This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]