X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fnto-tdep.c;h=f519a6ec67ec23babae407cdd7b8984e3f2dbc7b;hb=c14c28ba117dee9fd0bf17fc3437e808221a7829;hp=36556ce08adaa64777c87943d69a708aaa3efe00;hpb=7915a72c7f0c255cfcf47c1b186d3739aeafe4da;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/nto-tdep.c b/gdb/nto-tdep.c index 36556ce08a..f519a6ec67 100644 --- a/gdb/nto-tdep.c +++ b/gdb/nto-tdep.c @@ -1,6 +1,6 @@ /* nto-tdep.c - general QNX Neutrino target functionality. - Copyright 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc. Contributed by QNX Software Systems Ltd. @@ -8,7 +8,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -17,10 +17,9 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ +#include "defs.h" #include "gdb_stat.h" #include "gdb_string.h" #include "nto-tdep.h" @@ -33,6 +32,9 @@ #include "elf-bfd.h" #include "solib-svr4.h" #include "gdbcore.h" +#include "objfiles.h" + +#include #ifdef __CYGWIN__ #include @@ -105,21 +107,24 @@ nto_find_and_open_solib (char *solib, unsigned o_flags, char **temp_pathname) #define PATH_FMT "%s/lib:%s/usr/lib:%s/usr/photon/lib:%s/usr/photon/dll:%s/lib/dll" nto_root = nto_target (); - if (strcmp (TARGET_ARCHITECTURE->arch_name, "i386") == 0) + if (strcmp (gdbarch_bfd_arch_info (target_gdbarch)->arch_name, "i386") == 0) { arch = "x86"; endian = ""; } - else if (strcmp (TARGET_ARCHITECTURE->arch_name, "rs6000") == 0 - || strcmp (TARGET_ARCHITECTURE->arch_name, "powerpc") == 0) + else if (strcmp (gdbarch_bfd_arch_info (target_gdbarch)->arch_name, + "rs6000") == 0 + || strcmp (gdbarch_bfd_arch_info (target_gdbarch)->arch_name, + "powerpc") == 0) { arch = "ppc"; endian = "be"; } else { - arch = TARGET_ARCHITECTURE->arch_name; - endian = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? "be" : "le"; + arch = gdbarch_bfd_arch_info (target_gdbarch)->arch_name; + endian = gdbarch_byte_order (target_gdbarch) + == BFD_ENDIAN_BIG ? "be" : "le"; } /* In case nto_root is short, add strlen(solib) @@ -164,21 +169,24 @@ nto_init_solib_absolute_prefix (void) const char *arch; nto_root = nto_target (); - if (strcmp (TARGET_ARCHITECTURE->arch_name, "i386") == 0) + if (strcmp (gdbarch_bfd_arch_info (target_gdbarch)->arch_name, "i386") == 0) { arch = "x86"; endian = ""; } - else if (strcmp (TARGET_ARCHITECTURE->arch_name, "rs6000") == 0 - || strcmp (TARGET_ARCHITECTURE->arch_name, "powerpc") == 0) + else if (strcmp (gdbarch_bfd_arch_info (target_gdbarch)->arch_name, + "rs6000") == 0 + || strcmp (gdbarch_bfd_arch_info (target_gdbarch)->arch_name, + "powerpc") == 0) { arch = "ppc"; endian = "be"; } else { - arch = TARGET_ARCHITECTURE->arch_name; - endian = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? "be" : "le"; + arch = gdbarch_bfd_arch_info (target_gdbarch)->arch_name; + endian = gdbarch_byte_order (target_gdbarch) + == BFD_ENDIAN_BIG ? "be" : "le"; } sprintf (arch_path, "%s/%s%s", nto_root, arch, endian); @@ -188,7 +196,8 @@ nto_init_solib_absolute_prefix (void) } char ** -nto_parse_redirection (char *pargv[], char **pin, char **pout, char **perr) +nto_parse_redirection (char *pargv[], const char **pin, const char **pout, + const char **perr) { char **argv; char *in, *out, *err, *p; @@ -244,33 +253,50 @@ nto_parse_redirection (char *pargv[], char **pin, char **pout, char **perr) solib-svr4.c to support nto_relocate_section_addresses which is different from the svr4 version. */ +/* Link map info to include in an allocated so_list entry */ + struct lm_info -{ - /* Pointer to copy of link map from inferior. The type is char * - rather than void *, so that we may use byte offsets to find the - various fields without the need for a cast. */ - char *lm; -}; + { + /* Pointer to copy of link map from inferior. The type is char * + rather than void *, so that we may use byte offsets to find the + various fields without the need for a cast. */ + gdb_byte *lm; + + /* Amount by which addresses in the binary should be relocated to + match the inferior. This could most often be taken directly + from lm, but when prelinking is involved and the prelink base + address changes, we may need a different offset, we want to + warn about the difference and compute it only once. */ + CORE_ADDR l_addr; + + /* The target location of lm. */ + CORE_ADDR lm_addr; + }; + static CORE_ADDR LM_ADDR (struct so_list *so) { - struct link_map_offsets *lmo = nto_fetch_link_map_offsets (); + if (so->lm_info->l_addr == (CORE_ADDR)-1) + { + struct link_map_offsets *lmo = nto_fetch_link_map_offsets (); + struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr; - return (CORE_ADDR) extract_signed_integer (so->lm_info->lm + - lmo->l_addr_offset, - lmo->l_addr_size); + so->lm_info->l_addr = + extract_typed_address (so->lm_info->lm + lmo->l_addr_offset, ptr_type); + } + return so->lm_info->l_addr; } static CORE_ADDR nto_truncate_ptr (CORE_ADDR addr) { - if (TARGET_PTR_BIT == sizeof (CORE_ADDR) * 8) + if (gdbarch_ptr_bit (target_gdbarch) == sizeof (CORE_ADDR) * 8) /* We don't need to truncate anything, and the bit twiddling below will fail due to overflow problems. */ return addr; else - return addr & (((CORE_ADDR) 1 << TARGET_PTR_BIT) - 1); + return addr & (((CORE_ADDR) 1 << gdbarch_ptr_bit (target_gdbarch)) - 1); } Elf_Internal_Phdr * @@ -336,7 +362,7 @@ nto_generic_supply_altregset (const struct regset *regset, } void -nto_dummy_supply_regset (char *regs) +nto_dummy_supply_regset (struct regcache *regcache, char *regs) { /* Do nothing. */ } @@ -382,6 +408,7 @@ Show QNX NTO internal debugging."), _("\ When non-zero, nto specific debug info is\n\ displayed. Different information is displayed\n\ for different positive values."), + NULL, NULL, /* FIXME: i18n: QNX NTO internal debugging is %s. */ - NULL, NULL, &setdebuglist, &showdebuglist); + &setdebuglist, &showdebuglist); }