mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-03 04:12:10 +08:00
* solib-svr4.c (scan_dyntag): Only read target memory when necessary.
Fix formatting. (elf_locate_base): Look for DT_MIPS_RLD_MAP first. Expand comments. (elf_lookup_lib_symbol): Fix formatting.
This commit is contained in:
parent
9a2e389ab0
commit
65728c2698
@ -1,3 +1,10 @@
|
||||
2007-08-22 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* solib-svr4.c (scan_dyntag): Only read target memory when necessary.
|
||||
Fix formatting.
|
||||
(elf_locate_base): Look for DT_MIPS_RLD_MAP first. Expand comments.
|
||||
(elf_lookup_lib_symbol): Fix formatting.
|
||||
|
||||
2007-08-21 Michael Snyder <msnyder@access-company.com>
|
||||
|
||||
* dbxread.c (read_dbx_symtab): Guard null deref.
|
||||
|
@ -354,7 +354,7 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
|
||||
int arch_size, step, sect_size;
|
||||
long dyn_tag;
|
||||
CORE_ADDR dyn_ptr, dyn_addr;
|
||||
gdb_byte *bufend, *buf;
|
||||
gdb_byte *bufend, *bufstart, *buf;
|
||||
Elf32_External_Dyn *x_dynp_32;
|
||||
Elf64_External_Dyn *x_dynp_64;
|
||||
struct bfd_section *sect;
|
||||
@ -371,16 +371,13 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
|
||||
return 0;
|
||||
dyn_addr = bfd_section_vma (abfd, sect);
|
||||
|
||||
/* Read in .dynamic section, silently ignore errors. */
|
||||
/* Read in .dynamic from the BFD. We will get the actual value
|
||||
from memory later. */
|
||||
sect_size = bfd_section_size (abfd, sect);
|
||||
buf = alloca (sect_size);
|
||||
if (target_read_memory (dyn_addr, buf, sect_size))
|
||||
{
|
||||
/* If target_read_memory fails, try reading the BFD file. */
|
||||
if (!bfd_get_section_contents (abfd, sect,
|
||||
buf, 0, sect_size))
|
||||
return 0;
|
||||
}
|
||||
buf = bufstart = alloca (sect_size);
|
||||
if (!bfd_get_section_contents (abfd, sect,
|
||||
buf, 0, sect_size))
|
||||
return 0;
|
||||
|
||||
/* Iterate over BUF and scan for DYNTAG. If found, set PTR and return. */
|
||||
step = (arch_size == 32) ? sizeof (Elf32_External_Dyn)
|
||||
@ -395,7 +392,7 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
|
||||
dyn_tag = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_tag);
|
||||
dyn_ptr = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_un.d_ptr);
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
x_dynp_64 = (Elf64_External_Dyn *) buf;
|
||||
dyn_tag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag);
|
||||
@ -405,9 +402,20 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr)
|
||||
return 0;
|
||||
if (dyn_tag == dyntag)
|
||||
{
|
||||
/* If requested, try to read the runtime value of this .dynamic
|
||||
entry. */
|
||||
if (ptr)
|
||||
*ptr = dyn_ptr;
|
||||
return 1;
|
||||
{
|
||||
gdb_byte ptr_buf[8];
|
||||
CORE_ADDR ptr_addr;
|
||||
|
||||
ptr_addr = dyn_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,
|
||||
builtin_type_void_data_ptr);
|
||||
*ptr = dyn_ptr;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -445,11 +453,9 @@ elf_locate_base (void)
|
||||
struct minimal_symbol *msymbol;
|
||||
CORE_ADDR dyn_ptr;
|
||||
|
||||
/* Find DT_DEBUG. */
|
||||
if (scan_dyntag (DT_DEBUG, exec_bfd, &dyn_ptr))
|
||||
return dyn_ptr;
|
||||
|
||||
/* Find DT_MIPS_RLD_MAP. */
|
||||
/* Look for DT_MIPS_RLD_MAP first. MIPS executables use this
|
||||
instead of DT_DEBUG, although they sometimes contain an unused
|
||||
DT_DEBUG. */
|
||||
if (scan_dyntag (DT_MIPS_RLD_MAP, exec_bfd, &dyn_ptr))
|
||||
{
|
||||
gdb_byte *pbuf;
|
||||
@ -462,6 +468,10 @@ elf_locate_base (void)
|
||||
return extract_typed_address (pbuf, builtin_type_void_data_ptr);
|
||||
}
|
||||
|
||||
/* Find DT_DEBUG. */
|
||||
if (scan_dyntag (DT_DEBUG, exec_bfd, &dyn_ptr))
|
||||
return dyn_ptr;
|
||||
|
||||
/* This may be a static executable. Look for the symbol
|
||||
conventionally named _r_debug, as a last resort. */
|
||||
msymbol = lookup_minimal_symbol ("_r_debug", NULL, symfile_objfile);
|
||||
@ -1549,7 +1559,7 @@ elf_lookup_lib_symbol (const struct objfile *objfile,
|
||||
|| scan_dyntag (DT_SYMBOLIC, objfile->obfd, NULL) != 1)
|
||||
return NULL;
|
||||
|
||||
return lookup_global_symbol_from_objfile
|
||||
return lookup_global_symbol_from_objfile
|
||||
(objfile, name, linkage_name, domain, symtab);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user