]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
readelf: Update dynamic tag processing and validate section info
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 1 Jul 2026 02:15:30 +0000 (10:15 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 3 Jul 2026 13:50:49 +0000 (21:50 +0800)
commit1dcfefd8dd49e32a9880a79c8fbb9276eaade23c
tree4fb4c56059471c311abf516c4066c0b538762eb1
parente8fa604cdc98e42a6bc3c408f5a3428cb2b7c201
readelf: Update dynamic tag processing and validate section info

Count DT_RELR relocations using dynamic tags when section header isn't
used.  Ignore section sh_offset and sh_size if they are larger than file
size.

One side effect is that we now display

readelf: Warning: Ignore the out of range sh_offset value of 2199023261148 for section 17
readelf: Warning: Ignore the out of range sh_size value of 13 for section 17 with sh_offset value of 2199023261148
...
  [17] .fini             PROGBITS        00000000000015dc 000000 000000 00  AX  0   0  4
...

instead of

...
  [17] .fini             PROGBITS        00000000000015dc 200000015dc 00000d 00  AX  0   0  4
...

and segfault.

binutils/

PR binutils/34326
PR binutils/34339
* readelf.c (update_all_relocations): Skip if nentries == 0.
(validate_section_info): New.
(get_32bit_section_headers): Call validate_section_info.
(get_64bit_section_headers): Likewise.
(process_relocs): Call count_relr_relocations for relocations
from dynamic tags.  Skip if values in DT_RELENT/DT_RELAENT
are larger than values in DT_RELSZ/DT_RELASZ.
(process_got_section_contents): Skip if all_relocations_count
== 0.

ld/
PR binutils/34339
* testsuite/ld-x86-64/binutils.exp: Run PR binutils/34339 tests.
* testsuite/ld-x86-64/got-2.s: New file.
* testsuite/ld-x86-64/libgot-2.rd: Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
binutils/readelf.c
ld/testsuite/ld-x86-64/binutils.exp
ld/testsuite/ld-x86-64/got-2.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/libgot-2.rd [new file with mode: 0644]