Date: Mon, 14 Oct 2013 22:31:56 +0200 From: Dimitry Andric <dim@FreeBSD.org> To: Mikhail T. <mi+thun@aldan.algebra.com> Cc: stable@FreeBSD.org Subject: Re: runtime linker on 9.x/i386: clang vs. gcc Message-ID: <B4BCF2B5-5B37-47E1-BCB7-A0159E249E10@FreeBSD.org> In-Reply-To: <525C1A5C.2030605@aldan.algebra.com> References: <525C1A5C.2030605@aldan.algebra.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--Apple-Mail=_7A577A69-AB79-43C4-92E9-A95FCAFB480D Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii On Oct 14, 2013, at 18:22, Mikhail T. <mi+thun@aldan.algebra.com> wrote: > 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... >=20 > One example of this is reported in ports/180473 = <http://www.freebsd.org/cgi/query-pr.cgi?pr=3Dports/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). >=20 > Another example is xorg-server, which, for me, can not load some of = the drivers because they complain of missing symbols: >=20 > (EE) Failed to load /opt/lib/xorg/modules/drivers/vboxvideo_drv.so: = /opt/lib/xorg/modules/drivers/vboxvideo_drv.so: Undefined symbol = "DRIFinishScreenInit" >=20 > 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. >=20 > 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. >=20 > Any thoughts? There are many possibilities here, and you might be running into multiple different problems, but the X.org failures look familiar to me. There is a problem when clang does tail-call optimization on i386 with PIC in effect, and it emits GOT relocations for the tail-called functions, instead of PLT relocations. In some scenarios, such as with the way X.org does lazy dynamic linking, this can cause problems. See also http://llvm.org/PR15086 (which I unfortunately did not get much response on). For now, a workaround is to recompile the affected .so files with -fno-optimize-sibling-calls (if you are optimizing). This is also the approach taken for the X.org ports, see http://svnweb.freebsd.org/ports?view=3Drevision&revision=3D312583 for = the diff. -Dimitry --Apple-Mail=_7A577A69-AB79-43C4-92E9-A95FCAFB480D Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP using GPGMail -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.20 (Darwin) iEYEARECAAYFAlJcVMMACgkQsF6jCi4glqPgIwCfV8ySjwjATOvzrJnFiTlTyQe8 AcAAoMe/plJAhIGxuA2wkxXUFAwpDt+b =eMtO -----END PGP SIGNATURE----- --Apple-Mail=_7A577A69-AB79-43C4-92E9-A95FCAFB480D--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?B4BCF2B5-5B37-47E1-BCB7-A0159E249E10>