Message ID | 20241018144306.954716-8-pbonzini@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | rust: miscellaneous cleanups + QOM integration tests | expand |
Paolo Bonzini <pbonzini@redhat.com> writes: > Some newer ABI implementations do not provide .ctors; and while > some linkers rewrite .ctors into .init_array, not all of them do. > Use the newer .init_array ABI, which works more reliably, and > apply it to all non-Apple, non-Windows platforms. > > This is similar to how the ctor crate operates; without this change, > "#[derive(Object)]" does not work on Fedora 41. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Junjie Mao <junjie.mao@hotmail.com> -- Best Regards Junjie Mao
diff --git a/rust/qemu-api-macros/src/lib.rs b/rust/qemu-api-macros/src/lib.rs index 59aba592d9a..be8874caea1 100644 --- a/rust/qemu-api-macros/src/lib.rs +++ b/rust/qemu-api-macros/src/lib.rs @@ -16,8 +16,8 @@ pub fn derive_object(input: TokenStream) -> TokenStream { let expanded = quote! { #[allow(non_upper_case_globals)] #[used] - #[cfg_attr(target_os = "linux", link_section = ".ctors")] - #[cfg_attr(target_os = "macos", link_section = "__DATA,__mod_init_func")] + #[cfg_attr(not(any(target_vendor = "apple", target_os = "windows")), link_section = ".init_array")] + #[cfg_attr(target_vendor = "apple", link_section = "__DATA,__mod_init_func")] #[cfg_attr(target_os = "windows", link_section = ".CRT$XCU")] pub static #module_static: extern "C" fn() = { extern "C" fn __register() {
Some newer ABI implementations do not provide .ctors; and while some linkers rewrite .ctors into .init_array, not all of them do. Use the newer .init_array ABI, which works more reliably, and apply it to all non-Apple, non-Windows platforms. This is similar to how the ctor crate operates; without this change, "#[derive(Object)]" does not work on Fedora 41. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- rust/qemu-api-macros/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)