Multiple definition of vfork() when linking statically

Bernhard Reutner-Fischer rep.dot.nop at gmail.com
Fri Aug 29 14:37:02 UTC 2014


On 29 August 2014 15:33, Waldemar Brodkorb <wbx at openadk.org> wrote:
> Hi Thomas,
> Thomas Petazzoni wrote,
>
>> Hello,
>>
>> When doing static linking, vfork() is defined in both libc.a and
>> libpthread.a, causing a build failure such as:
>>
>> aserver.c:(.text.startup+0x464): warning: gethostbyname is obsolescent, use getnameinfo() instead.
>> /home/test/autobuild/instance-1/output/host/usr/sh4-buildroot-linux-uclibc/sysroot/usr/lib/libc.a(vfork.os): In function `vfork':
>> (.text+0x0): multiple definition of `__vfork'
>> /home/test/autobuild/instance-1/output/host/usr/sh4-buildroot-linux-uclibc/sysroot/usr/lib/libpthread.a(pt-vfork.os):(.text+0x0): first defined here
>> collect2: error: ld returned 1 exit status
>>
>> This happens with uClibc 0.9.33.2 + the set of patches visible at
>> http://git.buildroot.net/buildroot/tree/package/uclibc/0.9.33.2?id=2014.05-rc1.
>
> 21 /* libpthread used to have its own vfork implementation that differed
> 22    from libc's only in having a pointless micro-optimization.  There
> 23    is no longer any use to having a separate copy in libpthread, but
> 24    the historical ABI requires it.  For static linking, there is no
> 25    need to provide anything here--the libc version will be linked in.
> 26    For shared library ABI compatibility, there must be __vfork and
> 27    vfork symbols in libpthread.so.  */
> 28
> 29 #if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
> 30      || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
> 31
> 32 #include <vfork.S>
> 33
> 34 #endif
> 35
> 36 #if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
> 37 compat_symbol (libpthread, __libc_vfork, vfork, GLIBC_2_0);
> 38 #endif
> 39
> 40 #if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)
> 41 strong_alias (__libc_vfork, __vfork_compat)
> 42 compat_symbol (libpthread, __vfork_compat, __vfork, GLIBC_2_1_2);
> 43 #endif
>
> Any volunteers to come up with a patch for uClibc mimic the
> changes of glibc for pt-vfork.S?

sed -i -e 's/[[:space:]]pt-vfork\.[csS]//' $(git grep -l pt-vfork
libpthread/nptl/sysdeps)
find libpthread/nptl -name "*pt-vfork*" | git rm {} +

untested..


More information about the uClibc mailing list