Skip site navigation (1)Skip section navigation (2)
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>