mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 18:44:20 +08:00
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.
This commit is contained in:
parent
06a6f27066
commit
61f0d76280
@ -1,3 +1,12 @@
|
||||
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.
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
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.
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user