From 51bee8e9b74abe4f87f96d3ec97e98d34426aae7 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Thu, 14 Jan 2010 21:01:25 +0000 Subject: [PATCH] gdb/ Support PIEs with no symfile_objfile. * exec.c (print_section_info ): Relocate Entry point. * solib-svr4.c (svr4_relocate_main_executable ): 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. --- gdb/ChangeLog | 6 +++ gdb/exec.c | 32 +++++++++++++++- gdb/solib-svr4.c | 9 +++++ gdb/testsuite/ChangeLog | 7 ++++ gdb/testsuite/gdb.base/break-interp.exp | 50 +++++++++++++++++++++++-- 5 files changed, 99 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ffcbe7414c9..875e65afb7d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2010-01-14 Jan Kratochvil + + Support PIEs with no symfile_objfile. + * exec.c (print_section_info ): Relocate Entry point. + * solib-svr4.c (svr4_relocate_main_executable ): New block. + 2010-01-14 Jan Kratochvil * solib-svr4.c (svr4_relocate_main_executable): Move the static exec diff --git a/gdb/exec.c b/gdb/exec.c index 948a1ecc758..14ee32762aa 100644 --- 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)); diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 3ad067ab7e1..a2feabd4c76 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1649,6 +1649,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)); + } } /* diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 5caf2a999a0..735d4501ed7 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-01-14 Jan Kratochvil + + 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. + 2010-01-14 Jan Kratochvil * gdb.base/break-interp.exp: New file. diff --git a/gdb/testsuite/gdb.base/break-interp.exp b/gdb/testsuite/gdb.base/break-interp.exp index d225b6c8656..d2799489b7e 100644 --- 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"}] } } } -- 2.30.2