diff options
author | Jan Beulich <jbeulich@suse.com> | 2025-04-14 14:23:53 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2025-04-14 14:23:53 +0200 |
commit | 8fa7162be556f60fdbd146d2a38c1c7e776ead36 (patch) | |
tree | 7ea87fdc385dca977142355fa294be901ce782a2 | |
parent | 7c96ca457993267db20d31d239e3d84c2c48f1ec (diff) | |
download | binutils-8fa7162be556f60fdbd146d2a38c1c7e776ead36.zip binutils-8fa7162be556f60fdbd146d2a38c1c7e776ead36.tar.gz binutils-8fa7162be556f60fdbd146d2a38c1c7e776ead36.tar.bz2 |
bfd/ELF/x86: avoid layering violation in link hash table entry init
There's no reason not to do as the comment says, just like all other
architectures do when they need custom field: Call the allocation method
of the "superclass". Which is the ELF one, of which in turn the BFD one
is the "superclass", dealt with accordingly by
_bfd_elf_link_hash_newfunc().
-rw-r--r-- | bfd/elfxx-x86.c | 20 |
1 files changed, 3 insertions, 17 deletions
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index 6ea41f2..bc9bb70 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -609,8 +609,7 @@ _bfd_elf_x86_get_local_sym_hash (struct elf_x86_link_hash_table *htab, return &ret->elf; } -/* Create an entry in a x86 ELF linker hash table. NB: THIS MUST BE IN - SYNC WITH _bfd_elf_link_hash_newfunc. */ +/* Create an entry in an x86 ELF linker hash table. */ struct bfd_hash_entry * _bfd_x86_elf_link_hash_newfunc (struct bfd_hash_entry *entry, @@ -629,27 +628,14 @@ _bfd_x86_elf_link_hash_newfunc (struct bfd_hash_entry *entry, } /* Call the allocation method of the superclass. */ - entry = _bfd_link_hash_newfunc (entry, table, string); + entry = _bfd_elf_link_hash_newfunc (entry, table, string); if (entry != NULL) { struct elf_x86_link_hash_entry *eh = (struct elf_x86_link_hash_entry *) entry; - struct elf_link_hash_table *htab - = (struct elf_link_hash_table *) table; - memset (&eh->elf.size, 0, - (sizeof (struct elf_x86_link_hash_entry) - - offsetof (struct elf_link_hash_entry, size))); + memset (&eh->elf + 1, 0, sizeof (*eh) - sizeof (eh->elf)); /* Set local fields. */ - eh->elf.indx = -1; - eh->elf.dynindx = -1; - eh->elf.got = htab->init_got_refcount; - eh->elf.plt = htab->init_plt_refcount; - /* Assume that we have been called by a non-ELF symbol reader. - This flag is then reset by the code which reads an ELF input - file. This ensures that a symbol created by a non-ELF symbol - reader will have the flag set correctly. */ - eh->elf.non_elf = 1; eh->plt_second.offset = (bfd_vma) -1; eh->plt_got.offset = (bfd_vma) -1; eh->tlsdesc_got = (bfd_vma) -1; |