mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 19:09:31 +08:00
* elf32-i386.c (allocate_dynrelocs): Don't create a .plt entry
without a reloc when symbol visibilty makes a function local.
This commit is contained in:
@ -1,3 +1,8 @@
|
|||||||
|
2001-09-28 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* elf32-i386.c (allocate_dynrelocs): Don't create a .plt entry
|
||||||
|
without a reloc when symbol visibilty makes a function local.
|
||||||
|
|
||||||
2001-09-27 Nick Clifton <nickc@cambridge.redhat.com>
|
2001-09-27 Nick Clifton <nickc@cambridge.redhat.com>
|
||||||
|
|
||||||
* elf32-arm.h (elf32_arm_merge_private_bfd_data): Fix detection of
|
* elf32-arm.h (elf32_arm_merge_private_bfd_data): Fix detection of
|
||||||
|
@ -1263,47 +1263,52 @@ allocate_dynrelocs (h, inf)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
s = htab->splt;
|
|
||||||
if (s == NULL)
|
|
||||||
abort ();
|
|
||||||
|
|
||||||
/* If this is the first .plt entry, make room for the special
|
|
||||||
first entry. */
|
|
||||||
if (s->_raw_size == 0)
|
|
||||||
s->_raw_size += PLT_ENTRY_SIZE;
|
|
||||||
|
|
||||||
h->plt.offset = s->_raw_size;
|
|
||||||
|
|
||||||
/* If this symbol is not defined in a regular file, and we are
|
|
||||||
not generating a shared library, then set the symbol to this
|
|
||||||
location in the .plt. This is required to make function
|
|
||||||
pointers compare as equal between the normal executable and
|
|
||||||
the shared library. */
|
|
||||||
if (! info->shared
|
|
||||||
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
|
|
||||||
{
|
|
||||||
h->root.u.def.section = s;
|
|
||||||
h->root.u.def.value = h->plt.offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make room for this entry. */
|
|
||||||
s->_raw_size += PLT_ENTRY_SIZE;
|
|
||||||
|
|
||||||
/* We also need to make an entry in the .got.plt section, which
|
|
||||||
will be placed in the .got section by the linker script. */
|
|
||||||
s = htab->sgotplt;
|
|
||||||
if (s == NULL)
|
|
||||||
abort ();
|
|
||||||
s->_raw_size += 4;
|
|
||||||
|
|
||||||
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
|
if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
|
||||||
{
|
{
|
||||||
|
s = htab->splt;
|
||||||
|
if (s == NULL)
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
/* If this is the first .plt entry, make room for the special
|
||||||
|
first entry. */
|
||||||
|
if (s->_raw_size == 0)
|
||||||
|
s->_raw_size += PLT_ENTRY_SIZE;
|
||||||
|
|
||||||
|
h->plt.offset = s->_raw_size;
|
||||||
|
|
||||||
|
/* If this symbol is not defined in a regular file, and we are
|
||||||
|
not generating a shared library, then set the symbol to this
|
||||||
|
location in the .plt. This is required to make function
|
||||||
|
pointers compare as equal between the normal executable and
|
||||||
|
the shared library. */
|
||||||
|
if (! info->shared
|
||||||
|
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
|
||||||
|
{
|
||||||
|
h->root.u.def.section = s;
|
||||||
|
h->root.u.def.value = h->plt.offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make room for this entry. */
|
||||||
|
s->_raw_size += PLT_ENTRY_SIZE;
|
||||||
|
|
||||||
|
/* We also need to make an entry in the .got.plt section, which
|
||||||
|
will be placed in the .got section by the linker script. */
|
||||||
|
s = htab->sgotplt;
|
||||||
|
if (s == NULL)
|
||||||
|
abort ();
|
||||||
|
s->_raw_size += 4;
|
||||||
|
|
||||||
/* We also need to make an entry in the .rel.plt section. */
|
/* We also need to make an entry in the .rel.plt section. */
|
||||||
s = htab->srelplt;
|
s = htab->srelplt;
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
abort ();
|
abort ();
|
||||||
s->_raw_size += sizeof (Elf32_External_Rel);
|
s->_raw_size += sizeof (Elf32_External_Rel);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
h->plt.offset = (bfd_vma) -1;
|
||||||
|
h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user