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.
This commit is contained in:
Jan Kratochvil 2010-01-14 21:01:25 +00:00
parent b8040f198c
commit 51bee8e9b7
5 changed files with 99 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2010-01-14 Jan Kratochvil <jan.kratochvil@redhat.com>
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.
2010-01-14 Jan Kratochvil <jan.kratochvil@redhat.com>
* solib-svr4.c (svr4_relocate_main_executable): Move the static exec

View File

@ -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));

View File

@ -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));
}
}
/*

View File

@ -1,3 +1,10 @@
2010-01-14 Jan Kratochvil <jan.kratochvil@redhat.com>
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 <jan.kratochvil@redhat.com>
* gdb.base/break-interp.exp: New file.

View File

@ -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"}]
}
}
}