Message ID | 20250218083734.3345966-1-zhao1.liu@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | rust: Prefer link_with over link_whole | expand |
On 2/18/25 09:37, Zhao Liu wrote: > The commit fccb744f41c6 ("gdbstub: Try unlinking the unix socket before > binding") causes the compilation of rust-qemu-api-integration to fail, > because rust-qemu-api-integration uses link_whole which meets the > duplicate symbol linker error. > > Though it's not the issue of link_whole used by Rust side, there's no > need to use link_whole. > > Use link_with, which may also bring some benefits, such as faster > linking or smaller output files. link_with, if I remember correctly, drops the constructors. Using it in rust_devices_ss therefore prevents the devices from being registered with QOM. The real issue is lack of support for "objects" in Meson for Rust executables. A patch to fix that is under review, after which it will be possible to build Rust executables using the same "dependency" objects as C code. Paolo > rust_devices_ss.add(when: 'CONFIG_X_PL011_RUST', if_true: [declare_dependency( > - link_whole: [_libpl011_rs], > + link_with: [_libpl011_rs], > # Putting proc macro crates in `dependencies` is necessary for Meson to find > # them when compiling the root per-target static rust lib. > dependencies: [bilge_impl_dep, qemu_api_macros], > diff --git a/rust/hw/timer/hpet/meson.build b/rust/hw/timer/hpet/meson.build > index c2d7c0532ca4..ce90cc4f021a 100644 > --- a/rust/hw/timer/hpet/meson.build > +++ b/rust/hw/timer/hpet/meson.build > @@ -10,7 +10,7 @@ _libhpet_rs = static_library( > ) > > rust_devices_ss.add(when: 'CONFIG_X_HPET_RUST', if_true: [declare_dependency( > - link_whole: [_libhpet_rs], > + link_with: [_libhpet_rs], > # Putting proc macro crates in `dependencies` is necessary for Meson to find > # them when compiling the root per-target static rust lib. > dependencies: [qemu_api_macros], > diff --git a/rust/qemu-api/meson.build b/rust/qemu-api/meson.build > index 2e9c1078b9b2..e825671b694b 100644 > --- a/rust/qemu-api/meson.build > +++ b/rust/qemu-api/meson.build > @@ -63,7 +63,7 @@ test('rust-qemu-api-integration', > rust_args: ['--test'], > install: false, > dependencies: [qemu_api, qemu_api_macros], > - link_whole: [rust_qemu_api_objs, libqemuutil]), > + link_with: [rust_qemu_api_objs, libqemuutil]), > args: [ > '--test', '--test-threads', '1', > '--format', 'pretty',
On Tue, Feb 18, 2025 at 09:58:44AM +0100, Paolo Bonzini wrote: > Date: Tue, 18 Feb 2025 09:58:44 +0100 > From: Paolo Bonzini <pbonzini@redhat.com> > Subject: Re: [PATCH] rust: Prefer link_with over link_whole > > On 2/18/25 09:37, Zhao Liu wrote: > > The commit fccb744f41c6 ("gdbstub: Try unlinking the unix socket before > > binding") causes the compilation of rust-qemu-api-integration to fail, > > because rust-qemu-api-integration uses link_whole which meets the > > duplicate symbol linker error. > > > > Though it's not the issue of link_whole used by Rust side, there's no > > need to use link_whole. > > > > Use link_with, which may also bring some benefits, such as faster > > linking or smaller output files. > > link_with, if I remember correctly, drops the constructors. Using it in > rust_devices_ss therefore prevents the devices from being registered with > QOM. Interesting, I test with link_with and HPET QOM type can be registered. I find this is because `module_init` macro adds `#[used]` for `LOAD_MODULE`, which prevents linker dropping QOM type. Without `#[used]`, both link_with and link_whole will optimize `LOAD_MODULE`... So here `#[used]` is the key to getting everything to work properly. > The real issue is lack of support for "objects" in Meson for Rust > executables. A patch to fix that is under review, after which it will be > possible to build Rust executables using the same "dependency" objects as C > code. HMM, but with link_with, everything seems to compile fine? Thanks, Zhao
diff --git a/rust/hw/char/pl011/meson.build b/rust/hw/char/pl011/meson.build index 547cca5a96f7..4ba9089fcf8e 100644 --- a/rust/hw/char/pl011/meson.build +++ b/rust/hw/char/pl011/meson.build @@ -18,7 +18,7 @@ _libpl011_rs = static_library( ) rust_devices_ss.add(when: 'CONFIG_X_PL011_RUST', if_true: [declare_dependency( - link_whole: [_libpl011_rs], + link_with: [_libpl011_rs], # Putting proc macro crates in `dependencies` is necessary for Meson to find # them when compiling the root per-target static rust lib. dependencies: [bilge_impl_dep, qemu_api_macros], diff --git a/rust/hw/timer/hpet/meson.build b/rust/hw/timer/hpet/meson.build index c2d7c0532ca4..ce90cc4f021a 100644 --- a/rust/hw/timer/hpet/meson.build +++ b/rust/hw/timer/hpet/meson.build @@ -10,7 +10,7 @@ _libhpet_rs = static_library( ) rust_devices_ss.add(when: 'CONFIG_X_HPET_RUST', if_true: [declare_dependency( - link_whole: [_libhpet_rs], + link_with: [_libhpet_rs], # Putting proc macro crates in `dependencies` is necessary for Meson to find # them when compiling the root per-target static rust lib. dependencies: [qemu_api_macros], diff --git a/rust/qemu-api/meson.build b/rust/qemu-api/meson.build index 2e9c1078b9b2..e825671b694b 100644 --- a/rust/qemu-api/meson.build +++ b/rust/qemu-api/meson.build @@ -63,7 +63,7 @@ test('rust-qemu-api-integration', rust_args: ['--test'], install: false, dependencies: [qemu_api, qemu_api_macros], - link_whole: [rust_qemu_api_objs, libqemuutil]), + link_with: [rust_qemu_api_objs, libqemuutil]), args: [ '--test', '--test-threads', '1', '--format', 'pretty',
The commit fccb744f41c6 ("gdbstub: Try unlinking the unix socket before binding") causes the compilation of rust-qemu-api-integration to fail, because rust-qemu-api-integration uses link_whole which meets the duplicate symbol linker error. Though it's not the issue of link_whole used by Rust side, there's no need to use link_whole. Use link_with, which may also bring some benefits, such as faster linking or smaller output files. Signed-off-by: Zhao Liu <zhao1.liu@intel.com> --- rust/hw/char/pl011/meson.build | 2 +- rust/hw/timer/hpet/meson.build | 2 +- rust/qemu-api/meson.build | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)