This is the mail archive of the
gdb-patches@sourceware.cygnus.com
mailing list for the GDB project.
[PATCH]: shared libs on 32/64 bit systems.
- To: gdb-patches at sourceware dot cygnus dot com, jimb at cygnus dot com
- Subject: [PATCH]: shared libs on 32/64 bit systems.
- From: msnyder at cygnus dot com
- Date: Mon, 5 Jun 2000 17:31:46 -0700 (PDT)
Specifically Sparc Solaris. Jim Blandy, are you online?
Or do I need to find an alternate maintainer to review it?
2000-06-05 Michael Snyder <msnyder@seadog.cygnus.com>
* solib.c (struct so_list): Add new member for 64bits-x-32-bits.
(first_link_map_member, open_symbol_file_object, current_sos):
Add code to handle 32-bit objects when debugger is a 64-bit
app (Solaris sparc64 cross sparc32).
(LM_ADDR, LM_NEXT, LM_NAME, IGNORE_FIRST_LINK_MAP_ENTRY):
Convert from macros to functions.
Index: solib.c
===================================================================
RCS file: /cvs/src/src/gdb/solib.c,v
retrieving revision 1.16
diff -p -r1.16 solib.c
*** solib.c 2000/05/28 01:12:29 1.16
--- solib.c 2000/06/06 00:28:29
***************
*** 19,24 ****
--- 19,27 ----
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+ #if defined (__sparcv9)
+ #define _SYSCALL32 /* for Sparc64 cross Sparc32 */
+ #endif
#include "defs.h"
*************** static char *main_name_list[] =
*** 106,130 ****
"main_$main",
NULL
};
-
- /* local data declarations */
! /* Macro to extract an address from a solib structure.
When GDB is configured for some 32-bit targets (e.g. Solaris 2.7
sparc), BFD is configured to handle 64-bit targets, so CORE_ADDR is
64 bits. We have to extract only the significant bits of addresses
! to get the right address when accessing the core file BFD. */
! #define SOLIB_EXTRACT_ADDRESS(member) \
! extract_address (&member, sizeof (member))
#ifndef SVR4_SHARED_LIBS
- #define LM_ADDR(so) (SOLIB_EXTRACT_ADDRESS ((so) -> lm.lm_addr))
- #define LM_NEXT(so) (SOLIB_EXTRACT_ADDRESS ((so) -> lm.lm_next))
- #define LM_NAME(so) (SOLIB_EXTRACT_ADDRESS ((so) -> lm.lm_name))
- /* Test for first link map entry; first entry is a shared library. */
- #define IGNORE_FIRST_LINK_MAP_ENTRY(so) (0)
static struct link_dynamic dynamic_copy;
static struct link_dynamic_2 ld_2_copy;
static struct ld_debug debug_copy;
--- 109,142 ----
"main_$main",
NULL
};
! /* Function to extract an address from a solib structure.
When GDB is configured for some 32-bit targets (e.g. Solaris 2.7
sparc), BFD is configured to handle 64-bit targets, so CORE_ADDR is
64 bits. We have to extract only the significant bits of addresses
! to get the right address when accessing the core file BFD.
! We'll use the BFD itself to determine the number of significant bits.
! MVS, June 2000 */
+ static CORE_ADDR
+ solib_extract_address (void *memberp)
+ {
+ return extract_address (memberp,
+ bfd_elf_get_arch_size (exec_bfd) / 8);
+ }
+
+ #define SOLIB_EXTRACT_ADDRESS(MEMBER) \
+ solib_extract_address (&MEMBER)
+
+ /* local data declarations */
+
#ifndef SVR4_SHARED_LIBS
+
+ /* NOTE: converted the macros LM_ADDR, LM_NEXT, LM_NAME and
+ IGNORE_FIRST_LINK_MAP_ENTRY into functions (see below).
+ MVS, June 2000 */
static struct link_dynamic dynamic_copy;
static struct link_dynamic_2 ld_2_copy;
static struct ld_debug debug_copy;
*************** static CORE_ADDR flag_addr;
*** 133,145 ****
#else /* SVR4_SHARED_LIBS */
- #define LM_ADDR(so) (SOLIB_EXTRACT_ADDRESS ((so) -> lm.l_addr))
- #define LM_NEXT(so) (SOLIB_EXTRACT_ADDRESS ((so) -> lm.l_next))
- #define LM_NAME(so) (SOLIB_EXTRACT_ADDRESS ((so) -> lm.l_name))
- /* Test for first link map entry; first entry is the exec-file. */
- #define IGNORE_FIRST_LINK_MAP_ENTRY(so) \
- (SOLIB_EXTRACT_ADDRESS ((so) -> lm.l_prev) == 0)
static struct r_debug debug_copy;
char shadow_contents[BREAKPOINT_MAX]; /* Stash old bkpt addr contents */
#endif /* !SVR4_SHARED_LIBS */
--- 145,155 ----
#else /* SVR4_SHARED_LIBS */
static struct r_debug debug_copy;
+ #if defined (__sparcv9)
+ static struct r_debug32 debug32_copy; /* Sparc64 cross Sparc32 */
+ #endif
+
char shadow_contents[BREAKPOINT_MAX]; /* Stash old bkpt addr contents */
#endif /* !SVR4_SHARED_LIBS */
*************** struct so_list
*** 152,157 ****
--- 162,170 ----
struct so_list *next; /* next structure in linked list */
struct link_map lm; /* copy of link map from inferior */
+ #if defined (__sparcv9)
+ struct link_map32 lm32; /* copy of link map from 32-bit inferior */
+ #endif
CORE_ADDR lmaddr; /* addr in inferior lm was read from */
/* Shared object file name, exactly as it appears in the
*************** struct so_list
*** 179,184 ****
--- 192,298 ----
};
static struct so_list *so_list_head; /* List of known shared objects */
+
+ /* link map access functions */
+
+ #ifndef SVR4_SHARED_LIBS
+
+ static CORE_ADDR
+ LM_ADDR (so)
+ struct so_list *so;
+ {
+ #if defined (__sparcv9)
+ if (bfd_elf_get_arch_size (exec_bfd) == 32)
+ return extract_address (&so->lm32.lm_addr, sizeof (so->lm32.lm_addr));
+ else
+ #endif
+ return extract_address (&so->lm.lm_addr, sizeof (so->lm.lm_addr));
+ }
+
+ static CORE_ADDR
+ LM_NEXT (so)
+ struct so_list *so;
+ {
+ #if defined (__sparcv9)
+ if (bfd_elf_get_arch_size (exec_bfd) == 32)
+ return extract_address (&so->lm32.lm_next, sizeof (so->lm32.lm_next));
+ else
+ #endif
+ return extract_address (&so->lm.lm_next, sizeof (so->lm.lm_next));
+ }
+
+ static CORE_ADDR
+ LM_NAME (so)
+ struct so_list *so;
+ {
+ #if defined (__sparcv9)
+ if (bfd_elf_get_arch_size (exec_bfd) == 32)
+ return extract_address (&so->lm32.lm_name, sizeof (so->lm32.lm_name));
+ else
+ #endif
+ return extract_address (&so->lm.lm_name, sizeof (so->lm.lm_name));
+ }
+
+ static int
+ IGNORE_FIRST_LINK_MAP_ENTRY (so)
+ struct so_list *so;
+ {
+ return 0;
+ }
+
+ #else /* SVR4_SHARED_LIBS */
+
+ static CORE_ADDR
+ LM_ADDR (so)
+ struct so_list *so;
+ {
+ #if defined (__sparcv9)
+ if (bfd_elf_get_arch_size (exec_bfd) == 32)
+ return extract_address (&so->lm32.l_addr, sizeof (so->lm32.l_addr));
+ else
+ #endif
+ return extract_address (&so->lm.l_addr, sizeof (so->lm.l_addr));
+ }
+
+ static CORE_ADDR
+ LM_NEXT (so)
+ struct so_list *so;
+ {
+ #if defined (__sparcv9)
+ if (bfd_elf_get_arch_size (exec_bfd) == 32)
+ return extract_address (&so->lm32.l_next, sizeof (so->lm32.l_next));
+ else
+ #endif
+ return extract_address (&so->lm.l_next, sizeof (so->lm.l_next));
+ }
+
+ static CORE_ADDR
+ LM_NAME (so)
+ struct so_list *so;
+ {
+ #if defined (__sparcv9)
+ if (bfd_elf_get_arch_size (exec_bfd) == 32)
+ return extract_address (&so->lm32.l_name, sizeof (so->lm32.l_name));
+ else
+ #endif
+ return extract_address (&so->lm.l_name, sizeof (so->lm.l_name));
+ }
+
+ static int
+ IGNORE_FIRST_LINK_MAP_ENTRY (so)
+ struct so_list *so;
+ {
+ #if defined (__sparcv9)
+ if (bfd_elf_get_arch_size (exec_bfd) == 32)
+ return (solib_extract_address (&(so) -> lm32.l_prev) == 0);
+ else
+ #endif
+ return (solib_extract_address (&(so) -> lm.l_prev) == 0);
+ }
+
+ #endif /* !SVR4_SHARED_LIBS */
+
+
static CORE_ADDR debug_base; /* Base of dynamic linker structures */
static CORE_ADDR breakpoint_addr; /* Address where end bkpt is set */
*************** first_link_map_member ()
*** 902,913 ****
}
#else /* SVR4_SHARED_LIBS */
!
! read_memory (debug_base, (char *) &debug_copy, sizeof (struct r_debug));
/* FIXME: Perhaps we should validate the info somehow, perhaps by
checking r_version for a known version number, or r_state for
RT_CONSISTENT. */
- lm = SOLIB_EXTRACT_ADDRESS (debug_copy.r_map);
#endif /* !SVR4_SHARED_LIBS */
--- 1016,1038 ----
}
#else /* SVR4_SHARED_LIBS */
! #if defined (__sparcv9)
! if (bfd_elf_get_arch_size (exec_bfd) == 32)
! {
! read_memory (debug_base, (char *) &debug32_copy,
! sizeof (struct r_debug32));
! lm = SOLIB_EXTRACT_ADDRESS (debug32_copy.r_map);
! }
! else
! #endif
! {
! read_memory (debug_base, (char *) &debug_copy,
! sizeof (struct r_debug));
! lm = SOLIB_EXTRACT_ADDRESS (debug_copy.r_map);
! }
/* FIXME: Perhaps we should validate the info somehow, perhaps by
checking r_version for a known version number, or r_state for
RT_CONSISTENT. */
#endif /* !SVR4_SHARED_LIBS */
*************** open_symbol_file_object (from_ttyp)
*** 939,945 ****
int *from_ttyp; /* sneak past catch_errors */
{
CORE_ADDR lm;
- struct link_map lmcopy;
char *filename;
int errcode;
--- 1064,1069 ----
*************** open_symbol_file_object (from_ttyp)
*** 953,968 ****
/* First link map member should be the executable. */
if ((lm = first_link_map_member ()) == 0)
return 0; /* failed somehow... */
-
- /* Read from target memory to GDB. */
- read_memory (lm, (void *) &lmcopy, sizeof (lmcopy));
! if (lmcopy.l_name == 0)
! return 0; /* no filename. */
- /* Now fetch the filename from target memory. */
- target_read_string (SOLIB_EXTRACT_ADDRESS (lmcopy.l_name), &filename,
- MAX_PATH_SIZE - 1, &errcode);
if (errcode)
{
warning ("failed to read exec filename from attached file: %s",
--- 1077,1112 ----
/* First link map member should be the executable. */
if ((lm = first_link_map_member ()) == 0)
return 0; /* failed somehow... */
! #if defined (__sparcv9)
! if (bfd_elf_get_arch_size (exec_bfd) == 32)
! {
! struct link_map32 lmcopy;
! /* Read from target memory to GDB. */
! read_memory (lm, (void *) &lmcopy, sizeof (lmcopy));
!
! if (lmcopy.l_name == 0)
! return 0; /* no filename. */
!
! /* Now fetch the filename from target memory. */
! target_read_string (SOLIB_EXTRACT_ADDRESS (lmcopy.l_name),
! &filename, MAX_PATH_SIZE - 1, &errcode);
! }
! else
! #endif /* __sparcv9 */
! {
! struct link_map lmcopy;
! /* Read from target memory to GDB. */
! read_memory (lm, (void *) &lmcopy, sizeof (lmcopy));
!
! if (lmcopy.l_name == 0)
! return 0; /* no filename. */
!
! /* Now fetch the filename from target memory. */
! target_read_string (SOLIB_EXTRACT_ADDRESS (lmcopy.l_name), &filename,
! MAX_PATH_SIZE - 1, &errcode);
! }
if (errcode)
{
warning ("failed to read exec filename from attached file: %s",
*************** current_sos ()
*** 1092,1098 ****
memset (new, 0, sizeof (*new));
new->lmaddr = lm;
! read_memory (lm, (char *) &(new->lm), sizeof (struct link_map));
lm = LM_NEXT (new);
--- 1236,1248 ----
memset (new, 0, sizeof (*new));
new->lmaddr = lm;
!
! #if defined (__sparcv9)
! if (bfd_elf_get_arch_size (exec_bfd) == 32)
! read_memory (lm, (char *) &(new->lm32), sizeof (struct link_map32));
! else
! #endif
! read_memory (lm, (char *) &(new->lm), sizeof (struct link_map));
lm = LM_NEXT (new);