This is the mail archive of the binutils@sourceware.cygnus.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: ld and common symbols


Hi Phillip,

: Using the latest binutils from CVS I am seeing what seems to be a change in 
: behaviour relating to ld and common symbols.
: 
: With a test like this:
: 
: $ cat >t1.c
: int foo;	/* common */
: int bar = 1;	/* initialised */
: ^D
: $ cat >t2.c
: int foo = 1;	/* initialised */
: int bar = 1;	/* initialised */
: ^D
: $ gcc -c t1.c
: $ gcc -c t2.c
: $ ar cq t.a t2.o
: $ ld t1.o t.a
: 
: older versions of the linker seemed to be content with the common declaration 
: of `foo' in t1.o.  The current linker instead favours pulling in the archive 
: member in order to get an initialised definition of `foo'.  In this case that 
: causes `bar' to be multiply defined and so you get a link error.
: 
: This patch seems a likely candidate for having caused the change, though I 
: haven't verified that this is the case.
: 
: 1999-12-10  Nick Clifton  <nickc@cygnus.com>
: 
: 	* elflink.h (elf_link_is_defined_archive_symbol): New
: 	function: Decide if a symbol, in an archive map is there
: 	because it is defined in the archive element, or because it is
: 	just another common declaration of it.
: 	(elf_link_add_archive_symbols): Use
: 	elf_link_is_defined_archive_symbol to decide if an archive
: 	element contain a reference to a common symbol should be
: 	linked in or not.
: 
: Can anybody explain whether the "new" behaviour is intentional or accidental?

It is intentional.

This change is in order to match the behaviour of the native linkers
for Solaris and HP-UX (and possibly others, we haven't tested), and is
also necessary in order to allow libraries of FORTRAN generates
objects to be correctly linked together.

I think we would all agree that if t2.c had contained this line:

  int bar = 2;

then the linker would have been justified in issueing the error about
a multiply defined symbol.  I am not sure however, what the concessus
will be for the correct behaviour in the case you outline above.
Persoanlly I think the linker is doing the right thing in complaining,
since bar ought to only be defined and initlaised in one palce, and
the other files ought to just contain references to it.

Cheers
	Nick


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]