[committed/darwin] Handle darwin 10 dynamic loader

Tristan Gingold gingold@adacore.com
Tue Oct 13 10:31:00 GMT 2009


Hi,

the version of the communication area between gdb and the dynadmic  
loader (dyld) has changed with
darwin 10.  With this patch gdb can handle the new (well, in fact  
backward compatible) structure.

Tristan.

2009-10-13  Tristan Gingold  <gingold@adacore.com>

	* solib-darwin.c: Add an empty line after comment for functions.
	(struct gdb_dyld_all_image_infos): Improve comment.
	(DYLD_VERSION): Removed and replaced by ...
	(DYLD_VERSION_MAX, DYLD_VERSION_MIN): ... New macros.
	(darwin_dyld_version_ok): New function.
	(darwin_load_image_infos): Call darwin_dyld_version_ok.
	(darwin_current_sos): Ditto.
	(darwin_solib_create_inferior_hook): Ditto.

Index: solib-darwin.c
===================================================================
RCS file: /cvs/src/src/gdb/solib-darwin.c,v
retrieving revision 1.7
diff -c -r1.7 solib-darwin.c
*** solib-darwin.c	10 Aug 2009 09:35:24 -0000	1.7
--- solib-darwin.c	13 Oct 2009 10:27:54 -0000
***************
*** 52,58 ****
     unsigned long mtime;
   };

! /* Content of inferior dyld_all_image_infos structure.  */
   struct gdb_dyld_all_image_infos
   {
     /* Version (1).  */
--- 52,59 ----
     unsigned long mtime;
   };

! /* Content of inferior dyld_all_image_infos structure.
!    See /usr/include/mach-o/dyld_images.h for the documentation.  */
   struct gdb_dyld_all_image_infos
   {
     /* Version (1).  */
***************
*** 66,72 ****
   };

   /* Current all_image_infos version.  */
! #define DYLD_VERSION 1

   /* Address of structure dyld_all_image_infos in inferior.  */
   static CORE_ADDR dyld_all_image_addr;
--- 67,74 ----
   };

   /* Current all_image_infos version.  */
! #define DYLD_VERSION_MIN 1
! #define DYLD_VERSION_MAX 7

   /* Address of structure dyld_all_image_infos in inferior.  */
   static CORE_ADDR dyld_all_image_addr;
***************
*** 74,80 ****
--- 76,92 ----
   /* Gdb copy of dyld_all_info_infos.  */
   static struct gdb_dyld_all_image_infos dyld_all_image;

+ /* Return non-zero if the version in dyld_all_image is known.  */
+
+ static int
+ darwin_dyld_version_ok (void)
+ {
+   return dyld_all_image.version >= DYLD_VERSION_MIN
+     && dyld_all_image.version >= DYLD_VERSION_MAX;
+ }
+
   /* Read dyld_all_image from inferior.  */
+
   static void
   darwin_load_image_infos (void)
   {
***************
*** 99,105 ****

     /* Extract the fields.  */
     dyld_all_image.version = extract_unsigned_integer (buf, 4,  
byte_order);
!   if (dyld_all_image.version != DYLD_VERSION)
       return;

     dyld_all_image.count = extract_unsigned_integer (buf + 4, 4,  
byte_order);
--- 111,117 ----

     /* Extract the fields.  */
     dyld_all_image.version = extract_unsigned_integer (buf, 4,  
byte_order);
!   if (!darwin_dyld_version_ok ())
       return;

     dyld_all_image.count = extract_unsigned_integer (buf + 4, 4,  
byte_order);
***************
*** 125,130 ****
--- 137,143 ----
   };

   /* Lookup the value for a specific symbol.  */
+
   static CORE_ADDR
   lookup_symbol_from_bfd (bfd *abfd, char *symname)
   {
***************
*** 183,188 ****
--- 196,202 ----
   /*  Not used.  I don't see how the main symbol file can be found: the
       interpreter name is needed and it is known from the executable  
file.
       Note that darwin-nat.c implements pid_to_exec_file.  */
+
   static int
   open_symbol_file_object (void *from_ttyp)
   {
***************
*** 190,195 ****
--- 204,210 ----
   }

   /* Build a list of currently loaded shared objects.  See solib- 
svr4.c  */
+
   static struct so_list *
   darwin_current_sos (void)
   {
***************
*** 204,210 ****
     /* Be sure image infos are loaded.  */
     darwin_load_image_infos ();

!   if (dyld_all_image.version != DYLD_VERSION)
       return NULL;

     image_info_size = ptr_len * 3;
--- 219,225 ----
     /* Be sure image infos are loaded.  */
     darwin_load_image_infos ();

!   if (!darwin_dyld_version_ok ())
       return NULL;

     image_info_size = ptr_len * 3;
***************
*** 262,267 ****
--- 277,283 ----

   /* Return 1 if PC lies in the dynamic symbol resolution code of the
      run time loader.  */
+
   int
   darwin_in_dynsym_resolve_code (CORE_ADDR pc)
   {
***************
*** 270,281 ****
--- 286,299 ----


   /* No special symbol handling.  */
+
   static void
   darwin_special_symbol_handling (void)
   {
   }

   /* Shared library startup support.  See documentation in solib- 
svr4.c  */
+
   static void
   darwin_solib_create_inferior_hook (void)
   {
***************
*** 348,354 ****

     darwin_load_image_infos ();

!   if (dyld_all_image.version == DYLD_VERSION)
       create_solib_event_breakpoint (target_gdbarch,  
dyld_all_image.notifier);
   }

--- 366,372 ----

     darwin_load_image_infos ();

!   if (darwin_dyld_version_ok ())
       create_solib_event_breakpoint (target_gdbarch,  
dyld_all_image.notifier);
   }

***************
*** 366,371 ****
--- 384,390 ----

   /* The section table is built from bfd sections using bfd VMAs.
      Relocate these VMAs according to solib info.  */
+
   static void
   darwin_relocate_section_addresses (struct so_list *so,
   				   struct target_section *sec)



More information about the Gdb-patches mailing list