* 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> 2008-05-14 Daniel Jacobowitz <dan@codesourcery.com>
* elfread.c (elf_symtab_read): Create trampolines for @plt symbols. * 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. GNU/Linux.
Usually a function pointer's representation is simply the address 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 function, the second word is the TOC pointer (r2), and the third word
is the static chain value. 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 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 the address of the function, which is not easy to fix. In addition, the
conversion of a function address to a function pointer would 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. */ random addresses such as occur when there is no symbol table. */
static CORE_ADDR static CORE_ADDR
ppc_linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch, ppc64_linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
CORE_ADDR addr, CORE_ADDR addr,
struct target_ops *targ) struct target_ops *targ)
{ {
struct gdbarch_tdep *tdep;
struct section_table *s = target_section_by_addr (targ, addr); 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. */ /* Check if ADDR points to a function descriptor. */
if (s && strcmp (s->the_bfd_section->name, ".opd") == 0)
/* NOTE: this depends on the coincidence that the address of a functions return get_target_memory_unsigned (targ, addr, 8);
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);
return addr; 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_bit (gdbarch, 16 * TARGET_CHAR_BIT);
set_gdbarch_long_double_format (gdbarch, floatformats_ibm_long_double); 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. */ /* Handle inferior calls during interrupted system calls. */
set_gdbarch_write_pc (gdbarch, ppc_linux_write_pc); 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 set_gdbarch_adjust_breakpoint_address
(gdbarch, ppc64_sysv_abi_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. */ /* Shared library handling. */
set_gdbarch_skip_trampoline_code (gdbarch, ppc64_skip_trampoline_code); set_gdbarch_skip_trampoline_code (gdbarch, ppc64_skip_trampoline_code);
set_solib_svr4_fetch_link_map_offsets set_solib_svr4_fetch_link_map_offsets