[new test case jluu@mainsoft.com: Re: Possible linker problem]
Geoff Keating
geoffk@cygnus.com
Tue Mar 14 14:08:00 GMT 2000
> From: "Jose Luu" <jluu@mainsoft.com>
> Cc: <binutils@sourceware.cygnus.com>
> Date: Tue, 14 Mar 2000 19:40:44 +0100
> The executable is referencing a symbol in the shared library with no intent
> to override (declared as external int).
>
> The shared library is linked with Bsymbolic.
>
> The result is that the said symbol also becomes defined in the executable,
> so we have 2 symbols with the same name and the confusion that results.
I see. The problem is that the executable has the address of the
variable hard-coded and so uses a R_*_COPY reloc; but the dso also
'knows' where the variable is and doesn't have the information in
relocs to let the symbol be in the executable.
eg. on ppc the following DSO:
int foo = 3;
int getfoo(void) { return foo; }
generates the following relocs:
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
000405c8 R_PPC_RELATIVE *ABS*+0x0004065c
00040670 R_PPC_RELATIVE *ABS*+0x000405cc
0004066c R_PPC_RELATIVE *ABS*+0x000405c8
00040674 R_PPC_RELATIVE *ABS*+0x00040654
00040678 R_PPC_RELATIVE *ABS*+0x00040680
but it needs to explicitly have relocs against 'foo', like this:
00040674 R_PPC_GLOB_DAT foo
because 'foo' might be in the executable.
There is probably a similar problem with taking the address of functions.
This should actually simplify 'ld' a bit, because much of the
special-case handling for -Bsymbolic should probably go away; the
handling must happen in ld.so instead (hopefully ld.so handles it
right).
--
- Geoffrey Keating <geoffk@cygnus.com>
More information about the Binutils
mailing list