Bug#591405: gcc-4.4/g++-4.4: link failure with -Wl, -no-add-needed: "invalid DSO for symbol `pthread_cancel@@GLIBC_2.0' definition"
Package: g++-4.4
Version: 4.4.4-7
Severity: normal
[ First of all, this bug seems to be the same as bugs #577961 and
#578831, only they cover gcc-4.5, where afaik -Wl,-no-add-needed
is default ]
I'm trying to build my libraries with -Wl,-no-add-needed and got an
issue wrt weak symbols handling. Here is the testcase (based on
#577961):
---- 8< Makefile ----
CXXLD=$(CXX) -Wl,-no-add-needed
CXXFLAGS=-Wall -fPIC -std=gnu++0x
CPPFLAGS=-I.
all: mymain2 mymain libkapi.so.0
mymain: mymain.o libkapi.so
$(CXXLD) -o $@ $(CXXFLAGS) mymain.o -L. -lkapi
mymain2: mymain.o
$(CXXLD) -o $@ $(CXXFLAGS) mymain.o
libkapi.so: libkapi.so.0
ln -fs $@.0 $@
kapi.cc:
touch $@
kapi.o: kapi.cc
libkapi.so.0: kapi.o
$(CXXLD) $(CXXFLAGS) -shared -Wl,-soname -Wl,$@ -o $@ $^ -pthread
clean:
$(RM) *.o libkapi.so.0 mymain kapi.cc libkapi.so mymain2
---- 8< mymain.cc ----
#include <iostream>
#include <memory>
#include <string>
using namespace std;
int main () {
string numbers[] ={"one","two","three"};
// get block of uninitialized memory:
pair <string*,ptrdiff_t> result = get_temporary_buffer<string>(3);
if (result.second>0) {
uninitialized_copy ( numbers, numbers+result.second, result.first );
for (int i=0; i<result.second; i++)
cout << result.first[i] << " ";
cout << endl;
return_temporary_buffer(result.first);
}
return 0;
}
$ make
g++ -Wall -fPIC -std=gnu++0x -I. -c -o mymain.o mymain.cc
g++ -Wl,-no-add-needed -o mymain2 -Wall -fPIC -std=gnu++0x mymain.o
touch kapi.cc
g++ -Wall -fPIC -std=gnu++0x -I. -c -o kapi.o kapi.cc
g++ -Wl,-no-add-needed -Wall -fPIC -std=gnu++0x -shared -Wl,-soname -Wl,libkapi.so.0 -o libkapi.so.0 kapi.o -pthread
ln -fs libkapi.so.0 libkapi.so
g++ -Wl,-no-add-needed -o mymain -Wall -fPIC -std=gnu++0x mymain.o -L. -lkapi
/usr/bin/ld: :: invalid DSO for symbol `pthread_cancel@@GLIBC_2.0' definition
/lib/libpthread.so.0: could not read symbols: Bad value
collect2: ld returned 1 exit status
If CXXLD is changed back to just $(CXX) it builds ok.
As I can tell this is related to libstdc++ weakly pulling in libpthread.so, but
if then another library (libkapi.so) links explicitely to libpthread, when
linking mymain, linker wrongly decides we need pthread_cancel non-weakly.
See e.g. this thread:
http://www.mail-archive.com/devel@lists.fedoraproject.org/msg00042.html
Probably a linker issue too, so
$ ld -v
GNU ld (GNU Binutils for Debian) 2.20.1-system.20100303
Thanks,
Kirill
-- System Information:
Debian Release: squeeze/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: i386 (i686)
Kernel: Linux 2.6.33.6-roro-00002-gf825b2a-dirty (SMP w/2 CPU cores; PREEMPT)
Locale: LANG=ru_RU.UTF-8, LC_CTYPE=ru_RU.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages g++-4.4 depends on:
ii gcc-4.4 4.4.4-7 The GNU C compiler
ii gcc-4.4-base 4.4.4-7 The GNU Compiler Collection (base
ii libc6 2.11.2-2 Embedded GNU C Library: Shared lib
ii libgmp3c2 2:4.3.2+dfsg-1 Multiprecision arithmetic library
ii libmpfr1ldbl 2.4.2-3 multiple precision floating-point
ii libstdc++6-4.4-dev 4.4.4-7 The GNU Standard C++ Library v3 (d
g++-4.4 recommends no packages.
Versions of packages g++-4.4 suggests:
pn g++-4.4-multilib <none> (no description available)
ii gcc-4.4-doc 4.4.4.nf1-1 documentation for the GNU compiler
ii libstdc++6-4.4-dbg 4.4.4-7 The GNU Standard C++ Library v3 (d
-- no debconf information
Reply to: