diff options
author | Alan Modra <amodra@gmail.com> | 2019-11-25 10:07:40 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-11-25 14:32:19 +1030 |
commit | bb2942085c83289c56cc3ef8b9ab0ecf6267efa3 (patch) | |
tree | f5865525e08a0c12b146f56c4432ed876aa26d37 /bfd/elf.c | |
parent | 618265039f697eab9e72bb58b95fc2d32925df58 (diff) | |
download | gdb-bb2942085c83289c56cc3ef8b9ab0ecf6267efa3.zip gdb-bb2942085c83289c56cc3ef8b9ab0ecf6267efa3.tar.gz gdb-bb2942085c83289c56cc3ef8b9ab0ecf6267efa3.tar.bz2 |
Pass section when available to bfd_octets_per_byte
and other tidies. I think it's better to default to passing the
section to bfd_octets_per_byte, even in cases where we know it won't
make a difference.
A number of the coff reloc functions used bfd_octets_per_byte wrongly,
not factoring it into the offset into the data buffer. As it happens,
the targets using those files always had bfd_octets_per_byte equal to
one, so there wasn't any detectable wrong behaviour. However, it is
wrong in the source and might cause trouble for anyone creating a new
target. Besides fixing that, the patch also defines OCTETS_PER_BYTE
as one in target files where that is appropriate.
bfd/
* archures.c (bfd_octets_per_byte): Tail call
bfd_arch_mach_octets_per_byte.
* coff-arm.c (OCTETS_PER_BYTE): Define.
(coff_arm_reloc): Introduce new "octets" temp. Use OCTETS_PER_BYTE
with section. Correct "addr". Remove ATTRIBUTE_UNUSED.
* coff-i386.c (coff_i386_reloc): Similarly.
* coff-mips.c (mips_reflo_reloc): Similarly.
* coff-x86_64.c (coff_amd64_reloc): Similarly.
* elf32-msp430.c (OCTETS_PER_BYTE): Define.
(rl78_sym_diff_handler): Use OCTETS_PER_BYTE, with section.
* elf32-nds32.c (nds32_elf_get_relocated_section_contents): Similarly.
* elf32-ppc.c (ppc_elf_addr16_ha_reloc): Similarly.
* elf32-pru.c (pru_elf32_do_ldi32_relocate): Similarly.
* elf32-s12z.c (opru18_reloc): Similarly.
* elf32-sh.c (sh_elf_reloc): Similarly.
* elf32-spu.c (spu_elf_rel9): Similarly.
* elf32-xtensa.c (bfd_elf_xtensa_reloc): Similarly.
* elf64-ppc.c (ppc64_elf_ha_reloc, ppc64_elf_brtaken_reloc),
(ppc64_elf_toc64_reloc): Similarly.
* bfd.c (bfd_get_section_limit): Pass section to bfd_octets_per_byte.
* cofflink.c (_bfd_coff_link_input_bfd),
(_bfd_coff_reloc_link_order): Likewise.
* elf.c (_bfd_elf_section_offset): Likewise.
* elflink.c (resolve_section, bfd_elf_perform_complex_relocation),
(elf_link_input_bfd, elf_reloc_link_order, elf_fixup_link_order),
(bfd_elf_final_link): Likewise.
* elf.c (_bfd_elf_make_section_from_shdr): Don't strncmp twice
to set SEC_ELF_OCTETS.
* reloc.c (bfd_perform_relocation): Tidy SEC_ELF_OCTETS special case.
(bfd_install_relocation): Likewise.
(_bfd_final_link_relocate): Don't recalculate octets.
* syms.c (_bfd_stab_section_find_nearest_line): Introduc new
"octets" temp.
* bfd-in2.h: Regenerate.
ld/
* ldexp.c (fold_name): Pass section to bfd_octets_per_byte.
* ldlang.c (init_opb): Don't call bfd_arch_mach_octets_per_byte
unnecessarily.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r-- | bfd/elf.c | 38 |
1 files changed, 11 insertions, 27 deletions
@@ -1102,33 +1102,17 @@ _bfd_elf_make_section_from_shdr (bfd *abfd, not any sort of flag. Their SEC_ALLOC bits are cleared. */ if (name [0] == '.') { - const char *p; - int n; - if (name[1] == 'd') - p = ".debug", n = 6; - else if (name[1] == 'g' && name[2] == 'n') - p = ".gnu.linkonce.wi.", n = 17; - else if (name[1] == 'g' && name[2] == 'd') - p = ".gdb_index", n = 11; /* yes we really do mean 11. */ - else if (name[1] == 'l') - p = ".line", n = 5; - else if (name[1] == 's') - p = ".stab", n = 5; - else if (name[1] == 'z') - p = ".zdebug", n = 7; - else - p = NULL, n = 0; - if (p != NULL && strncmp (name, p, n) == 0) + if (strncmp (name, ".debug", 6) == 0 + || strncmp (name, ".gnu.linkonce.wi.", 17) == 0 + || strncmp (name, ".zdebug", 7) == 0) + flags |= SEC_DEBUGGING | SEC_ELF_OCTETS; + else if (strncmp (name, GNU_BUILD_ATTRS_SECTION_NAME, 21) == 0 + || strncmp (name, ".note.gnu", 9) == 0) + flags |= SEC_ELF_OCTETS; + else if (strncmp (name, ".line", 5) == 0 + || strncmp (name, ".stab", 5) == 0 + || strcmp (name, ".gdb_index") == 0) flags |= SEC_DEBUGGING; - - /* DWARF debug sections and ELF notes are organized in octets. */ - if (strncmp (name, ".debug", 6) == 0 || - strncmp (name, ".zdebug", 7) == 0 || - strncmp (name, GNU_BUILD_ATTRS_SECTION_NAME, 21) == 0 || - strncmp (name, ".note.gnu", 9) == 0) - { - flags |= SEC_ELF_OCTETS; - } } } @@ -12064,7 +12048,7 @@ _bfd_elf_section_offset (bfd *abfd, /* address_size and sec->size are in octets. Convert to bytes before subtracting the original offset. */ offset = ((sec->size - address_size) - / bfd_octets_per_byte (abfd, NULL) - offset); + / bfd_octets_per_byte (abfd, sec) - offset); } return offset; } |