Message ID | 20201119141457.844452-1-stefanha@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3] trace: use STAP_SDT_V2 to work around symbol visibility | expand |
On 11/19/20 3:14 PM, Stefan Hajnoczi wrote: > QEMU binaries no longer launch successfully with recent SystemTap > releases. This is because modular QEMU builds link the sdt semaphores > into the main binary instead of into the shared objects where they are > used. The symbol visibility of semaphores is 'hidden' and the dynamic > linker prints an error during module loading: > > $ ./configure --enable-trace-backends=dtrace --enable-modules ... > ... > Failed to open module: /builddir/build/BUILD/qemu-4.2.0/s390x-softmmu/../block-curl.so: undefined symbol: qemu_curl_close_semaphore > > The long-term solution is to generate per-module dtrace .o files and > link them into the module instead of the main binary. > > In the short term we can define STAP_SDT_V2 so dtrace(1) produces a .o > file with 'default' symbol visibility instead of 'hidden'. This > workaround is small and easier to merge for QEMU 5.2 and downstream > backports. > > Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1898700 > Cc: wcohen@redhat.com > Cc: fche@redhat.com > Cc: kraxel@redhat.com > Cc: rjones@redhat.com > Cc: ddepaula@redhat.com > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> > Reviewed-by: Miroslav Rezanina <mrezanin@redhat.com> > --- > v3: > * Tweak commit description for clarity [danpb] > * Add Buglink tag > * Add explanation comment into ./configure [Philippe] > * Add Reviewed-by tags > v2: > * Define STAP_SDT_V2 everywhere [danpb] > --- > configure | 7 +++++++ > trace/meson.build | 4 ++-- > 2 files changed, 9 insertions(+), 2 deletions(-) > > diff --git a/configure b/configure > index 714e75b5d8..796cec14de 100755 > --- a/configure > +++ b/configure > @@ -4832,6 +4832,13 @@ if have_backend "dtrace"; then > trace_backend_stap="no" > if has 'stap' ; then > trace_backend_stap="yes" > + > + # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol > + # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility > + # instead. QEMU --enable-modules depends on this because the SystemTap > + # semaphores are linked into the main binary and not the module's shared > + # object. Thanks! > + QEMU_CFLAGS="$QEMU_CFLAGS -DSTAP_SDT_V2" > fi > fi > > diff --git a/trace/meson.build b/trace/meson.build > index d5fc45c628..843ea14495 100644 > --- a/trace/meson.build > +++ b/trace/meson.build > @@ -38,13 +38,13 @@ foreach dir : [ '.' ] + trace_events_subdirs > trace_dtrace_h = custom_target(fmt.format('trace-dtrace', 'h'), > output: fmt.format('trace-dtrace', 'h'), > input: trace_dtrace, > - command: [ 'dtrace', '-o', '@OUTPUT@', '-h', '-s', '@INPUT@' ]) > + command: [ 'dtrace', '-DSTAP_SDT_V2', '-o', '@OUTPUT@', '-h', '-s', '@INPUT@' ]) > trace_ss.add(trace_dtrace_h) > if host_machine.system() != 'darwin' > trace_dtrace_o = custom_target(fmt.format('trace-dtrace', 'o'), > output: fmt.format('trace-dtrace', 'o'), > input: trace_dtrace, > - command: [ 'dtrace', '-o', '@OUTPUT@', '-G', '-s', '@INPUT@' ]) > + command: [ 'dtrace', '-DSTAP_SDT_V2', '-o', '@OUTPUT@', '-G', '-s', '@INPUT@' ]) > trace_ss.add(trace_dtrace_o) > endif > >
diff --git a/configure b/configure index 714e75b5d8..796cec14de 100755 --- a/configure +++ b/configure @@ -4832,6 +4832,13 @@ if have_backend "dtrace"; then trace_backend_stap="no" if has 'stap' ; then trace_backend_stap="yes" + + # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol + # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility + # instead. QEMU --enable-modules depends on this because the SystemTap + # semaphores are linked into the main binary and not the module's shared + # object. + QEMU_CFLAGS="$QEMU_CFLAGS -DSTAP_SDT_V2" fi fi diff --git a/trace/meson.build b/trace/meson.build index d5fc45c628..843ea14495 100644 --- a/trace/meson.build +++ b/trace/meson.build @@ -38,13 +38,13 @@ foreach dir : [ '.' ] + trace_events_subdirs trace_dtrace_h = custom_target(fmt.format('trace-dtrace', 'h'), output: fmt.format('trace-dtrace', 'h'), input: trace_dtrace, - command: [ 'dtrace', '-o', '@OUTPUT@', '-h', '-s', '@INPUT@' ]) + command: [ 'dtrace', '-DSTAP_SDT_V2', '-o', '@OUTPUT@', '-h', '-s', '@INPUT@' ]) trace_ss.add(trace_dtrace_h) if host_machine.system() != 'darwin' trace_dtrace_o = custom_target(fmt.format('trace-dtrace', 'o'), output: fmt.format('trace-dtrace', 'o'), input: trace_dtrace, - command: [ 'dtrace', '-o', '@OUTPUT@', '-G', '-s', '@INPUT@' ]) + command: [ 'dtrace', '-DSTAP_SDT_V2', '-o', '@OUTPUT@', '-G', '-s', '@INPUT@' ]) trace_ss.add(trace_dtrace_o) endif