On Sat, Sep 19, 2015 at 10:29 AM, Sebastien Marie <sema...@openbsd.org> wrote:
> On Sat, Sep 19, 2015 at 10:07:04AM -0700, Philip Guenther wrote:
>> On Sat, Sep 19, 2015 at 9:50 AM, Sebastien Marie <sema...@openbsd.org> wrote:
>> > While working on building llvm 3.7.0 on openbsd (-current amd64 and
>> > i386), I encounter a problem when linking a shared library, while
>> > -Wl,-z,defs was passed on command-line.
>> >
>> > I build a minimal reproductible testcase:
>> >
>> > $ touch test.c
>> > $ c++ -Wl,-z,defs -shared -o libtest.so test.c
>> > /usr/lib/crtbeginS.o: In function `atexit':
>> > (.text+0x18f): undefined reference to `__cxa_atexit'
>> > collect2: ld returned 1 exit status
>>
>> If you want to use -zdefs when building a shared library, you MUST
>> include in the link the libraries that it depends on, including libc.
>
> First, I encountered this problem while building clang. The linking of
> libclang.so.3.7 use -Wl,-z,defs.
>
> For building with it, it would require -lc for several symbols, and the
> last symbols will be `environ'. If I add `crt0.o' for `environ', it will
> require `__init' and `main'.

Congrats, you found a bug in how things are spread between crt0 and
libc!  The result is that you can't use -zdefs when building a shared
library.  The fix is to not have libc depend on crt0, not to disable
that functionality in ld.


> I am not sure that I can provide them for linking libclang.so ?

You can provide libc, but you can't (MUST NOT) provide crt0.


>> I believe the current behavior is correct and matches other systems.
>
> I tested under Linux (debian wheezy) the testcase written before, and I
> don't have any error like under OpenBSD.
>
> $ uname -a
> Linux srvlinux 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u3 
> (2015-08-04) x86_64 GNU/Linux
> $ touch test.c
> $ c++ -Wl,-z,defs -shared -o libtest.so test.c
> $ ls libtest.so
> libtest.so
> $

Right, because their libc doesn't depend on their crt0.  The whole
point of -zdefs is to require a link to have all dependencies
provided; it's not currently possible to do that on OpenBSD.


Philip Guenther

Reply via email to