aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf32-i386.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2001-09-27 16:10:28 +0000
committerAlan Modra <amodra@gmail.com>2001-09-27 16:10:28 +0000
commitced53ee5daeb7e1f0d2f86fc7f70857b8e8b60cf (patch)
tree34fb2fc4cfe68bc951d3c77d01156f2ca67b9afb /bfd/elf32-i386.c
parent06317a278f74fc5d84e23b4046a14eac883f015d (diff)
downloadgdb-ced53ee5daeb7e1f0d2f86fc7f70857b8e8b60cf.zip
gdb-ced53ee5daeb7e1f0d2f86fc7f70857b8e8b60cf.tar.gz
gdb-ced53ee5daeb7e1f0d2f86fc7f70857b8e8b60cf.tar.bz2
* elf32-i386.c (allocate_dynrelocs): Don't create a .plt entry
without a reloc when symbol visibilty makes a function local.
Diffstat (limited to 'bfd/elf32-i386.c')
-rw-r--r--bfd/elf32-i386.c63
1 files changed, 34 insertions, 29 deletions
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 019a2d0..4cfd0fa 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -1263,47 +1263,52 @@ allocate_dynrelocs (h, inf)
return false;
}
- s = htab->splt;
- if (s == NULL)
- abort ();
+ 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;
+ /* 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;
+ 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;
- }
+ /* 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;
+ /* 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 .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))
- {
/* We also need to make an entry in the .rel.plt section. */
s = htab->srelplt;
if (s == NULL)
abort ();
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
{