Replace the block_found global with explicit data-flow
[deliverable/binutils-gdb.git] / gdb / solib-darwin.c
CommitLineData
cf1061c0
TG
1/* Handle Darwin shared libraries for GDB, the GNU Debugger.
2
32d0add0 3 Copyright (C) 2009-2015 Free Software Foundation, Inc.
cf1061c0
TG
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"
fb14de7b 29#include "regcache.h"
cf1061c0 30#include "gdbthread.h"
cbb099e8 31#include "gdb_bfd.h"
cf1061c0 32
cf1061c0
TG
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"
cf1061c0 41#include "mach-o.h"
8544a150 42#include "mach-o/external.h"
cf1061c0
TG
43
44struct 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
066d7383
TG
54/* Content of inferior dyld_all_image_infos structure.
55 See /usr/include/mach-o/dyld_images.h for the documentation. */
cf1061c0
TG
56struct 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. */
066d7383 69#define DYLD_VERSION_MIN 1
d4ccb5e0 70#define DYLD_VERSION_MAX 14
cf1061c0 71
ec95993c
TG
72/* Per PSPACE specific data. */
73struct 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. */
83static const struct program_space_data *solib_darwin_pspace_data;
84
85static void
86darwin_pspace_data_cleanup (struct program_space *pspace, void *arg)
87{
487ad57c 88 xfree (arg);
ec95993c 89}
cf1061c0 90
ec95993c
TG
91/* Get the current darwin data. If none is found yet, add it now. This
92 function always returns a valid object. */
93
94static struct darwin_info *
95get_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
41bf6aca 103 info = XCNEW (struct darwin_info);
ec95993c
TG
104 set_program_space_data (current_program_space,
105 solib_darwin_pspace_data, info);
106 return info;
107}
cf1061c0 108
066d7383
TG
109/* Return non-zero if the version in dyld_all_image is known. */
110
111static int
ec95993c 112darwin_dyld_version_ok (const struct darwin_info *info)
066d7383 113{
ec95993c
TG
114 return info->all_image.version >= DYLD_VERSION_MIN
115 && info->all_image.version <= DYLD_VERSION_MAX;
066d7383
TG
116}
117
cf1061c0 118/* Read dyld_all_image from inferior. */
066d7383 119
cf1061c0 120static void
ec95993c 121darwin_load_image_infos (struct darwin_info *info)
cf1061c0
TG
122{
123 gdb_byte buf[24];
f5656ead
TT
124 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
125 struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
cf1061c0
TG
126 int len;
127
128 /* If the structure address is not known, don't continue. */
ec95993c 129 if (info->all_image_addr == 0)
cf1061c0
TG
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));
ec95993c 136 memset (&info->all_image, 0, sizeof (info->all_image));
cf1061c0
TG
137
138 /* Read structure raw bytes from target. */
ec95993c 139 if (target_read_memory (info->all_image_addr, buf, len))
cf1061c0
TG
140 return;
141
142 /* Extract the fields. */
ec95993c
TG
143 info->all_image.version = extract_unsigned_integer (buf, 4, byte_order);
144 if (!darwin_dyld_version_ok (info))
cf1061c0
TG
145 return;
146
ec95993c
TG
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
cf1061c0
TG
150 (buf + 8 + ptr_type->length, ptr_type);
151}
152
153/* Link map info to include in an allocated so_list entry. */
154
155struct lm_info
156{
157 /* The target location of lm. */
158 CORE_ADDR lm_addr;
159};
160
161struct 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. */
066d7383 170
cf1061c0
TG
171static CORE_ADDR
172lookup_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);
70d4c673 187
cf1061c0
TG
188 for (i = 0; i < number_of_symbols; i++)
189 {
190 asymbol *sym = symbol_table[i];
433759f7 191
cf1061c0
TG
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. */
023e4e81 206
001f13d8 207static char *
cf1061c0
TG
208find_program_interpreter (void)
209{
001f13d8 210 char *buf = NULL;
cf1061c0 211
023e4e81 212 /* If we have an exec_bfd, get the interpreter from the load commands. */
cf1061c0
TG
213 if (exec_bfd)
214 {
023e4e81 215 bfd_mach_o_load_command *cmd;
70d4c673 216
023e4e81
TG
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;
cf1061c0
TG
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. */
066d7383 230
cf1061c0
TG
231static int
232open_symbol_file_object (void *from_ttyp)
233{
234 return 0;
235}
236
c378eb4e 237/* Build a list of currently loaded shared objects. See solib-svr4.c. */
066d7383 238
cf1061c0
TG
239static struct so_list *
240darwin_current_sos (void)
241{
f5656ead
TT
242 struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr;
243 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
cf1061c0
TG
244 int ptr_len = TYPE_LENGTH (ptr_type);
245 unsigned int image_info_size;
cf1061c0
TG
246 struct so_list *head = NULL;
247 struct so_list *tail = NULL;
248 int i;
ec95993c 249 struct darwin_info *info = get_darwin_info ();
cf1061c0
TG
250
251 /* Be sure image infos are loaded. */
ec95993c 252 darwin_load_image_infos (info);
cf1061c0 253
ec95993c 254 if (!darwin_dyld_version_ok (info))
cf1061c0
TG
255 return NULL;
256
257 image_info_size = ptr_len * 3;
258
259 /* Read infos for each solib.
8544a150
TG
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. */
ec95993c 263 for (i = 0; i < info->all_image.count; i++)
cf1061c0 264 {
ec95993c 265 CORE_ADDR iinfo = info->all_image.info + i * image_info_size;
e362b510 266 gdb_byte buf[image_info_size];
cf1061c0
TG
267 CORE_ADDR load_addr;
268 CORE_ADDR path_addr;
8544a150
TG
269 struct mach_o_header_external hdr;
270 unsigned long hdr_val;
cf1061c0
TG
271 char *file_path;
272 int errcode;
273 struct darwin_so_list *dnew;
fe978cb0 274 struct so_list *newobj;
cf1061c0
TG
275 struct cleanup *old_chain;
276
277 /* Read image info from inferior. */
ec95993c 278 if (target_read_memory (iinfo, buf, image_info_size))
cf1061c0
TG
279 break;
280
281 load_addr = extract_typed_address (buf, ptr_type);
282 path_addr = extract_typed_address (buf + ptr_len, ptr_type);
283
8544a150 284 /* Read Mach-O header from memory. */
948f8e3d 285 if (target_read_memory (load_addr, (gdb_byte *) &hdr, sizeof (hdr) - 4))
8544a150
TG
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
cf1061c0
TG
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. */
41bf6aca 304 dnew = XCNEW (struct darwin_so_list);
fe978cb0 305 newobj = &dnew->sl;
cf1061c0
TG
306 old_chain = make_cleanup (xfree, dnew);
307
fe978cb0 308 newobj->lm_info = &dnew->li;
cf1061c0 309
fe978cb0
PA
310 strncpy (newobj->so_name, file_path, SO_NAME_MAX_PATH_SIZE - 1);
311 newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
312 strcpy (newobj->so_original_name, newobj->so_name);
cf1061c0 313 xfree (file_path);
fe978cb0 314 newobj->lm_info->lm_addr = load_addr;
cf1061c0
TG
315
316 if (head == NULL)
fe978cb0 317 head = newobj;
cf1061c0 318 else
fe978cb0
PA
319 tail->next = newobj;
320 tail = newobj;
cf1061c0
TG
321
322 discard_cleanups (old_chain);
323 }
324
325 return head;
326}
327
4141a416
JB
328/* Get the load address of the executable. We assume that the dyld info are
329 correct. */
330
331static CORE_ADDR
332darwin_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;
e362b510 344 gdb_byte buf[image_info_size];
4141a416
JB
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. */
948f8e3d 356 if (target_read_memory (load_addr, (gdb_byte *) &hdr, sizeof (hdr) - 4))
4141a416
JB
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
cf1061c0
TG
373/* Return 1 if PC lies in the dynamic symbol resolution code of the
374 run time loader. */
066d7383 375
693be288 376static int
cf1061c0
TG
377darwin_in_dynsym_resolve_code (CORE_ADDR pc)
378{
379 return 0;
380}
381
382
383/* No special symbol handling. */
066d7383 384
cf1061c0
TG
385static void
386darwin_special_symbol_handling (void)
387{
388}
389
0cd61f44
TT
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
394static bfd *
395gdb_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
f00c55f8
TG
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. */
066d7383 413
cf1061c0 414static void
ec95993c 415darwin_solib_get_all_image_info_addr_at_init (struct darwin_info *info)
cf1061c0 416{
001f13d8 417 char *interp_name;
cf1061c0 418 CORE_ADDR load_addr = 0;
cf1061c0 419 bfd *dyld_bfd = NULL;
d6ad71ba 420 struct cleanup *cleanup;
f00c55f8
TG
421
422 /* This method doesn't work with an attached process. */
423 if (current_inferior ()->attach_flag)
424 return;
cf1061c0 425
cf1061c0
TG
426 /* Find the program interpreter. */
427 interp_name = find_program_interpreter ();
428 if (!interp_name)
429 return;
430
d6ad71ba
TT
431 cleanup = make_cleanup (null_cleanup, NULL);
432
cf1061c0 433 /* Create a bfd for the interpreter. */
1c00ec6b 434 dyld_bfd = gdb_bfd_open (interp_name, gnutarget, -1);
cf1061c0
TG
435 if (dyld_bfd)
436 {
437 bfd *sub;
433759f7 438
f9a062ff 439 make_cleanup_bfd_unref (dyld_bfd);
0cd61f44
TT
440 sub = gdb_bfd_mach_o_fat_extract (dyld_bfd, bfd_object,
441 gdbarch_bfd_arch_info (target_gdbarch ()));
cf1061c0 442 if (sub)
cf1061c0 443 {
520b0001 444 dyld_bfd = sub;
f9a062ff 445 make_cleanup_bfd_unref (sub);
cf1061c0 446 }
d6ad71ba
TT
447 else
448 dyld_bfd = NULL;
cf1061c0
TG
449 }
450 if (!dyld_bfd)
d6ad71ba
TT
451 {
452 do_cleanups (cleanup);
453 return;
454 }
70d4c673 455
f00c55f8
TG
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));
cf1061c0
TG
461
462 /* Now try to set a breakpoint in the dynamic linker. */
ec95993c 463 info->all_image_addr =
cf1061c0 464 lookup_symbol_from_bfd (dyld_bfd, "_dyld_all_image_infos");
70d4c673 465
d6ad71ba 466 do_cleanups (cleanup);
cf1061c0 467
ec95993c 468 if (info->all_image_addr == 0)
cf1061c0
TG
469 return;
470
ec95993c 471 info->all_image_addr += load_addr;
f00c55f8
TG
472}
473
474/* Extract dyld_all_image_addr reading it from
475 TARGET_OBJECT_DARWIN_DYLD_INFO. */
476
477static void
ec95993c 478darwin_solib_read_all_image_info_addr (struct darwin_info *info)
f00c55f8
TG
479{
480 gdb_byte buf[8 + 8 + 4];
481 LONGEST len;
f5656ead 482 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
f00c55f8
TG
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
ec95993c 489 info->all_image_addr = extract_unsigned_integer (buf, 8, byte_order);
f00c55f8
TG
490}
491
492/* Shared library startup support. See documentation in solib-svr4.c. */
493
494static void
495darwin_solib_create_inferior_hook (int from_tty)
496{
ec95993c 497 struct darwin_info *info = get_darwin_info ();
4141a416 498 CORE_ADDR load_addr;
ec95993c
TG
499
500 info->all_image_addr = 0;
f00c55f8 501
ec95993c 502 darwin_solib_read_all_image_info_addr (info);
f00c55f8 503
ec95993c
TG
504 if (info->all_image_addr == 0)
505 darwin_solib_get_all_image_info_addr_at_init (info);
f00c55f8 506
ec95993c 507 if (info->all_image_addr == 0)
f00c55f8 508 return;
cf1061c0 509
ec95993c 510 darwin_load_image_infos (info);
cf1061c0 511
4141a416 512 if (!darwin_dyld_version_ok (info))
d4ccb5e0
TG
513 {
514 warning (_("unhandled dyld version (%d)"), info->all_image.version);
515 return;
516 }
4141a416
JB
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 {
1bdad2e0 524 CORE_ADDR vmaddr;
4141a416
JB
525
526 /* Find the base address of the executable. */
1bdad2e0 527 vmaddr = bfd_mach_o_get_base_address (exec_bfd);
4141a416
JB
528
529 /* Relocate. */
530 if (vmaddr != load_addr)
531 objfile_rebase (symfile_objfile, load_addr - vmaddr);
532 }
cf1061c0
TG
533}
534
535static void
536darwin_clear_solib (void)
537{
ec95993c
TG
538 struct darwin_info *info = get_darwin_info ();
539
540 info->all_image_addr = 0;
541 info->all_image.version = 0;
cf1061c0
TG
542}
543
544static void
545darwin_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. */
066d7383 551
cf1061c0
TG
552static void
553darwin_relocate_section_addresses (struct so_list *so,
0542c86d 554 struct target_section *sec)
cf1061c0
TG
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\f
d12307c1 572static struct block_symbol
efad9b6a 573darwin_lookup_lib_symbol (struct objfile *objfile,
cf1061c0 574 const char *name,
cf1061c0
TG
575 const domain_enum domain)
576{
d12307c1 577 return (struct block_symbol) {NULL, NULL};
cf1061c0
TG
578}
579
580static bfd *
581darwin_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
0cd61f44
TT
596 res = gdb_bfd_mach_o_fat_extract (abfd, bfd_object,
597 gdbarch_bfd_arch_info (target_gdbarch ()));
cf1061c0
TG
598 if (!res)
599 {
f9a062ff 600 make_cleanup_bfd_unref (abfd);
cf1061c0 601 error (_("`%s': not a shared-library: %s"),
a4453b7e 602 bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
cf1061c0 603 }
0cd61f44 604
b030cf11
JB
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. */
adcf2eed
HZ
608 xfree (bfd_get_filename (res));
609 res->filename = xstrdup (pathname);
b030cf11 610
0cd61f44 611 gdb_bfd_unref (abfd);
cf1061c0
TG
612 return res;
613}
614
615struct target_so_ops darwin_so_ops;
616
693be288
JK
617/* -Wmissing-prototypes */
618extern initialize_file_ftype _initialize_darwin_solib;
619
cf1061c0
TG
620void
621_initialize_darwin_solib (void)
622{
ec95993c 623 solib_darwin_pspace_data
8e260fc0
TT
624 = register_program_space_data_with_cleanup (NULL,
625 darwin_pspace_data_cleanup);
ec95993c 626
cf1061c0
TG
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}
This page took 0.805407 seconds and 4 git commands to generate.