On Mon, Dec 15, 2025 at 08:49:53AM +0100, Paolo Bonzini wrote:
> Date: Mon, 15 Dec 2025 08:49:53 +0100
> From: Paolo Bonzini <[email protected]>
> Subject: [PATCH 04/11] rust: Do not link qemuutil into Rust rlibs
> X-Mailer: git-send-email 2.52.0
> 
> From: Martin Kletzander <[email protected]>
> 
> Commit de037ab8d83d removed qemuutil dependency from chardev and util
> rust crates.  However it stayed in the _util_rs static library.  The
> dependency is also defined as `link_with`, which is fine for C targets,
> where the resulting archive gets linked as another parameter on the
> command line when it is a static library.
> 
> However, when a C library is linked into a Rust rlib, rustc remembers
> the dependency into the metadata and adds the library to the linker
> command line.
> 
> Unfortunately, static libraries are sensitive to their
> position on the command line and rustc does not always get it right.
> Fortunately, simply removing it from dependencies of any rust libraries
> and instead adding them into the dependencies of executables and
> doctests fixes the behaviour.
> 
> Without this patch the error I get is:
> 
>   FAILED: [code=1] rust/tests/rust-integration
>   ...
>   = note: rust-lld: error: unable to find library -l:libqemuutil.a
>           rust-lld: error: unable to find library -l:libvhost-user-glib.a
>           rust-lld: error: unable to find library -l:libvhost-user.a
>           rust-lld: error: unable to find library -l:libqemuutil.a
>           rust-lld: error: unable to find library -l:libvhost-user-glib.a
>           rust-lld: error: unable to find library -l:libvhost-user.a
>           rust-lld: error: unable to find library -l:libqemuutil.a
>           rust-lld: error: unable to find library -l:libvhost-user-glib.a
>           rust-lld: error: unable to find library -l:libvhost-user.a
>           rust-lld: error: unable to find library -l:libqemuutil.a
>           rust-lld: error: unable to find library -l:libvhost-user-glib.a
>           rust-lld: error: unable to find library -l:libvhost-user.a
>           rust-lld: error: unable to find library -l:libqemuutil.a
>           rust-lld: error: unable to find library -l:libvhost-user-glib.a
>           rust-lld: error: unable to find library -l:libvhost-user.a
>           rust-lld: error: unable to find library -l:libqemuutil.a
>           rust-lld: error: unable to find library -l:libvhost-user-glib.a
>           rust-lld: error: unable to find library -l:libvhost-user.a
>           collect2: error: ld returned 1 exit status
> 
> Meson could work around it itself by never adding these static libraries
> to the rlibs (after all, Meson tracks the transitive dependencies already
> and knows how to add them to dependents of those rlibs); at least for now,
> do it in QEMU: never link C libraries into Rust rlibs, and add them to the
> final build products only.
> 
> Signed-off-by: Martin Kletzander <[email protected]>
> Signed-off-by: Paolo Bonzini <[email protected]>
> ---
>  rust/chardev/meson.build | 2 +-
>  rust/qom/meson.build     | 2 +-
>  rust/util/meson.build    | 4 ++--
>  3 files changed, 4 insertions(+), 4 deletions(-)

Reviewed-by: Zhao Liu <[email protected]>


Reply via email to