mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-18 21:34:13 +08:00
* elf-bfd.h (ELF_LINK_NON_GOT_REF): Define.
* elflink.h (elf_adjust_dynamic_symbol): Copy REF_REGULAR_NONWEAK and NON_GOT_REF from weak defined symbol to real symbol. * elf32-i386.c (elf_i386_check_relocs): Set NON_GOT_REF. (elf_i386_adjust_dynamic_symbol): If NON_GOT_REF is not set, don't create a COPY reloc. * elf32-sparc.c (elf32_sparc_check_relocs): Set NON_GOT_REF. (elf32_sparc_adjust_dynamic_symbol): If NON_GOT_REF is not set, don't create a COPY reloc.
This commit is contained in:
@ -1,3 +1,15 @@
|
|||||||
|
1999-09-04 Ian Lance Taylor <ian@zembu.com>
|
||||||
|
|
||||||
|
* elf-bfd.h (ELF_LINK_NON_GOT_REF): Define.
|
||||||
|
* elflink.h (elf_adjust_dynamic_symbol): Copy REF_REGULAR_NONWEAK
|
||||||
|
and NON_GOT_REF from weak defined symbol to real symbol.
|
||||||
|
* elf32-i386.c (elf_i386_check_relocs): Set NON_GOT_REF.
|
||||||
|
(elf_i386_adjust_dynamic_symbol): If NON_GOT_REF is not set, don't
|
||||||
|
create a COPY reloc.
|
||||||
|
* elf32-sparc.c (elf32_sparc_check_relocs): Set NON_GOT_REF.
|
||||||
|
(elf32_sparc_adjust_dynamic_symbol): If NON_GOT_REF is not set,
|
||||||
|
don't create a COPY reloc.
|
||||||
|
|
||||||
1999-09-03 Ian Lance Taylor <ian@zembu.com>
|
1999-09-03 Ian Lance Taylor <ian@zembu.com>
|
||||||
|
|
||||||
* elflink.h (elf_bfd_final_link): When counting relocations, don't
|
* elflink.h (elf_bfd_final_link): When counting relocations, don't
|
||||||
|
@ -189,6 +189,9 @@ struct elf_link_hash_entry
|
|||||||
#define ELF_LINK_FORCED_LOCAL 02000
|
#define ELF_LINK_FORCED_LOCAL 02000
|
||||||
/* Symbol was marked during garbage collection. */
|
/* Symbol was marked during garbage collection. */
|
||||||
#define ELF_LINK_HASH_MARK 04000
|
#define ELF_LINK_HASH_MARK 04000
|
||||||
|
/* Symbol is referenced by a non-GOT/non-PLT relocation. This is
|
||||||
|
not currently set by all the backends. */
|
||||||
|
#define ELF_LINK_NON_GOT_REF 010000
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Records local symbols to be emitted in the dynamic symbol table. */
|
/* Records local symbols to be emitted in the dynamic symbol table. */
|
||||||
|
@ -591,6 +591,9 @@ elf_i386_check_relocs (abfd, info, sec, relocs)
|
|||||||
|
|
||||||
case R_386_32:
|
case R_386_32:
|
||||||
case R_386_PC32:
|
case R_386_PC32:
|
||||||
|
if (h != NULL)
|
||||||
|
h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
|
||||||
|
|
||||||
/* If we are creating a shared library, and this is a reloc
|
/* If we are creating a shared library, and this is a reloc
|
||||||
against a global symbol, or a non PC relative reloc
|
against a global symbol, or a non PC relative reloc
|
||||||
against a local symbol, then we need to copy the reloc
|
against a local symbol, then we need to copy the reloc
|
||||||
@ -889,6 +892,11 @@ elf_i386_adjust_dynamic_symbol (info, h)
|
|||||||
if (info->shared)
|
if (info->shared)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
/* If there are no references to this symbol that do not use the
|
||||||
|
GOT, we don't need to generate a copy reloc. */
|
||||||
|
if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
/* We must allocate the symbol in our .dynbss section, which will
|
/* We must allocate the symbol in our .dynbss section, which will
|
||||||
become part of the .bss section of the executable. There will be
|
become part of the .bss section of the executable. There will be
|
||||||
an entry for this symbol in the .dynsym section. The dynamic
|
an entry for this symbol in the .dynsym section. The dynamic
|
||||||
|
@ -510,6 +510,9 @@ elf32_sparc_check_relocs (abfd, info, sec, relocs)
|
|||||||
|
|
||||||
case R_SPARC_PC10:
|
case R_SPARC_PC10:
|
||||||
case R_SPARC_PC22:
|
case R_SPARC_PC22:
|
||||||
|
if (h != NULL)
|
||||||
|
h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
|
||||||
|
|
||||||
if (h != NULL
|
if (h != NULL
|
||||||
&& strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
|
&& strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
|
||||||
break;
|
break;
|
||||||
@ -521,6 +524,9 @@ elf32_sparc_check_relocs (abfd, info, sec, relocs)
|
|||||||
case R_SPARC_WDISP22:
|
case R_SPARC_WDISP22:
|
||||||
case R_SPARC_WDISP19:
|
case R_SPARC_WDISP19:
|
||||||
case R_SPARC_WDISP16:
|
case R_SPARC_WDISP16:
|
||||||
|
if (h != NULL)
|
||||||
|
h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
|
||||||
|
|
||||||
/* If we are linking with -Bsymbolic, we do not need to copy
|
/* If we are linking with -Bsymbolic, we do not need to copy
|
||||||
a PC relative reloc against a global symbol which is
|
a PC relative reloc against a global symbol which is
|
||||||
defined in an object we are including in the link (i.e.,
|
defined in an object we are including in the link (i.e.,
|
||||||
@ -543,6 +549,9 @@ elf32_sparc_check_relocs (abfd, info, sec, relocs)
|
|||||||
case R_SPARC_13:
|
case R_SPARC_13:
|
||||||
case R_SPARC_LO10:
|
case R_SPARC_LO10:
|
||||||
case R_SPARC_UA32:
|
case R_SPARC_UA32:
|
||||||
|
if (h != NULL)
|
||||||
|
h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
|
||||||
|
|
||||||
if (info->shared)
|
if (info->shared)
|
||||||
{
|
{
|
||||||
/* When creating a shared object, we must copy these
|
/* When creating a shared object, we must copy these
|
||||||
@ -834,6 +843,11 @@ elf32_sparc_adjust_dynamic_symbol (info, h)
|
|||||||
if (info->shared)
|
if (info->shared)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
/* If there are no references to this symbol that do not use the
|
||||||
|
GOT, we don't need to generate a copy reloc. */
|
||||||
|
if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
/* We must allocate the symbol in our .dynbss section, which will
|
/* We must allocate the symbol in our .dynbss section, which will
|
||||||
become part of the .bss section of the executable. There will be
|
become part of the .bss section of the executable. There will be
|
||||||
an entry for this symbol in the .dynsym section. The dynamic
|
an entry for this symbol in the .dynsym section. The dynamic
|
||||||
|
@ -3349,10 +3349,11 @@ elf_adjust_dynamic_symbol (h, data)
|
|||||||
{
|
{
|
||||||
/* There is an implicit reference by a regular object file
|
/* There is an implicit reference by a regular object file
|
||||||
via the weak symbol. */
|
via the weak symbol. */
|
||||||
weakdef->elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR;
|
weakdef->elf_link_hash_flags |=
|
||||||
if (h->weakdef->elf_link_hash_flags
|
(ELF_LINK_HASH_REF_REGULAR
|
||||||
& ELF_LINK_HASH_REF_REGULAR_NONWEAK)
|
| (h->elf_link_hash_flags
|
||||||
weakdef->elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR_NONWEAK;
|
& (ELF_LINK_HASH_REF_REGULAR_NONWEAK
|
||||||
|
| ELF_LINK_NON_GOT_REF)));
|
||||||
if (! elf_adjust_dynamic_symbol (weakdef, (PTR) eif))
|
if (! elf_adjust_dynamic_symbol (weakdef, (PTR) eif))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user