* ppc-linux-tdep.c (ppc_linux_convert_from_func_ptr_addr): Rename ...

(ppc64_linux_convert_from_func_ptr_addr): ... to this.  No longer try
	to handle ppc32 PLT entries.
	(ppc_linux_init_abi): Install ppc64_linux_convert_from_func_ptr_addr
	only on ppc64.
This commit is contained in:
Ulrich Weigand 2008-05-14 18:28:59 +00:00
parent 2eaf8d2a14
commit 00d5f93a89
2 changed files with 19 additions and 42 deletions

View File

@ -1,3 +1,11 @@
2008-05-14 Ulrich Weigand <uweigand@de.ibm.com>
* ppc-linux-tdep.c (ppc_linux_convert_from_func_ptr_addr): Rename ...
(ppc64_linux_convert_from_func_ptr_addr): ... to this. No longer try
to handle ppc32 PLT entries.
(ppc_linux_init_abi): Install ppc64_linux_convert_from_func_ptr_addr
only on ppc64.
2008-05-14 Daniel Jacobowitz <dan@codesourcery.com>
* elfread.c (elf_symtab_read): Create trampolines for @plt symbols.

View File

@ -556,7 +556,7 @@ ppc64_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
}
/* Support for convert_from_func_ptr_addr (ARCH, ADDR, TARG) on PPC
/* Support for convert_from_func_ptr_addr (ARCH, ADDR, TARG) on PPC64
GNU/Linux.
Usually a function pointer's representation is simply the address
@ -568,12 +568,6 @@ ppc64_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
function, the second word is the TOC pointer (r2), and the third word
is the static chain value.
For PPC32, there are two kinds of function pointers: non-secure and
secure. Non-secure function pointers point directly to the
function in a code section and thus need no translation. Secure
ones (from GCC's -msecure-plt option) are in a data section and
contain one word: the address of the function.
Throughout GDB it is currently assumed that a function pointer contains
the address of the function, which is not easy to fix. In addition, the
conversion of a function address to a function pointer would
@ -589,40 +583,15 @@ ppc64_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
random addresses such as occur when there is no symbol table. */
static CORE_ADDR
ppc_linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
CORE_ADDR addr,
struct target_ops *targ)
ppc64_linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
CORE_ADDR addr,
struct target_ops *targ)
{
struct gdbarch_tdep *tdep;
struct section_table *s = target_section_by_addr (targ, addr);
char *sect_name = NULL;
if (!s)
return addr;
tdep = gdbarch_tdep (gdbarch);
switch (tdep->wordsize)
{
case 4:
sect_name = ".plt";
break;
case 8:
sect_name = ".opd";
break;
default:
internal_error (__FILE__, __LINE__,
_("failed internal consistency check"));
}
/* Check if ADDR points to a function descriptor. */
/* NOTE: this depends on the coincidence that the address of a functions
entry point is contained in the first word of its function descriptor
for both PPC-64 and for PPC-32 with secure PLTs. */
if ((strcmp (s->the_bfd_section->name, sect_name) == 0)
&& s->the_bfd_section->flags & SEC_DATA)
return get_target_memory_unsigned (targ, addr, tdep->wordsize);
if (s && strcmp (s->the_bfd_section->name, ".opd") == 0)
return get_target_memory_unsigned (targ, addr, 8);
return addr;
}
@ -1025,11 +994,6 @@ ppc_linux_init_abi (struct gdbarch_info info,
set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
set_gdbarch_long_double_format (gdbarch, floatformats_ibm_long_double);
/* Handle PPC GNU/Linux 64-bit function pointers (which are really
function descriptors) and 32-bit secure PLT entries. */
set_gdbarch_convert_from_func_ptr_addr
(gdbarch, ppc_linux_convert_from_func_ptr_addr);
/* Handle inferior calls during interrupted system calls. */
set_gdbarch_write_pc (gdbarch, ppc_linux_write_pc);
@ -1069,6 +1033,11 @@ ppc_linux_init_abi (struct gdbarch_info info,
set_gdbarch_adjust_breakpoint_address
(gdbarch, ppc64_sysv_abi_adjust_breakpoint_address);
/* Handle PPC GNU/Linux 64-bit function pointers (which are really
function descriptors). */
set_gdbarch_convert_from_func_ptr_addr
(gdbarch, ppc64_linux_convert_from_func_ptr_addr);
/* Shared library handling. */
set_gdbarch_skip_trampoline_code (gdbarch, ppc64_skip_trampoline_code);
set_solib_svr4_fetch_link_map_offsets