On Fri, Aug 30, 2013 at 12:47:09PM +0200, Viktor Mihajlovski wrote:
On 08/29/2013 07:08 PM, Eric Blake wrote:
> We are already providing an LD_PRELOAD override of
> dbus_message_set_reply_serial as part of that test, which SHOULD be
> avoiding that assert (at least, it did so on both RHEL 5 and current
> Fedora) (see commit 524f52c). Can you do some debugging under gdb to
> see why the preload is not being used on Ubuntu's version of dbus?
>
The mechanism itself is working fine, but looking at the backtrace it
seems that dbus_message_set_reply_serial is called from within a
function that's not part of the mock library:
Breakpoint 1, 0x00007ffff5aaf8e0 in dbus_message_set_reply_serial () from
/lib/x86_64-linux-gnu/libdbus-1.so.3
(gdb) bt
#0 0x00007ffff5aaf8e0 in dbus_message_set_reply_serial () from
/lib/x86_64-linux-gnu/libdbus-1.so.3
#1 0x00007ffff5ab2a28 in dbus_message_new_method_return () from
/lib/x86_64-linux-gnu/libdbus-1.so.3
#2 0x00007ffff770c71f in virDBusCallMethod (conn=0x1, replyout=0x0,
destination=<optimized out>,
path=<optimized out>, iface=0x7ffff791c8f0
"org.freedesktop.machine1.Manager", member=<optimized out>,
types=0x7ffff791c9cb "sayssusa(sv)") at ../../src/util/virdbus.c:1151
#3 0x00007ffff77459c1 in virSystemdCreateMachine (name=<optimized out>,
drivername=0x411d3d "lxc",
privileged=<optimized out>,
uuid=0x7fffffffded0
"\001\001\001\001\002\002\002\002\003\003\003\003\004\004\004\004",
rootdir=<optimized out>, pidleader=123, iscontainer=true, partition=0x411db2
"highpriority.slice")
at ../../src/util/virsystemd.c:213
#4 0x00000000004031e9 in testCreateContainer (opaque=<optimized out>) at
../../tests/virsystemdtest.c:39
#5 0x0000000000403f9d in virtTestRun (title=<optimized out>, nloops=1,
body=0x403150 <testCreateContainer>,
data=0x0) at ../../tests/testutils.c:169
#6 0x0000000000402bc1 in mymain () at ../../tests/virsystemdtest.c:178
#7 0x000000000040468b in virtTestMain (argc=1, argv=<optimized out>, func=0x402b90
<mymain>)
at ../../tests/testutils.c:772
#8 0x00000000004029e0 in main (argc=1, argv=0x7fffffffe168) at
../../tests/virsystemdtest.c:207
as can be seen here:
ldd -r .libs/virsystemdmock.so
undefined symbol: dbus_set_error (.libs/virsystemdmock.so)
linux-vdso.so.1 => (0x00007fff69bb2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd46ecf0000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd46f2d2000)
undefined symbol: dbus_message_new_error (.libs/virsystemdmock.so)
undefined symbol: dbus_message_new_method_return (.libs/virsystemdmock.so)
although the callstack seems to have fallen prey to the optimizer,
virDBusCallMethod calls the mock dbus_connection_send_with_reply_and_block
which in turn calls the real dbus_message_new_method_return which again
calls dbus_message_set_reply_serial, but the real one instead of the mock
version. On RHEL it's calling the mock ...reply_serial.
On other occcasions I have observed that libtool on Ubuntu behaves differently
than on RHEL or Fedora and maybe that's why the LD_PRELOAD works differently
for intra-library calls there. But here I am entering the realm of wild
speculations...
I found the build logs for libdbus on Ubuntu
https://launchpadlibrarian.net/142327590/buildlog_ubuntu-raring-i386.dbus...
Notice that '-Bsymbolic-functions' is passed when linking libdbus. This
isn't something upstream dbus do, so must be an ubuntu specific linker
flag.
This causes all function calls made by libdbus to any other function
inside libdbus to be strictly bound at link time. This prevents you
using an LD_PRELOAD libraries to replace them, which really, really
sucks.
Regards,
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|