xref: /netbsd-src/external/gpl3/gdb/dist/gdb/solib-darwin.c (revision 946379e7b37692fc43f68eb0d1c10daa0a7f3b6c)
1 /* Handle Darwin shared libraries for GDB, the GNU Debugger.
2 
3    Copyright (C) 2009-2015 Free Software Foundation, Inc.
4 
5    This file is part of GDB.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 #include "defs.h"
21 
22 #include "symtab.h"
23 #include "bfd.h"
24 #include "symfile.h"
25 #include "objfiles.h"
26 #include "gdbcore.h"
27 #include "target.h"
28 #include "inferior.h"
29 #include "regcache.h"
30 #include "gdbthread.h"
31 #include "gdb_bfd.h"
32 
33 #include "solist.h"
34 #include "solib.h"
35 #include "solib-svr4.h"
36 
37 #include "bfd-target.h"
38 #include "elf-bfd.h"
39 #include "exec.h"
40 #include "auxv.h"
41 #include "mach-o.h"
42 #include "mach-o/external.h"
43 
44 struct gdb_dyld_image_info
45 {
46   /* Base address (which corresponds to the Mach-O header).  */
47   CORE_ADDR mach_header;
48   /* Image file path.  */
49   CORE_ADDR file_path;
50   /* st.m_time of image file.  */
51   unsigned long mtime;
52 };
53 
54 /* Content of inferior dyld_all_image_infos structure.
55    See /usr/include/mach-o/dyld_images.h for the documentation.  */
56 struct gdb_dyld_all_image_infos
57 {
58   /* Version (1).  */
59   unsigned int version;
60   /* Number of images.  */
61   unsigned int count;
62   /* Image description.  */
63   CORE_ADDR info;
64   /* Notifier (function called when a library is added or removed).  */
65   CORE_ADDR notifier;
66 };
67 
68 /* Current all_image_infos version.  */
69 #define DYLD_VERSION_MIN 1
70 #define DYLD_VERSION_MAX 14
71 
72 /* Per PSPACE specific data.  */
73 struct darwin_info
74 {
75   /* Address of structure dyld_all_image_infos in inferior.  */
76   CORE_ADDR all_image_addr;
77 
78   /* Gdb copy of dyld_all_info_infos.  */
79   struct gdb_dyld_all_image_infos all_image;
80 };
81 
82 /* Per-program-space data key.  */
83 static const struct program_space_data *solib_darwin_pspace_data;
84 
85 static void
86 darwin_pspace_data_cleanup (struct program_space *pspace, void *arg)
87 {
88   xfree (arg);
89 }
90 
91 /* Get the current darwin data.  If none is found yet, add it now.  This
92    function always returns a valid object.  */
93 
94 static struct darwin_info *
95 get_darwin_info (void)
96 {
97   struct darwin_info *info;
98 
99   info = program_space_data (current_program_space, solib_darwin_pspace_data);
100   if (info != NULL)
101     return info;
102 
103   info = XCNEW (struct darwin_info);
104   set_program_space_data (current_program_space,
105 			  solib_darwin_pspace_data, info);
106   return info;
107 }
108 
109 /* Return non-zero if the version in dyld_all_image is known.  */
110 
111 static int
112 darwin_dyld_version_ok (const struct darwin_info *info)
113 {
114   return info->all_image.version >= DYLD_VERSION_MIN
115     && info->all_image.version <= DYLD_VERSION_MAX;
116 }
117 
118 /* Read dyld_all_image from inferior.  */
119 
120 static void
121 darwin_load_image_infos (struct darwin_info *info)
122 {
123   gdb_byte buf[24];
124   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
125   struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
126   int len;
127 
128   /* If the structure address is not known, don't continue.  */
129   if (info->all_image_addr == 0)
130     return;
131 
132   /* The structure has 4 fields: version (4 bytes), count (4 bytes),
133      info (pointer) and notifier (pointer).  */
134   len = 4 + 4 + 2 * ptr_type->length;
135   gdb_assert (len <= sizeof (buf));
136   memset (&info->all_image, 0, sizeof (info->all_image));
137 
138   /* Read structure raw bytes from target.  */
139   if (target_read_memory (info->all_image_addr, buf, len))
140     return;
141 
142   /* Extract the fields.  */
143   info->all_image.version = extract_unsigned_integer (buf, 4, byte_order);
144   if (!darwin_dyld_version_ok (info))
145     return;
146 
147   info->all_image.count = extract_unsigned_integer (buf + 4, 4, byte_order);
148   info->all_image.info = extract_typed_address (buf + 8, ptr_type);
149   info->all_image.notifier = extract_typed_address
150     (buf + 8 + ptr_type->length, ptr_type);
151 }
152 
153 /* Link map info to include in an allocated so_list entry.  */
154 
155 struct lm_info
156 {
157   /* The target location of lm.  */
158   CORE_ADDR lm_addr;
159 };
160 
161 struct darwin_so_list
162 {
163   /* Common field.  */
164   struct so_list sl;
165   /* Darwin specific data.  */
166   struct lm_info li;
167 };
168 
169 /* Lookup the value for a specific symbol.  */
170 
171 static CORE_ADDR
172 lookup_symbol_from_bfd (bfd *abfd, char *symname)
173 {
174   long storage_needed;
175   asymbol **symbol_table;
176   unsigned int number_of_symbols;
177   unsigned int i;
178   CORE_ADDR symaddr = 0;
179 
180   storage_needed = bfd_get_symtab_upper_bound (abfd);
181 
182   if (storage_needed <= 0)
183     return 0;
184 
185   symbol_table = (asymbol **) xmalloc (storage_needed);
186   number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
187 
188   for (i = 0; i < number_of_symbols; i++)
189     {
190       asymbol *sym = symbol_table[i];
191 
192       if (strcmp (sym->name, symname) == 0
193 	  && (sym->section->flags & (SEC_CODE | SEC_DATA)) != 0)
194 	{
195 	  /* BFD symbols are section relative.  */
196 	  symaddr = sym->value + sym->section->vma;
197 	  break;
198 	}
199     }
200   xfree (symbol_table);
201 
202   return symaddr;
203 }
204 
205 /* Return program interpreter string.  */
206 
207 static char *
208 find_program_interpreter (void)
209 {
210   char *buf = NULL;
211 
212   /* If we have an exec_bfd, get the interpreter from the load commands.  */
213   if (exec_bfd)
214     {
215       bfd_mach_o_load_command *cmd;
216 
217       if (bfd_mach_o_lookup_command (exec_bfd,
218                                      BFD_MACH_O_LC_LOAD_DYLINKER, &cmd) == 1)
219         return cmd->command.dylinker.name_str;
220     }
221 
222   /* If we didn't find it, read from memory.
223      FIXME: todo.  */
224   return buf;
225 }
226 
227 /*  Not used.  I don't see how the main symbol file can be found: the
228     interpreter name is needed and it is known from the executable file.
229     Note that darwin-nat.c implements pid_to_exec_file.  */
230 
231 static int
232 open_symbol_file_object (void *from_ttyp)
233 {
234   return 0;
235 }
236 
237 /* Build a list of currently loaded shared objects.  See solib-svr4.c.  */
238 
239 static struct so_list *
240 darwin_current_sos (void)
241 {
242   struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
243   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
244   int ptr_len = TYPE_LENGTH (ptr_type);
245   unsigned int image_info_size;
246   struct so_list *head = NULL;
247   struct so_list *tail = NULL;
248   int i;
249   struct darwin_info *info = get_darwin_info ();
250 
251   /* Be sure image infos are loaded.  */
252   darwin_load_image_infos (info);
253 
254   if (!darwin_dyld_version_ok (info))
255     return NULL;
256 
257   image_info_size = ptr_len * 3;
258 
259   /* Read infos for each solib.
260      The first entry was rumored to be the executable itself, but this is not
261      true when a large number of shared libraries are used (table expanded ?).
262      We now check all entries, but discard executable images.  */
263   for (i = 0; i < info->all_image.count; i++)
264     {
265       CORE_ADDR iinfo = info->all_image.info + i * image_info_size;
266       gdb_byte buf[image_info_size];
267       CORE_ADDR load_addr;
268       CORE_ADDR path_addr;
269       struct mach_o_header_external hdr;
270       unsigned long hdr_val;
271       char *file_path;
272       int errcode;
273       struct darwin_so_list *dnew;
274       struct so_list *new;
275       struct cleanup *old_chain;
276 
277       /* Read image info from inferior.  */
278       if (target_read_memory (iinfo, buf, image_info_size))
279 	break;
280 
281       load_addr = extract_typed_address (buf, ptr_type);
282       path_addr = extract_typed_address (buf + ptr_len, ptr_type);
283 
284       /* Read Mach-O header from memory.  */
285       if (target_read_memory (load_addr, (gdb_byte *) &hdr, sizeof (hdr) - 4))
286 	break;
287       /* Discard wrong magic numbers.  Shouldn't happen.  */
288       hdr_val = extract_unsigned_integer
289         (hdr.magic, sizeof (hdr.magic), byte_order);
290       if (hdr_val != BFD_MACH_O_MH_MAGIC && hdr_val != BFD_MACH_O_MH_MAGIC_64)
291         continue;
292       /* Discard executable.  Should happen only once.  */
293       hdr_val = extract_unsigned_integer
294         (hdr.filetype, sizeof (hdr.filetype), byte_order);
295       if (hdr_val == BFD_MACH_O_MH_EXECUTE)
296         continue;
297 
298       target_read_string (path_addr, &file_path,
299 			  SO_NAME_MAX_PATH_SIZE - 1, &errcode);
300       if (errcode)
301 	break;
302 
303       /* Create and fill the new so_list element.  */
304       dnew = XCNEW (struct darwin_so_list);
305       new = &dnew->sl;
306       old_chain = make_cleanup (xfree, dnew);
307 
308       new->lm_info = &dnew->li;
309 
310       strncpy (new->so_name, file_path, SO_NAME_MAX_PATH_SIZE - 1);
311       new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
312       strcpy (new->so_original_name, new->so_name);
313       xfree (file_path);
314       new->lm_info->lm_addr = load_addr;
315 
316       if (head == NULL)
317 	head = new;
318       else
319 	tail->next = new;
320       tail = new;
321 
322       discard_cleanups (old_chain);
323     }
324 
325   return head;
326 }
327 
328 /* Get the load address of the executable.  We assume that the dyld info are
329    correct.  */
330 
331 static CORE_ADDR
332 darwin_read_exec_load_addr (struct darwin_info *info)
333 {
334   struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
335   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
336   int ptr_len = TYPE_LENGTH (ptr_type);
337   unsigned int image_info_size = ptr_len * 3;
338   int i;
339 
340   /* Read infos for each solib.  One of them should be the executable.  */
341   for (i = 0; i < info->all_image.count; i++)
342     {
343       CORE_ADDR iinfo = info->all_image.info + i * image_info_size;
344       gdb_byte buf[image_info_size];
345       CORE_ADDR load_addr;
346       struct mach_o_header_external hdr;
347       unsigned long hdr_val;
348 
349       /* Read image info from inferior.  */
350       if (target_read_memory (iinfo, buf, image_info_size))
351 	break;
352 
353       load_addr = extract_typed_address (buf, ptr_type);
354 
355       /* Read Mach-O header from memory.  */
356       if (target_read_memory (load_addr, (gdb_byte *) &hdr, sizeof (hdr) - 4))
357 	break;
358       /* Discard wrong magic numbers.  Shouldn't happen.  */
359       hdr_val = extract_unsigned_integer
360         (hdr.magic, sizeof (hdr.magic), byte_order);
361       if (hdr_val != BFD_MACH_O_MH_MAGIC && hdr_val != BFD_MACH_O_MH_MAGIC_64)
362         continue;
363       /* Check executable.  */
364       hdr_val = extract_unsigned_integer
365         (hdr.filetype, sizeof (hdr.filetype), byte_order);
366       if (hdr_val == BFD_MACH_O_MH_EXECUTE)
367 	return load_addr;
368     }
369 
370   return 0;
371 }
372 
373 /* Return 1 if PC lies in the dynamic symbol resolution code of the
374    run time loader.  */
375 
376 static int
377 darwin_in_dynsym_resolve_code (CORE_ADDR pc)
378 {
379   return 0;
380 }
381 
382 
383 /* No special symbol handling.  */
384 
385 static void
386 darwin_special_symbol_handling (void)
387 {
388 }
389 
390 /* A wrapper for bfd_mach_o_fat_extract that handles reference
391    counting properly.  This will either return NULL, or return a new
392    reference to a BFD.  */
393 
394 static bfd *
395 gdb_bfd_mach_o_fat_extract (bfd *abfd, bfd_format format,
396 			    const bfd_arch_info_type *arch)
397 {
398   bfd *result = bfd_mach_o_fat_extract (abfd, format, arch);
399 
400   if (result == NULL)
401     return NULL;
402 
403   if (result == abfd)
404     gdb_bfd_ref (result);
405   else
406     gdb_bfd_mark_parent (result, abfd);
407 
408   return result;
409 }
410 
411 /* Extract dyld_all_image_addr when the process was just created, assuming the
412    current PC is at the entry of the dynamic linker.  */
413 
414 static void
415 darwin_solib_get_all_image_info_addr_at_init (struct darwin_info *info)
416 {
417   char *interp_name;
418   CORE_ADDR load_addr = 0;
419   bfd *dyld_bfd = NULL;
420   struct cleanup *cleanup;
421 
422   /* This method doesn't work with an attached process.  */
423   if (current_inferior ()->attach_flag)
424     return;
425 
426   /* Find the program interpreter.  */
427   interp_name = find_program_interpreter ();
428   if (!interp_name)
429     return;
430 
431   cleanup = make_cleanup (null_cleanup, NULL);
432 
433   /* Create a bfd for the interpreter.  */
434   dyld_bfd = gdb_bfd_open (interp_name, gnutarget, -1);
435   if (dyld_bfd)
436     {
437       bfd *sub;
438 
439       make_cleanup_bfd_unref (dyld_bfd);
440       sub = gdb_bfd_mach_o_fat_extract (dyld_bfd, bfd_object,
441 					gdbarch_bfd_arch_info (target_gdbarch ()));
442       if (sub)
443 	{
444 	  dyld_bfd = sub;
445 	  make_cleanup_bfd_unref (sub);
446 	}
447       else
448 	dyld_bfd = NULL;
449     }
450   if (!dyld_bfd)
451     {
452       do_cleanups (cleanup);
453       return;
454     }
455 
456   /* We find the dynamic linker's base address by examining
457      the current pc (which should point at the entry point for the
458      dynamic linker) and subtracting the offset of the entry point.  */
459   load_addr = (regcache_read_pc (get_current_regcache ())
460                - bfd_get_start_address (dyld_bfd));
461 
462   /* Now try to set a breakpoint in the dynamic linker.  */
463   info->all_image_addr =
464     lookup_symbol_from_bfd (dyld_bfd, "_dyld_all_image_infos");
465 
466   do_cleanups (cleanup);
467 
468   if (info->all_image_addr == 0)
469     return;
470 
471   info->all_image_addr += load_addr;
472 }
473 
474 /* Extract dyld_all_image_addr reading it from
475    TARGET_OBJECT_DARWIN_DYLD_INFO.  */
476 
477 static void
478 darwin_solib_read_all_image_info_addr (struct darwin_info *info)
479 {
480   gdb_byte buf[8 + 8 + 4];
481   LONGEST len;
482   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
483 
484   len = target_read (&current_target, TARGET_OBJECT_DARWIN_DYLD_INFO, NULL,
485                      buf, 0, sizeof (buf));
486   if (len != sizeof (buf))
487     return;
488 
489   info->all_image_addr = extract_unsigned_integer (buf, 8, byte_order);
490 }
491 
492 /* Shared library startup support.  See documentation in solib-svr4.c.  */
493 
494 static void
495 darwin_solib_create_inferior_hook (int from_tty)
496 {
497   struct darwin_info *info = get_darwin_info ();
498   CORE_ADDR load_addr;
499 
500   info->all_image_addr = 0;
501 
502   darwin_solib_read_all_image_info_addr (info);
503 
504   if (info->all_image_addr == 0)
505     darwin_solib_get_all_image_info_addr_at_init (info);
506 
507   if (info->all_image_addr == 0)
508     return;
509 
510   darwin_load_image_infos (info);
511 
512   if (!darwin_dyld_version_ok (info))
513     {
514       warning (_("unhandled dyld version (%d)"), info->all_image.version);
515       return;
516     }
517 
518   create_solib_event_breakpoint (target_gdbarch (), info->all_image.notifier);
519 
520   /* Possible relocate the main executable (PIE).  */
521   load_addr = darwin_read_exec_load_addr (info);
522   if (load_addr != 0 && symfile_objfile != NULL)
523     {
524       CORE_ADDR vmaddr;
525 
526       /* Find the base address of the executable.  */
527       vmaddr = bfd_mach_o_get_base_address (exec_bfd);
528 
529       /* Relocate.  */
530       if (vmaddr != load_addr)
531 	objfile_rebase (symfile_objfile, load_addr - vmaddr);
532     }
533 }
534 
535 static void
536 darwin_clear_solib (void)
537 {
538   struct darwin_info *info = get_darwin_info ();
539 
540   info->all_image_addr = 0;
541   info->all_image.version = 0;
542 }
543 
544 static void
545 darwin_free_so (struct so_list *so)
546 {
547 }
548 
549 /* The section table is built from bfd sections using bfd VMAs.
550    Relocate these VMAs according to solib info.  */
551 
552 static void
553 darwin_relocate_section_addresses (struct so_list *so,
554 				   struct target_section *sec)
555 {
556   sec->addr += so->lm_info->lm_addr;
557   sec->endaddr += so->lm_info->lm_addr;
558 
559   /* Best effort to set addr_high/addr_low.  This is used only by
560      'info sharedlibary'.  */
561   if (so->addr_high == 0)
562     {
563       so->addr_low = sec->addr;
564       so->addr_high = sec->endaddr;
565     }
566   if (sec->endaddr > so->addr_high)
567     so->addr_high = sec->endaddr;
568   if (sec->addr < so->addr_low)
569     so->addr_low = sec->addr;
570 }
571 
572 static struct symbol *
573 darwin_lookup_lib_symbol (struct objfile *objfile,
574 			  const char *name,
575 			  const domain_enum domain)
576 {
577   return NULL;
578 }
579 
580 static bfd *
581 darwin_bfd_open (char *pathname)
582 {
583   char *found_pathname;
584   int found_file;
585   bfd *abfd;
586   bfd *res;
587 
588   /* Search for shared library file.  */
589   found_pathname = solib_find (pathname, &found_file);
590   if (found_pathname == NULL)
591     perror_with_name (pathname);
592 
593   /* Open bfd for shared library.  */
594   abfd = solib_bfd_fopen (found_pathname, found_file);
595 
596   res = gdb_bfd_mach_o_fat_extract (abfd, bfd_object,
597 				    gdbarch_bfd_arch_info (target_gdbarch ()));
598   if (!res)
599     {
600       make_cleanup_bfd_unref (abfd);
601       error (_("`%s': not a shared-library: %s"),
602 	     bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
603     }
604 
605   /* The current filename for fat-binary BFDs is a name generated
606      by BFD, usually a string containing the name of the architecture.
607      Reset its value to the actual filename.  */
608   xfree (bfd_get_filename (res));
609   res->filename = xstrdup (pathname);
610 
611   gdb_bfd_unref (abfd);
612   return res;
613 }
614 
615 struct target_so_ops darwin_so_ops;
616 
617 /* -Wmissing-prototypes */
618 extern initialize_file_ftype _initialize_darwin_solib;
619 
620 void
621 _initialize_darwin_solib (void)
622 {
623   solib_darwin_pspace_data
624     = register_program_space_data_with_cleanup (NULL,
625 						darwin_pspace_data_cleanup);
626 
627   darwin_so_ops.relocate_section_addresses = darwin_relocate_section_addresses;
628   darwin_so_ops.free_so = darwin_free_so;
629   darwin_so_ops.clear_solib = darwin_clear_solib;
630   darwin_so_ops.solib_create_inferior_hook = darwin_solib_create_inferior_hook;
631   darwin_so_ops.special_symbol_handling = darwin_special_symbol_handling;
632   darwin_so_ops.current_sos = darwin_current_sos;
633   darwin_so_ops.open_symbol_file_object = open_symbol_file_object;
634   darwin_so_ops.in_dynsym_resolve_code = darwin_in_dynsym_resolve_code;
635   darwin_so_ops.lookup_lib_global_symbol = darwin_lookup_lib_symbol;
636   darwin_so_ops.bfd_open = darwin_bfd_open;
637 }
638