aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2010-01-14 21:09:05 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2010-01-14 21:09:05 +0000
commit61f0d76280d963a9ecf3a3a525dae7ac21050636 (patch)
tree59dd35b2e11cb7b01e14b2ed74254c62d4b07a9b
parent06a6f27066c695efbde2773efafd2be68f7a7d1c (diff)
downloadgdb-61f0d76280d963a9ecf3a3a525dae7ac21050636.zip
gdb-61f0d76280d963a9ecf3a3a525dae7ac21050636.tar.gz
gdb-61f0d76280d963a9ecf3a3a525dae7ac21050636.tar.bz2
gdb/
* solib-svr4.c (scan_dyntag): Remove variable dyn_addr. New variable target_section. Find SECT in current_target_sections, gdb_assert it. (elf_lookup_lib_symbol): Pass the binary file if given symfile_objfile. New variable abfd. * symtab.c (lookup_objfile_from_block): Return the binary file instead of separate debug info file. gdb/testsuite/ * gdb.base/break-interp.exp (test_core): New proc. (test_ld): Call it.
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/solib-svr4.c28
-rw-r--r--gdb/symtab.c7
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/break-interp.exp23
5 files changed, 66 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 875e65a..324268f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,14 @@
2010-01-14 Jan Kratochvil <jan.kratochvil@redhat.com>
+ * solib-svr4.c (scan_dyntag): Remove variable dyn_addr. New variable
+ target_section. Find SECT in current_target_sections, gdb_assert it.
+ (elf_lookup_lib_symbol): Pass the binary file if given symfile_objfile.
+ New variable abfd.
+ * symtab.c (lookup_objfile_from_block): Return the binary file instead
+ of separate debug info file.
+
+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.
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index a2feabd..0957c44 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -568,11 +568,12 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
{
int arch_size, step, sect_size;
long dyn_tag;
- CORE_ADDR dyn_ptr, dyn_addr;
+ CORE_ADDR dyn_ptr;
gdb_byte *bufend, *bufstart, *buf;
Elf32_External_Dyn *x_dynp_32;
Elf64_External_Dyn *x_dynp_64;
struct bfd_section *sect;
+ struct target_section *target_section;
if (abfd == NULL)
return 0;
@@ -588,7 +589,13 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
sect = bfd_get_section_by_name (abfd, ".dynamic");
if (sect == NULL)
return 0;
- dyn_addr = bfd_section_vma (abfd, sect);
+
+ for (target_section = current_target_sections->sections;
+ target_section < current_target_sections->sections_end;
+ target_section++)
+ if (sect == target_section->the_bfd_section)
+ break;
+ gdb_assert (target_section < current_target_sections->sections_end);
/* Read in .dynamic from the BFD. We will get the actual value
from memory later. */
@@ -630,7 +637,7 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
CORE_ADDR ptr_addr;
ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
- ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
+ ptr_addr = target_section->addr + (buf - bufstart) + arch_size / 8;
if (target_read_memory (ptr_addr, ptr_buf, arch_size / 8) == 0)
dyn_ptr = extract_typed_address (ptr_buf, ptr_type);
*ptr = dyn_ptr;
@@ -1951,8 +1958,19 @@ elf_lookup_lib_symbol (const struct objfile *objfile,
const char *linkage_name,
const domain_enum domain)
{
- if (objfile->obfd == NULL
- || scan_dyntag (DT_SYMBOLIC, objfile->obfd, NULL) != 1)
+ bfd *abfd;
+
+ if (objfile == symfile_objfile)
+ abfd = exec_bfd;
+ else
+ {
+ /* OBJFILE should have been passed as the non-debug one. */
+ gdb_assert (objfile->separate_debug_objfile_backlink == NULL);
+
+ abfd = objfile->obfd;
+ }
+
+ if (abfd == NULL || scan_dyntag (DT_SYMBOLIC, abfd, NULL) != 1)
return NULL;
return lookup_global_symbol_from_objfile
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 7f5dabd..426326d 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -1470,7 +1470,12 @@ lookup_objfile_from_block (const struct block *block)
/* Go through SYMTABS. */
ALL_SYMTABS (obj, s)
if (block == BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK))
- return obj;
+ {
+ if (obj->separate_debug_objfile_backlink)
+ obj = obj->separate_debug_objfile_backlink;
+
+ return obj;
+ }
return NULL;
}
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 3756109..9a571ad 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2010-01-14 Jan Kratochvil <jan.kratochvil@redhat.com>
+ * gdb.base/break-interp.exp (test_core): New proc.
+ (test_ld): Call it.
+
+2010-01-14 Jan Kratochvil <jan.kratochvil@redhat.com>
+
* gdb.base/break-interp-main.c, gdb.base/break-interp-lib.c: New.
* gdb.base/break-interp.exp: Exit on skip_shlib_tests. Change $srcfile.
New variables $binfile_lib and $srcfile_lib. Call get_compiler_info
diff --git a/gdb/testsuite/gdb.base/break-interp.exp b/gdb/testsuite/gdb.base/break-interp.exp
index ce86cab..553bbc6 100644
--- a/gdb/testsuite/gdb.base/break-interp.exp
+++ b/gdb/testsuite/gdb.base/break-interp.exp
@@ -237,6 +237,27 @@ proc reach {func command} {
}
}
+proc test_core {file} {
+ global srcdir subdir gdb_prompt
+
+ set corefile [core_find $file]
+ if {$corefile == ""} {
+ return
+ }
+
+ gdb_exit
+ gdb_start
+ # Clear it to never find any separate debug infos in $debug_root.
+ gdb_test "set debug-file-directory" "" "set debug-file-directory for core"
+ gdb_reinitialize_dir $srcdir/$subdir
+ gdb_load $file
+
+ # Do not check the binary filename as it may be truncated.
+ gdb_test "core-file $corefile" "Core was generated by .*\r\n#0 .*" "core loaded"
+
+ gdb_test "bt" "#\[0-9\]+ +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#\[0-9\]+ +\[^\r\n\]*\\mmain\\M.*" "core main bt"
+}
+
proc test_ld {file ifmain trynosym} {
global srcdir subdir gdb_prompt
@@ -259,6 +280,8 @@ proc test_ld {file ifmain trynosym} {
reach "libfunc" continue
gdb_test "bt" "#0 +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#1 +\[^\r\n\]*\\mmain\\M.*" "main bt"
+
+ test_core $file
}
if !$trynosym {