* 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:
Ian Lance Taylor 1997-06-11 16:59:00 +00:00
parent b4a3d22176
commit 8519ea2120
5 changed files with 66 additions and 49 deletions

View file

@ -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.

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -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)