This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[Darwin] Fix mismatch with large number of dso
- From: Tristan Gingold <gingold at adacore dot com>
- To: "gdb-patches at sourceware dot org ml" <gdb-patches at sourceware dot org>
- Date: Fri, 17 Feb 2012 17:37:09 +0100
- Subject: [Darwin] Fix mismatch with large number of dso
Hi,
we found this issue on Darwin 10: we expected that the executable is the first element of the image list, but this is not true for very long list. So we now check the kind of each image.
Committed on trunk.
Tristan.
2012-02-17 Tristan Gingold <gingold@adacore.com>
* solib-darwin.c (darwin_current_sos): Check magic and filetype
===================================================================
RCS file: /cvs/src/src/gdb/solib-darwin.c,v
retrieving revision 1.19
diff -c -r1.19 solib-darwin.c
*** solib-darwin.c 8 Feb 2012 09:17:41 -0000 1.19
--- solib-darwin.c 17 Feb 2012 16:33:26 -0000
***************
*** 41,46 ****
--- 41,47 ----
#include "auxv.h"
#include "exceptions.h"
#include "mach-o.h"
+ #include "mach-o/external.h"
struct gdb_dyld_image_info
{
***************
*** 210,215 ****
--- 211,217 ----
darwin_current_sos (void)
{
struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr;
+ enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
int ptr_len = TYPE_LENGTH (ptr_type);
unsigned int image_info_size;
CORE_ADDR lm;
***************
*** 226,238 ****
image_info_size = ptr_len * 3;
/* Read infos for each solib.
! This first entry is ignored as this is the executable itself. */
! for (i = 1; i < dyld_all_image.count; i++)
{
CORE_ADDR info = dyld_all_image.info + i * image_info_size;
char buf[image_info_size];
CORE_ADDR load_addr;
CORE_ADDR path_addr;
char *file_path;
int errcode;
struct darwin_so_list *dnew;
--- 228,244 ----
image_info_size = ptr_len * 3;
/* Read infos for each solib.
! The first entry was rumored to be the executable itself, but this is not
! true when a large number of shared libraries are used (table expanded ?).
! We now check all entries, but discard executable images. */
! for (i = 0; i < dyld_all_image.count; i++)
{
CORE_ADDR info = dyld_all_image.info + i * image_info_size;
char buf[image_info_size];
CORE_ADDR load_addr;
CORE_ADDR path_addr;
+ struct mach_o_header_external hdr;
+ unsigned long hdr_val;
char *file_path;
int errcode;
struct darwin_so_list *dnew;
***************
*** 246,251 ****
--- 252,271 ----
load_addr = extract_typed_address (buf, ptr_type);
path_addr = extract_typed_address (buf + ptr_len, ptr_type);
+ /* Read Mach-O header from memory. */
+ if (target_read_memory (load_addr, (char *) &hdr, sizeof (hdr) - 4))
+ break;
+ /* Discard wrong magic numbers. Shouldn't happen. */
+ hdr_val = extract_unsigned_integer
+ (hdr.magic, sizeof (hdr.magic), byte_order);
+ if (hdr_val != BFD_MACH_O_MH_MAGIC && hdr_val != BFD_MACH_O_MH_MAGIC_64)
+ continue;
+ /* Discard executable. Should happen only once. */
+ hdr_val = extract_unsigned_integer
+ (hdr.filetype, sizeof (hdr.filetype), byte_order);
+ if (hdr_val == BFD_MACH_O_MH_EXECUTE)
+ continue;
+
target_read_string (path_addr, &file_path,
SO_NAME_MAX_PATH_SIZE - 1, &errcode);
if (errcode)