On Sat, 19 Sep 2015 19:29:56 +0200, Sebastien Marie 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.

FWIW, the comment in the cmake fragment says (HandleLLVMOptions.cmake):

[...]
 # Pass -Wl,-z,defs. This makes sure all symbols are defined. Otherwise
a DSO
 # build might work on ELF but fail on MachO/COFF.
[...]

and it then goes on to disable the option on FreeBSD, Darwin etc.

I think it's safe to say the option should also be disabled on OpenBSD,
so my current patch looks like this:

$OpenBSD$
--- cmake/modules/HandleLLVMOptions.cmake.orig  Wed Sep  9 14:34:05 2015
+++ cmake/modules/HandleLLVMOptions.cmake       Wed Sep  9 14:34:55 2015
@@ -132,7 +132,8 @@ endif()
 # Pass -Wl,-z,defs. This makes sure all symbols are defined. Otherwise a DSO
 # build might work on ELF but fail on MachO/COFF.
 if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32 OR CYGWIN OR
-        ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") AND
+        ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR
+       ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") AND
    NOT LLVM_USE_SANITIZER)
   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs")
 endif()

> 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'.
> 
> I am not sure that I can provide them for linking libclang.so ?
> 
> > 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.

That might depend on the specifics of gcc specs on Linux; I have no idea
why it works.

> $ 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
> $
> 
> Thanks.
> -- 
> Sebastien Marie
> 
> 

Reply via email to