aboutsummaryrefslogtreecommitdiff
path: root/bfd/elflink.h
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2003-06-18 05:18:06 +0000
committerAlan Modra <amodra@gmail.com>2003-06-18 05:18:06 +0000
commit64c456e1a1a185f930059aebd96e7fe8e52735fc (patch)
tree66f5c7d0f8e3e57ec4965a8ed7a8da91d7fee4df /bfd/elflink.h
parent3dab95d3244ea1c94115fb3a5bad35453fe41f59 (diff)
downloadgdb-64c456e1a1a185f930059aebd96e7fe8e52735fc.zip
gdb-64c456e1a1a185f930059aebd96e7fe8e52735fc.tar.gz
gdb-64c456e1a1a185f930059aebd96e7fe8e52735fc.tar.bz2
* elflink.h (elf_gc_record_vtentry): Revert last change. Correct
size calculation from addend. Round size up.
Diffstat (limited to 'bfd/elflink.h')
-rw-r--r--bfd/elflink.h17
1 files changed, 9 insertions, 8 deletions
diff --git a/bfd/elflink.h b/bfd/elflink.h
index 64554e7..4a7d27d 100644
--- a/bfd/elflink.h
+++ b/bfd/elflink.h
@@ -6301,30 +6301,31 @@ elf_gc_record_vtentry (abfd, sec, h, addend)
struct elf_backend_data *bed = get_elf_backend_data (abfd);
unsigned int log_file_align = bed->s->log_file_align;
- if (addend > h->vtable_entries_size)
+ if (addend >= h->vtable_entries_size)
{
- size_t size, bytes;
+ size_t size, bytes, file_align;
bfd_boolean *ptr = h->vtable_entries_used;
/* While the symbol is undefined, we have to be prepared to handle
a zero size. */
+ file_align = 1 << log_file_align;
if (h->root.type == bfd_link_hash_undefined)
- size = addend;
+ size = addend + file_align;
else
{
size = h->size;
- if (size < addend)
+ if (addend >= size)
{
/* Oops! We've got a reference past the defined end of
the table. This is probably a bug -- shall we warn? */
- size = addend;
+ size = addend + file_align;
}
}
+ size = (size + file_align - 1) & -file_align;
/* Allocate one extra entry for use as a "done" flag for the
- consolidation pass and another extra entry because we are
- going to write up to and including 'size' entries. */
- bytes = ((size >> log_file_align) + 2) * sizeof (bfd_boolean);
+ consolidation pass. */
+ bytes = ((size >> log_file_align) + 1) * sizeof (bfd_boolean);
if (ptr)
{