Hi On Thu, Jul 7, 2022 at 10:05 PM Marc-André Lureau < [email protected]> wrote:
> Hi > > On Thu, Jul 7, 2022 at 4:18 PM Markus Armbruster <[email protected]> > wrote: > >> [email protected] writes: >> >> > From: Marc-André Lureau <[email protected]> >> > >> > error_vprintf() is implemented in monitor.c, which overrides the >> > default implementation from stubs/, while avoiding a direct dependency >> > to the monitor from error-report.c. >> > >> > However, the stub solution isn't working when moving error-report.c and >> > stubs/error-printf.c in a common library. Linking with such library >> > creates conflicts for the error_vprintf() implementations >> >> I'm feeling dense today: how? >> > > If I try to overwrite a symbol in qemu when linking with a static library > from a subproject, the linker fails: > > FAILED: storage-daemon/qemu-storage-daemon > cc -m64 -mcx16 -o storage-daemon/qemu-storage-daemon > storage-daemon/qemu-storage-daemon.p/meson-generated_.._qapi_qapi-introspect.c.o > storage-daemon/qemu-storage-daemon.p/meson-generated_.._qapi_qapi-types.c.o > storage-daemon/qemu-storage-daemon.p/meson-generated_.._qapi_qapi-visit.c.o > storage-daemon/qemu-storage-daemon.p/meson-generated_.._qapi_qapi-commands.c.o > storage-daemon/qemu-storage-daemon.p/meson-generated_.._qapi_qapi-init-commands.c.o > storage-daemon/qemu-storage-daemon.p/meson-generated_.._qapi_qapi-events.c.o > storage-daemon/qemu-storage-daemon.p/meson-generated_.._qapi_qapi-emit-events.c.o > storage-daemon/qemu-storage-daemon.p/qemu-storage-daemon.c.o > -Wl,--as-needed -Wl,--no-undefined -pie -Wl,--whole-archive libblockdev.fa > libblock.fa libcrypto.fa libauthz.fa libqom.fa libio.fa -Wl,--start-group > libevent-loop-base.a libchardev.fa libqmp.fa -Wl,--no-whole-archive > -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -fstack-protector-strong > -Wl,-rpath,/usr/lib64/iscsi -Wl,-rpath-link,/usr/lib64/iscsi libqemuutil.a > subprojects/libvhost-user/libvhost-user-glib.a > subprojects/libvhost-user/libvhost-user.a > subprojects/qemu-common/libqemu-common.a libblockdev.fa > subprojects/libvduse/libvduse.a libblock.fa libcrypto.fa libauthz.fa > libqom.fa libio.fa libchardev.fa libqmp.fa @block.syms > /usr/lib64/libgnutls.so /usr/lib64/liburing.so /usr/lib64/libgio-2.0.so > /usr/lib64/libgobject-2.0.so /usr/lib64/libglib-2.0.so > -Wl,--export-dynamic -pthread -lgmodule-2.0 -lglib-2.0 -lglib-2.0 -lm > /usr/lib64/libpixman-1.so -lgmodule-2.0 -lglib-2.0 -lglib-2.0 -lgmodule-2.0 > -lglib-2.0 -lglib-2.0 -lgmodule-2.0 -lglib-2.0 -lglib-2.0 > /usr/lib64/libfuse3.so -lpthread -lgmodule-2.0 -lglib-2.0 -lglib-2.0 > /usr/lib64/libzstd.so /usr/lib64/libz.so /usr/lib64/iscsi/libiscsi.so -laio > -lpam -lutil -Wl,--end-group > /usr/bin/ld: > subprojects/qemu-common/libqemu-common.a.p/src_error-report.c.o: in > function `error_init': > /home/elmarco/src/qemu/build/../subprojects/qemu-common/src/error-report.c:413: > multiple definition of `error_init'; > libqmp.fa.p/monitor_qmp.c.o:/home/elmarco/src/qemu/build/../monitor/qmp.c:40: > first defined here > > But I can't really explain why it works when overwriting symbols from > libqemuutil.a, I am a bit puzzled here. Am I missing something obvious? > (this is a bit of dark linker magic going on) > > After playing with this for a few hours ... I managed to get the symbol override work, by having a single overridable function per unit. No idea why in qemutil.a/stubs we manage to have several. That's a mystery. Anyway, I will send a new version where I also introduce the subproject, to demonstrate it works. thanks > >> Why would the linker pull in error-printf.o when the symbols it defines >> are already provided by .o the linker processed before the library >> containing error-printf.o? >> >> > (and weak >> > symbols aren't great either). >> >> Weak symbols are great, except Windows isn't. >> >> > Instead, use the "traditional" approach to >> > provide overidable callbacks. >> > >> > Signed-off-by: Marc-André Lureau <[email protected]> >> >> >> > > -- > Marc-André Lureau > -- Marc-André Lureau
