diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d03929ae619..6c89655664f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2021-04-14 H.J. Lu + + PR binutils/27708 + * elf.c (assign_file_positions_for_non_load_sections): Set + p_memsz to p_filesz for the loadable PT_NOTE segment. + 2021-04-14 Frederic Cambus * elf.c (elfcore_grok_netbsd_note): Remove unneeded #ifdef diff --git a/bfd/elf.c b/bfd/elf.c index ef2193b07e9..11ae2f3a81b 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -6300,6 +6300,11 @@ assign_file_positions_for_non_load_sections (bfd *abfd, { p->p_filesz = (sect->filepos - m->sections[0]->filepos + hdr->sh_size); + /* NB: p_memsz of the loadable PT_NOTE segment + should be the same as p_filesz. */ + if (p->p_type == PT_NOTE + && (hdr->sh_flags & SHF_ALLOC) != 0) + p->p_memsz = p->p_filesz; break; } } diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 8929c0700fa..b109e3e5c2a 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,11 @@ +2021-04-14 H.J. Lu + + PR binutils/27708 + * testsuite/binutils-all/x86-64/pr27708.dump: New file. + * testsuite/binutils-all/x86-64/pr27708.exe.bz2: Likewise. + * testsuite/binutils-all/x86-64/x86-64.exp: Run binutils/27708 + test. + 2021-04-14 Mark Harmstone PR 27686 diff --git a/binutils/testsuite/binutils-all/x86-64/pr27708.dump b/binutils/testsuite/binutils-all/x86-64/pr27708.dump new file mode 100644 index 00000000000..e9123df9c42 --- /dev/null +++ b/binutils/testsuite/binutils-all/x86-64/pr27708.dump @@ -0,0 +1,33 @@ + +Elf file type is DYN (Shared object file) +Entry point 0x5f0 +There are 11 program headers, starting at offset 64 + +Program Headers: + Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align + PHDR 0x000040 0x0000000000000040 0x0000000000000040 0x000268 0x000268 R 0x8 + INTERP 0x0002a8 0x00000000000002a8 0x00000000000002a8 0x00001c 0x00001c R 0x1 + [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] + LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x000938 0x000938 R E 0x1000 + LOAD 0x000da0 0x0000000000001da0 0x0000000000001da0 0x000278 0x000279 RW 0x1000 + DYNAMIC 0x000db0 0x0000000000001db0 0x0000000000001db0 0x000210 0x000210 RW 0x8 + NOTE 0x0002e8 0x00000000000002e8 0x00000000000002e8 0x000030 0x000030 R 0x8 + NOTE 0x0002c4 0x00000000000002c4 0x00000000000002c4 0x000078 0x000078 R 0x4 + GNU_EH_FRAME 0x0008ec 0x00000000000008ec 0x00000000000008ec 0x00004c 0x00004c R 0x4 + GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10 + TLS 0x000da0 0x0000000000001da0 0x0000000000001da0 0x000000 0x000009 R 0x8 + GNU_RELRO 0x000da0 0x0000000000001da0 0x0000000000001da0 0x000260 0x000260 RW 0x8 + + Section to Segment mapping: + Segment Sections... + 00 + 01 .interp + 02 .interp .note.ABI-tag .note.gnu.property .note.gnu.build-id .dynsym .dynstr .gnu.hash .hash .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame .eh_frame_hdr + 03 .fini_array .init_array .dynamic .got .got.plt .data .bss + 04 .dynamic + 05 .note.gnu.property + 06 .note.ABI-tag .note.gnu.property .note.gnu.build-id + 07 .eh_frame_hdr + 08 + 09 .tbss + 10 .fini_array .init_array .dynamic .got diff --git a/binutils/testsuite/binutils-all/x86-64/pr27708.exe.bz2 b/binutils/testsuite/binutils-all/x86-64/pr27708.exe.bz2 new file mode 100644 index 00000000000..94063c6c285 Binary files /dev/null and b/binutils/testsuite/binutils-all/x86-64/pr27708.exe.bz2 differ diff --git a/binutils/testsuite/binutils-all/x86-64/x86-64.exp b/binutils/testsuite/binutils-all/x86-64/x86-64.exp index 90fcc84c4f5..29ba1f029c4 100644 --- a/binutils/testsuite/binutils-all/x86-64/x86-64.exp +++ b/binutils/testsuite/binutils-all/x86-64/x86-64.exp @@ -58,3 +58,41 @@ if {[catch "system \"bzip2 -dc $t > $tempfile\""] != 0} { } } } + +set t $srcdir/$subdir/pr27708.exe.bz2 +# We need to strip the ".bz2", but can leave the dirname. +set test $subdir/[file tail $t] +set testname [file rootname $test] +verbose $testname +if {[catch "system \"bzip2 -dc $t > $tempfile\""] != 0} { + untested "bzip2 -dc ($testname)" +} else { + send_log "$STRIP $tempfile -o ${tempfile}.strip\n" + verbose "$STRIP $tempfile -o ${tempfile}.strip" 1 + set got [catch "system \"$STRIP $tempfile -o ${tempfile}.strip\""] + if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]]} then { + fail $testname + } else { + send_log "$READELF -lW ${tempfile}.strip > tmpdir/pr27708.out 2> /dev/null\n" + verbose "$READELF -lW ${tempfile}.strip > tmpdir/pr27708.out 2> /dev/null" 1 + set got [catch "system \"$READELF -lW ${tempfile}.strip > tmpdir/pr27708.out 2> /dev/null\""] + + if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]]} then { + fail $testname + } else { + send_log "cmp tmpdir/pr27708.out $srcdir/$subdir/pr27708.dump\n" + verbose "cmp tmpdir/pr27708.out $srcdir/$subdir/pr26808.dump" 1 + set status [remote_exec build cmp "tmpdir/pr27708.out $srcdir/$subdir/pr27708.dump"] + set exec_output [lindex $status 1] + set exec_output [prune_warnings $exec_output] + + if [string match "" $exec_output] then { + pass "strip ($testname)" + } else { + send_log "$exec_output\n" + verbose "$exec_output" 1 + fail "strip ($testname)" + } + } + } +}