* elflink.h (elf_link_output_extsym): Call finish_dynamic_symbol
for a symbol which is being forced to be local. * elf32-i386.c (elf_i386_relocate_section): Write out the relocation value for a GOT reloc for a symbol which is turning into a local symbol. (elf_i386_finish_dynamic_symbol): If a symbol is turning into a local symbol, write out a RELATIVE reloc rather than a GLOB_DAT reloc. * elf32-m68k.c, elf32-sparc.c: Corresponding changes.
This commit is contained in:
parent
b4a3d22176
commit
8519ea2120
5 changed files with 66 additions and 49 deletions
|
@ -1,5 +1,15 @@
|
||||||
Wed Jun 11 00:00:07 1997 Ian Lance Taylor <ian@cygnus.com>
|
Wed Jun 11 00:00:07 1997 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
|
||||||
|
* elflink.h (elf_link_output_extsym): Call finish_dynamic_symbol
|
||||||
|
for a symbol which is being forced to be local.
|
||||||
|
* elf32-i386.c (elf_i386_relocate_section): Write out the
|
||||||
|
relocation value for a GOT reloc for a symbol which is turning
|
||||||
|
into a local symbol.
|
||||||
|
(elf_i386_finish_dynamic_symbol): If a symbol is turning into a
|
||||||
|
local symbol, write out a RELATIVE reloc rather than a GLOB_DAT
|
||||||
|
reloc.
|
||||||
|
* elf32-m68k.c, elf32-sparc.c: Corresponding changes.
|
||||||
|
|
||||||
* elf32-i386.c (elf_i386_relocate_section): Get the relocation
|
* elf32-i386.c (elf_i386_relocate_section): Get the relocation
|
||||||
value if the symbol is turning into a local symbol.
|
value if the symbol is turning into a local symbol.
|
||||||
* elf32-m68k.c (elf_m68k_relocate_section): Likewise.
|
* elf32-m68k.c (elf_m68k_relocate_section): Likewise.
|
||||||
|
@ -10,7 +20,7 @@ Wed Jun 11 00:00:07 1997 Ian Lance Taylor <ian@cygnus.com>
|
||||||
* elflink.h (elf_link_add_object_symbols): Also read verneed
|
* elflink.h (elf_link_add_object_symbols): Also read verneed
|
||||||
information by calling `_bfd_elf_slurp_version_tables'.
|
information by calling `_bfd_elf_slurp_version_tables'.
|
||||||
(elf_link_add_object_symbols): For undefined symbols look for
|
(elf_link_add_object_symbols): For undefined symbols look for
|
||||||
version informaiton in the verneed records.
|
version information in the verneed records.
|
||||||
(elf_link_add_object_symbols): Use soname of shared object
|
(elf_link_add_object_symbols): Use soname of shared object
|
||||||
for verneed record if it is available.
|
for verneed record if it is available.
|
||||||
|
|
||||||
|
|
|
@ -1179,7 +1179,7 @@ elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
|| (r_type == R_386_GOT32
|
|| (r_type == R_386_GOT32
|
||||||
&& elf_hash_table (info)->dynamic_sections_created
|
&& elf_hash_table (info)->dynamic_sections_created
|
||||||
&& (! info->shared
|
&& (! info->shared
|
||||||
|| ! info->symbolic
|
|| (! info->symbolic && h->dynindx != -1)
|
||||||
|| (h->elf_link_hash_flags
|
|| (h->elf_link_hash_flags
|
||||||
& ELF_LINK_HASH_DEF_REGULAR) == 0))
|
& ELF_LINK_HASH_DEF_REGULAR) == 0))
|
||||||
|| (info->shared
|
|| (info->shared
|
||||||
|
@ -1241,15 +1241,16 @@ elf_i386_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
|
|
||||||
if (! elf_hash_table (info)->dynamic_sections_created
|
if (! elf_hash_table (info)->dynamic_sections_created
|
||||||
|| (info->shared
|
|| (info->shared
|
||||||
&& info->symbolic
|
&& (info->symbolic || h->dynindx == -1)
|
||||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
|
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
|
||||||
{
|
{
|
||||||
/* This is actually a static link, or it is a
|
/* This is actually a static link, or it is a
|
||||||
-Bsymbolic link and the symbol is defined
|
-Bsymbolic link and the symbol is defined
|
||||||
locally. We must initialize this entry in the
|
locally, or the symbol was forced to be local
|
||||||
global offset table. Since the offset must
|
because of a version file. We must initialize
|
||||||
always be a multiple of 4, we use the least
|
this entry in the global offset table. Since the
|
||||||
significant bit to record whether we have
|
offset must always be a multiple of 4, we use the
|
||||||
|
least significant bit to record whether we have
|
||||||
initialized it already.
|
initialized it already.
|
||||||
|
|
||||||
When doing a dynamic link, we create a .rel.got
|
When doing a dynamic link, we create a .rel.got
|
||||||
|
@ -1623,8 +1624,6 @@ elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
|
||||||
/* This symbol has an entry in the global offset table. Set it
|
/* This symbol has an entry in the global offset table. Set it
|
||||||
up. */
|
up. */
|
||||||
|
|
||||||
BFD_ASSERT (h->dynindx != -1);
|
|
||||||
|
|
||||||
sgot = bfd_get_section_by_name (dynobj, ".got");
|
sgot = bfd_get_section_by_name (dynobj, ".got");
|
||||||
srel = bfd_get_section_by_name (dynobj, ".rel.got");
|
srel = bfd_get_section_by_name (dynobj, ".rel.got");
|
||||||
BFD_ASSERT (sgot != NULL && srel != NULL);
|
BFD_ASSERT (sgot != NULL && srel != NULL);
|
||||||
|
@ -1634,11 +1633,12 @@ elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym)
|
||||||
+ (h->got_offset &~ 1));
|
+ (h->got_offset &~ 1));
|
||||||
|
|
||||||
/* If this is a -Bsymbolic link, and the symbol is defined
|
/* If this is a -Bsymbolic link, and the symbol is defined
|
||||||
locally, we just want to emit a RELATIVE reloc. The entry in
|
locally, we just want to emit a RELATIVE reloc. Likewise if
|
||||||
the global offset table will already have been initialized in
|
the symbol was forced to be local because of a version file.
|
||||||
the relocate_section function. */
|
The entry in the global offset table will already have been
|
||||||
|
initialized in the relocate_section function. */
|
||||||
if (info->shared
|
if (info->shared
|
||||||
&& info->symbolic
|
&& (info->symbolic || h->dynindx == -1)
|
||||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
|
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
|
||||||
rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
|
rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
|
||||||
else
|
else
|
||||||
|
|
|
@ -1125,7 +1125,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
"_GLOBAL_OFFSET_TABLE_") != 0))
|
"_GLOBAL_OFFSET_TABLE_") != 0))
|
||||||
&& elf_hash_table (info)->dynamic_sections_created
|
&& elf_hash_table (info)->dynamic_sections_created
|
||||||
&& (! info->shared
|
&& (! info->shared
|
||||||
|| ! info->symbolic
|
|| (! info->symbolic && h->dynindx != -1)
|
||||||
|| (h->elf_link_hash_flags
|
|| (h->elf_link_hash_flags
|
||||||
& ELF_LINK_HASH_DEF_REGULAR) == 0))
|
& ELF_LINK_HASH_DEF_REGULAR) == 0))
|
||||||
|| (info->shared
|
|| (info->shared
|
||||||
|
@ -1197,16 +1197,17 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
|
|
||||||
if (!elf_hash_table (info)->dynamic_sections_created
|
if (!elf_hash_table (info)->dynamic_sections_created
|
||||||
|| (info->shared
|
|| (info->shared
|
||||||
&& info->symbolic
|
&& (info->symbolic || h->dynindx == -1)
|
||||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
|
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
|
||||||
{
|
{
|
||||||
/* This is actually a static link, or it is a
|
/* This is actually a static link, or it is a
|
||||||
-Bsymbolic link and the symbol is defined
|
-Bsymbolic link and the symbol is defined
|
||||||
locally. We must initialize this entry in the
|
locally, or the symbol was forced to be local
|
||||||
global offset table. Since the offset must
|
because of a version file.. We must initialize
|
||||||
always be a multiple of 4, we use the least
|
this entry in the global offset table. Since
|
||||||
significant bit to record whether we have
|
the offset must always be a multiple of 4, we
|
||||||
initialized it already.
|
use the least significant bit to record whether
|
||||||
|
we have initialized it already.
|
||||||
|
|
||||||
When doing a dynamic link, we create a .rela.got
|
When doing a dynamic link, we create a .rela.got
|
||||||
relocation entry to initialize the value. This
|
relocation entry to initialize the value. This
|
||||||
|
@ -1607,8 +1608,6 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
|
||||||
/* This symbol has an entry in the global offset table. Set it
|
/* This symbol has an entry in the global offset table. Set it
|
||||||
up. */
|
up. */
|
||||||
|
|
||||||
BFD_ASSERT (h->dynindx != -1);
|
|
||||||
|
|
||||||
sgot = bfd_get_section_by_name (dynobj, ".got");
|
sgot = bfd_get_section_by_name (dynobj, ".got");
|
||||||
srela = bfd_get_section_by_name (dynobj, ".rela.got");
|
srela = bfd_get_section_by_name (dynobj, ".rela.got");
|
||||||
BFD_ASSERT (sgot != NULL && srela != NULL);
|
BFD_ASSERT (sgot != NULL && srela != NULL);
|
||||||
|
@ -1618,11 +1617,12 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
|
||||||
+ (h->got_offset &~ 1));
|
+ (h->got_offset &~ 1));
|
||||||
|
|
||||||
/* If this is a -Bsymbolic link, and the symbol is defined
|
/* If this is a -Bsymbolic link, and the symbol is defined
|
||||||
locally, we just want to emit a RELATIVE reloc. The entry in
|
locally, we just want to emit a RELATIVE reloc. Likewise if
|
||||||
the global offset table will already have been initialized in
|
the symbol was forced to be local because of a version file.
|
||||||
the relocate_section function. */
|
The entry in the global offset table will already have been
|
||||||
|
initialized in the relocate_section function. */
|
||||||
if (info->shared
|
if (info->shared
|
||||||
&& info->symbolic
|
&& (info->symbolic || h->dynindx == -1)
|
||||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
|
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
|
||||||
{
|
{
|
||||||
rela.r_info = ELF32_R_INFO (0, R_68K_RELATIVE);
|
rela.r_info = ELF32_R_INFO (0, R_68K_RELATIVE);
|
||||||
|
|
|
@ -1050,7 +1050,7 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
|| r_type == R_SPARC_GOT22)
|
|| r_type == R_SPARC_GOT22)
|
||||||
&& elf_hash_table (info)->dynamic_sections_created
|
&& elf_hash_table (info)->dynamic_sections_created
|
||||||
&& (! info->shared
|
&& (! info->shared
|
||||||
|| ! info->symbolic
|
|| (! info->symbolic && h->dynindx != -1)
|
||||||
|| (h->elf_link_hash_flags
|
|| (h->elf_link_hash_flags
|
||||||
& ELF_LINK_HASH_DEF_REGULAR) == 0))
|
& ELF_LINK_HASH_DEF_REGULAR) == 0))
|
||||||
|| (info->shared
|
|| (info->shared
|
||||||
|
@ -1123,15 +1123,16 @@ elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
|
|
||||||
if (! elf_hash_table (info)->dynamic_sections_created
|
if (! elf_hash_table (info)->dynamic_sections_created
|
||||||
|| (info->shared
|
|| (info->shared
|
||||||
&& info->symbolic
|
&& (info->symbolic || h->dynindx == -1)
|
||||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
|
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
|
||||||
{
|
{
|
||||||
/* This is actually a static link, or it is a
|
/* This is actually a static link, or it is a
|
||||||
-Bsymbolic link and the symbol is defined
|
-Bsymbolic link and the symbol is defined
|
||||||
locally. We must initialize this entry in the
|
locally, or the symbol was forced to be local
|
||||||
global offset table. Since the offset must
|
because of a version file. We must initialize
|
||||||
always be a multiple of 4, we use the least
|
this entry in the global offset table. Since the
|
||||||
significant bit to record whether we have
|
offset must always be a multiple of 4, we use the
|
||||||
|
least significant bit to record whether we have
|
||||||
initialized it already.
|
initialized it already.
|
||||||
|
|
||||||
When doing a dynamic link, we create a .rela.got
|
When doing a dynamic link, we create a .rela.got
|
||||||
|
@ -1498,8 +1499,6 @@ elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym)
|
||||||
/* This symbol has an entry in the global offset table. Set it
|
/* This symbol has an entry in the global offset table. Set it
|
||||||
up. */
|
up. */
|
||||||
|
|
||||||
BFD_ASSERT (h->dynindx != -1);
|
|
||||||
|
|
||||||
sgot = bfd_get_section_by_name (dynobj, ".got");
|
sgot = bfd_get_section_by_name (dynobj, ".got");
|
||||||
srela = bfd_get_section_by_name (dynobj, ".rela.got");
|
srela = bfd_get_section_by_name (dynobj, ".rela.got");
|
||||||
BFD_ASSERT (sgot != NULL && srela != NULL);
|
BFD_ASSERT (sgot != NULL && srela != NULL);
|
||||||
|
@ -1509,11 +1508,12 @@ elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym)
|
||||||
+ (h->got_offset &~ 1));
|
+ (h->got_offset &~ 1));
|
||||||
|
|
||||||
/* If this is a -Bsymbolic link, and the symbol is defined
|
/* If this is a -Bsymbolic link, and the symbol is defined
|
||||||
locally, we just want to emit a RELATIVE reloc. The entry in
|
locally, we just want to emit a RELATIVE reloc. Likewise if
|
||||||
the global offset table will already have been initialized in
|
the symbol was forced to be local because of a version file.
|
||||||
the relocate_section function. */
|
The entry in the global offset table will already have been
|
||||||
|
initialized in the relocate_section function. */
|
||||||
if (info->shared
|
if (info->shared
|
||||||
&& info->symbolic
|
&& (info->symbolic || h->dynindx == -1)
|
||||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
|
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
|
||||||
rela.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
|
rela.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE);
|
||||||
else
|
else
|
||||||
|
|
|
@ -4123,6 +4123,24 @@ elf_link_output_extsym (h, data)
|
||||||
((struct elf_link_hash_entry *) h->root.u.i.link, data));
|
((struct elf_link_hash_entry *) h->root.u.i.link, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Give the processor backend a chance to tweak the symbol value,
|
||||||
|
and also to finish up anything that needs to be done for this
|
||||||
|
symbol. */
|
||||||
|
if ((h->dynindx != -1
|
||||||
|
|| (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0)
|
||||||
|
&& elf_hash_table (finfo->info)->dynamic_sections_created)
|
||||||
|
{
|
||||||
|
struct elf_backend_data *bed;
|
||||||
|
|
||||||
|
bed = get_elf_backend_data (finfo->output_bfd);
|
||||||
|
if (! ((*bed->elf_backend_finish_dynamic_symbol)
|
||||||
|
(finfo->output_bfd, finfo->info, h, &sym)))
|
||||||
|
{
|
||||||
|
eoinfo->failed = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* If this symbol should be put in the .dynsym section, then put it
|
/* If this symbol should be put in the .dynsym section, then put it
|
||||||
there now. We have already know the symbol index. We also fill
|
there now. We have already know the symbol index. We also fill
|
||||||
in the entry in the .hash section. */
|
in the entry in the .hash section. */
|
||||||
|
@ -4139,17 +4157,6 @@ elf_link_output_extsym (h, data)
|
||||||
|
|
||||||
sym.st_name = h->dynstr_index;
|
sym.st_name = h->dynstr_index;
|
||||||
|
|
||||||
/* Give the processor backend a chance to tweak the symbol
|
|
||||||
value, and also to finish up anything that needs to be done
|
|
||||||
for this symbol. */
|
|
||||||
bed = get_elf_backend_data (finfo->output_bfd);
|
|
||||||
if (! ((*bed->elf_backend_finish_dynamic_symbol)
|
|
||||||
(finfo->output_bfd, finfo->info, h, &sym)))
|
|
||||||
{
|
|
||||||
eoinfo->failed = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
elf_swap_symbol_out (finfo->output_bfd, &sym,
|
elf_swap_symbol_out (finfo->output_bfd, &sym,
|
||||||
(PTR) (((Elf_External_Sym *)
|
(PTR) (((Elf_External_Sym *)
|
||||||
finfo->dynsym_sec->contents)
|
finfo->dynsym_sec->contents)
|
||||||
|
|
Loading…
Reference in a new issue