collect2 bug in 3.3.2 on Tru64 UNIX 5.1

Jim Wilson wilson@specifixinc.com
Wed Apr 14 03:54:00 GMT 2004


Albert Chin wrote:
> $ g++ -v -Wl,-v -shared -Wl,-expect_unresolved,'*' \
> -Wl,-soname,libsip.so -o libsip.so moc_sipQt.o ...

You can work around this problem by putting the -soname option near the 
end of the gcc command line.  If there is at least one .o file name 
before the -soname option, then you won't see this problem.

You might be able to work around the problem by installing GNU ld (in 
the binutils package) and configuring --with-gnu-ld --with-gnu-as.  In 
that case, GNU ld should create the constructors, and collect2 won't 
need the second problematic link, and hence I would expect the above 
command to work.

Incidentally, I see that libtool always puts the -soname option near the 
end of the command line, but I don't know if this is done on purpose or 
by accident.

This problem won't occur for any ELF target, because we always link in 
at least one standard object file (e.g. crti.o, crtbeginS.o) when 
creating shared libraries, so the -soname argument can not be the first 
file name.

> I believe this is the culprit. How should I try to fix this? Should I
> check if p == '.so' and *(ld2-2) == '-soname'? Or maybe add o_file to
> *ld2++ when p == '.so' just like when p == '.o' || p == '.obj'?

It looks like o_file is deliberately inserted before any library, which 
makes sense, as we don't want a library file to accidentally override 
any of it.  Note that the same treatment is given to -l options.  So 
putting o_file after a .so does not appear safe.

That leaves us with the option of checking for the -soname option which 
is a bit of a hack, but I don't see any better alternative at the 
moment.  The problem here is that we need a solution that works for all 
targets, but not all targets have a "-soname" linker option.  So there 
is some risk that an explicit check for -soname may fail in some unusual 
cases.  Checking libtool, I see that the -soname option name seems to be 
pretty standard, so this seems reasonably safe.  I see only one system 
that has a --soname option, and I don't see any other names for this option.
-- 
Jim Wilson, GNU Tools Support, http://www.SpecifixInc.com



More information about the Gcc mailing list