This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PR symtab/21126] Fix handling of fully zeroed PT_GNU_RELRO
- From: "Doug Evans via gdb-patches" <gdb-patches at sourceware dot org>
- To: gdb-patches at sourceware dot org
- Date: Fri, 10 Feb 2017 00:01:16 +0000
- Subject: [PR symtab/21126] Fix handling of fully zeroed PT_GNU_RELRO
- Authentication-results: sourceware.org; auth=none
- Reply-to: Doug Evans <dje at google dot com>
Hi. I tripped over this on Fuchsia.
strip can now fully zero out the PT_GNU_RELRO segment header.
I don't see a need to test this segment at all. If the PT_LOAD segments
match I'm ok with saying "good to go".
Fix handling of fully zeroed PT_GNU_RELRO
From PR 21126:
strip can now fully zero out PT_GNU_RELRO segments
(as in even the segment type is changed to PT_NULL).
The bug has been seen with recent versions of strip on clang-built
binaries
when used with gdbserver.
gdb's exec_bfd needs to be the non-stripped version and the program
running
needs to be the stripped version in order to see the bug.
gdb/ChangeLog:
PR symtab/21126
* solib-svr4.c (svr4_exec_displacment): Ignore PT_GNU_RELRO segment.
testsuite/ChangeLog:
PR symtab/21126
* gdb.server/stripped-pie.exp: New testcase.
2017-02-09 Doug Evans <dje@google.com>
PR symtab/21126
* solib-svr4.c (svr4_exec_displacment): Ignore PT_GNU_RELRO segment.
2017-02-09 Doug Evans <dje@google.com>
PR symtab/21126
* gdb.server/stripped-pie.exp: New testcase.
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 4f52251a62..82904fe588 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -2777,25 +2777,10 @@ svr4_exec_displacement (CORE_ADDR *displacementp)
/* Strip modifies the flags and alignment of PT_GNU_RELRO.
CentOS-5 has problems with filesz, memsz as well.
- See PR 11786. */
+ And strip may now fully zero out the section, so just
+ ignore it. See PR 11786, 21126. */
if (phdr2[i].p_type == PT_GNU_RELRO)
- {
- Elf32_External_Phdr tmp_phdr = *phdrp;
- Elf32_External_Phdr tmp_phdr2 = *phdr2p;
-
- memset (tmp_phdr.p_filesz, 0, 4);
- memset (tmp_phdr.p_memsz, 0, 4);
- memset (tmp_phdr.p_flags, 0, 4);
- memset (tmp_phdr.p_align, 0, 4);
- memset (tmp_phdr2.p_filesz, 0, 4);
- memset (tmp_phdr2.p_memsz, 0, 4);
- memset (tmp_phdr2.p_flags, 0, 4);
- memset (tmp_phdr2.p_align, 0, 4);
-
- if (memcmp (&tmp_phdr, &tmp_phdr2, sizeof (tmp_phdr))
- == 0)
- continue;
- }
+ continue;
/* prelink can convert .plt SHT_NOBITS to SHT_PROGBITS. */
plt2_asect = bfd_get_section_by_name (exec_bfd, ".plt");
@@ -2908,25 +2893,10 @@ svr4_exec_displacement (CORE_ADDR *displacementp)
/* Strip modifies the flags and alignment of PT_GNU_RELRO.
CentOS-5 has problems with filesz, memsz as well.
- See PR 11786. */
+ And strip may now fully zero out the section, so just
+ ignore it. See PR 11786, 21126. */
if (phdr2[i].p_type == PT_GNU_RELRO)
- {
- Elf64_External_Phdr tmp_phdr = *phdrp;
- Elf64_External_Phdr tmp_phdr2 = *phdr2p;
-
- memset (tmp_phdr.p_filesz, 0, 8);
- memset (tmp_phdr.p_memsz, 0, 8);
- memset (tmp_phdr.p_flags, 0, 4);
- memset (tmp_phdr.p_align, 0, 8);
- memset (tmp_phdr2.p_filesz, 0, 8);
- memset (tmp_phdr2.p_memsz, 0, 8);
- memset (tmp_phdr2.p_flags, 0, 4);
- memset (tmp_phdr2.p_align, 0, 8);
-
- if (memcmp (&tmp_phdr, &tmp_phdr2, sizeof (tmp_phdr))
- == 0)
- continue;
- }
+ continue;
/* prelink can convert .plt SHT_NOBITS to SHT_PROGBITS. */
plt2_asect = bfd_get_section_by_name (exec_bfd, ".plt");
diff --git a/gdb/testsuite/gdb.server/stripped-pie.exp
b/gdb/testsuite/gdb.server/stripped-pie.exp
new file mode 100644
index 0000000000..330b0597b8
--- /dev/null
+++ b/gdb/testsuite/gdb.server/stripped-pie.exp
@@ -0,0 +1,55 @@
+# Copyright 2017 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# PR 21126
+# strip may completely nullify the PT_GNU_RELRO segment header.
+# Seeing this bug requires exec_bfd to be from the non-stripped binary,
+# with the in-memory image being from the stripped binary. And it seems
+# to require clang-built executables, not sure what the difference is that
+# triggers the complete nullification.
+
+load_lib gdbserver-support.exp
+
+standard_testfile server.c
+
+if { [skip_gdbserver_tests] } {
+ return 0
+}
+
+if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug
additional_flags=-fpie "ldflags=-pie -Wl,-z,relro"}]} {
+ return -1
+}
+
+set stripped_binfile ${binfile}.stripped
+
+set strip_program [transform strip]
+remote_file host delete ${stripped_binfile}
+if [run_on_host "strip" "$strip_program" "-g -o ${stripped_binfile}
$binfile"] {
+ return -1
+}
+
+clean_restart ${binfile}
+
+# Make sure we're disconnected, in case we're testing with an
+# extended-remote board, therefore already connected.
+gdb_test "disconnect" ".*"
+
+set remote_binfile [gdb_remote_download target $stripped_binfile]
+gdbserver_start_extended
+
+gdb_test_no_output "set remote exec-file $remote_binfile" "set remote
exec-file"
+
+# If we can run to main, we're good.
+runto main message