This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PR symtab/21126] Fix handling of fully zeroed PT_GNU_RELRO


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]