This is the mail archive of the
gdb-patches@sourceware.cygnus.com
mailing list for the GDB project.
[PATCH]: Make solib.c more multi-archable
- To: cagney at cygnus dot com, gdb-patches at sourceware dot cygnus dot com, jimb at cygnus dot com
- Subject: [PATCH]: Make solib.c more multi-archable
- From: msnyder at cygnus dot com
- Date: Wed, 3 May 2000 17:17:59 -0700 (PDT)
Hello,
This patch will allow solib.c to use the bfd to determine whether
it is ELF32 or ELF64, rather than using a compile-time macro.
This gets us closer to allowing a single GDB to debug both types
of solibs.
2000-05-03 Michael Snyder <msnyder@seadog.cygnus.com>
* solib.c (elf_locate_base, info_sharedlibrary_command):
Look at the bfd to determine if it is elf32 or elf64, rather
than using an ifdef. This makes it runtime teststable and
multi-arch.
Index: solib.c
===================================================================
RCS file: /cvs/src/src/gdb/solib.c,v
retrieving revision 1.11
diff -p -r1.11 solib.c
*** solib.c 2000/04/17 16:09:04 1.11
--- solib.c 2000/05/04 00:15:08
***************
*** 43,48 ****
--- 43,51 ----
#include "symtab.h"
#include "bfd.h"
+ #define _ELF_COMMON_H /* Kludge: prevent inclusion of elf/common.h.
+ Defines conflict with /usr/include/sys/elf.h */
+ #include "elf-bfd.h"
#include "symfile.h"
#include "objfiles.h"
#include "gdbcore.h"
*************** elf_locate_base ()
*** 726,781 ****
/* Find the DT_DEBUG entry in the the .dynamic section.
For mips elf we look for DT_MIPS_RLD_MAP, mips elf apparently has
no DT_DEBUG entries. */
! #ifndef TARGET_ELF64
! for (bufend = buf + dyninfo_sect_size;
! buf < bufend;
! buf += sizeof (Elf32_External_Dyn))
! {
! Elf32_External_Dyn *x_dynp = (Elf32_External_Dyn *) buf;
! long dyn_tag;
! CORE_ADDR dyn_ptr;
!
! dyn_tag = bfd_h_get_32 (exec_bfd, (bfd_byte *) x_dynp->d_tag);
! if (dyn_tag == DT_NULL)
! break;
! else if (dyn_tag == DT_DEBUG)
{
! dyn_ptr = bfd_h_get_32 (exec_bfd, (bfd_byte *) x_dynp->d_un.d_ptr);
! return dyn_ptr;
! }
#ifdef DT_MIPS_RLD_MAP
! else if (dyn_tag == DT_MIPS_RLD_MAP)
! {
! char pbuf[TARGET_PTR_BIT / HOST_CHAR_BIT];
! /* DT_MIPS_RLD_MAP contains a pointer to the address
! of the dynamic link structure. */
! dyn_ptr = bfd_h_get_32 (exec_bfd, (bfd_byte *) x_dynp->d_un.d_ptr);
! if (target_read_memory (dyn_ptr, pbuf, sizeof (pbuf)))
! return 0;
! return extract_unsigned_integer (pbuf, sizeof (pbuf));
! }
#endif
}
! #else /* ELF64 */
! for (bufend = buf + dyninfo_sect_size;
! buf < bufend;
! buf += sizeof (Elf64_External_Dyn))
! {
! Elf64_External_Dyn *x_dynp = (Elf64_External_Dyn *) buf;
! long dyn_tag;
! CORE_ADDR dyn_ptr;
!
! dyn_tag = bfd_h_get_64 (exec_bfd, (bfd_byte *) x_dynp->d_tag);
! if (dyn_tag == DT_NULL)
! break;
! else if (dyn_tag == DT_DEBUG)
{
! dyn_ptr = bfd_h_get_64 (exec_bfd, (bfd_byte *) x_dynp->d_un.d_ptr);
! return dyn_ptr;
}
}
- #endif
/* DT_DEBUG entry not found. */
return 0;
--- 729,790 ----
/* Find the DT_DEBUG entry in the the .dynamic section.
For mips elf we look for DT_MIPS_RLD_MAP, mips elf apparently has
no DT_DEBUG entries. */
! if ((get_elf_backend_data (exec_bfd))->s->arch_size == 32)
! { /* 32-bit elf */
! for (bufend = buf + dyninfo_sect_size;
! buf < bufend;
! buf += sizeof (Elf32_External_Dyn))
{
! Elf32_External_Dyn *x_dynp = (Elf32_External_Dyn *) buf;
! long dyn_tag;
! CORE_ADDR dyn_ptr;
!
! dyn_tag = bfd_h_get_32 (exec_bfd, (bfd_byte *) x_dynp->d_tag);
! if (dyn_tag == DT_NULL)
! break;
! else if (dyn_tag == DT_DEBUG)
! {
! dyn_ptr = bfd_h_get_32 (exec_bfd,
! (bfd_byte *) x_dynp->d_un.d_ptr);
! return dyn_ptr;
! }
#ifdef DT_MIPS_RLD_MAP
! else if (dyn_tag == DT_MIPS_RLD_MAP)
! {
! char pbuf[TARGET_PTR_BIT / HOST_CHAR_BIT];
! /* DT_MIPS_RLD_MAP contains a pointer to the address
! of the dynamic link structure. */
! dyn_ptr = bfd_h_get_32 (exec_bfd,
! (bfd_byte *) x_dynp->d_un.d_ptr);
! if (target_read_memory (dyn_ptr, pbuf, sizeof (pbuf)))
! return 0;
! return extract_unsigned_integer (pbuf, sizeof (pbuf));
! }
#endif
+ }
}
! else /* 64-bit elf */
! {
! for (bufend = buf + dyninfo_sect_size;
! buf < bufend;
! buf += sizeof (Elf64_External_Dyn))
{
! Elf64_External_Dyn *x_dynp = (Elf64_External_Dyn *) buf;
! long dyn_tag;
! CORE_ADDR dyn_ptr;
!
! dyn_tag = bfd_h_get_64 (exec_bfd, (bfd_byte *) x_dynp->d_tag);
! if (dyn_tag == DT_NULL)
! break;
! else if (dyn_tag == DT_DEBUG)
! {
! dyn_ptr = bfd_h_get_64 (exec_bfd,
! (bfd_byte *) x_dynp->d_un.d_ptr);
! return dyn_ptr;
! }
}
}
/* DT_DEBUG entry not found. */
return 0;
*************** info_sharedlibrary_command (ignore, from
*** 1491,1503 ****
return;
}
! #ifndef TARGET_ELF64
! addr_width = 8 + 4;
! addr_fmt = "08l";
! #else
! addr_width = 16 + 4;
! addr_fmt = "016l";
! #endif
update_solib_list (from_tty, 0);
--- 1500,1515 ----
return;
}
! if ((get_elf_backend_data (exec_bfd))->s->arch_size == 32)
! { /* 32-bit elf */
! addr_width = 8 + 4;
! addr_fmt = "08l";
! }
! else /* 64-bit elf */
! {
! addr_width = 16 + 4;
! addr_fmt = "016l";
! }
update_solib_list (from_tty, 0);