runtime linker on 9.x/i386: clang vs. gcc
Mikhail T.
mi+thun at aldan.algebra.com
Mon Oct 14 16:30:03 UTC 2013
Hello!
I'm seeing a strange problem with clang-compiled binaries on 9.x/i386
system. Here it is: if a shared library A needs a symbol provided by a
shared library B, libA will fail to load into a process even if the
executable is linked with libB. The only fix (work-around?) is to relink
libA to explicitly depend on libB. A temporary work-around is to use
LD_PRELOAD to list all of the necessary libBs...
One example of this is reported in ports/180473
<http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/180473> -- the
libprldap6.so refuses to load because of the symbols it needs from
libnspr4.so. For some reason, the fact, that -lnspr4 is linked into the
executable (seamonkey or thunderbird), is not sufficient... As the
ticket suggests, using gcc46 (Mozilla rejects gcc-4.2.x nowadays)
instead of clang solves the problem (though an even better solution is
in place since this weekend).
Another example is xorg-server, which, for me, can not load some of the
drivers because they complain of missing symbols:
(EE) Failed to load /opt/lib/xorg/modules/drivers/vboxvideo_drv.so: /opt/lib/xorg/modules/drivers/vboxvideo_drv.so: Undefined symbol "DRIFinishScreenInit"
The DRIFinishScreenInit is provided by libdri.so, which the server also
loads... But, somehow, that is not sufficient. Rebuilding
vboxvideo_drv.so (provided by emulators/virtualbox-ose-additions
<http://www.freshports.org/emulators/virtualbox-ose-additions>) with the
stock cc (gcc-4.2.1) resolves the linking problem -- even if Xorg
executable and the libdri.so remain clang-compiled.
I am not prepared to argue, whether that's a "right" or "wrong" behavior
-- but it certainly is inconsistent, because it is only manifested on
i386 and only when the compiler is clang.
Any thoughts?
-mi
More information about the freebsd-stable
mailing list