"Dan Nicholson" <dbn.lists@gmail.com> writes:
[...]
> And now I've come upon this old thread:
>
> http://rpm5.org/community/rpm-devel/1554.html
>
> This is definitely the problem. When --as-needed is used, libc is
> bound first to tmire, causing regcomp and friends to be resolved
> through libc rather than libpcreposix.
the symbol conflict is a mess. pcreposix better be fixed
(http://rpm5.org/community/rpm-devel/1562.html)
it's hard to beat libc... here is what happens:
% echo 'int f() { regcomp(); }' > liba.c
% gcc -shared -o liba.so liba.c -lpcreposix
% ldd liba.so
libpcreposix.so.0 => /usr/lib/libpcreposix.so.0 (0xb7f76000)
libc.so.6 => /lib/i686/libc.so.6 (0xb7e28000)
libpcre.so.0 => /lib/libpcre.so.0 (0xb7e00000)
% gcc -shared -o liba_.so liba.so
% LD_LIBRARY_PATH=`pwd` ldd liba_.so
liba.so => /tmp/liba.so (0xb7f44000)
libc.so.6 => /lib/i686/libc.so.6 (0xb7de2000)
libpcreposix.so.0 => /usr/lib/libpcreposix.so.0 (0xb7de0000)
libpcre.so.0 => /lib/libpcre.so.0 (0xb7db8000)
one can see -lc has been added. confirmed by:
% gcc -nostdlib -shared -o liba_.so liba.so
% LD_LIBRARY_PATH=`pwd` ldd liba_.so
liba.so => /tmp/liba.so (0xb7f19000)
libpcreposix.so.0 => /usr/lib/libpcreposix.so.0 (0xb7f03000)
libc.so.6 => /lib/i686/libc.so.6 (0xb7db5000)
libpcre.so.0 => /lib/libpcre.so.0 (0xb7d8d000)
but using -nostdlib is harder when building a binary... hence the need
to force -lpcreposix at each linking steps:
% gcc -shared -o liba_.so liba.so -lpcreposix
% LD_LIBRARY_PATH=`pwd` ldd liba_.so
liba.so => /tmp/liba.so (0xb7f9f000)
libpcreposix.so.0 => /usr/lib/libpcreposix.so.0 (0xb7f89000)
libc.so.6 => /lib/i686/libc.so.6 (0xb7e3b000)
libpcre.so.0 => /lib/libpcre.so.0 (0xb7e13000)
which defeats the idea of DSO which should handle their deps themselves.
and such hacks do not play well with --as-needed:
export LD_LIBRARY_PATH=/tmp
cd /tmp
echo 'int f() { printf("fa "); }' > liba.c
echo 'int f() { printf("fb "); }' > libb.c
echo 'int g() { }' >> libb.c
echo 'int h() { f(); g(); }' > libx.c
echo 'main() { h(); g(); printf("\n"); }' > t.c
gcc -o liba.so -shared liba.c
gcc -o libb.so -shared libb.c
gcc -o libx.so -shared libx.c -L. -la -lb
gcc t.c -L. -lx ; ./a.out # fb
gcc t.c -L. -lx -la; ./a.out # fa
gcc -Wl,--as-needed t.c -L. -lx -la; ./a.out # fb
i wonder if ld could have a warning to detect about multiple symbols
in DSO and so tell about possible issues with --as-needed.
Received on Fri Jun 13 18:51:40 2008