diff options
author | Alan Modra <amodra@gmail.com> | 2020-03-24 10:42:45 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2020-03-25 14:51:41 +1030 |
commit | d16e3d2e5b717cf83c1fe47a70e0a9f2c2024a44 (patch) | |
tree | c47ce831be747a5f74e963ef3ac523514576b0fe | |
parent | 0d4a4bc56fc947565ef0dd4b440a157e7d592b09 (diff) | |
download | gdb-d16e3d2e5b717cf83c1fe47a70e0a9f2c2024a44.zip gdb-d16e3d2e5b717cf83c1fe47a70e0a9f2c2024a44.tar.gz gdb-d16e3d2e5b717cf83c1fe47a70e0a9f2c2024a44.tar.bz2 |
PR25662, invalid sh_offset for first section in segment with phdrs
PR 25662
* elf.c (assign_file_positions_for_load_sections): Adjust offset
for SHT_NOBITS section if first in segment.
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elf.c | 22 |
2 files changed, 25 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f273ea5..b4160c9 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2020-03-25 Alan Modra <amodra@gmail.com> + + PR 25662 + * elf.c (assign_file_positions_for_load_sections): Adjust offset + for SHT_NOBITS section if first in segment. + 2020-03-24 H.J. Lu <hongjiu.lu@intel.com> PR binutils/25708 @@ -5833,10 +5833,11 @@ assign_file_positions_for_load_sections (bfd *abfd, } p->p_memsz += adjust; - if (this_hdr->sh_type != SHT_NOBITS) + if (p->p_type == PT_LOAD) { - if (p->p_type == PT_LOAD) + if (this_hdr->sh_type != SHT_NOBITS) { + off_adjust = 0; if (p->p_filesz + adjust < p->p_memsz) { /* We have a PROGBITS section following NOBITS ones. @@ -5846,10 +5847,25 @@ assign_file_positions_for_load_sections (bfd *abfd, if (!write_zeros (abfd, off, adjust)) return FALSE; } + } + /* We only adjust sh_offset in SHT_NOBITS sections + as would seem proper for their address when the + section is first in the segment. sh_offset + doesn't really have any significance for + SHT_NOBITS anyway, apart from a notional position + relative to other sections. Historically we + didn't bother with adjusting sh_offset and some + programs depend on it not being adjusted. See + pr12921 and pr25662. */ + if (this_hdr->sh_type != SHT_NOBITS || i == 0) + { off += adjust; + if (this_hdr->sh_type == SHT_NOBITS) + off_adjust += adjust; } - p->p_filesz += adjust; } + if (this_hdr->sh_type != SHT_NOBITS) + p->p_filesz += adjust; } if (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core) |