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]

[patch 09/15] PIE: symbol-less (exec-file only) executables


Hi,

this case was not currently supported by the Red Hat PIE patch, FSF GDB even
crashes on this case.

I do not find it so important but at least exec_bfd should be displayed to the
user according to the current displacement IMO.

There is a general question which displacement to use after the inferior dies.
Currently the last active displacement is used which makes some sense IMO.

Initially the displacement is zero, therefore the file is left at its
prelinked location (and thus at address 0 if unprelinked).


Thanks,
Jan


gdb/
	Support PIEs with no symfile_objfile.
	* exec.c (print_section_info <abfd == exec_bfd>): Relocate Entry point.
	* solib-svr4.c (svr4_relocate_main_executable <exec_bfd>): New block.
    
gdb/testsuite/
	Support PIEs with no symfile_objfile.
	* gdb.base/break-interp.exp: New argument at the test_ld calls.
	(test_ld): New parameter trynosym.
	(test_ld <$trynosym>): New block.

--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -674,8 +674,36 @@ print_section_info (struct target_section_table *t, bfd *abfd)
   wrap_here ("        ");
   printf_filtered (_("file type %s.\n"), bfd_get_target (abfd));
   if (abfd == exec_bfd)
-    printf_filtered (_("\tEntry point: %s\n"),
-                     paddress (gdbarch, bfd_get_start_address (abfd)));
+    {
+      bfd_vma displacement;
+
+      for (p = t->sections; p < t->sections_end; p++)
+	{
+	  asection *asect = p->the_bfd_section;
+
+	  if ((bfd_get_section_flags (abfd, asect) & (SEC_ALLOC | SEC_LOAD))
+	      != (SEC_ALLOC | SEC_LOAD))
+	    continue;
+
+	  if (bfd_get_section_vma (abfd, asect) <= abfd->start_address
+	      && abfd->start_address < bfd_get_section_vma (abfd, asect)
+				       + bfd_get_section_size (asect))
+	    {
+	      displacement = p->addr - bfd_get_section_vma (abfd, asect);
+	      break;
+	    }
+	}
+      if (p == t->sections_end)
+	{
+	  warning (_("Cannot find section for the entry point of %s.\n"),
+		   bfd_get_filename (abfd));
+	  displacement = 0;
+	}
+
+      printf_filtered (_("\tEntry point: %s\n"),
+		       paddress (gdbarch, bfd_get_start_address (abfd)
+					  + displacement));
+    }
   for (p = t->sections; p < t->sections_end; p++)
     {
       printf_filtered ("\t%s", hex_string_custom (p->addr, wid));
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1599,6 +1599,15 @@ svr4_relocate_main_executable (void)
 
       objfile_relocate (symfile_objfile, new_offsets);
     }
+  else if (exec_bfd)
+    {
+      asection *asect;
+
+      for (asect = exec_bfd->sections; asect != NULL; asect = asect->next)
+	exec_set_section_address (bfd_get_filename (exec_bfd), asect->index,
+				  bfd_section_vma (exec_bfd, asect)
+				  + displacement);
+    }
 }
 
 /*
--- a/gdb/testsuite/gdb.base/break-interp.exp
+++ b/gdb/testsuite/gdb.base/break-interp.exp
@@ -223,7 +223,7 @@ proc reach {func command} {
     }
 }
 
-proc test_ld {file ifmain} {
+proc test_ld {file ifmain trynosym} {
     global srcdir subdir gdb_prompt
 
     # First test normal `file'-command loaded $FILE with symbols.
@@ -239,6 +239,50 @@ proc test_ld {file ifmain} {
     if $ifmain {
 	reach "main" continue
     }
+
+    if !$trynosym {
+	return
+    }
+
+    global pf_prefix
+    set old_ldprefix $pf_prefix
+    lappend pf_prefix "symbol-less:"
+
+    # Test also `exec-file'-command loaded $FILE - therefore without symbols.
+    # SYMBOL_OBJFILE is not available and only EXEC_BFD must be used.
+
+    gdb_exit
+    gdb_start
+    # Clear it to never find any separate debug infos in $debug_root.
+    gdb_test "set debug-file-directory"
+    gdb_reinitialize_dir $srcdir/$subdir
+
+    # Test no (error) message has been printed by `exec-file'.
+    set escapedfile [string_to_regexp $file]
+    gdb_test "exec-file $file" "exec-file $escapedfile" "load"
+
+    if $ifmain {
+	reach "dl_main" run
+
+	set test "info files"
+	set entrynohex ""
+	gdb_test_multiple $test $test {
+	    -re "\r\n\[\t \]*Entry point:\[\t \]*0x(\[0-9a-f\]+)\r\n.*$gdb_prompt $" {
+		set entrynohex $expect_out(1,string) 
+		pass $test
+	    }
+	}
+	if {$entrynohex != ""} {
+	    gdb_test "break *0x$entrynohex" "" "break at entry point"
+	    gdb_test "continue" "\r\nBreakpoint \[0-9\]+, 0x0*$entrynohex in .*" "entry point reached"
+	}
+    } else {
+	# There is no symbol to break at ld.so.  Moreover it can exit with an
+	# error code.
+	gdb_test "run" "Program exited (normally|with code \[0-9\]+)\\." "ld.so exit"
+    }
+
+    set pf_prefix $old_ldprefix
 }
 
 # Create separate binaries for each testcase - to make the possible reported
@@ -322,7 +366,7 @@ foreach ldprelink {NO YES} {
 	if ![prelink$ldprelink $interp] {
 	    continue
 	}
-	test_ld $interp 0
+	test_ld $interp 0 [expr {$ldsepdebug == "NO"}]
 
 	if ![copy $interp $interp_saved] {
 	    continue
@@ -401,7 +445,7 @@ foreach ldprelink {NO YES} {
 
 		    if {[prelink$binprelink "--dynamic-linker=$interp --ld-library-path=$dir $exec $interp [concat $dests]" $exec]
 		        && [copy $interp_saved $interp]} {
-			test_ld $exec 1
+			test_ld $exec 1 [expr {$binsepdebug == "NO"}]
 		    }
 		}
 	    }


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