2003-11-22 Jakub Jelinek <jakub@redhat.com>

* elf-bfd.h (ELF_LINK_POINTER_EQUALITY_NEEDED): Define new flag.
	* elf.c (_bfd_elf_link_hash_copy_indirect): Copy it.
	* elf32-i386.c (elf_i386_copy_indirect_symbol): Likewise.
	(elf_i386_check_relocs): Set it.
	(elf_i386_finish_dynamic_symbol): If it is not set,
	clear st_value of SHN_UNDEF symbol.
This commit is contained in:
Jakub Jelinek
2003-11-22 10:45:44 +00:00
parent f22b3cafc9
commit c6585bbb10
4 changed files with 25 additions and 4 deletions

View File

@ -1,3 +1,12 @@
2003-11-22 Jakub Jelinek <jakub@redhat.com>
* elf-bfd.h (ELF_LINK_POINTER_EQUALITY_NEEDED): Define new flag.
* elf.c (_bfd_elf_link_hash_copy_indirect): Copy it.
* elf32-i386.c (elf_i386_copy_indirect_symbol): Likewise.
(elf_i386_check_relocs): Set it.
(elf_i386_finish_dynamic_symbol): If it is not set,
clear st_value of SHN_UNDEF symbol.
2003-11-20 Jim Blandy <jimb@redhat.com> 2003-11-20 Jim Blandy <jimb@redhat.com>
* cpu-powerpc.c (powerpc_compatible): Any ISA in the PowerPC * cpu-powerpc.c (powerpc_compatible): Any ISA in the PowerPC

View File

@ -200,6 +200,9 @@ struct elf_link_hash_entry
#define ELF_LINK_DYNAMIC_DEF 020000 #define ELF_LINK_DYNAMIC_DEF 020000
/* Symbol is weak in all shared objects. */ /* Symbol is weak in all shared objects. */
#define ELF_LINK_DYNAMIC_WEAK 040000 #define ELF_LINK_DYNAMIC_WEAK 040000
/* Symbol is referenced with a relocation where C/C++ pointer equality
matters. */
#define ELF_LINK_POINTER_EQUALITY_NEEDED 0100000
}; };
/* Will references to this symbol always reference the symbol /* Will references to this symbol always reference the symbol

View File

@ -1359,7 +1359,8 @@ _bfd_elf_link_hash_copy_indirect (const struct elf_backend_data *bed,
| ELF_LINK_HASH_REF_REGULAR | ELF_LINK_HASH_REF_REGULAR
| ELF_LINK_HASH_REF_REGULAR_NONWEAK | ELF_LINK_HASH_REF_REGULAR_NONWEAK
| ELF_LINK_NON_GOT_REF | ELF_LINK_NON_GOT_REF
| ELF_LINK_HASH_NEEDS_PLT)); | ELF_LINK_HASH_NEEDS_PLT
| ELF_LINK_POINTER_EQUALITY_NEEDED));
if (ind->root.type != bfd_link_hash_indirect) if (ind->root.type != bfd_link_hash_indirect)
return; return;

View File

@ -771,7 +771,8 @@ elf_i386_copy_indirect_symbol (const struct elf_backend_data *bed,
(ind->elf_link_hash_flags & (ELF_LINK_HASH_REF_DYNAMIC (ind->elf_link_hash_flags & (ELF_LINK_HASH_REF_DYNAMIC
| ELF_LINK_HASH_REF_REGULAR | ELF_LINK_HASH_REF_REGULAR
| ELF_LINK_HASH_REF_REGULAR_NONWEAK | ELF_LINK_HASH_REF_REGULAR_NONWEAK
| ELF_LINK_HASH_NEEDS_PLT)); | ELF_LINK_HASH_NEEDS_PLT
| ELF_LINK_POINTER_EQUALITY_NEEDED));
else else
_bfd_elf_link_hash_copy_indirect (bed, dir, ind); _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
} }
@ -1001,6 +1002,8 @@ elf_i386_check_relocs (bfd *abfd,
/* We may need a .plt entry if the function this reloc /* We may need a .plt entry if the function this reloc
refers to is in a shared lib. */ refers to is in a shared lib. */
h->plt.refcount += 1; h->plt.refcount += 1;
if (r_type != R_386_PC32)
h->elf_link_hash_flags |= ELF_LINK_POINTER_EQUALITY_NEEDED;
} }
/* If we are creating a shared library, and this is a reloc /* If we are creating a shared library, and this is a reloc
@ -3004,11 +3007,16 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
{ {
/* Mark the symbol as undefined, rather than as defined in /* Mark the symbol as undefined, rather than as defined in
the .plt section. Leave the value alone. This is a clue the .plt section. Leave the value if there were any
relocations where pointer equality matters (this is a clue
for the dynamic linker, to make function pointer for the dynamic linker, to make function pointer
comparisons work between an application and shared comparisons work between an application and shared
library. */ library), otherwise set it to zero. If a function is only
called from a binary, there is no need to slow down
shared libraries because of that. */
sym->st_shndx = SHN_UNDEF; sym->st_shndx = SHN_UNDEF;
if ((h->elf_link_hash_flags & ELF_LINK_POINTER_EQUALITY_NEEDED) == 0)
sym->st_value = 0;
} }
} }