bfd/
[deliverable/binutils-gdb.git] / bfd / mach-o.c
1 /* Mach-O support for BFD.
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3 2009, 2010, 2011
4 Free Software Foundation, Inc.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23 #include "sysdep.h"
24 #include "mach-o.h"
25 #include "bfd.h"
26 #include "libbfd.h"
27 #include "libiberty.h"
28 #include "aout/stab_gnu.h"
29 #include "mach-o/reloc.h"
30 #include "mach-o/external.h"
31 #include <ctype.h>
32
33 #define bfd_mach_o_object_p bfd_mach_o_gen_object_p
34 #define bfd_mach_o_core_p bfd_mach_o_gen_core_p
35 #define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject
36
37 #define FILE_ALIGN(off, algn) \
38 (((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1 << (algn)))
39
40 static int bfd_mach_o_read_symtab_symbols (bfd *);
41
42 unsigned int
43 bfd_mach_o_version (bfd *abfd)
44 {
45 bfd_mach_o_data_struct *mdata = NULL;
46
47 BFD_ASSERT (bfd_mach_o_valid (abfd));
48 mdata = bfd_mach_o_get_data (abfd);
49
50 return mdata->header.version;
51 }
52
53 bfd_boolean
54 bfd_mach_o_valid (bfd *abfd)
55 {
56 if (abfd == NULL || abfd->xvec == NULL)
57 return FALSE;
58
59 if (abfd->xvec->flavour != bfd_target_mach_o_flavour)
60 return FALSE;
61
62 if (bfd_mach_o_get_data (abfd) == NULL)
63 return FALSE;
64 return TRUE;
65 }
66
67 static INLINE bfd_boolean
68 mach_o_wide_p (bfd_mach_o_header *header)
69 {
70 switch (header->version)
71 {
72 case 1:
73 return FALSE;
74 case 2:
75 return TRUE;
76 default:
77 BFD_FAIL ();
78 return FALSE;
79 }
80 }
81
82 static INLINE bfd_boolean
83 bfd_mach_o_wide_p (bfd *abfd)
84 {
85 return mach_o_wide_p (&bfd_mach_o_get_data (abfd)->header);
86 }
87
88 /* Tables to translate well known Mach-O segment/section names to bfd
89 names. Use of canonical names (such as .text or .debug_frame) is required
90 by gdb. */
91
92 struct mach_o_section_name_xlat
93 {
94 const char *bfd_name;
95 const char *mach_o_name;
96 flagword flags;
97 };
98
99 static const struct mach_o_section_name_xlat dwarf_section_names_xlat[] =
100 {
101 { ".debug_frame", "__debug_frame", SEC_DEBUGGING },
102 { ".debug_info", "__debug_info", SEC_DEBUGGING },
103 { ".debug_abbrev", "__debug_abbrev", SEC_DEBUGGING },
104 { ".debug_aranges", "__debug_aranges", SEC_DEBUGGING },
105 { ".debug_macinfo", "__debug_macinfo", SEC_DEBUGGING },
106 { ".debug_line", "__debug_line", SEC_DEBUGGING },
107 { ".debug_loc", "__debug_loc", SEC_DEBUGGING },
108 { ".debug_pubnames", "__debug_pubnames", SEC_DEBUGGING },
109 { ".debug_pubtypes", "__debug_pubtypes", SEC_DEBUGGING },
110 { ".debug_str", "__debug_str", SEC_DEBUGGING },
111 { ".debug_ranges", "__debug_ranges", SEC_DEBUGGING },
112 { NULL, NULL, 0}
113 };
114
115 static const struct mach_o_section_name_xlat text_section_names_xlat[] =
116 {
117 { ".text", "__text", SEC_CODE | SEC_LOAD },
118 { ".const", "__const", SEC_READONLY | SEC_DATA | SEC_LOAD },
119 { ".cstring", "__cstring", SEC_READONLY | SEC_DATA | SEC_LOAD },
120 { ".eh_frame", "__eh_frame", SEC_READONLY | SEC_LOAD },
121 { NULL, NULL, 0}
122 };
123
124 static const struct mach_o_section_name_xlat data_section_names_xlat[] =
125 {
126 { ".data", "__data", SEC_DATA | SEC_LOAD },
127 { ".const_data", "__const", SEC_DATA | SEC_LOAD },
128 { ".dyld", "__dyld", SEC_DATA | SEC_LOAD },
129 { ".lazy_symbol_ptr", "__la_symbol_ptr", SEC_DATA | SEC_LOAD },
130 { ".non_lazy_symbol_ptr", "__nl_symbol_ptr", SEC_DATA | SEC_LOAD },
131 { ".bss", "__bss", SEC_NO_FLAGS },
132 { NULL, NULL, 0}
133 };
134
135 struct mach_o_segment_name_xlat
136 {
137 const char *segname;
138 const struct mach_o_section_name_xlat *sections;
139 };
140
141 static const struct mach_o_segment_name_xlat segsec_names_xlat[] =
142 {
143 { "__DWARF", dwarf_section_names_xlat },
144 { "__TEXT", text_section_names_xlat },
145 { "__DATA", data_section_names_xlat },
146 { NULL, NULL }
147 };
148
149 /* Mach-O to bfd names. */
150
151 void
152 bfd_mach_o_normalize_section_name (const char *segname, const char *sectname,
153 const char **name, flagword *flags)
154 {
155 const struct mach_o_segment_name_xlat *seg;
156
157 *name = NULL;
158 *flags = SEC_NO_FLAGS;
159
160 for (seg = segsec_names_xlat; seg->segname; seg++)
161 {
162 if (strcmp (seg->segname, segname) == 0)
163 {
164 const struct mach_o_section_name_xlat *sec;
165
166 for (sec = seg->sections; sec->mach_o_name; sec++)
167 {
168 if (strcmp (sec->mach_o_name, sectname) == 0)
169 {
170 *name = sec->bfd_name;
171 *flags = sec->flags;
172 return;
173 }
174 }
175 return;
176 }
177 }
178 }
179
180 static void
181 bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, bfd_mach_o_section *section,
182 const char **name, flagword *flags)
183 {
184 char *res;
185 unsigned int len;
186 const char *pfx = "";
187
188 /* First search for a canonical name. */
189 bfd_mach_o_normalize_section_name (section->segname, section->sectname,
190 name, flags);
191
192 /* Return now if found. */
193 if (*name)
194 return;
195
196 len = strlen (section->segname) + 1
197 + strlen (section->sectname) + 1;
198
199 /* Put "LC_SEGMENT." prefix if the segment name is weird (ie doesn't start
200 with an underscore. */
201 if (section->segname[0] != '_')
202 {
203 static const char seg_pfx[] = "LC_SEGMENT.";
204
205 pfx = seg_pfx;
206 len += sizeof (seg_pfx) - 1;
207 }
208
209 res = bfd_alloc (abfd, len);
210 if (res == NULL)
211 return;
212 snprintf (res, len, "%s%s.%s", pfx, section->segname, section->sectname);
213 *name = res;
214 *flags = SEC_NO_FLAGS;
215 }
216
217 /* Convert a bfd section name to a Mach-O segment + section name. */
218
219 static void
220 bfd_mach_o_convert_section_name_to_mach_o (bfd *abfd ATTRIBUTE_UNUSED,
221 asection *sect,
222 bfd_mach_o_section *section)
223 {
224 const struct mach_o_segment_name_xlat *seg;
225 const char *name = bfd_get_section_name (abfd, sect);
226 const char *dot;
227 unsigned int len;
228 unsigned int seglen;
229 unsigned int seclen;
230
231 /* List of well known names. They all start with a dot. */
232 if (name[0] == '.')
233 for (seg = segsec_names_xlat; seg->segname; seg++)
234 {
235 const struct mach_o_section_name_xlat *sec;
236
237 for (sec = seg->sections; sec->mach_o_name; sec++)
238 {
239 if (strcmp (sec->bfd_name, name) == 0)
240 {
241 strcpy (section->segname, seg->segname);
242 strcpy (section->sectname, sec->mach_o_name);
243 return;
244 }
245 }
246 }
247
248 /* Strip LC_SEGMENT. prefix. */
249 if (strncmp (name, "LC_SEGMENT.", 11) == 0)
250 name += 11;
251
252 /* Find a dot. */
253 dot = strchr (name, '.');
254 len = strlen (name);
255
256 /* Try to split name into segment and section names. */
257 if (dot && dot != name)
258 {
259 seglen = dot - name;
260 seclen = len - (dot + 1 - name);
261
262 if (seglen < 16 && seclen < 16)
263 {
264 memcpy (section->segname, name, seglen);
265 section->segname[seglen] = 0;
266 memcpy (section->sectname, dot + 1, seclen);
267 section->sectname[seclen] = 0;
268 return;
269 }
270 }
271
272 if (len > 16)
273 len = 16;
274 memcpy (section->segname, name, len);
275 section->segname[len] = 0;
276 memcpy (section->sectname, name, len);
277 section->sectname[len] = 0;
278 }
279
280 /* Return the size of an entry for section SEC.
281 Must be called only for symbol pointer section and symbol stubs
282 sections. */
283
284 static unsigned int
285 bfd_mach_o_section_get_entry_size (bfd *abfd, bfd_mach_o_section *sec)
286 {
287 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
288 {
289 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
290 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
291 return bfd_mach_o_wide_p (abfd) ? 8 : 4;
292 case BFD_MACH_O_S_SYMBOL_STUBS:
293 return sec->reserved2;
294 default:
295 BFD_FAIL ();
296 return 0;
297 }
298 }
299
300 /* Return the number of indirect symbols for a section.
301 Must be called only for symbol pointer section and symbol stubs
302 sections. */
303
304 static unsigned int
305 bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section *sec)
306 {
307 unsigned int elsz;
308
309 elsz = bfd_mach_o_section_get_entry_size (abfd, sec);
310 if (elsz == 0)
311 return 0;
312 else
313 return sec->size / elsz;
314 }
315
316
317 /* Copy any private info we understand from the input symbol
318 to the output symbol. */
319
320 bfd_boolean
321 bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
322 asymbol *isymbol ATTRIBUTE_UNUSED,
323 bfd *obfd ATTRIBUTE_UNUSED,
324 asymbol *osymbol ATTRIBUTE_UNUSED)
325 {
326 return TRUE;
327 }
328
329 /* Copy any private info we understand from the input section
330 to the output section. */
331
332 bfd_boolean
333 bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
334 asection *isection ATTRIBUTE_UNUSED,
335 bfd *obfd ATTRIBUTE_UNUSED,
336 asection *osection ATTRIBUTE_UNUSED)
337 {
338 return TRUE;
339 }
340
341 /* Copy any private info we understand from the input bfd
342 to the output bfd. */
343
344 bfd_boolean
345 bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
346 {
347 if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour
348 || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour)
349 return TRUE;
350
351 BFD_ASSERT (bfd_mach_o_valid (ibfd));
352 BFD_ASSERT (bfd_mach_o_valid (obfd));
353
354 /* FIXME: copy commands. */
355
356 return TRUE;
357 }
358
359 /* Count the total number of symbols. */
360
361 static long
362 bfd_mach_o_count_symbols (bfd *abfd)
363 {
364 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
365
366 if (mdata->symtab == NULL)
367 return 0;
368 return mdata->symtab->nsyms;
369 }
370
371 long
372 bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
373 {
374 long nsyms = bfd_mach_o_count_symbols (abfd);
375
376 return ((nsyms + 1) * sizeof (asymbol *));
377 }
378
379 long
380 bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
381 {
382 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
383 long nsyms = bfd_mach_o_count_symbols (abfd);
384 bfd_mach_o_symtab_command *sym = mdata->symtab;
385 unsigned long j;
386
387 if (nsyms < 0)
388 return nsyms;
389
390 if (nsyms == 0)
391 {
392 /* Do not try to read symbols if there are none. */
393 alocation[0] = NULL;
394 return 0;
395 }
396
397 if (bfd_mach_o_read_symtab_symbols (abfd) != 0)
398 {
399 (*_bfd_error_handler) (_("bfd_mach_o_canonicalize_symtab: unable to load symbols"));
400 return 0;
401 }
402
403 BFD_ASSERT (sym->symbols != NULL);
404
405 for (j = 0; j < sym->nsyms; j++)
406 alocation[j] = &sym->symbols[j].symbol;
407
408 alocation[j] = NULL;
409
410 return nsyms;
411 }
412
413 long
414 bfd_mach_o_get_synthetic_symtab (bfd *abfd,
415 long symcount ATTRIBUTE_UNUSED,
416 asymbol **syms ATTRIBUTE_UNUSED,
417 long dynsymcount ATTRIBUTE_UNUSED,
418 asymbol **dynsyms ATTRIBUTE_UNUSED,
419 asymbol **ret)
420 {
421 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
422 bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
423 bfd_mach_o_symtab_command *symtab = mdata->symtab;
424 asymbol *s;
425 unsigned long count, i, j, n;
426 size_t size;
427 char *names;
428 char *nul_name;
429
430 *ret = NULL;
431
432 if (dysymtab == NULL || symtab == NULL || symtab->symbols == NULL)
433 return 0;
434
435 if (dysymtab->nindirectsyms == 0)
436 return 0;
437
438 count = dysymtab->nindirectsyms;
439 size = count * sizeof (asymbol) + 1;
440
441 for (j = 0; j < count; j++)
442 {
443 unsigned int isym = dysymtab->indirect_syms[j];
444
445 if (isym < symtab->nsyms && symtab->symbols[isym].symbol.name)
446 size += strlen (symtab->symbols[isym].symbol.name) + sizeof ("$stub");
447 }
448
449 s = *ret = (asymbol *) bfd_malloc (size);
450 if (s == NULL)
451 return -1;
452 names = (char *) (s + count);
453 nul_name = names;
454 *names++ = 0;
455
456 n = 0;
457 for (i = 0; i < mdata->nsects; i++)
458 {
459 bfd_mach_o_section *sec = mdata->sections[i];
460 unsigned int first, last;
461 bfd_vma addr;
462 bfd_vma entry_size;
463
464 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
465 {
466 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
467 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
468 case BFD_MACH_O_S_SYMBOL_STUBS:
469 first = sec->reserved1;
470 last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
471 addr = sec->addr;
472 entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
473 for (j = first; j < last; j++)
474 {
475 unsigned int isym = dysymtab->indirect_syms[j];
476
477 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
478 s->section = sec->bfdsection;
479 s->value = addr - sec->addr;
480 s->udata.p = NULL;
481
482 if (isym < symtab->nsyms
483 && symtab->symbols[isym].symbol.name)
484 {
485 const char *sym = symtab->symbols[isym].symbol.name;
486 size_t len;
487
488 s->name = names;
489 len = strlen (sym);
490 memcpy (names, sym, len);
491 names += len;
492 memcpy (names, "$stub", sizeof ("$stub"));
493 names += sizeof ("$stub");
494 }
495 else
496 s->name = nul_name;
497
498 addr += entry_size;
499 s++;
500 n++;
501 }
502 break;
503 default:
504 break;
505 }
506 }
507
508 return n;
509 }
510
511 void
512 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
513 asymbol *symbol,
514 symbol_info *ret)
515 {
516 bfd_symbol_info (symbol, ret);
517 }
518
519 void
520 bfd_mach_o_print_symbol (bfd *abfd,
521 void * afile,
522 asymbol *symbol,
523 bfd_print_symbol_type how)
524 {
525 FILE *file = (FILE *) afile;
526 const char *name;
527 bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)symbol;
528
529 switch (how)
530 {
531 case bfd_print_symbol_name:
532 fprintf (file, "%s", symbol->name);
533 break;
534 default:
535 bfd_print_symbol_vandf (abfd, (void *) file, symbol);
536 if (asym->n_type & BFD_MACH_O_N_STAB)
537 name = bfd_get_stab_name (asym->n_type);
538 else
539 switch (asym->n_type & BFD_MACH_O_N_TYPE)
540 {
541 case BFD_MACH_O_N_UNDF:
542 name = "UND";
543 break;
544 case BFD_MACH_O_N_ABS:
545 name = "ABS";
546 break;
547 case BFD_MACH_O_N_INDR:
548 name = "INDR";
549 break;
550 case BFD_MACH_O_N_PBUD:
551 name = "PBUD";
552 break;
553 case BFD_MACH_O_N_SECT:
554 name = "SECT";
555 break;
556 default:
557 name = "???";
558 break;
559 }
560 if (name == NULL)
561 name = "";
562 fprintf (file, " %02x %-6s %02x %04x",
563 asym->n_type, name, asym->n_sect, asym->n_desc);
564 if ((asym->n_type & BFD_MACH_O_N_STAB) == 0
565 && (asym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
566 fprintf (file, " %-5s", symbol->section->name);
567 fprintf (file, " %s", symbol->name);
568 }
569 }
570
571 static void
572 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
573 bfd_mach_o_cpu_subtype msubtype ATTRIBUTE_UNUSED,
574 enum bfd_architecture *type,
575 unsigned long *subtype)
576 {
577 *subtype = bfd_arch_unknown;
578
579 switch (mtype)
580 {
581 case BFD_MACH_O_CPU_TYPE_VAX: *type = bfd_arch_vax; break;
582 case BFD_MACH_O_CPU_TYPE_MC680x0: *type = bfd_arch_m68k; break;
583 case BFD_MACH_O_CPU_TYPE_I386:
584 *type = bfd_arch_i386;
585 *subtype = bfd_mach_i386_i386;
586 break;
587 case BFD_MACH_O_CPU_TYPE_X86_64:
588 *type = bfd_arch_i386;
589 *subtype = bfd_mach_x86_64;
590 break;
591 case BFD_MACH_O_CPU_TYPE_MIPS: *type = bfd_arch_mips; break;
592 case BFD_MACH_O_CPU_TYPE_MC98000: *type = bfd_arch_m98k; break;
593 case BFD_MACH_O_CPU_TYPE_HPPA: *type = bfd_arch_hppa; break;
594 case BFD_MACH_O_CPU_TYPE_ARM: *type = bfd_arch_arm; break;
595 case BFD_MACH_O_CPU_TYPE_MC88000: *type = bfd_arch_m88k; break;
596 case BFD_MACH_O_CPU_TYPE_SPARC:
597 *type = bfd_arch_sparc;
598 *subtype = bfd_mach_sparc;
599 break;
600 case BFD_MACH_O_CPU_TYPE_I860: *type = bfd_arch_i860; break;
601 case BFD_MACH_O_CPU_TYPE_ALPHA: *type = bfd_arch_alpha; break;
602 case BFD_MACH_O_CPU_TYPE_POWERPC:
603 *type = bfd_arch_powerpc;
604 *subtype = bfd_mach_ppc;
605 break;
606 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
607 *type = bfd_arch_powerpc;
608 *subtype = bfd_mach_ppc64;
609 break;
610 default:
611 *type = bfd_arch_unknown;
612 break;
613 }
614 }
615
616 static bfd_boolean
617 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
618 {
619 struct mach_o_header_external raw;
620 unsigned int size;
621
622 size = mach_o_wide_p (header) ?
623 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
624
625 bfd_h_put_32 (abfd, header->magic, raw.magic);
626 bfd_h_put_32 (abfd, header->cputype, raw.cputype);
627 bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype);
628 bfd_h_put_32 (abfd, header->filetype, raw.filetype);
629 bfd_h_put_32 (abfd, header->ncmds, raw.ncmds);
630 bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds);
631 bfd_h_put_32 (abfd, header->flags, raw.flags);
632
633 if (mach_o_wide_p (header))
634 bfd_h_put_32 (abfd, header->reserved, raw.reserved);
635
636 if (bfd_seek (abfd, 0, SEEK_SET) != 0
637 || bfd_bwrite (&raw, size, abfd) != size)
638 return FALSE;
639
640 return TRUE;
641 }
642
643 static int
644 bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
645 {
646 bfd_mach_o_thread_command *cmd = &command->command.thread;
647 unsigned int i;
648 struct mach_o_thread_command_external raw;
649 unsigned int offset;
650
651 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
652 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
653
654 offset = 8;
655 for (i = 0; i < cmd->nflavours; i++)
656 {
657 BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
658 BFD_ASSERT (cmd->flavours[i].offset ==
659 (command->offset + offset + BFD_MACH_O_LC_SIZE));
660
661 bfd_h_put_32 (abfd, cmd->flavours[i].flavour, raw.flavour);
662 bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), raw.count);
663
664 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
665 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
666 return -1;
667
668 offset += cmd->flavours[i].size + sizeof (raw);
669 }
670
671 return 0;
672 }
673
674 long
675 bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
676 asection *asect)
677 {
678 return (asect->reloc_count + 1) * sizeof (arelent *);
679 }
680
681 static int
682 bfd_mach_o_canonicalize_one_reloc (bfd *abfd,
683 struct mach_o_reloc_info_external *raw,
684 arelent *res, asymbol **syms)
685 {
686 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
687 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
688 bfd_mach_o_reloc_info reloc;
689 bfd_vma addr;
690 bfd_vma symnum;
691 asymbol **sym;
692
693 addr = bfd_get_32 (abfd, raw->r_address);
694 symnum = bfd_get_32 (abfd, raw->r_symbolnum);
695
696 if (addr & BFD_MACH_O_SR_SCATTERED)
697 {
698 unsigned int j;
699
700 /* Scattered relocation.
701 Extract section and offset from r_value. */
702 res->sym_ptr_ptr = NULL;
703 res->addend = 0;
704 for (j = 0; j < mdata->nsects; j++)
705 {
706 bfd_mach_o_section *sect = mdata->sections[j];
707 if (symnum >= sect->addr && symnum < sect->addr + sect->size)
708 {
709 res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr;
710 res->addend = symnum - sect->addr;
711 break;
712 }
713 }
714 res->address = BFD_MACH_O_GET_SR_ADDRESS (addr);
715 reloc.r_type = BFD_MACH_O_GET_SR_TYPE (addr);
716 reloc.r_length = BFD_MACH_O_GET_SR_LENGTH (addr);
717 reloc.r_pcrel = addr & BFD_MACH_O_SR_PCREL;
718 reloc.r_scattered = 1;
719 }
720 else
721 {
722 unsigned int num = BFD_MACH_O_GET_R_SYMBOLNUM (symnum);
723 res->addend = 0;
724 res->address = addr;
725 if (symnum & BFD_MACH_O_R_EXTERN)
726 {
727 sym = syms + num;
728 reloc.r_extern = 1;
729 }
730 else
731 {
732 BFD_ASSERT (num != 0);
733 BFD_ASSERT (num <= mdata->nsects);
734 sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr;
735 /* For a symbol defined in section S, the addend (stored in the
736 binary) contains the address of the section. To comply with
737 bfd conventio, substract the section address.
738 Use the address from the header, so that the user can modify
739 the vma of the section. */
740 res->addend = -mdata->sections[num - 1]->addr;
741 reloc.r_extern = 0;
742 }
743 res->sym_ptr_ptr = sym;
744 reloc.r_type = BFD_MACH_O_GET_R_TYPE (symnum);
745 reloc.r_length = BFD_MACH_O_GET_R_LENGTH (symnum);
746 reloc.r_pcrel = (symnum & BFD_MACH_O_R_PCREL) ? 1 : 0;
747 reloc.r_scattered = 0;
748 }
749
750 if (!(*bed->_bfd_mach_o_swap_reloc_in)(res, &reloc))
751 return -1;
752 return 0;
753 }
754
755 static int
756 bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
757 unsigned long count,
758 arelent *res, asymbol **syms)
759 {
760 unsigned long i;
761 struct mach_o_reloc_info_external *native_relocs;
762 bfd_size_type native_size;
763
764 /* Allocate and read relocs. */
765 native_size = count * BFD_MACH_O_RELENT_SIZE;
766 native_relocs =
767 (struct mach_o_reloc_info_external *) bfd_malloc (native_size);
768 if (native_relocs == NULL)
769 return -1;
770
771 if (bfd_seek (abfd, filepos, SEEK_SET) != 0
772 || bfd_bread (native_relocs, native_size, abfd) != native_size)
773 goto err;
774
775 for (i = 0; i < count; i++)
776 {
777 if (bfd_mach_o_canonicalize_one_reloc (abfd, &native_relocs[i],
778 &res[i], syms) < 0)
779 goto err;
780 }
781 free (native_relocs);
782 return i;
783 err:
784 free (native_relocs);
785 return -1;
786 }
787
788 long
789 bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect,
790 arelent **rels, asymbol **syms)
791 {
792 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
793 unsigned long i;
794 arelent *res;
795
796 if (asect->reloc_count == 0)
797 return 0;
798
799 /* No need to go further if we don't know how to read relocs. */
800 if (bed->_bfd_mach_o_swap_reloc_in == NULL)
801 return 0;
802
803 res = bfd_malloc (asect->reloc_count * sizeof (arelent));
804 if (res == NULL)
805 return -1;
806
807 if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos,
808 asect->reloc_count, res, syms) < 0)
809 {
810 free (res);
811 return -1;
812 }
813
814 for (i = 0; i < asect->reloc_count; i++)
815 rels[i] = &res[i];
816 rels[i] = NULL;
817 asect->relocation = res;
818
819 return i;
820 }
821
822 long
823 bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd)
824 {
825 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
826
827 if (mdata->dysymtab == NULL)
828 return 1;
829 return (mdata->dysymtab->nextrel + mdata->dysymtab->nlocrel)
830 * sizeof (arelent *);
831 }
832
833 long
834 bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
835 struct bfd_symbol **syms)
836 {
837 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
838 bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
839 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
840 unsigned long i;
841 arelent *res;
842
843 if (dysymtab == NULL)
844 return 0;
845 if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0)
846 return 0;
847
848 /* No need to go further if we don't know how to read relocs. */
849 if (bed->_bfd_mach_o_swap_reloc_in == NULL)
850 return 0;
851
852 res = bfd_malloc ((dysymtab->nextrel + dysymtab->nlocrel) * sizeof (arelent));
853 if (res == NULL)
854 return -1;
855
856 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff,
857 dysymtab->nextrel, res, syms) < 0)
858 {
859 free (res);
860 return -1;
861 }
862
863 if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff,
864 dysymtab->nlocrel,
865 res + dysymtab->nextrel, syms) < 0)
866 {
867 free (res);
868 return -1;
869 }
870
871 for (i = 0; i < dysymtab->nextrel + dysymtab->nlocrel; i++)
872 rels[i] = &res[i];
873 rels[i] = NULL;
874 return i;
875 }
876
877 static bfd_boolean
878 bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
879 {
880 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
881 unsigned int i;
882 arelent **entries;
883 asection *sec;
884 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
885
886 sec = section->bfdsection;
887 if (sec->reloc_count == 0)
888 return TRUE;
889
890 if (bed->_bfd_mach_o_swap_reloc_out == NULL)
891 return TRUE;
892
893 /* Allocate relocation room. */
894 mdata->filelen = FILE_ALIGN(mdata->filelen, 2);
895 section->nreloc = sec->reloc_count;
896 sec->rel_filepos = mdata->filelen;
897 section->reloff = sec->rel_filepos;
898 mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
899
900 if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0)
901 return FALSE;
902
903 /* Convert and write. */
904 entries = section->bfdsection->orelocation;
905 for (i = 0; i < section->nreloc; i++)
906 {
907 arelent *rel = entries[i];
908 struct mach_o_reloc_info_external raw;
909 bfd_mach_o_reloc_info info, *pinfo = &info;
910
911 /* Convert relocation to an intermediate representation. */
912 if (!(*bed->_bfd_mach_o_swap_reloc_out) (rel, pinfo))
913 return FALSE;
914
915 /* Lower the relocation info. */
916 if (pinfo->r_scattered)
917 {
918 unsigned long v;
919
920 v = BFD_MACH_O_SR_SCATTERED
921 | (pinfo->r_pcrel ? BFD_MACH_O_SR_PCREL : 0)
922 | BFD_MACH_O_SET_SR_LENGTH(pinfo->r_length)
923 | BFD_MACH_O_SET_SR_TYPE(pinfo->r_type)
924 | BFD_MACH_O_SET_SR_ADDRESS(pinfo->r_address);
925 /* Note: scattered relocs have field in reverse order... */
926 bfd_put_32 (abfd, v, raw.r_address);
927 bfd_put_32 (abfd, pinfo->r_value, raw.r_symbolnum);
928 }
929 else
930 {
931 unsigned long v;
932
933 bfd_put_32 (abfd, pinfo->r_address, raw.r_address);
934 v = BFD_MACH_O_SET_R_SYMBOLNUM (pinfo->r_value)
935 | (pinfo->r_pcrel ? BFD_MACH_O_R_PCREL : 0)
936 | BFD_MACH_O_SET_R_LENGTH (pinfo->r_length)
937 | (pinfo->r_extern ? BFD_MACH_O_R_EXTERN : 0)
938 | BFD_MACH_O_SET_R_TYPE (pinfo->r_type);
939 bfd_put_32 (abfd, v, raw.r_symbolnum);
940 }
941
942 if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd)
943 != BFD_MACH_O_RELENT_SIZE)
944 return FALSE;
945 }
946 return TRUE;
947 }
948
949 static int
950 bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
951 {
952 struct mach_o_section_32_external raw;
953
954 memcpy (raw.sectname, section->sectname, 16);
955 memcpy (raw.segname + 16, section->segname, 16);
956 bfd_h_put_32 (abfd, section->addr, raw.addr);
957 bfd_h_put_32 (abfd, section->size, raw.size);
958 bfd_h_put_32 (abfd, section->offset, raw.offset);
959 bfd_h_put_32 (abfd, section->align, raw.align);
960 bfd_h_put_32 (abfd, section->reloff, raw.reloff);
961 bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
962 bfd_h_put_32 (abfd, section->flags, raw.flags);
963 bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
964 bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
965
966 if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
967 != BFD_MACH_O_SECTION_SIZE)
968 return -1;
969
970 return 0;
971 }
972
973 static int
974 bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
975 {
976 struct mach_o_section_64_external raw;
977
978 memcpy (raw.sectname, section->sectname, 16);
979 memcpy (raw.segname, section->segname, 16);
980 bfd_h_put_64 (abfd, section->addr, raw.addr);
981 bfd_h_put_64 (abfd, section->size, raw.size);
982 bfd_h_put_32 (abfd, section->offset, raw.offset);
983 bfd_h_put_32 (abfd, section->align, raw.align);
984 bfd_h_put_32 (abfd, section->reloff, raw.reloff);
985 bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
986 bfd_h_put_32 (abfd, section->flags, raw.flags);
987 bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
988 bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
989 bfd_h_put_32 (abfd, section->reserved3, raw.reserved3);
990
991 if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
992 != BFD_MACH_O_SECTION_64_SIZE)
993 return -1;
994
995 return 0;
996 }
997
998 static int
999 bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
1000 {
1001 struct mach_o_segment_command_32_external raw;
1002 bfd_mach_o_segment_command *seg = &command->command.segment;
1003 unsigned long i;
1004
1005 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
1006
1007 for (i = 0; i < seg->nsects; i++)
1008 if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i]))
1009 return -1;
1010
1011 memcpy (raw.segname, seg->segname, 16);
1012 bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr);
1013 bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize);
1014 bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff);
1015 bfd_h_put_32 (abfd, seg->filesize, raw.filesize);
1016 bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1017 bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1018 bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1019 bfd_h_put_32 (abfd, seg->flags, raw.flags);
1020
1021 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1022 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1023 return -1;
1024
1025 for (i = 0; i < seg->nsects; i++)
1026 if (bfd_mach_o_write_section_32 (abfd, &seg->sections[i]))
1027 return -1;
1028
1029 return 0;
1030 }
1031
1032 static int
1033 bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
1034 {
1035 struct mach_o_segment_command_64_external raw;
1036 bfd_mach_o_segment_command *seg = &command->command.segment;
1037 unsigned long i;
1038
1039 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
1040
1041 for (i = 0; i < seg->nsects; i++)
1042 if (!bfd_mach_o_write_relocs (abfd, &seg->sections[i]))
1043 return -1;
1044
1045 memcpy (raw.segname, seg->segname, 16);
1046 bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr);
1047 bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize);
1048 bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff);
1049 bfd_h_put_64 (abfd, seg->filesize, raw.filesize);
1050 bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1051 bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1052 bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1053 bfd_h_put_32 (abfd, seg->flags, raw.flags);
1054
1055 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1056 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1057 return -1;
1058
1059 for (i = 0; i < seg->nsects; i++)
1060 if (bfd_mach_o_write_section_64 (abfd, &seg->sections[i]))
1061 return -1;
1062
1063 return 0;
1064 }
1065
1066 static bfd_boolean
1067 bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
1068 {
1069 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1070 bfd_mach_o_symtab_command *sym = &command->command.symtab;
1071 unsigned long i;
1072 unsigned int wide = bfd_mach_o_wide_p (abfd);
1073 unsigned int symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
1074 struct bfd_strtab_hash *strtab;
1075 asymbol **symbols = bfd_get_outsymbols (abfd);
1076
1077 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
1078
1079 /* Write the symbols first. */
1080 mdata->filelen = FILE_ALIGN(mdata->filelen, wide ? 3 : 2);
1081 sym->symoff = mdata->filelen;
1082 if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0)
1083 return FALSE;
1084
1085 sym->nsyms = bfd_get_symcount (abfd);
1086 mdata->filelen += sym->nsyms * symlen;
1087
1088 strtab = _bfd_stringtab_init ();
1089 if (strtab == NULL)
1090 return FALSE;
1091
1092 for (i = 0; i < sym->nsyms; i++)
1093 {
1094 bfd_size_type str_index;
1095 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1096
1097 /* Compute name index. */
1098 /* An index of 0 always means the empty string. */
1099 if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
1100 str_index = 0;
1101 else
1102 {
1103 str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
1104 if (str_index == (bfd_size_type) -1)
1105 goto err;
1106 }
1107
1108 if (wide)
1109 {
1110 struct mach_o_nlist_64_external raw;
1111
1112 bfd_h_put_32 (abfd, str_index, raw.n_strx);
1113 bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1114 bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1115 bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1116 bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value,
1117 raw.n_value);
1118
1119 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1120 goto err;
1121 }
1122 else
1123 {
1124 struct mach_o_nlist_external raw;
1125
1126 bfd_h_put_32 (abfd, str_index, raw.n_strx);
1127 bfd_h_put_8 (abfd, s->n_type, raw.n_type);
1128 bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
1129 bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
1130 bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value,
1131 raw.n_value);
1132
1133 if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1134 goto err;
1135 }
1136 }
1137 sym->strsize = _bfd_stringtab_size (strtab);
1138 sym->stroff = mdata->filelen;
1139 mdata->filelen += sym->strsize;
1140
1141 if (_bfd_stringtab_emit (abfd, strtab) != TRUE)
1142 goto err;
1143 _bfd_stringtab_free (strtab);
1144
1145 /* The command. */
1146 {
1147 struct mach_o_symtab_command_external raw;
1148
1149 bfd_h_put_32 (abfd, sym->symoff, raw.symoff);
1150 bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms);
1151 bfd_h_put_32 (abfd, sym->stroff, raw.stroff);
1152 bfd_h_put_32 (abfd, sym->strsize, raw.strsize);
1153
1154 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1155 || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1156 return FALSE;
1157 }
1158
1159 return TRUE;
1160
1161 err:
1162 _bfd_stringtab_free (strtab);
1163 return FALSE;
1164 }
1165
1166 /* Process the symbols and generate Mach-O specific fields.
1167 Number them. */
1168
1169 static bfd_boolean
1170 bfd_mach_o_mangle_symbols (bfd *abfd)
1171 {
1172 unsigned long i;
1173 asymbol **symbols = bfd_get_outsymbols (abfd);
1174
1175 for (i = 0; i < bfd_get_symcount (abfd); i++)
1176 {
1177 bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
1178
1179 if (s->n_type == BFD_MACH_O_N_UNDF && !(s->symbol.flags & BSF_DEBUGGING))
1180 {
1181 /* As genuine Mach-O symbols type shouldn't be N_UNDF (undefined
1182 symbols should be N_UNDEF | N_EXT), we suppose the back-end
1183 values haven't been set. */
1184 if (s->symbol.section == bfd_abs_section_ptr)
1185 s->n_type = BFD_MACH_O_N_ABS;
1186 else if (s->symbol.section == bfd_und_section_ptr)
1187 {
1188 s->n_type = BFD_MACH_O_N_UNDF;
1189 if (s->symbol.flags & BSF_WEAK)
1190 s->n_desc |= BFD_MACH_O_N_WEAK_REF;
1191 }
1192 else if (s->symbol.section == bfd_com_section_ptr)
1193 s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
1194 else
1195 s->n_type = BFD_MACH_O_N_SECT;
1196
1197 if (s->symbol.flags & BSF_GLOBAL)
1198 s->n_type |= BFD_MACH_O_N_EXT;
1199 }
1200
1201 /* Compute section index. */
1202 if (s->symbol.section != bfd_abs_section_ptr
1203 && s->symbol.section != bfd_und_section_ptr
1204 && s->symbol.section != bfd_com_section_ptr)
1205 s->n_sect = s->symbol.section->target_index;
1206
1207 /* Number symbols. */
1208 s->symbol.udata.i = i;
1209 }
1210 return TRUE;
1211 }
1212
1213 bfd_boolean
1214 bfd_mach_o_write_contents (bfd *abfd)
1215 {
1216 unsigned int i;
1217 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1218
1219 if (mdata->header.ncmds == 0)
1220 if (!bfd_mach_o_build_commands (abfd))
1221 return FALSE;
1222
1223 /* Now write header information. */
1224 if (mdata->header.filetype == 0)
1225 {
1226 if (abfd->flags & EXEC_P)
1227 mdata->header.filetype = BFD_MACH_O_MH_EXECUTE;
1228 else if (abfd->flags & DYNAMIC)
1229 mdata->header.filetype = BFD_MACH_O_MH_DYLIB;
1230 else
1231 mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
1232 }
1233 if (!bfd_mach_o_write_header (abfd, &mdata->header))
1234 return FALSE;
1235
1236 /* Assign a number to each symbols. */
1237 if (!bfd_mach_o_mangle_symbols (abfd))
1238 return FALSE;
1239
1240 for (i = 0; i < mdata->header.ncmds; i++)
1241 {
1242 struct mach_o_load_command_external raw;
1243 bfd_mach_o_load_command *cur = &mdata->commands[i];
1244 unsigned long typeflag;
1245
1246 typeflag = cur->type | (cur->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
1247
1248 bfd_h_put_32 (abfd, typeflag, raw.cmd);
1249 bfd_h_put_32 (abfd, cur->len, raw.cmdsize);
1250
1251 if (bfd_seek (abfd, cur->offset, SEEK_SET) != 0
1252 || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8)
1253 return FALSE;
1254
1255 switch (cur->type)
1256 {
1257 case BFD_MACH_O_LC_SEGMENT:
1258 if (bfd_mach_o_write_segment_32 (abfd, cur) != 0)
1259 return FALSE;
1260 break;
1261 case BFD_MACH_O_LC_SEGMENT_64:
1262 if (bfd_mach_o_write_segment_64 (abfd, cur) != 0)
1263 return FALSE;
1264 break;
1265 case BFD_MACH_O_LC_SYMTAB:
1266 if (!bfd_mach_o_write_symtab (abfd, cur))
1267 return FALSE;
1268 break;
1269 case BFD_MACH_O_LC_SYMSEG:
1270 break;
1271 case BFD_MACH_O_LC_THREAD:
1272 case BFD_MACH_O_LC_UNIXTHREAD:
1273 if (bfd_mach_o_write_thread (abfd, cur) != 0)
1274 return FALSE;
1275 break;
1276 case BFD_MACH_O_LC_LOADFVMLIB:
1277 case BFD_MACH_O_LC_IDFVMLIB:
1278 case BFD_MACH_O_LC_IDENT:
1279 case BFD_MACH_O_LC_FVMFILE:
1280 case BFD_MACH_O_LC_PREPAGE:
1281 case BFD_MACH_O_LC_DYSYMTAB:
1282 case BFD_MACH_O_LC_LOAD_DYLIB:
1283 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1284 case BFD_MACH_O_LC_ID_DYLIB:
1285 case BFD_MACH_O_LC_REEXPORT_DYLIB:
1286 case BFD_MACH_O_LC_LOAD_DYLINKER:
1287 case BFD_MACH_O_LC_ID_DYLINKER:
1288 case BFD_MACH_O_LC_PREBOUND_DYLIB:
1289 case BFD_MACH_O_LC_ROUTINES:
1290 case BFD_MACH_O_LC_SUB_FRAMEWORK:
1291 break;
1292 default:
1293 (*_bfd_error_handler) (_("unable to write unknown load command 0x%lx"),
1294 (unsigned long) cur->type);
1295 return FALSE;
1296 }
1297 }
1298
1299 return TRUE;
1300 }
1301
1302 /* Build Mach-O load commands from the sections. */
1303
1304 bfd_boolean
1305 bfd_mach_o_build_commands (bfd *abfd)
1306 {
1307 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1308 unsigned int wide = mach_o_wide_p (&mdata->header);
1309 bfd_mach_o_segment_command *seg;
1310 bfd_mach_o_section *sections;
1311 asection *sec;
1312 bfd_mach_o_load_command *cmd;
1313 bfd_mach_o_load_command *symtab_cmd;
1314 int target_index;
1315
1316 /* Return now if commands are already built. */
1317 if (mdata->header.ncmds)
1318 return FALSE;
1319
1320 /* Very simple version: 1 command (segment) containing all sections. */
1321 mdata->header.ncmds = 2;
1322 mdata->commands = bfd_alloc (abfd, mdata->header.ncmds
1323 * sizeof (bfd_mach_o_load_command));
1324 if (mdata->commands == NULL)
1325 return FALSE;
1326 cmd = &mdata->commands[0];
1327 seg = &cmd->command.segment;
1328
1329 seg->nsects = bfd_count_sections (abfd);
1330 sections = bfd_alloc (abfd, seg->nsects * sizeof (bfd_mach_o_section));
1331 if (sections == NULL)
1332 return FALSE;
1333 seg->sections = sections;
1334
1335 /* Set segment command. */
1336 if (wide)
1337 {
1338 cmd->type = BFD_MACH_O_LC_SEGMENT_64;
1339 cmd->offset = BFD_MACH_O_HEADER_64_SIZE;
1340 cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE
1341 + BFD_MACH_O_SECTION_64_SIZE * seg->nsects;
1342 }
1343 else
1344 {
1345 cmd->type = BFD_MACH_O_LC_SEGMENT;
1346 cmd->offset = BFD_MACH_O_HEADER_SIZE;
1347 cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE
1348 + BFD_MACH_O_SECTION_SIZE * seg->nsects;
1349 }
1350 cmd->type_required = FALSE;
1351 mdata->header.sizeofcmds = cmd->len;
1352 mdata->filelen = cmd->offset + cmd->len;
1353
1354 /* Set symtab command. */
1355 symtab_cmd = &mdata->commands[1];
1356
1357 symtab_cmd->type = BFD_MACH_O_LC_SYMTAB;
1358 symtab_cmd->offset = cmd->offset + cmd->len;
1359 symtab_cmd->len = 6 * 4;
1360 symtab_cmd->type_required = FALSE;
1361
1362 mdata->header.sizeofcmds += symtab_cmd->len;
1363 mdata->filelen += symtab_cmd->len;
1364
1365 /* Fill segment command. */
1366 memset (seg->segname, 0, sizeof (seg->segname));
1367 seg->vmaddr = 0;
1368 seg->fileoff = mdata->filelen;
1369 seg->filesize = 0;
1370 seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
1371 | BFD_MACH_O_PROT_EXECUTE;
1372 seg->initprot = seg->maxprot;
1373 seg->flags = 0;
1374
1375 /* Create Mach-O sections. */
1376 target_index = 0;
1377 for (sec = abfd->sections; sec; sec = sec->next)
1378 {
1379 sections->bfdsection = sec;
1380 bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, sections);
1381 sections->addr = bfd_get_section_vma (abfd, sec);
1382 sections->size = bfd_get_section_size (sec);
1383 sections->align = bfd_get_section_alignment (abfd, sec);
1384
1385 if (sections->size != 0)
1386 {
1387 mdata->filelen = FILE_ALIGN (mdata->filelen, sections->align);
1388 sections->offset = mdata->filelen;
1389 }
1390 else
1391 sections->offset = 0;
1392 sections->reloff = 0;
1393 sections->nreloc = 0;
1394 sections->reserved1 = 0;
1395 sections->reserved2 = 0;
1396 sections->reserved3 = 0;
1397
1398 sec->filepos = sections->offset;
1399 sec->target_index = ++target_index;
1400
1401 mdata->filelen += sections->size;
1402 sections++;
1403 }
1404 seg->filesize = mdata->filelen - seg->fileoff;
1405 seg->vmsize = seg->filesize;
1406
1407 return TRUE;
1408 }
1409
1410 /* Set the contents of a section. */
1411
1412 bfd_boolean
1413 bfd_mach_o_set_section_contents (bfd *abfd,
1414 asection *section,
1415 const void * location,
1416 file_ptr offset,
1417 bfd_size_type count)
1418 {
1419 file_ptr pos;
1420
1421 /* This must be done first, because bfd_set_section_contents is
1422 going to set output_has_begun to TRUE. */
1423 if (! abfd->output_has_begun && ! bfd_mach_o_build_commands (abfd))
1424 return FALSE;
1425
1426 if (count == 0)
1427 return TRUE;
1428
1429 pos = section->filepos + offset;
1430 if (bfd_seek (abfd, pos, SEEK_SET) != 0
1431 || bfd_bwrite (location, count, abfd) != count)
1432 return FALSE;
1433
1434 return TRUE;
1435 }
1436
1437 int
1438 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
1439 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1440 {
1441 return 0;
1442 }
1443
1444 /* Make an empty symbol. This is required only because
1445 bfd_make_section_anyway wants to create a symbol for the section. */
1446
1447 asymbol *
1448 bfd_mach_o_make_empty_symbol (bfd *abfd)
1449 {
1450 asymbol *new_symbol;
1451
1452 new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol));
1453 if (new_symbol == NULL)
1454 return new_symbol;
1455 new_symbol->the_bfd = abfd;
1456 new_symbol->udata.i = 0;
1457 return new_symbol;
1458 }
1459
1460 static bfd_boolean
1461 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
1462 {
1463 struct mach_o_header_external raw;
1464 unsigned int size;
1465 bfd_vma (*get32) (const void *) = NULL;
1466
1467 /* Just read the magic number. */
1468 if (bfd_seek (abfd, 0, SEEK_SET) != 0
1469 || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4)
1470 return FALSE;
1471
1472 if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
1473 {
1474 header->byteorder = BFD_ENDIAN_BIG;
1475 header->magic = BFD_MACH_O_MH_MAGIC;
1476 header->version = 1;
1477 get32 = bfd_getb32;
1478 }
1479 else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
1480 {
1481 header->byteorder = BFD_ENDIAN_LITTLE;
1482 header->magic = BFD_MACH_O_MH_MAGIC;
1483 header->version = 1;
1484 get32 = bfd_getl32;
1485 }
1486 else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
1487 {
1488 header->byteorder = BFD_ENDIAN_BIG;
1489 header->magic = BFD_MACH_O_MH_MAGIC_64;
1490 header->version = 2;
1491 get32 = bfd_getb32;
1492 }
1493 else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
1494 {
1495 header->byteorder = BFD_ENDIAN_LITTLE;
1496 header->magic = BFD_MACH_O_MH_MAGIC_64;
1497 header->version = 2;
1498 get32 = bfd_getl32;
1499 }
1500 else
1501 {
1502 header->byteorder = BFD_ENDIAN_UNKNOWN;
1503 return FALSE;
1504 }
1505
1506 /* Once the size of the header is known, read the full header. */
1507 size = mach_o_wide_p (header) ?
1508 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
1509
1510 if (bfd_seek (abfd, 0, SEEK_SET) != 0
1511 || bfd_bread (&raw, size, abfd) != size)
1512 return FALSE;
1513
1514 header->cputype = (*get32) (raw.cputype);
1515 header->cpusubtype = (*get32) (raw.cpusubtype);
1516 header->filetype = (*get32) (raw.filetype);
1517 header->ncmds = (*get32) (raw.ncmds);
1518 header->sizeofcmds = (*get32) (raw.sizeofcmds);
1519 header->flags = (*get32) (raw.flags);
1520
1521 if (mach_o_wide_p (header))
1522 header->reserved = (*get32) (raw.reserved);
1523
1524 return TRUE;
1525 }
1526
1527 static asection *
1528 bfd_mach_o_make_bfd_section (bfd *abfd, bfd_mach_o_section *section,
1529 unsigned long prot)
1530 {
1531 asection *bfdsec;
1532 const char *sname;
1533 flagword flags;
1534
1535 bfd_mach_o_convert_section_name_to_bfd (abfd, section, &sname, &flags);
1536 if (sname == NULL)
1537 return NULL;
1538
1539 if (flags == SEC_NO_FLAGS)
1540 {
1541 /* Try to guess flags. */
1542 if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
1543 flags = SEC_DEBUGGING;
1544 else
1545 {
1546 flags = SEC_ALLOC;
1547 if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
1548 != BFD_MACH_O_S_ZEROFILL)
1549 {
1550 flags |= SEC_LOAD;
1551 if (prot & BFD_MACH_O_PROT_EXECUTE)
1552 flags |= SEC_CODE;
1553 if (prot & BFD_MACH_O_PROT_WRITE)
1554 flags |= SEC_DATA;
1555 else if (prot & BFD_MACH_O_PROT_READ)
1556 flags |= SEC_READONLY;
1557 }
1558 }
1559 }
1560 else
1561 {
1562 if ((flags & SEC_DEBUGGING) == 0)
1563 flags |= SEC_ALLOC;
1564 }
1565
1566 if (section->offset != 0)
1567 flags |= SEC_HAS_CONTENTS;
1568 if (section->nreloc != 0)
1569 flags |= SEC_RELOC;
1570
1571 bfdsec = bfd_make_section_anyway_with_flags (abfd, sname, flags);
1572 if (bfdsec == NULL)
1573 return NULL;
1574
1575 bfdsec->vma = section->addr;
1576 bfdsec->lma = section->addr;
1577 bfdsec->size = section->size;
1578 bfdsec->filepos = section->offset;
1579 bfdsec->alignment_power = section->align;
1580 bfdsec->segment_mark = 0;
1581 bfdsec->reloc_count = section->nreloc;
1582 bfdsec->rel_filepos = section->reloff;
1583
1584 return bfdsec;
1585 }
1586
1587 static int
1588 bfd_mach_o_read_section_32 (bfd *abfd,
1589 bfd_mach_o_section *section,
1590 unsigned int offset,
1591 unsigned long prot)
1592 {
1593 struct mach_o_section_32_external raw;
1594
1595 if (bfd_seek (abfd, offset, SEEK_SET) != 0
1596 || (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
1597 != BFD_MACH_O_SECTION_SIZE))
1598 return -1;
1599
1600 memcpy (section->sectname, raw.sectname, 16);
1601 section->sectname[16] = '\0';
1602 memcpy (section->segname, raw.segname, 16);
1603 section->segname[16] = '\0';
1604 section->addr = bfd_h_get_32 (abfd, raw.addr);
1605 section->size = bfd_h_get_32 (abfd, raw.size);
1606 section->offset = bfd_h_get_32 (abfd, raw.offset);
1607 section->align = bfd_h_get_32 (abfd, raw.align);
1608 section->reloff = bfd_h_get_32 (abfd, raw.reloff);
1609 section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
1610 section->flags = bfd_h_get_32 (abfd, raw.flags);
1611 section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
1612 section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
1613 section->reserved3 = 0;
1614 section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot);
1615
1616 if (section->bfdsection == NULL)
1617 return -1;
1618
1619 return 0;
1620 }
1621
1622 static int
1623 bfd_mach_o_read_section_64 (bfd *abfd,
1624 bfd_mach_o_section *section,
1625 unsigned int offset,
1626 unsigned long prot)
1627 {
1628 struct mach_o_section_64_external raw;
1629
1630 if (bfd_seek (abfd, offset, SEEK_SET) != 0
1631 || (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
1632 != BFD_MACH_O_SECTION_64_SIZE))
1633 return -1;
1634
1635 memcpy (section->sectname, raw.sectname, 16);
1636 section->sectname[16] = '\0';
1637 memcpy (section->segname, raw.segname, 16);
1638 section->segname[16] = '\0';
1639 section->addr = bfd_h_get_64 (abfd, raw.addr);
1640 section->size = bfd_h_get_64 (abfd, raw.size);
1641 section->offset = bfd_h_get_32 (abfd, raw.offset);
1642 section->align = bfd_h_get_32 (abfd, raw.align);
1643 section->reloff = bfd_h_get_32 (abfd, raw.reloff);
1644 section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
1645 section->flags = bfd_h_get_32 (abfd, raw.flags);
1646 section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
1647 section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
1648 section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3);
1649 section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section, prot);
1650
1651 if (section->bfdsection == NULL)
1652 return -1;
1653
1654 return 0;
1655 }
1656
1657 static int
1658 bfd_mach_o_read_section (bfd *abfd,
1659 bfd_mach_o_section *section,
1660 unsigned int offset,
1661 unsigned long prot,
1662 unsigned int wide)
1663 {
1664 if (wide)
1665 return bfd_mach_o_read_section_64 (abfd, section, offset, prot);
1666 else
1667 return bfd_mach_o_read_section_32 (abfd, section, offset, prot);
1668 }
1669
1670 static int
1671 bfd_mach_o_read_symtab_symbol (bfd *abfd,
1672 bfd_mach_o_symtab_command *sym,
1673 bfd_mach_o_asymbol *s,
1674 unsigned long i)
1675 {
1676 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1677 unsigned int wide = mach_o_wide_p (&mdata->header);
1678 unsigned int symwidth =
1679 wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
1680 unsigned int symoff = sym->symoff + (i * symwidth);
1681 struct mach_o_nlist_64_external raw;
1682 unsigned char type = -1;
1683 unsigned char section = -1;
1684 short desc = -1;
1685 symvalue value = -1;
1686 unsigned long stroff = -1;
1687 unsigned int symtype = -1;
1688
1689 BFD_ASSERT (sym->strtab != NULL);
1690
1691 if (bfd_seek (abfd, symoff, SEEK_SET) != 0
1692 || bfd_bread (&raw, symwidth, abfd) != symwidth)
1693 {
1694 (*_bfd_error_handler)
1695 (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"),
1696 symwidth, (unsigned long) symoff);
1697 return -1;
1698 }
1699
1700 stroff = bfd_h_get_32 (abfd, raw.n_strx);
1701 type = bfd_h_get_8 (abfd, raw.n_type);
1702 symtype = type & BFD_MACH_O_N_TYPE;
1703 section = bfd_h_get_8 (abfd, raw.n_sect);
1704 desc = bfd_h_get_16 (abfd, raw.n_desc);
1705 if (wide)
1706 value = bfd_h_get_64 (abfd, raw.n_value);
1707 else
1708 value = bfd_h_get_32 (abfd, raw.n_value);
1709
1710 if (stroff >= sym->strsize)
1711 {
1712 (*_bfd_error_handler)
1713 (_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %lu)"),
1714 (unsigned long) stroff,
1715 (unsigned long) sym->strsize);
1716 return -1;
1717 }
1718
1719 s->symbol.the_bfd = abfd;
1720 s->symbol.name = sym->strtab + stroff;
1721 s->symbol.value = value;
1722 s->symbol.flags = 0x0;
1723 s->symbol.udata.i = 0;
1724 s->n_type = type;
1725 s->n_sect = section;
1726 s->n_desc = desc;
1727
1728 if (type & BFD_MACH_O_N_STAB)
1729 {
1730 s->symbol.flags |= BSF_DEBUGGING;
1731 s->symbol.section = bfd_und_section_ptr;
1732 switch (type)
1733 {
1734 case N_FUN:
1735 case N_STSYM:
1736 case N_LCSYM:
1737 case N_BNSYM:
1738 case N_SLINE:
1739 case N_ENSYM:
1740 case N_ECOMM:
1741 case N_ECOML:
1742 case N_GSYM:
1743 if ((section > 0) && (section <= mdata->nsects))
1744 {
1745 s->symbol.section = mdata->sections[section - 1]->bfdsection;
1746 s->symbol.value =
1747 s->symbol.value - mdata->sections[section - 1]->addr;
1748 }
1749 break;
1750 }
1751 }
1752 else
1753 {
1754 if (type & BFD_MACH_O_N_PEXT)
1755 s->symbol.flags |= BSF_GLOBAL;
1756
1757 if (type & BFD_MACH_O_N_EXT)
1758 s->symbol.flags |= BSF_GLOBAL;
1759
1760 if (!(type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
1761 s->symbol.flags |= BSF_LOCAL;
1762
1763 switch (symtype)
1764 {
1765 case BFD_MACH_O_N_UNDF:
1766 if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT)
1767 && s->symbol.value != 0)
1768 {
1769 /* A common symbol. */
1770 s->symbol.section = bfd_com_section_ptr;
1771 s->symbol.flags = BSF_NO_FLAGS;
1772 }
1773 else
1774 {
1775 s->symbol.section = bfd_und_section_ptr;
1776 if (s->n_desc & BFD_MACH_O_N_WEAK_REF)
1777 s->symbol.flags |= BSF_WEAK;
1778 }
1779 break;
1780 case BFD_MACH_O_N_PBUD:
1781 s->symbol.section = bfd_und_section_ptr;
1782 break;
1783 case BFD_MACH_O_N_ABS:
1784 s->symbol.section = bfd_abs_section_ptr;
1785 break;
1786 case BFD_MACH_O_N_SECT:
1787 if ((section > 0) && (section <= mdata->nsects))
1788 {
1789 s->symbol.section = mdata->sections[section - 1]->bfdsection;
1790 s->symbol.value =
1791 s->symbol.value - mdata->sections[section - 1]->addr;
1792 }
1793 else
1794 {
1795 /* Mach-O uses 0 to mean "no section"; not an error. */
1796 if (section != 0)
1797 {
1798 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
1799 "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined"),
1800 s->symbol.name, section, mdata->nsects);
1801 }
1802 s->symbol.section = bfd_und_section_ptr;
1803 }
1804 break;
1805 case BFD_MACH_O_N_INDR:
1806 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
1807 "symbol \"%s\" is unsupported 'indirect' reference: setting to undefined"),
1808 s->symbol.name);
1809 s->symbol.section = bfd_und_section_ptr;
1810 break;
1811 default:
1812 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
1813 "symbol \"%s\" specified invalid type field 0x%x: setting to undefined"),
1814 s->symbol.name, symtype);
1815 s->symbol.section = bfd_und_section_ptr;
1816 break;
1817 }
1818 }
1819
1820 return 0;
1821 }
1822
1823 static int
1824 bfd_mach_o_read_symtab_strtab (bfd *abfd)
1825 {
1826 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1827 bfd_mach_o_symtab_command *sym = mdata->symtab;
1828
1829 /* Fail if there is no symtab. */
1830 if (sym == NULL)
1831 return -1;
1832
1833 /* Success if already loaded. */
1834 if (sym->strtab)
1835 return 0;
1836
1837 if (abfd->flags & BFD_IN_MEMORY)
1838 {
1839 struct bfd_in_memory *b;
1840
1841 b = (struct bfd_in_memory *) abfd->iostream;
1842
1843 if ((sym->stroff + sym->strsize) > b->size)
1844 {
1845 bfd_set_error (bfd_error_file_truncated);
1846 return -1;
1847 }
1848 sym->strtab = (char *) b->buffer + sym->stroff;
1849 }
1850 else
1851 {
1852 sym->strtab = bfd_alloc (abfd, sym->strsize);
1853 if (sym->strtab == NULL)
1854 return -1;
1855
1856 if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0
1857 || bfd_bread ((void *) sym->strtab, sym->strsize, abfd) != sym->strsize)
1858 {
1859 bfd_set_error (bfd_error_file_truncated);
1860 return -1;
1861 }
1862 }
1863
1864 return 0;
1865 }
1866
1867 static int
1868 bfd_mach_o_read_symtab_symbols (bfd *abfd)
1869 {
1870 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1871 bfd_mach_o_symtab_command *sym = mdata->symtab;
1872 unsigned long i;
1873 int ret;
1874
1875 if (sym == NULL || sym->symbols)
1876 {
1877 /* Return now if there are no symbols or if already loaded. */
1878 return 0;
1879 }
1880
1881 sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (bfd_mach_o_asymbol));
1882
1883 if (sym->symbols == NULL)
1884 {
1885 (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbols: unable to allocate memory for symbols"));
1886 return -1;
1887 }
1888
1889 ret = bfd_mach_o_read_symtab_strtab (abfd);
1890 if (ret != 0)
1891 return ret;
1892
1893 for (i = 0; i < sym->nsyms; i++)
1894 {
1895 ret = bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i);
1896 if (ret != 0)
1897 return ret;
1898 }
1899
1900 return 0;
1901 }
1902
1903 int
1904 bfd_mach_o_read_dysymtab_symbol (bfd *abfd,
1905 bfd_mach_o_dysymtab_command *dysym,
1906 bfd_mach_o_symtab_command *sym,
1907 bfd_mach_o_asymbol *s,
1908 unsigned long i)
1909 {
1910 unsigned long isymoff = dysym->indirectsymoff + (i * 4);
1911 unsigned long sym_index;
1912 unsigned char raw[4];
1913
1914 BFD_ASSERT (i < dysym->nindirectsyms);
1915
1916 if (bfd_seek (abfd, isymoff, SEEK_SET) != 0
1917 || bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
1918 {
1919 (*_bfd_error_handler)
1920 (_("bfd_mach_o_read_dysymtab_symbol: unable to read %lu bytes at %lu"),
1921 (unsigned long) sizeof (raw), isymoff);
1922 return -1;
1923 }
1924 sym_index = bfd_h_get_32 (abfd, raw);
1925
1926 return bfd_mach_o_read_symtab_symbol (abfd, sym, s, sym_index);
1927 }
1928
1929 static const char *
1930 bfd_mach_o_i386_flavour_string (unsigned int flavour)
1931 {
1932 switch ((int) flavour)
1933 {
1934 case BFD_MACH_O_x86_THREAD_STATE32: return "x86_THREAD_STATE32";
1935 case BFD_MACH_O_x86_FLOAT_STATE32: return "x86_FLOAT_STATE32";
1936 case BFD_MACH_O_x86_EXCEPTION_STATE32: return "x86_EXCEPTION_STATE32";
1937 case BFD_MACH_O_x86_THREAD_STATE64: return "x86_THREAD_STATE64";
1938 case BFD_MACH_O_x86_FLOAT_STATE64: return "x86_FLOAT_STATE64";
1939 case BFD_MACH_O_x86_EXCEPTION_STATE64: return "x86_EXCEPTION_STATE64";
1940 case BFD_MACH_O_x86_THREAD_STATE: return "x86_THREAD_STATE";
1941 case BFD_MACH_O_x86_FLOAT_STATE: return "x86_FLOAT_STATE";
1942 case BFD_MACH_O_x86_EXCEPTION_STATE: return "x86_EXCEPTION_STATE";
1943 case BFD_MACH_O_x86_DEBUG_STATE32: return "x86_DEBUG_STATE32";
1944 case BFD_MACH_O_x86_DEBUG_STATE64: return "x86_DEBUG_STATE64";
1945 case BFD_MACH_O_x86_DEBUG_STATE: return "x86_DEBUG_STATE";
1946 case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE";
1947 default: return "UNKNOWN";
1948 }
1949 }
1950
1951 static const char *
1952 bfd_mach_o_ppc_flavour_string (unsigned int flavour)
1953 {
1954 switch ((int) flavour)
1955 {
1956 case BFD_MACH_O_PPC_THREAD_STATE: return "PPC_THREAD_STATE";
1957 case BFD_MACH_O_PPC_FLOAT_STATE: return "PPC_FLOAT_STATE";
1958 case BFD_MACH_O_PPC_EXCEPTION_STATE: return "PPC_EXCEPTION_STATE";
1959 case BFD_MACH_O_PPC_VECTOR_STATE: return "PPC_VECTOR_STATE";
1960 case BFD_MACH_O_PPC_THREAD_STATE64: return "PPC_THREAD_STATE64";
1961 case BFD_MACH_O_PPC_EXCEPTION_STATE64: return "PPC_EXCEPTION_STATE64";
1962 default: return "UNKNOWN";
1963 }
1964 }
1965
1966 static int
1967 bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
1968 {
1969 bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
1970 struct mach_o_str_command_external raw;
1971 unsigned int nameoff;
1972
1973 BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER)
1974 || (command->type == BFD_MACH_O_LC_LOAD_DYLINKER));
1975
1976 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1977 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
1978 return -1;
1979
1980 nameoff = bfd_h_get_32 (abfd, raw.str);
1981
1982 cmd->name_offset = command->offset + nameoff;
1983 cmd->name_len = command->len - nameoff;
1984 cmd->name_str = bfd_alloc (abfd, cmd->name_len);
1985 if (cmd->name_str == NULL)
1986 return -1;
1987 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
1988 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
1989 return -1;
1990 return 0;
1991 }
1992
1993 static int
1994 bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
1995 {
1996 bfd_mach_o_dylib_command *cmd = &command->command.dylib;
1997 struct mach_o_dylib_command_external raw;
1998 unsigned int nameoff;
1999
2000 switch (command->type)
2001 {
2002 case BFD_MACH_O_LC_LOAD_DYLIB:
2003 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
2004 case BFD_MACH_O_LC_ID_DYLIB:
2005 case BFD_MACH_O_LC_REEXPORT_DYLIB:
2006 break;
2007 default:
2008 BFD_FAIL ();
2009 return -1;
2010 }
2011
2012 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2013 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2014 return -1;
2015
2016 nameoff = bfd_h_get_32 (abfd, raw.name);
2017 cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp);
2018 cmd->current_version = bfd_h_get_32 (abfd, raw.current_version);
2019 cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version);
2020
2021 cmd->name_offset = command->offset + nameoff;
2022 cmd->name_len = command->len - nameoff;
2023 cmd->name_str = bfd_alloc (abfd, cmd->name_len);
2024 if (cmd->name_str == NULL)
2025 return -1;
2026 if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
2027 || bfd_bread (cmd->name_str, cmd->name_len, abfd) != cmd->name_len)
2028 return -1;
2029 return 0;
2030 }
2031
2032 static int
2033 bfd_mach_o_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED,
2034 bfd_mach_o_load_command *command ATTRIBUTE_UNUSED)
2035 {
2036 /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
2037
2038 BFD_ASSERT (command->type == BFD_MACH_O_LC_PREBOUND_DYLIB);
2039 return 0;
2040 }
2041
2042 static int
2043 bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
2044 {
2045 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2046 bfd_mach_o_thread_command *cmd = &command->command.thread;
2047 unsigned int offset;
2048 unsigned int nflavours;
2049 unsigned int i;
2050
2051 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
2052 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
2053
2054 /* Count the number of threads. */
2055 offset = 8;
2056 nflavours = 0;
2057 while (offset != command->len)
2058 {
2059 struct mach_o_thread_command_external raw;
2060
2061 if (offset >= command->len)
2062 return -1;
2063
2064 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
2065 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2066 return -1;
2067
2068 offset += sizeof (raw) + bfd_h_get_32 (abfd, raw.count) * 4;
2069 nflavours++;
2070 }
2071
2072 /* Allocate threads. */
2073 cmd->flavours = bfd_alloc
2074 (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
2075 if (cmd->flavours == NULL)
2076 return -1;
2077 cmd->nflavours = nflavours;
2078
2079 offset = 8;
2080 nflavours = 0;
2081 while (offset != command->len)
2082 {
2083 struct mach_o_thread_command_external raw;
2084
2085 if (offset >= command->len)
2086 return -1;
2087
2088 if (nflavours >= cmd->nflavours)
2089 return -1;
2090
2091 if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
2092 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2093 return -1;
2094
2095 cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour);
2096 cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw);
2097 cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4;
2098 offset += cmd->flavours[nflavours].size + sizeof (raw);
2099 nflavours++;
2100 }
2101
2102 for (i = 0; i < nflavours; i++)
2103 {
2104 asection *bfdsec;
2105 unsigned int snamelen;
2106 char *sname;
2107 const char *flavourstr;
2108 const char *prefix = "LC_THREAD";
2109 unsigned int j = 0;
2110
2111 switch (mdata->header.cputype)
2112 {
2113 case BFD_MACH_O_CPU_TYPE_POWERPC:
2114 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
2115 flavourstr = bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
2116 break;
2117 case BFD_MACH_O_CPU_TYPE_I386:
2118 case BFD_MACH_O_CPU_TYPE_X86_64:
2119 flavourstr = bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
2120 break;
2121 default:
2122 flavourstr = "UNKNOWN_ARCHITECTURE";
2123 break;
2124 }
2125
2126 snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
2127 sname = bfd_alloc (abfd, snamelen);
2128 if (sname == NULL)
2129 return -1;
2130
2131 for (;;)
2132 {
2133 sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
2134 if (bfd_get_section_by_name (abfd, sname) == NULL)
2135 break;
2136 j++;
2137 }
2138
2139 bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
2140
2141 bfdsec->vma = 0;
2142 bfdsec->lma = 0;
2143 bfdsec->size = cmd->flavours[i].size;
2144 bfdsec->filepos = cmd->flavours[i].offset;
2145 bfdsec->alignment_power = 0x0;
2146
2147 cmd->section = bfdsec;
2148 }
2149
2150 return 0;
2151 }
2152
2153 static int
2154 bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
2155 {
2156 bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
2157 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2158
2159 BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
2160
2161 {
2162 struct mach_o_dysymtab_command_external raw;
2163
2164 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2165 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2166 return -1;
2167
2168 cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym);
2169 cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym);
2170 cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym);
2171 cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym);
2172 cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym);
2173 cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym);
2174 cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff);
2175 cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc);
2176 cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff);
2177 cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab);
2178 cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff);
2179 cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms);
2180 cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff);
2181 cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms);
2182 cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff);
2183 cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel);
2184 cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff);
2185 cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel);
2186 }
2187
2188 if (cmd->nmodtab != 0)
2189 {
2190 unsigned int i;
2191 int wide = bfd_mach_o_wide_p (abfd);
2192 unsigned int module_len = wide ? 56 : 52;
2193
2194 cmd->dylib_module =
2195 bfd_alloc (abfd, cmd->nmodtab * sizeof (bfd_mach_o_dylib_module));
2196 if (cmd->dylib_module == NULL)
2197 return -1;
2198
2199 if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
2200 return -1;
2201
2202 for (i = 0; i < cmd->nmodtab; i++)
2203 {
2204 bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
2205 unsigned long v;
2206 unsigned char buf[56];
2207
2208 if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
2209 return -1;
2210
2211 module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
2212 module->iextdefsym = bfd_h_get_32 (abfd, buf + 4);
2213 module->nextdefsym = bfd_h_get_32 (abfd, buf + 8);
2214 module->irefsym = bfd_h_get_32 (abfd, buf + 12);
2215 module->nrefsym = bfd_h_get_32 (abfd, buf + 16);
2216 module->ilocalsym = bfd_h_get_32 (abfd, buf + 20);
2217 module->nlocalsym = bfd_h_get_32 (abfd, buf + 24);
2218 module->iextrel = bfd_h_get_32 (abfd, buf + 28);
2219 module->nextrel = bfd_h_get_32 (abfd, buf + 32);
2220 v = bfd_h_get_32 (abfd, buf +36);
2221 module->iinit = v & 0xffff;
2222 module->iterm = (v >> 16) & 0xffff;
2223 v = bfd_h_get_32 (abfd, buf + 40);
2224 module->ninit = v & 0xffff;
2225 module->nterm = (v >> 16) & 0xffff;
2226 if (wide)
2227 {
2228 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44);
2229 module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48);
2230 }
2231 else
2232 {
2233 module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44);
2234 module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48);
2235 }
2236 }
2237 }
2238
2239 if (cmd->ntoc != 0)
2240 {
2241 unsigned int i;
2242
2243 cmd->dylib_toc = bfd_alloc
2244 (abfd, cmd->ntoc * sizeof (bfd_mach_o_dylib_table_of_content));
2245 if (cmd->dylib_toc == NULL)
2246 return -1;
2247
2248 if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
2249 return -1;
2250
2251 for (i = 0; i < cmd->ntoc; i++)
2252 {
2253 struct mach_o_dylib_table_of_contents_external raw;
2254 bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
2255
2256 if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2257 return -1;
2258
2259 toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index);
2260 toc->module_index = bfd_h_get_32 (abfd, raw.module_index);
2261 }
2262 }
2263
2264 if (cmd->nindirectsyms != 0)
2265 {
2266 unsigned int i;
2267
2268 cmd->indirect_syms = bfd_alloc
2269 (abfd, cmd->nindirectsyms * sizeof (unsigned int));
2270 if (cmd->indirect_syms == NULL)
2271 return -1;
2272
2273 if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
2274 return -1;
2275
2276 for (i = 0; i < cmd->nindirectsyms; i++)
2277 {
2278 unsigned char raw[4];
2279 unsigned int *is = &cmd->indirect_syms[i];
2280
2281 if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
2282 return -1;
2283
2284 *is = bfd_h_get_32 (abfd, raw);
2285 }
2286 }
2287
2288 if (cmd->nextrefsyms != 0)
2289 {
2290 unsigned long v;
2291 unsigned int i;
2292
2293 cmd->ext_refs = bfd_alloc
2294 (abfd, cmd->nextrefsyms * sizeof (bfd_mach_o_dylib_reference));
2295 if (cmd->ext_refs == NULL)
2296 return -1;
2297
2298 if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
2299 return -1;
2300
2301 for (i = 0; i < cmd->nextrefsyms; i++)
2302 {
2303 unsigned char raw[4];
2304 bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
2305
2306 if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
2307 return -1;
2308
2309 /* Fields isym and flags are written as bit-fields, thus we need
2310 a specific processing for endianness. */
2311 v = bfd_h_get_32 (abfd, raw);
2312 if (bfd_big_endian (abfd))
2313 {
2314 ref->isym = (v >> 8) & 0xffffff;
2315 ref->flags = v & 0xff;
2316 }
2317 else
2318 {
2319 ref->isym = v & 0xffffff;
2320 ref->flags = (v >> 24) & 0xff;
2321 }
2322 }
2323 }
2324
2325 if (mdata->dysymtab)
2326 return -1;
2327 mdata->dysymtab = cmd;
2328
2329 return 0;
2330 }
2331
2332 static int
2333 bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
2334 {
2335 bfd_mach_o_symtab_command *symtab = &command->command.symtab;
2336 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2337 struct mach_o_symtab_command_external raw;
2338
2339 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
2340
2341 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2342 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2343 return -1;
2344
2345 symtab->symoff = bfd_h_get_32 (abfd, raw.symoff);
2346 symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms);
2347 symtab->stroff = bfd_h_get_32 (abfd, raw.stroff);
2348 symtab->strsize = bfd_h_get_32 (abfd, raw.strsize);
2349 symtab->symbols = NULL;
2350 symtab->strtab = NULL;
2351
2352 if (symtab->nsyms != 0)
2353 abfd->flags |= HAS_SYMS;
2354
2355 if (mdata->symtab)
2356 return -1;
2357 mdata->symtab = symtab;
2358 return 0;
2359 }
2360
2361 static int
2362 bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
2363 {
2364 bfd_mach_o_uuid_command *cmd = &command->command.uuid;
2365
2366 BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
2367
2368 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2369 || bfd_bread (cmd->uuid, 16, abfd) != 16)
2370 return -1;
2371
2372 return 0;
2373 }
2374
2375 static int
2376 bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
2377 {
2378 bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
2379 struct mach_o_linkedit_data_command_external raw;
2380
2381 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2382 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2383 return -1;
2384
2385 cmd->dataoff = bfd_get_32 (abfd, raw.dataoff);
2386 cmd->datasize = bfd_get_32 (abfd, raw.datasize);
2387 return 0;
2388 }
2389
2390 static int
2391 bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
2392 {
2393 bfd_mach_o_str_command *cmd = &command->command.str;
2394 struct mach_o_str_command_external raw;
2395 unsigned long off;
2396
2397 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2398 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2399 return -1;
2400
2401 off = bfd_get_32 (abfd, raw.str);
2402 cmd->stroff = command->offset + off;
2403 cmd->str_len = command->len - off;
2404 cmd->str = bfd_alloc (abfd, cmd->str_len);
2405 if (cmd->str == NULL)
2406 return -1;
2407 if (bfd_seek (abfd, cmd->stroff, SEEK_SET) != 0
2408 || bfd_bread ((void *) cmd->str, cmd->str_len, abfd) != cmd->str_len)
2409 return -1;
2410 return 0;
2411 }
2412
2413 static int
2414 bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
2415 {
2416 bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
2417 struct mach_o_dyld_info_command_external raw;
2418
2419 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2420 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2421 return -1;
2422
2423 cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off);
2424 cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size);
2425 cmd->bind_off = bfd_get_32 (abfd, raw.bind_off);
2426 cmd->bind_size = bfd_get_32 (abfd, raw.bind_size);
2427 cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off);
2428 cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size);
2429 cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off);
2430 cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size);
2431 cmd->export_off = bfd_get_32 (abfd, raw.export_off);
2432 cmd->export_size = bfd_get_32 (abfd, raw.export_size);
2433 return 0;
2434 }
2435
2436 static bfd_boolean
2437 bfd_mach_o_read_version_min (bfd *abfd, bfd_mach_o_load_command *command)
2438 {
2439 bfd_mach_o_version_min_command *cmd = &command->command.version_min;
2440 struct mach_o_version_min_command_external raw;
2441 unsigned int ver;
2442
2443 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2444 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2445 return FALSE;
2446
2447 ver = bfd_get_32 (abfd, raw.version);
2448 cmd->rel = ver >> 16;
2449 cmd->maj = ver >> 8;
2450 cmd->min = ver;
2451 cmd->reserved = bfd_get_32 (abfd, raw.reserved);
2452 return TRUE;
2453 }
2454
2455 static int
2456 bfd_mach_o_read_segment (bfd *abfd,
2457 bfd_mach_o_load_command *command,
2458 unsigned int wide)
2459 {
2460 bfd_mach_o_segment_command *seg = &command->command.segment;
2461 unsigned long i;
2462
2463 if (wide)
2464 {
2465 struct mach_o_segment_command_64_external raw;
2466
2467 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
2468
2469 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2470 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2471 return -1;
2472
2473 memcpy (seg->segname, raw.segname, 16);
2474 seg->segname[16] = '\0';
2475
2476 seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr);
2477 seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize);
2478 seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff);
2479 seg->filesize = bfd_h_get_64 (abfd, raw.filesize);
2480 seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
2481 seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
2482 seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
2483 seg->flags = bfd_h_get_32 (abfd, raw.flags);
2484 }
2485 else
2486 {
2487 struct mach_o_segment_command_32_external raw;
2488
2489 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
2490
2491 if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2492 || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
2493 return -1;
2494
2495 memcpy (seg->segname, raw.segname, 16);
2496 seg->segname[16] = '\0';
2497
2498 seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr);
2499 seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize);
2500 seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff);
2501 seg->filesize = bfd_h_get_32 (abfd, raw.filesize);
2502 seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
2503 seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
2504 seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
2505 seg->flags = bfd_h_get_32 (abfd, raw.flags);
2506 }
2507
2508 if (seg->nsects != 0)
2509 {
2510 seg->sections = bfd_alloc (abfd, seg->nsects
2511 * sizeof (bfd_mach_o_section));
2512 if (seg->sections == NULL)
2513 return -1;
2514
2515 for (i = 0; i < seg->nsects; i++)
2516 {
2517 bfd_vma segoff;
2518 if (wide)
2519 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE
2520 + (i * BFD_MACH_O_SECTION_64_SIZE);
2521 else
2522 segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE
2523 + (i * BFD_MACH_O_SECTION_SIZE);
2524
2525 if (bfd_mach_o_read_section
2526 (abfd, &seg->sections[i], segoff, seg->initprot, wide) != 0)
2527 return -1;
2528 }
2529 }
2530
2531 return 0;
2532 }
2533
2534 static int
2535 bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
2536 {
2537 return bfd_mach_o_read_segment (abfd, command, 0);
2538 }
2539
2540 static int
2541 bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
2542 {
2543 return bfd_mach_o_read_segment (abfd, command, 1);
2544 }
2545
2546 static int
2547 bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
2548 {
2549 struct mach_o_load_command_external raw;
2550 unsigned int cmd;
2551
2552 /* Read command type and length. */
2553 if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
2554 || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE)
2555 return -1;
2556
2557 cmd = bfd_h_get_32 (abfd, raw.cmd);
2558 command->type = cmd & ~BFD_MACH_O_LC_REQ_DYLD;
2559 command->type_required = cmd & BFD_MACH_O_LC_REQ_DYLD ? TRUE : FALSE;
2560 command->len = bfd_h_get_32 (abfd, raw.cmdsize);
2561
2562 switch (command->type)
2563 {
2564 case BFD_MACH_O_LC_SEGMENT:
2565 if (bfd_mach_o_read_segment_32 (abfd, command) != 0)
2566 return -1;
2567 break;
2568 case BFD_MACH_O_LC_SEGMENT_64:
2569 if (bfd_mach_o_read_segment_64 (abfd, command) != 0)
2570 return -1;
2571 break;
2572 case BFD_MACH_O_LC_SYMTAB:
2573 if (bfd_mach_o_read_symtab (abfd, command) != 0)
2574 return -1;
2575 break;
2576 case BFD_MACH_O_LC_SYMSEG:
2577 break;
2578 case BFD_MACH_O_LC_THREAD:
2579 case BFD_MACH_O_LC_UNIXTHREAD:
2580 if (bfd_mach_o_read_thread (abfd, command) != 0)
2581 return -1;
2582 break;
2583 case BFD_MACH_O_LC_LOAD_DYLINKER:
2584 case BFD_MACH_O_LC_ID_DYLINKER:
2585 if (bfd_mach_o_read_dylinker (abfd, command) != 0)
2586 return -1;
2587 break;
2588 case BFD_MACH_O_LC_LOAD_DYLIB:
2589 case BFD_MACH_O_LC_ID_DYLIB:
2590 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
2591 case BFD_MACH_O_LC_REEXPORT_DYLIB:
2592 if (bfd_mach_o_read_dylib (abfd, command) != 0)
2593 return -1;
2594 break;
2595 case BFD_MACH_O_LC_PREBOUND_DYLIB:
2596 if (bfd_mach_o_read_prebound_dylib (abfd, command) != 0)
2597 return -1;
2598 break;
2599 case BFD_MACH_O_LC_LOADFVMLIB:
2600 case BFD_MACH_O_LC_IDFVMLIB:
2601 case BFD_MACH_O_LC_IDENT:
2602 case BFD_MACH_O_LC_FVMFILE:
2603 case BFD_MACH_O_LC_PREPAGE:
2604 case BFD_MACH_O_LC_ROUTINES:
2605 case BFD_MACH_O_LC_ROUTINES_64:
2606 break;
2607 case BFD_MACH_O_LC_SUB_FRAMEWORK:
2608 case BFD_MACH_O_LC_SUB_UMBRELLA:
2609 case BFD_MACH_O_LC_SUB_LIBRARY:
2610 case BFD_MACH_O_LC_SUB_CLIENT:
2611 case BFD_MACH_O_LC_RPATH:
2612 if (bfd_mach_o_read_str (abfd, command) != 0)
2613 return -1;
2614 break;
2615 case BFD_MACH_O_LC_DYSYMTAB:
2616 if (bfd_mach_o_read_dysymtab (abfd, command) != 0)
2617 return -1;
2618 break;
2619 case BFD_MACH_O_LC_TWOLEVEL_HINTS:
2620 case BFD_MACH_O_LC_PREBIND_CKSUM:
2621 break;
2622 case BFD_MACH_O_LC_UUID:
2623 if (bfd_mach_o_read_uuid (abfd, command) != 0)
2624 return -1;
2625 break;
2626 case BFD_MACH_O_LC_CODE_SIGNATURE:
2627 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
2628 case BFD_MACH_O_LC_FUNCTION_STARTS:
2629 if (bfd_mach_o_read_linkedit (abfd, command) != 0)
2630 return -1;
2631 break;
2632 case BFD_MACH_O_LC_DYLD_INFO:
2633 if (bfd_mach_o_read_dyld_info (abfd, command) != 0)
2634 return -1;
2635 break;
2636 case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
2637 case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
2638 if (!bfd_mach_o_read_version_min (abfd, command))
2639 return -1;
2640 break;
2641 default:
2642 (*_bfd_error_handler) (_("unable to read unknown load command 0x%lx"),
2643 (unsigned long) command->type);
2644 break;
2645 }
2646
2647 return 0;
2648 }
2649
2650 static void
2651 bfd_mach_o_flatten_sections (bfd *abfd)
2652 {
2653 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2654 long csect = 0;
2655 unsigned long i, j;
2656
2657 /* Count total number of sections. */
2658 mdata->nsects = 0;
2659
2660 for (i = 0; i < mdata->header.ncmds; i++)
2661 {
2662 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
2663 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
2664 {
2665 bfd_mach_o_segment_command *seg;
2666
2667 seg = &mdata->commands[i].command.segment;
2668 mdata->nsects += seg->nsects;
2669 }
2670 }
2671
2672 /* Allocate sections array. */
2673 mdata->sections = bfd_alloc (abfd,
2674 mdata->nsects * sizeof (bfd_mach_o_section *));
2675
2676 /* Fill the array. */
2677 csect = 0;
2678
2679 for (i = 0; i < mdata->header.ncmds; i++)
2680 {
2681 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
2682 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
2683 {
2684 bfd_mach_o_segment_command *seg;
2685
2686 seg = &mdata->commands[i].command.segment;
2687 BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
2688
2689 for (j = 0; j < seg->nsects; j++)
2690 mdata->sections[csect++] = &seg->sections[j];
2691 }
2692 }
2693 }
2694
2695 int
2696 bfd_mach_o_scan_start_address (bfd *abfd)
2697 {
2698 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2699 bfd_mach_o_thread_command *cmd = NULL;
2700 unsigned long i;
2701
2702 for (i = 0; i < mdata->header.ncmds; i++)
2703 {
2704 if ((mdata->commands[i].type == BFD_MACH_O_LC_THREAD) ||
2705 (mdata->commands[i].type == BFD_MACH_O_LC_UNIXTHREAD))
2706 {
2707 if (cmd == NULL)
2708 cmd = &mdata->commands[i].command.thread;
2709 else
2710 return 0;
2711 }
2712 }
2713
2714 if (cmd == NULL)
2715 return 0;
2716
2717 for (i = 0; i < cmd->nflavours; i++)
2718 {
2719 if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
2720 && (cmd->flavours[i].flavour
2721 == (unsigned long) BFD_MACH_O_x86_THREAD_STATE32))
2722 {
2723 unsigned char buf[4];
2724
2725 if (bfd_seek (abfd, cmd->flavours[i].offset + 40, SEEK_SET) != 0
2726 || bfd_bread (buf, 4, abfd) != 4)
2727 return -1;
2728
2729 abfd->start_address = bfd_h_get_32 (abfd, buf);
2730 }
2731 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
2732 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
2733 {
2734 unsigned char buf[4];
2735
2736 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
2737 || bfd_bread (buf, 4, abfd) != 4)
2738 return -1;
2739
2740 abfd->start_address = bfd_h_get_32 (abfd, buf);
2741 }
2742 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
2743 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64))
2744 {
2745 unsigned char buf[8];
2746
2747 if (bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET) != 0
2748 || bfd_bread (buf, 8, abfd) != 8)
2749 return -1;
2750
2751 abfd->start_address = bfd_h_get_64 (abfd, buf);
2752 }
2753 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
2754 && (cmd->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
2755 {
2756 unsigned char buf[8];
2757
2758 if (bfd_seek (abfd, cmd->flavours[i].offset + (16 * 8), SEEK_SET) != 0
2759 || bfd_bread (buf, 8, abfd) != 8)
2760 return -1;
2761
2762 abfd->start_address = bfd_h_get_64 (abfd, buf);
2763 }
2764 }
2765
2766 return 0;
2767 }
2768
2769 bfd_boolean
2770 bfd_mach_o_set_arch_mach (bfd *abfd,
2771 enum bfd_architecture arch,
2772 unsigned long machine)
2773 {
2774 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
2775
2776 /* If this isn't the right architecture for this backend, and this
2777 isn't the generic backend, fail. */
2778 if (arch != bed->arch
2779 && arch != bfd_arch_unknown
2780 && bed->arch != bfd_arch_unknown)
2781 return FALSE;
2782
2783 return bfd_default_set_arch_mach (abfd, arch, machine);
2784 }
2785
2786 int
2787 bfd_mach_o_scan (bfd *abfd,
2788 bfd_mach_o_header *header,
2789 bfd_mach_o_data_struct *mdata)
2790 {
2791 unsigned int i;
2792 enum bfd_architecture cputype;
2793 unsigned long cpusubtype;
2794 unsigned int hdrsize;
2795
2796 hdrsize = mach_o_wide_p (header) ?
2797 BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
2798
2799 mdata->header = *header;
2800
2801 abfd->flags = abfd->flags & BFD_IN_MEMORY;
2802 switch (header->filetype)
2803 {
2804 case BFD_MACH_O_MH_OBJECT:
2805 abfd->flags |= HAS_RELOC;
2806 break;
2807 case BFD_MACH_O_MH_EXECUTE:
2808 abfd->flags |= EXEC_P;
2809 break;
2810 case BFD_MACH_O_MH_DYLIB:
2811 case BFD_MACH_O_MH_BUNDLE:
2812 abfd->flags |= DYNAMIC;
2813 break;
2814 }
2815
2816 abfd->tdata.mach_o_data = mdata;
2817
2818 bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
2819 &cputype, &cpusubtype);
2820 if (cputype == bfd_arch_unknown)
2821 {
2822 (*_bfd_error_handler) (_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"),
2823 header->cputype, header->cpusubtype);
2824 return -1;
2825 }
2826
2827 bfd_set_arch_mach (abfd, cputype, cpusubtype);
2828
2829 if (header->ncmds != 0)
2830 {
2831 mdata->commands = bfd_alloc
2832 (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
2833 if (mdata->commands == NULL)
2834 return -1;
2835
2836 for (i = 0; i < header->ncmds; i++)
2837 {
2838 bfd_mach_o_load_command *cur = &mdata->commands[i];
2839
2840 if (i == 0)
2841 cur->offset = hdrsize;
2842 else
2843 {
2844 bfd_mach_o_load_command *prev = &mdata->commands[i - 1];
2845 cur->offset = prev->offset + prev->len;
2846 }
2847
2848 if (bfd_mach_o_read_command (abfd, cur) < 0)
2849 return -1;
2850 }
2851 }
2852
2853 if (bfd_mach_o_scan_start_address (abfd) < 0)
2854 return -1;
2855
2856 bfd_mach_o_flatten_sections (abfd);
2857 return 0;
2858 }
2859
2860 bfd_boolean
2861 bfd_mach_o_mkobject_init (bfd *abfd)
2862 {
2863 bfd_mach_o_data_struct *mdata = NULL;
2864
2865 mdata = bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct));
2866 if (mdata == NULL)
2867 return FALSE;
2868 abfd->tdata.mach_o_data = mdata;
2869
2870 mdata->header.magic = 0;
2871 mdata->header.cputype = 0;
2872 mdata->header.cpusubtype = 0;
2873 mdata->header.filetype = 0;
2874 mdata->header.ncmds = 0;
2875 mdata->header.sizeofcmds = 0;
2876 mdata->header.flags = 0;
2877 mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
2878 mdata->commands = NULL;
2879 mdata->nsects = 0;
2880 mdata->sections = NULL;
2881
2882 return TRUE;
2883 }
2884
2885 static bfd_boolean
2886 bfd_mach_o_gen_mkobject (bfd *abfd)
2887 {
2888 bfd_mach_o_data_struct *mdata;
2889
2890 if (!bfd_mach_o_mkobject_init (abfd))
2891 return FALSE;
2892
2893 mdata = bfd_mach_o_get_data (abfd);
2894 mdata->header.magic = BFD_MACH_O_MH_MAGIC;
2895 mdata->header.cputype = 0;
2896 mdata->header.cpusubtype = 0;
2897 mdata->header.byteorder = abfd->xvec->byteorder;
2898 mdata->header.version = 1;
2899
2900 return TRUE;
2901 }
2902
2903 const bfd_target *
2904 bfd_mach_o_header_p (bfd *abfd,
2905 bfd_mach_o_filetype filetype,
2906 bfd_mach_o_cpu_type cputype)
2907 {
2908 struct bfd_preserve preserve;
2909 bfd_mach_o_header header;
2910
2911 preserve.marker = NULL;
2912 if (!bfd_mach_o_read_header (abfd, &header))
2913 goto wrong;
2914
2915 if (! (header.byteorder == BFD_ENDIAN_BIG
2916 || header.byteorder == BFD_ENDIAN_LITTLE))
2917 {
2918 (*_bfd_error_handler) (_("unknown header byte-order value 0x%lx"),
2919 (unsigned long) header.byteorder);
2920 goto wrong;
2921 }
2922
2923 if (! ((header.byteorder == BFD_ENDIAN_BIG
2924 && abfd->xvec->byteorder == BFD_ENDIAN_BIG
2925 && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
2926 || (header.byteorder == BFD_ENDIAN_LITTLE
2927 && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
2928 && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
2929 goto wrong;
2930
2931 /* Check cputype and filetype.
2932 In case of wildcard, do not accept magics that are handled by existing
2933 targets. */
2934 if (cputype)
2935 {
2936 if (header.cputype != cputype)
2937 goto wrong;
2938 }
2939 else
2940 {
2941 switch (header.cputype)
2942 {
2943 case BFD_MACH_O_CPU_TYPE_I386:
2944 /* Handled by mach-o-i386 */
2945 goto wrong;
2946 default:
2947 break;
2948 }
2949 }
2950 if (filetype)
2951 {
2952 if (header.filetype != filetype)
2953 goto wrong;
2954 }
2955 else
2956 {
2957 switch (header.filetype)
2958 {
2959 case BFD_MACH_O_MH_CORE:
2960 /* Handled by core_p */
2961 goto wrong;
2962 default:
2963 break;
2964 }
2965 }
2966
2967 preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
2968 if (preserve.marker == NULL
2969 || !bfd_preserve_save (abfd, &preserve))
2970 goto fail;
2971
2972 if (bfd_mach_o_scan (abfd, &header,
2973 (bfd_mach_o_data_struct *) preserve.marker) != 0)
2974 goto wrong;
2975
2976 bfd_preserve_finish (abfd, &preserve);
2977 return abfd->xvec;
2978
2979 wrong:
2980 bfd_set_error (bfd_error_wrong_format);
2981
2982 fail:
2983 if (preserve.marker != NULL)
2984 bfd_preserve_restore (abfd, &preserve);
2985 return NULL;
2986 }
2987
2988 static const bfd_target *
2989 bfd_mach_o_gen_object_p (bfd *abfd)
2990 {
2991 return bfd_mach_o_header_p (abfd, 0, 0);
2992 }
2993
2994 static const bfd_target *
2995 bfd_mach_o_gen_core_p (bfd *abfd)
2996 {
2997 return bfd_mach_o_header_p (abfd, BFD_MACH_O_MH_CORE, 0);
2998 }
2999
3000 typedef struct mach_o_fat_archentry
3001 {
3002 unsigned long cputype;
3003 unsigned long cpusubtype;
3004 unsigned long offset;
3005 unsigned long size;
3006 unsigned long align;
3007 } mach_o_fat_archentry;
3008
3009 typedef struct mach_o_fat_data_struct
3010 {
3011 unsigned long magic;
3012 unsigned long nfat_arch;
3013 mach_o_fat_archentry *archentries;
3014 } mach_o_fat_data_struct;
3015
3016 const bfd_target *
3017 bfd_mach_o_archive_p (bfd *abfd)
3018 {
3019 mach_o_fat_data_struct *adata = NULL;
3020 struct mach_o_fat_header_external hdr;
3021 unsigned long i;
3022
3023 if (bfd_seek (abfd, 0, SEEK_SET) != 0
3024 || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
3025 goto error;
3026
3027 adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
3028 if (adata == NULL)
3029 goto error;
3030
3031 adata->magic = bfd_getb32 (hdr.magic);
3032 adata->nfat_arch = bfd_getb32 (hdr.nfat_arch);
3033 if (adata->magic != 0xcafebabe)
3034 goto error;
3035 /* Avoid matching Java bytecode files, which have the same magic number.
3036 In the Java bytecode file format this field contains the JVM version,
3037 which starts at 43.0. */
3038 if (adata->nfat_arch > 30)
3039 goto error;
3040
3041 adata->archentries =
3042 bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
3043 if (adata->archentries == NULL)
3044 goto error;
3045
3046 for (i = 0; i < adata->nfat_arch; i++)
3047 {
3048 struct mach_o_fat_arch_external arch;
3049 if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch))
3050 goto error;
3051 adata->archentries[i].cputype = bfd_getb32 (arch.cputype);
3052 adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype);
3053 adata->archentries[i].offset = bfd_getb32 (arch.offset);
3054 adata->archentries[i].size = bfd_getb32 (arch.size);
3055 adata->archentries[i].align = bfd_getb32 (arch.align);
3056 }
3057
3058 abfd->tdata.mach_o_fat_data = adata;
3059 return abfd->xvec;
3060
3061 error:
3062 if (adata != NULL)
3063 bfd_release (abfd, adata);
3064 bfd_set_error (bfd_error_wrong_format);
3065 return NULL;
3066 }
3067
3068 bfd *
3069 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
3070 {
3071 mach_o_fat_data_struct *adata;
3072 mach_o_fat_archentry *entry = NULL;
3073 unsigned long i;
3074 bfd *nbfd;
3075 enum bfd_architecture arch_type;
3076 unsigned long arch_subtype;
3077
3078 adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
3079 BFD_ASSERT (adata != NULL);
3080
3081 /* Find index of previous entry. */
3082 if (prev == NULL)
3083 i = 0; /* Start at first one. */
3084 else
3085 {
3086 for (i = 0; i < adata->nfat_arch; i++)
3087 {
3088 if (adata->archentries[i].offset == prev->origin)
3089 break;
3090 }
3091
3092 if (i == adata->nfat_arch)
3093 {
3094 /* Not found. */
3095 bfd_set_error (bfd_error_bad_value);
3096 return NULL;
3097 }
3098 i++; /* Get next entry. */
3099 }
3100
3101 if (i >= adata->nfat_arch)
3102 {
3103 bfd_set_error (bfd_error_no_more_archived_files);
3104 return NULL;
3105 }
3106
3107 entry = &adata->archentries[i];
3108 nbfd = _bfd_new_bfd_contained_in (archive);
3109 if (nbfd == NULL)
3110 return NULL;
3111
3112 nbfd->origin = entry->offset;
3113
3114 bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
3115 &arch_type, &arch_subtype);
3116 /* Create the member filename.
3117 Use FILENAME:ARCH_NAME. */
3118 {
3119 char *s = NULL;
3120 const char *arch_name;
3121 size_t arch_file_len = strlen (bfd_get_filename (archive));
3122
3123 arch_name = bfd_printable_arch_mach (arch_type, arch_subtype);
3124 s = bfd_malloc (arch_file_len + 1 + strlen (arch_name) + 1);
3125 if (s == NULL)
3126 return NULL;
3127 memcpy (s, bfd_get_filename (archive), arch_file_len);
3128 s[arch_file_len] = ':';
3129 strcpy (s + arch_file_len + 1, arch_name);
3130 nbfd->filename = s;
3131 }
3132 nbfd->iostream = NULL;
3133 bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
3134
3135 return nbfd;
3136 }
3137
3138 /* If ABFD format is FORMAT and architecture is ARCH, return it.
3139 If ABFD is a fat image containing a member that corresponds to FORMAT
3140 and ARCH, returns it.
3141 In other case, returns NULL.
3142 This function allows transparent uses of fat images. */
3143 bfd *
3144 bfd_mach_o_fat_extract (bfd *abfd,
3145 bfd_format format,
3146 const bfd_arch_info_type *arch)
3147 {
3148 bfd *res;
3149 mach_o_fat_data_struct *adata;
3150 unsigned int i;
3151
3152 if (bfd_check_format (abfd, format))
3153 {
3154 if (bfd_get_arch_info (abfd) == arch)
3155 return abfd;
3156 return NULL;
3157 }
3158 if (!bfd_check_format (abfd, bfd_archive)
3159 || abfd->xvec != &mach_o_fat_vec)
3160 return NULL;
3161
3162 /* This is a Mach-O fat image. */
3163 adata = (mach_o_fat_data_struct *) abfd->tdata.mach_o_fat_data;
3164 BFD_ASSERT (adata != NULL);
3165
3166 for (i = 0; i < adata->nfat_arch; i++)
3167 {
3168 struct mach_o_fat_archentry *e = &adata->archentries[i];
3169 enum bfd_architecture cpu_type;
3170 unsigned long cpu_subtype;
3171
3172 bfd_mach_o_convert_architecture (e->cputype, e->cpusubtype,
3173 &cpu_type, &cpu_subtype);
3174 if (cpu_type != arch->arch || cpu_subtype != arch->mach)
3175 continue;
3176
3177 /* The architecture is found. */
3178 res = _bfd_new_bfd_contained_in (abfd);
3179 if (res == NULL)
3180 return NULL;
3181
3182 res->origin = e->offset;
3183
3184 res->filename = strdup (abfd->filename);
3185 res->iostream = NULL;
3186
3187 if (bfd_check_format (res, format))
3188 {
3189 BFD_ASSERT (bfd_get_arch_info (res) == arch);
3190 return res;
3191 }
3192 bfd_close (res);
3193 return NULL;
3194 }
3195
3196 return NULL;
3197 }
3198
3199 int
3200 bfd_mach_o_lookup_section (bfd *abfd,
3201 asection *section,
3202 bfd_mach_o_load_command **mcommand,
3203 bfd_mach_o_section **msection)
3204 {
3205 struct mach_o_data_struct *md = bfd_mach_o_get_data (abfd);
3206 unsigned int i, j, num;
3207
3208 bfd_mach_o_load_command *ncmd = NULL;
3209 bfd_mach_o_section *nsect = NULL;
3210
3211 BFD_ASSERT (mcommand != NULL);
3212 BFD_ASSERT (msection != NULL);
3213
3214 num = 0;
3215 for (i = 0; i < md->header.ncmds; i++)
3216 {
3217 struct bfd_mach_o_load_command *cmd = &md->commands[i];
3218 struct bfd_mach_o_segment_command *seg = NULL;
3219
3220 if (cmd->type != BFD_MACH_O_LC_SEGMENT
3221 || cmd->type != BFD_MACH_O_LC_SEGMENT_64)
3222 continue;
3223 seg = &cmd->command.segment;
3224
3225 for (j = 0; j < seg->nsects; j++)
3226 {
3227 struct bfd_mach_o_section *sect = &seg->sections[j];
3228
3229 if (sect->bfdsection == section)
3230 {
3231 if (num == 0)
3232 {
3233 nsect = sect;
3234 ncmd = cmd;
3235 }
3236 num++;
3237 }
3238 }
3239 }
3240
3241 *mcommand = ncmd;
3242 *msection = nsect;
3243 return num;
3244 }
3245
3246 int
3247 bfd_mach_o_lookup_command (bfd *abfd,
3248 bfd_mach_o_load_command_type type,
3249 bfd_mach_o_load_command **mcommand)
3250 {
3251 struct mach_o_data_struct *md = bfd_mach_o_get_data (abfd);
3252 bfd_mach_o_load_command *ncmd = NULL;
3253 unsigned int i, num;
3254
3255 BFD_ASSERT (md != NULL);
3256 BFD_ASSERT (mcommand != NULL);
3257
3258 num = 0;
3259 for (i = 0; i < md->header.ncmds; i++)
3260 {
3261 struct bfd_mach_o_load_command *cmd = &md->commands[i];
3262
3263 if (cmd->type != type)
3264 continue;
3265
3266 if (num == 0)
3267 ncmd = cmd;
3268 num++;
3269 }
3270
3271 *mcommand = ncmd;
3272 return num;
3273 }
3274
3275 unsigned long
3276 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
3277 {
3278 switch (type)
3279 {
3280 case BFD_MACH_O_CPU_TYPE_MC680x0:
3281 return 0x04000000;
3282 case BFD_MACH_O_CPU_TYPE_MC88000:
3283 return 0xffffe000;
3284 case BFD_MACH_O_CPU_TYPE_POWERPC:
3285 return 0xc0000000;
3286 case BFD_MACH_O_CPU_TYPE_I386:
3287 return 0xc0000000;
3288 case BFD_MACH_O_CPU_TYPE_SPARC:
3289 return 0xf0000000;
3290 case BFD_MACH_O_CPU_TYPE_I860:
3291 return 0;
3292 case BFD_MACH_O_CPU_TYPE_HPPA:
3293 return 0xc0000000 - 0x04000000;
3294 default:
3295 return 0;
3296 }
3297 }
3298
3299 typedef struct bfd_mach_o_xlat_name
3300 {
3301 const char *name;
3302 unsigned long val;
3303 }
3304 bfd_mach_o_xlat_name;
3305
3306 static void
3307 bfd_mach_o_print_flags (const bfd_mach_o_xlat_name *table,
3308 unsigned long val,
3309 FILE *file)
3310 {
3311 int first = 1;
3312
3313 for (; table->name; table++)
3314 {
3315 if (table->val & val)
3316 {
3317 if (!first)
3318 fprintf (file, "+");
3319 fprintf (file, "%s", table->name);
3320 val &= ~table->val;
3321 first = 0;
3322 }
3323 }
3324 if (val)
3325 {
3326 if (!first)
3327 fprintf (file, "+");
3328 fprintf (file, "0x%lx", val);
3329 return;
3330 }
3331 if (first)
3332 fprintf (file, "-");
3333 }
3334
3335 static const char *
3336 bfd_mach_o_get_name_or_null (const bfd_mach_o_xlat_name *table,
3337 unsigned long val)
3338 {
3339 for (; table->name; table++)
3340 if (table->val == val)
3341 return table->name;
3342 return NULL;
3343 }
3344
3345 static const char *
3346 bfd_mach_o_get_name (const bfd_mach_o_xlat_name *table, unsigned long val)
3347 {
3348 const char *res = bfd_mach_o_get_name_or_null (table, val);
3349
3350 if (res == NULL)
3351 return "*UNKNOWN*";
3352 else
3353 return res;
3354 }
3355
3356 static bfd_mach_o_xlat_name bfd_mach_o_cpu_name[] =
3357 {
3358 { "vax", BFD_MACH_O_CPU_TYPE_VAX },
3359 { "mc680x0", BFD_MACH_O_CPU_TYPE_MC680x0 },
3360 { "i386", BFD_MACH_O_CPU_TYPE_I386 },
3361 { "mips", BFD_MACH_O_CPU_TYPE_MIPS },
3362 { "mc98000", BFD_MACH_O_CPU_TYPE_MC98000 },
3363 { "hppa", BFD_MACH_O_CPU_TYPE_HPPA },
3364 { "arm", BFD_MACH_O_CPU_TYPE_ARM },
3365 { "mc88000", BFD_MACH_O_CPU_TYPE_MC88000 },
3366 { "sparc", BFD_MACH_O_CPU_TYPE_SPARC },
3367 { "i860", BFD_MACH_O_CPU_TYPE_I860 },
3368 { "alpha", BFD_MACH_O_CPU_TYPE_ALPHA },
3369 { "powerpc", BFD_MACH_O_CPU_TYPE_POWERPC },
3370 { "powerpc_64", BFD_MACH_O_CPU_TYPE_POWERPC_64 },
3371 { "x86_64", BFD_MACH_O_CPU_TYPE_X86_64 },
3372 { NULL, 0}
3373 };
3374
3375 static bfd_mach_o_xlat_name bfd_mach_o_filetype_name[] =
3376 {
3377 { "object", BFD_MACH_O_MH_OBJECT },
3378 { "execute", BFD_MACH_O_MH_EXECUTE },
3379 { "fvmlib", BFD_MACH_O_MH_FVMLIB },
3380 { "core", BFD_MACH_O_MH_CORE },
3381 { "preload", BFD_MACH_O_MH_PRELOAD },
3382 { "dylib", BFD_MACH_O_MH_DYLIB },
3383 { "dylinker", BFD_MACH_O_MH_DYLINKER },
3384 { "bundle", BFD_MACH_O_MH_BUNDLE },
3385 { "dylib_stub", BFD_MACH_O_MH_DYLIB_STUB },
3386 { "dym", BFD_MACH_O_MH_DSYM },
3387 { "kext_bundle", BFD_MACH_O_MH_KEXT_BUNDLE },
3388 { NULL, 0}
3389 };
3390
3391 static bfd_mach_o_xlat_name bfd_mach_o_header_flags_name[] =
3392 {
3393 { "noundefs", BFD_MACH_O_MH_NOUNDEFS },
3394 { "incrlink", BFD_MACH_O_MH_INCRLINK },
3395 { "dyldlink", BFD_MACH_O_MH_DYLDLINK },
3396 { "bindatload", BFD_MACH_O_MH_BINDATLOAD },
3397 { "prebound", BFD_MACH_O_MH_PREBOUND },
3398 { "split_segs", BFD_MACH_O_MH_SPLIT_SEGS },
3399 { "lazy_init", BFD_MACH_O_MH_LAZY_INIT },
3400 { "twolevel", BFD_MACH_O_MH_TWOLEVEL },
3401 { "force_flat", BFD_MACH_O_MH_FORCE_FLAT },
3402 { "nomultidefs", BFD_MACH_O_MH_NOMULTIDEFS },
3403 { "nofixprebinding", BFD_MACH_O_MH_NOFIXPREBINDING },
3404 { "prebindable", BFD_MACH_O_MH_PREBINDABLE },
3405 { "allmodsbound", BFD_MACH_O_MH_ALLMODSBOUND },
3406 { "subsections_via_symbols", BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS },
3407 { "canonical", BFD_MACH_O_MH_CANONICAL },
3408 { "weak_defines", BFD_MACH_O_MH_WEAK_DEFINES },
3409 { "binds_to_weak", BFD_MACH_O_MH_BINDS_TO_WEAK },
3410 { "allow_stack_execution", BFD_MACH_O_MH_ALLOW_STACK_EXECUTION },
3411 { "root_safe", BFD_MACH_O_MH_ROOT_SAFE },
3412 { "setuid_safe", BFD_MACH_O_MH_SETUID_SAFE },
3413 { "no_reexported_dylibs", BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS },
3414 { "pie", BFD_MACH_O_MH_PIE },
3415 { NULL, 0}
3416 };
3417
3418 static bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
3419 {
3420 { "regular", BFD_MACH_O_S_REGULAR},
3421 { "zerofill", BFD_MACH_O_S_ZEROFILL},
3422 { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS},
3423 { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
3424 { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
3425 { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
3426 { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
3427 { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
3428 { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
3429 { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
3430 { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
3431 { "coalesced", BFD_MACH_O_S_COALESCED},
3432 { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL},
3433 { "interposing", BFD_MACH_O_S_INTERPOSING},
3434 { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
3435 { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
3436 { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
3437 { NULL, 0}
3438 };
3439
3440 static bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] =
3441 {
3442 { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC },
3443 { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC },
3444 { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS },
3445 { "debug", BFD_MACH_O_S_ATTR_DEBUG },
3446 { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
3447 { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT },
3448 { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP },
3449 { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS },
3450 { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC },
3451 { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS },
3452 { NULL, 0}
3453 };
3454
3455 static bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
3456 {
3457 { "segment", BFD_MACH_O_LC_SEGMENT},
3458 { "symtab", BFD_MACH_O_LC_SYMTAB},
3459 { "symseg", BFD_MACH_O_LC_SYMSEG},
3460 { "thread", BFD_MACH_O_LC_THREAD},
3461 { "unixthread", BFD_MACH_O_LC_UNIXTHREAD},
3462 { "loadfvmlib", BFD_MACH_O_LC_LOADFVMLIB},
3463 { "idfvmlib", BFD_MACH_O_LC_IDFVMLIB},
3464 { "ident", BFD_MACH_O_LC_IDENT},
3465 { "fvmfile", BFD_MACH_O_LC_FVMFILE},
3466 { "prepage", BFD_MACH_O_LC_PREPAGE},
3467 { "dysymtab", BFD_MACH_O_LC_DYSYMTAB},
3468 { "load_dylib", BFD_MACH_O_LC_LOAD_DYLIB},
3469 { "id_dylib", BFD_MACH_O_LC_ID_DYLIB},
3470 { "load_dylinker", BFD_MACH_O_LC_LOAD_DYLINKER},
3471 { "id_dylinker", BFD_MACH_O_LC_ID_DYLINKER},
3472 { "prebound_dylib", BFD_MACH_O_LC_PREBOUND_DYLIB},
3473 { "routines", BFD_MACH_O_LC_ROUTINES},
3474 { "sub_framework", BFD_MACH_O_LC_SUB_FRAMEWORK},
3475 { "sub_umbrella", BFD_MACH_O_LC_SUB_UMBRELLA},
3476 { "sub_client", BFD_MACH_O_LC_SUB_CLIENT},
3477 { "sub_library", BFD_MACH_O_LC_SUB_LIBRARY},
3478 { "twolevel_hints", BFD_MACH_O_LC_TWOLEVEL_HINTS},
3479 { "prebind_cksum", BFD_MACH_O_LC_PREBIND_CKSUM},
3480 { "load_weak_dylib", BFD_MACH_O_LC_LOAD_WEAK_DYLIB},
3481 { "segment_64", BFD_MACH_O_LC_SEGMENT_64},
3482 { "routines_64", BFD_MACH_O_LC_ROUTINES_64},
3483 { "uuid", BFD_MACH_O_LC_UUID},
3484 { "rpath", BFD_MACH_O_LC_RPATH},
3485 { "code_signature", BFD_MACH_O_LC_CODE_SIGNATURE},
3486 { "segment_split_info", BFD_MACH_O_LC_SEGMENT_SPLIT_INFO},
3487 { "reexport_dylib", BFD_MACH_O_LC_REEXPORT_DYLIB},
3488 { "lazy_load_dylib", BFD_MACH_O_LC_LAZY_LOAD_DYLIB},
3489 { "encryption_info", BFD_MACH_O_LC_ENCRYPTION_INFO},
3490 { "dyld_info", BFD_MACH_O_LC_DYLD_INFO},
3491 { "load_upward_lib", BFD_MACH_O_LC_LOAD_UPWARD_DYLIB},
3492 { "version_min_macosx", BFD_MACH_O_LC_VERSION_MIN_MACOSX},
3493 { "version_min_iphoneos", BFD_MACH_O_LC_VERSION_MIN_IPHONEOS},
3494 { "function_starts", BFD_MACH_O_LC_FUNCTION_STARTS},
3495 { "dyld_environment", BFD_MACH_O_LC_DYLD_ENVIRONMENT},
3496 { NULL, 0}
3497 };
3498
3499 /* Get the section type from NAME. Return -1 if NAME is unknown. */
3500
3501 unsigned int
3502 bfd_mach_o_get_section_type_from_name (const char *name)
3503 {
3504 bfd_mach_o_xlat_name *x;
3505
3506 for (x = bfd_mach_o_section_type_name; x->name; x++)
3507 if (strcmp (x->name, name) == 0)
3508 return x->val;
3509 return (unsigned int)-1;
3510 }
3511
3512 /* Get the section attribute from NAME. Return -1 if NAME is unknown. */
3513
3514 unsigned int
3515 bfd_mach_o_get_section_attribute_from_name (const char *name)
3516 {
3517 bfd_mach_o_xlat_name *x;
3518
3519 for (x = bfd_mach_o_section_attribute_name; x->name; x++)
3520 if (strcmp (x->name, name) == 0)
3521 return x->val;
3522 return (unsigned int)-1;
3523 }
3524
3525 static void
3526 bfd_mach_o_print_private_header (bfd *abfd, FILE *file)
3527 {
3528 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3529 bfd_mach_o_header *h = &mdata->header;
3530
3531 fputs (_("Mach-O header:\n"), file);
3532 fprintf (file, _(" magic : %08lx\n"), h->magic);
3533 fprintf (file, _(" cputype : %08lx (%s)\n"), h->cputype,
3534 bfd_mach_o_get_name (bfd_mach_o_cpu_name, h->cputype));
3535 fprintf (file, _(" cpusubtype: %08lx\n"), h->cpusubtype);
3536 fprintf (file, _(" filetype : %08lx (%s)\n"),
3537 h->filetype,
3538 bfd_mach_o_get_name (bfd_mach_o_filetype_name, h->filetype));
3539 fprintf (file, _(" ncmds : %08lx (%lu)\n"), h->ncmds, h->ncmds);
3540 fprintf (file, _(" sizeofcmds: %08lx\n"), h->sizeofcmds);
3541 fprintf (file, _(" flags : %08lx ("), h->flags);
3542 bfd_mach_o_print_flags (bfd_mach_o_header_flags_name, h->flags, file);
3543 fputs (_(")\n"), file);
3544 fprintf (file, _(" reserved : %08x\n"), h->reserved);
3545 }
3546
3547 static void
3548 bfd_mach_o_print_section_map (bfd *abfd, FILE *file)
3549 {
3550 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3551 unsigned int i, j;
3552 unsigned int sec_nbr = 0;
3553
3554 fputs (_("Segments and Sections:\n"), file);
3555 fputs (_(" #: Segment name Section name Address\n"), file);
3556
3557 for (i = 0; i < mdata->header.ncmds; i++)
3558 {
3559 bfd_mach_o_segment_command *seg;
3560
3561 if (mdata->commands[i].type != BFD_MACH_O_LC_SEGMENT
3562 && mdata->commands[i].type != BFD_MACH_O_LC_SEGMENT_64)
3563 continue;
3564
3565 seg = &mdata->commands[i].command.segment;
3566
3567 fprintf (file, "[Segment %-16s ", seg->segname);
3568 fprintf_vma (file, seg->vmaddr);
3569 fprintf (file, "-");
3570 fprintf_vma (file, seg->vmaddr + seg->vmsize - 1);
3571 fputc (' ', file);
3572 fputc (seg->initprot & BFD_MACH_O_PROT_READ ? 'r' : '-', file);
3573 fputc (seg->initprot & BFD_MACH_O_PROT_WRITE ? 'w' : '-', file);
3574 fputc (seg->initprot & BFD_MACH_O_PROT_EXECUTE ? 'x' : '-', file);
3575 fprintf (file, "]\n");
3576 for (j = 0; j < seg->nsects; j++)
3577 {
3578 bfd_mach_o_section *sec = &seg->sections[j];
3579 fprintf (file, "%02u: %-16s %-16s ", ++sec_nbr,
3580 sec->segname, sec->sectname);
3581 fprintf_vma (file, sec->addr);
3582 fprintf (file, " ");
3583 fprintf_vma (file, sec->size);
3584 fprintf (file, " %08lx\n", sec->flags);
3585 }
3586 }
3587 }
3588
3589 static void
3590 bfd_mach_o_print_section (bfd *abfd ATTRIBUTE_UNUSED,
3591 bfd_mach_o_section *sec, FILE *file)
3592 {
3593 fprintf (file, " Section: %-16s %-16s (bfdname: %s)\n",
3594 sec->sectname, sec->segname, sec->bfdsection->name);
3595 fprintf (file, " addr: ");
3596 fprintf_vma (file, sec->addr);
3597 fprintf (file, " size: ");
3598 fprintf_vma (file, sec->size);
3599 fprintf (file, " offset: ");
3600 fprintf_vma (file, sec->offset);
3601 fprintf (file, "\n");
3602 fprintf (file, " align: %ld", sec->align);
3603 fprintf (file, " nreloc: %lu reloff: ", sec->nreloc);
3604 fprintf_vma (file, sec->reloff);
3605 fprintf (file, "\n");
3606 fprintf (file, " flags: %08lx (type: %s", sec->flags,
3607 bfd_mach_o_get_name (bfd_mach_o_section_type_name,
3608 sec->flags & BFD_MACH_O_SECTION_TYPE_MASK));
3609 fprintf (file, " attr: ");
3610 bfd_mach_o_print_flags (bfd_mach_o_section_attribute_name,
3611 sec->flags & BFD_MACH_O_SECTION_ATTRIBUTES_MASK,
3612 file);
3613 fprintf (file, ")\n");
3614 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3615 {
3616 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
3617 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
3618 case BFD_MACH_O_S_SYMBOL_STUBS:
3619 fprintf (file, " first indirect sym: %lu", sec->reserved1);
3620 fprintf (file, " (%u entries)",
3621 bfd_mach_o_section_get_nbr_indirect (abfd, sec));
3622 break;
3623 default:
3624 fprintf (file, " reserved1: 0x%lx", sec->reserved1);
3625 break;
3626 }
3627 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3628 {
3629 case BFD_MACH_O_S_SYMBOL_STUBS:
3630 fprintf (file, " stub size: %lu", sec->reserved2);
3631 break;
3632 default:
3633 fprintf (file, " reserved2: 0x%lx", sec->reserved2);
3634 break;
3635 }
3636 fprintf (file, " reserved3: 0x%lx\n", sec->reserved3);
3637 }
3638
3639 static void
3640 bfd_mach_o_print_segment (bfd *abfd ATTRIBUTE_UNUSED,
3641 bfd_mach_o_load_command *cmd, FILE *file)
3642 {
3643 bfd_mach_o_segment_command *seg = &cmd->command.segment;
3644 unsigned int i;
3645
3646 fprintf (file, " name: %s\n", *seg->segname ? seg->segname : "*none*");
3647 fprintf (file, " vmaddr: ");
3648 fprintf_vma (file, seg->vmaddr);
3649 fprintf (file, " vmsize: ");
3650 fprintf_vma (file, seg->vmsize);
3651 fprintf (file, "\n");
3652 fprintf (file, " fileoff: ");
3653 fprintf_vma (file, seg->fileoff);
3654 fprintf (file, " filesize: ");
3655 fprintf_vma (file, (bfd_vma)seg->filesize);
3656 fprintf (file, " endoff: ");
3657 fprintf_vma (file, (bfd_vma)(seg->fileoff + seg->filesize));
3658 fprintf (file, "\n");
3659 fprintf (file, " nsects: %lu ", seg->nsects);
3660 fprintf (file, " flags: %lx\n", seg->flags);
3661 for (i = 0; i < seg->nsects; i++)
3662 bfd_mach_o_print_section (abfd, &seg->sections[i], file);
3663 }
3664
3665 static void
3666 bfd_mach_o_print_dysymtab (bfd *abfd ATTRIBUTE_UNUSED,
3667 bfd_mach_o_load_command *cmd, FILE *file)
3668 {
3669 bfd_mach_o_dysymtab_command *dysymtab = &cmd->command.dysymtab;
3670 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3671 unsigned int i;
3672
3673 fprintf (file, " local symbols: idx: %10lu num: %-8lu",
3674 dysymtab->ilocalsym, dysymtab->nlocalsym);
3675 fprintf (file, " (nxtidx: %lu)\n",
3676 dysymtab->ilocalsym + dysymtab->nlocalsym);
3677 fprintf (file, " external symbols: idx: %10lu num: %-8lu",
3678 dysymtab->iextdefsym, dysymtab->nextdefsym);
3679 fprintf (file, " (nxtidx: %lu)\n",
3680 dysymtab->iextdefsym + dysymtab->nextdefsym);
3681 fprintf (file, " undefined symbols: idx: %10lu num: %-8lu",
3682 dysymtab->iundefsym, dysymtab->nundefsym);
3683 fprintf (file, " (nxtidx: %lu)\n",
3684 dysymtab->iundefsym + dysymtab->nundefsym);
3685 fprintf (file, " table of content: off: 0x%08lx num: %-8lu",
3686 dysymtab->tocoff, dysymtab->ntoc);
3687 fprintf (file, " (endoff: 0x%08lx)\n",
3688 dysymtab->tocoff
3689 + dysymtab->ntoc * BFD_MACH_O_TABLE_OF_CONTENT_SIZE);
3690 fprintf (file, " module table: off: 0x%08lx num: %-8lu",
3691 dysymtab->modtaboff, dysymtab->nmodtab);
3692 fprintf (file, " (endoff: 0x%08lx)\n",
3693 dysymtab->modtaboff + dysymtab->nmodtab
3694 * (mach_o_wide_p (&mdata->header) ?
3695 BFD_MACH_O_DYLIB_MODULE_64_SIZE : BFD_MACH_O_DYLIB_MODULE_SIZE));
3696 fprintf (file, " external reference table: off: 0x%08lx num: %-8lu",
3697 dysymtab->extrefsymoff, dysymtab->nextrefsyms);
3698 fprintf (file, " (endoff: 0x%08lx)\n",
3699 dysymtab->extrefsymoff
3700 + dysymtab->nextrefsyms * BFD_MACH_O_REFERENCE_SIZE);
3701 fprintf (file, " indirect symbol table: off: 0x%08lx num: %-8lu",
3702 dysymtab->indirectsymoff, dysymtab->nindirectsyms);
3703 fprintf (file, " (endoff: 0x%08lx)\n",
3704 dysymtab->indirectsymoff
3705 + dysymtab->nindirectsyms * BFD_MACH_O_INDIRECT_SYMBOL_SIZE);
3706 fprintf (file, " external relocation table: off: 0x%08lx num: %-8lu",
3707 dysymtab->extreloff, dysymtab->nextrel);
3708 fprintf (file, " (endoff: 0x%08lx)\n",
3709 dysymtab->extreloff + dysymtab->nextrel * BFD_MACH_O_RELENT_SIZE);
3710 fprintf (file, " local relocation table: off: 0x%08lx num: %-8lu",
3711 dysymtab->locreloff, dysymtab->nlocrel);
3712 fprintf (file, " (endoff: 0x%08lx)\n",
3713 dysymtab->locreloff + dysymtab->nlocrel * BFD_MACH_O_RELENT_SIZE);
3714
3715 if (dysymtab->ntoc > 0
3716 || dysymtab->nindirectsyms > 0
3717 || dysymtab->nextrefsyms > 0)
3718 {
3719 /* Try to read the symbols to display the toc or indirect symbols. */
3720 bfd_mach_o_read_symtab_symbols (abfd);
3721 }
3722 else if (dysymtab->nmodtab > 0)
3723 {
3724 /* Try to read the strtab to display modules name. */
3725 bfd_mach_o_read_symtab_strtab (abfd);
3726 }
3727
3728 for (i = 0; i < dysymtab->nmodtab; i++)
3729 {
3730 bfd_mach_o_dylib_module *module = &dysymtab->dylib_module[i];
3731 fprintf (file, " module %u:\n", i);
3732 fprintf (file, " name: %lu", module->module_name_idx);
3733 if (mdata->symtab && mdata->symtab->strtab)
3734 fprintf (file, ": %s",
3735 mdata->symtab->strtab + module->module_name_idx);
3736 fprintf (file, "\n");
3737 fprintf (file, " extdefsym: idx: %8lu num: %lu\n",
3738 module->iextdefsym, module->nextdefsym);
3739 fprintf (file, " refsym: idx: %8lu num: %lu\n",
3740 module->irefsym, module->nrefsym);
3741 fprintf (file, " localsym: idx: %8lu num: %lu\n",
3742 module->ilocalsym, module->nlocalsym);
3743 fprintf (file, " extrel: idx: %8lu num: %lu\n",
3744 module->iextrel, module->nextrel);
3745 fprintf (file, " init: idx: %8u num: %u\n",
3746 module->iinit, module->ninit);
3747 fprintf (file, " term: idx: %8u num: %u\n",
3748 module->iterm, module->nterm);
3749 fprintf (file, " objc_module_info: addr: ");
3750 fprintf_vma (file, module->objc_module_info_addr);
3751 fprintf (file, " size: %lu\n", module->objc_module_info_size);
3752 }
3753
3754 if (dysymtab->ntoc > 0)
3755 {
3756 bfd_mach_o_symtab_command *symtab = mdata->symtab;
3757
3758 fprintf (file, " table of content: (symbol/module)\n");
3759 for (i = 0; i < dysymtab->ntoc; i++)
3760 {
3761 bfd_mach_o_dylib_table_of_content *toc = &dysymtab->dylib_toc[i];
3762
3763 fprintf (file, " %4u: ", i);
3764 if (symtab && symtab->symbols && toc->symbol_index < symtab->nsyms)
3765 {
3766 const char *name = symtab->symbols[toc->symbol_index].symbol.name;
3767 fprintf (file, "%s (%lu)", name ? name : "*invalid*",
3768 toc->symbol_index);
3769 }
3770 else
3771 fprintf (file, "%lu", toc->symbol_index);
3772
3773 fprintf (file, " / ");
3774 if (symtab && symtab->strtab
3775 && toc->module_index < dysymtab->nmodtab)
3776 {
3777 bfd_mach_o_dylib_module *mod;
3778 mod = &dysymtab->dylib_module[toc->module_index];
3779 fprintf (file, "%s (%lu)",
3780 symtab->strtab + mod->module_name_idx,
3781 toc->module_index);
3782 }
3783 else
3784 fprintf (file, "%lu", toc->module_index);
3785
3786 fprintf (file, "\n");
3787 }
3788 }
3789
3790 if (dysymtab->nindirectsyms != 0)
3791 {
3792 fprintf (file, " indirect symbols:\n");
3793
3794 for (i = 0; i < mdata->nsects; i++)
3795 {
3796 bfd_mach_o_section *sec = mdata->sections[i];
3797 unsigned int j, first, last;
3798 bfd_mach_o_symtab_command *symtab = mdata->symtab;
3799 bfd_vma addr;
3800 bfd_vma entry_size;
3801
3802 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3803 {
3804 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
3805 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
3806 case BFD_MACH_O_S_SYMBOL_STUBS:
3807 first = sec->reserved1;
3808 last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
3809 addr = sec->addr;
3810 entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
3811 fprintf (file, " for section %s.%s:\n",
3812 sec->segname, sec->sectname);
3813 for (j = first; j < last; j++)
3814 {
3815 unsigned int isym = dysymtab->indirect_syms[j];
3816
3817 fprintf (file, " ");
3818 fprintf_vma (file, addr);
3819 fprintf (file, " %5u: 0x%08x", j, isym);
3820 if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL)
3821 fprintf (file, " LOCAL");
3822 if (isym & BFD_MACH_O_INDIRECT_SYMBOL_ABS)
3823 fprintf (file, " ABSOLUTE");
3824 if (symtab && symtab->symbols
3825 && isym < symtab->nsyms
3826 && symtab->symbols[isym].symbol.name)
3827 fprintf (file, " %s", symtab->symbols[isym].symbol.name);
3828 fprintf (file, "\n");
3829 addr += entry_size;
3830 }
3831 break;
3832 default:
3833 break;
3834 }
3835 }
3836 }
3837 if (dysymtab->nextrefsyms > 0)
3838 {
3839 bfd_mach_o_symtab_command *symtab = mdata->symtab;
3840
3841 fprintf (file, " external reference table: (symbol flags)\n");
3842 for (i = 0; i < dysymtab->nextrefsyms; i++)
3843 {
3844 bfd_mach_o_dylib_reference *ref = &dysymtab->ext_refs[i];
3845
3846 fprintf (file, " %4u: %5lu 0x%02lx", i, ref->isym, ref->flags);
3847 if (symtab && symtab->symbols
3848 && ref->isym < symtab->nsyms
3849 && symtab->symbols[ref->isym].symbol.name)
3850 fprintf (file, " %s", symtab->symbols[ref->isym].symbol.name);
3851 fprintf (file, "\n");
3852 }
3853 }
3854
3855 }
3856
3857 static void
3858 bfd_mach_o_print_dyld_info (bfd *abfd ATTRIBUTE_UNUSED,
3859 bfd_mach_o_load_command *cmd, FILE *file)
3860 {
3861 bfd_mach_o_dyld_info_command *info = &cmd->command.dyld_info;
3862
3863 fprintf (file, " rebase: off: 0x%08x size: %-8u\n",
3864 info->rebase_off, info->rebase_size);
3865 fprintf (file, " bind: off: 0x%08x size: %-8u\n",
3866 info->bind_off, info->bind_size);
3867 fprintf (file, " weak bind: off: 0x%08x size: %-8u\n",
3868 info->weak_bind_off, info->weak_bind_size);
3869 fprintf (file, " lazy bind: off: 0x%08x size: %-8u\n",
3870 info->lazy_bind_off, info->lazy_bind_size);
3871 fprintf (file, " export: off: 0x%08x size: %-8u\n",
3872 info->export_off, info->export_size);
3873 }
3874
3875 bfd_boolean
3876 bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, void * ptr)
3877 {
3878 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3879 FILE *file = (FILE *) ptr;
3880 unsigned int i;
3881
3882 bfd_mach_o_print_private_header (abfd, file);
3883 fputc ('\n', file);
3884
3885 for (i = 0; i < mdata->header.ncmds; i++)
3886 {
3887 bfd_mach_o_load_command *cmd = &mdata->commands[i];
3888 const char *cmd_name;
3889
3890 cmd_name = bfd_mach_o_get_name_or_null
3891 (bfd_mach_o_load_command_name, cmd->type);
3892 fprintf (file, "Load command ");
3893 if (cmd_name == NULL)
3894 fprintf (file, "0x%02x:", cmd->type);
3895 else
3896 fprintf (file, "%s:", cmd_name);
3897
3898 switch (cmd->type)
3899 {
3900 case BFD_MACH_O_LC_SEGMENT:
3901 case BFD_MACH_O_LC_SEGMENT_64:
3902 bfd_mach_o_print_segment (abfd, cmd, file);
3903 break;
3904 case BFD_MACH_O_LC_UUID:
3905 {
3906 bfd_mach_o_uuid_command *uuid = &cmd->command.uuid;
3907 unsigned int j;
3908
3909 for (j = 0; j < sizeof (uuid->uuid); j ++)
3910 fprintf (file, " %02x", uuid->uuid[j]);
3911 fputc ('\n', file);
3912 }
3913 break;
3914 case BFD_MACH_O_LC_LOAD_DYLIB:
3915 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
3916 case BFD_MACH_O_LC_REEXPORT_DYLIB:
3917 case BFD_MACH_O_LC_ID_DYLIB:
3918 {
3919 bfd_mach_o_dylib_command *dylib = &cmd->command.dylib;
3920 fprintf (file, " %s\n", dylib->name_str);
3921 fprintf (file, " time stamp: 0x%08lx\n",
3922 dylib->timestamp);
3923 fprintf (file, " current version: 0x%08lx\n",
3924 dylib->current_version);
3925 fprintf (file, " comptibility version: 0x%08lx\n",
3926 dylib->compatibility_version);
3927 break;
3928 }
3929 case BFD_MACH_O_LC_LOAD_DYLINKER:
3930 case BFD_MACH_O_LC_ID_DYLINKER:
3931 fprintf (file, " %s\n", cmd->command.dylinker.name_str);
3932 break;
3933 case BFD_MACH_O_LC_SYMTAB:
3934 {
3935 bfd_mach_o_symtab_command *symtab = &cmd->command.symtab;
3936 fprintf (file,
3937 "\n"
3938 " symoff: 0x%08x nsyms: %8u (endoff: 0x%08x)\n",
3939 symtab->symoff, symtab->nsyms,
3940 symtab->symoff + symtab->nsyms
3941 * (mach_o_wide_p (&mdata->header)
3942 ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE));
3943 fprintf (file,
3944 " stroff: 0x%08x strsize: %8u (endoff: 0x%08x)\n",
3945 symtab->stroff, symtab->strsize,
3946 symtab->stroff + symtab->strsize);
3947 break;
3948 }
3949 case BFD_MACH_O_LC_DYSYMTAB:
3950 fprintf (file, "\n");
3951 bfd_mach_o_print_dysymtab (abfd, cmd, file);
3952 break;
3953 case BFD_MACH_O_LC_CODE_SIGNATURE:
3954 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
3955 case BFD_MACH_O_LC_FUNCTION_STARTS:
3956 {
3957 bfd_mach_o_linkedit_command *linkedit = &cmd->command.linkedit;
3958 fprintf
3959 (file, "\n"
3960 " dataoff: 0x%08lx datasize: 0x%08lx (endoff: 0x%08lx)\n",
3961 linkedit->dataoff, linkedit->datasize,
3962 linkedit->dataoff + linkedit->datasize);
3963 break;
3964 }
3965 case BFD_MACH_O_LC_SUB_FRAMEWORK:
3966 case BFD_MACH_O_LC_SUB_UMBRELLA:
3967 case BFD_MACH_O_LC_SUB_LIBRARY:
3968 case BFD_MACH_O_LC_SUB_CLIENT:
3969 case BFD_MACH_O_LC_RPATH:
3970 {
3971 bfd_mach_o_str_command *str = &cmd->command.str;
3972 fprintf (file, " %s\n", str->str);
3973 break;
3974 }
3975 case BFD_MACH_O_LC_THREAD:
3976 case BFD_MACH_O_LC_UNIXTHREAD:
3977 {
3978 bfd_mach_o_thread_command *thread = &cmd->command.thread;
3979 unsigned int j;
3980 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
3981
3982 fprintf (file, " nflavours: %lu\n", thread->nflavours);
3983 for (j = 0; j < thread->nflavours; j++)
3984 {
3985 bfd_mach_o_thread_flavour *flavour = &thread->flavours[j];
3986
3987 fprintf (file, " %2u: flavour: 0x%08lx offset: 0x%08lx"
3988 " size: 0x%08lx\n",
3989 j, flavour->flavour, flavour->offset,
3990 flavour->size);
3991 if (bed->_bfd_mach_o_print_thread)
3992 {
3993 char *buf = bfd_malloc (flavour->size);
3994
3995 if (buf
3996 && bfd_seek (abfd, flavour->offset, SEEK_SET) == 0
3997 && (bfd_bread (buf, flavour->size, abfd)
3998 == flavour->size))
3999 (*bed->_bfd_mach_o_print_thread)(abfd, flavour,
4000 file, buf);
4001 free (buf);
4002 }
4003 }
4004 break;
4005 }
4006 case BFD_MACH_O_LC_DYLD_INFO:
4007 fprintf (file, "\n");
4008 bfd_mach_o_print_dyld_info (abfd, cmd, file);
4009 break;
4010 case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
4011 case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
4012 {
4013 bfd_mach_o_version_min_command *ver = &cmd->command.version_min;
4014
4015 fprintf (file, " %u.%u.%u\n", ver->rel, ver->maj, ver->min);
4016 }
4017 break;
4018 default:
4019 fprintf (file, "\n");
4020 fprintf (file, " offset: 0x%08lx\n", (unsigned long)cmd->offset);
4021 fprintf (file, " size: 0x%08lx\n", (unsigned long)cmd->len);
4022 break;
4023 }
4024 fputc ('\n', file);
4025 }
4026
4027 bfd_mach_o_print_section_map (abfd, file);
4028
4029 return TRUE;
4030 }
4031
4032 int
4033 bfd_mach_o_core_fetch_environment (bfd *abfd,
4034 unsigned char **rbuf,
4035 unsigned int *rlen)
4036 {
4037 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4038 unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
4039 unsigned int i = 0;
4040
4041 for (i = 0; i < mdata->header.ncmds; i++)
4042 {
4043 bfd_mach_o_load_command *cur = &mdata->commands[i];
4044 bfd_mach_o_segment_command *seg = NULL;
4045
4046 if (cur->type != BFD_MACH_O_LC_SEGMENT)
4047 continue;
4048
4049 seg = &cur->command.segment;
4050
4051 if ((seg->vmaddr + seg->vmsize) == stackaddr)
4052 {
4053 unsigned long start = seg->fileoff;
4054 unsigned long end = seg->fileoff + seg->filesize;
4055 unsigned char *buf = bfd_malloc (1024);
4056 unsigned long size = 1024;
4057
4058 for (;;)
4059 {
4060 bfd_size_type nread = 0;
4061 unsigned long offset;
4062 int found_nonnull = 0;
4063
4064 if (size > (end - start))
4065 size = (end - start);
4066
4067 buf = bfd_realloc_or_free (buf, size);
4068 if (buf == NULL)
4069 return -1;
4070
4071 if (bfd_seek (abfd, end - size, SEEK_SET) != 0)
4072 {
4073 free (buf);
4074 return -1;
4075 }
4076
4077 nread = bfd_bread (buf, size, abfd);
4078
4079 if (nread != size)
4080 {
4081 free (buf);
4082 return -1;
4083 }
4084
4085 for (offset = 4; offset <= size; offset += 4)
4086 {
4087 unsigned long val;
4088
4089 val = *((unsigned long *) (buf + size - offset));
4090 if (! found_nonnull)
4091 {
4092 if (val != 0)
4093 found_nonnull = 1;
4094 }
4095 else if (val == 0x0)
4096 {
4097 unsigned long bottom;
4098 unsigned long top;
4099
4100 bottom = seg->fileoff + seg->filesize - offset;
4101 top = seg->fileoff + seg->filesize - 4;
4102 *rbuf = bfd_malloc (top - bottom);
4103 *rlen = top - bottom;
4104
4105 memcpy (*rbuf, buf + size - *rlen, *rlen);
4106 free (buf);
4107 return 0;
4108 }
4109 }
4110
4111 if (size == (end - start))
4112 break;
4113
4114 size *= 2;
4115 }
4116
4117 free (buf);
4118 }
4119 }
4120
4121 return -1;
4122 }
4123
4124 char *
4125 bfd_mach_o_core_file_failing_command (bfd *abfd)
4126 {
4127 unsigned char *buf = NULL;
4128 unsigned int len = 0;
4129 int ret = -1;
4130
4131 ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
4132 if (ret < 0)
4133 return NULL;
4134
4135 return (char *) buf;
4136 }
4137
4138 int
4139 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
4140 {
4141 return 0;
4142 }
4143
4144 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
4145 #define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
4146
4147 #define bfd_mach_o_swap_reloc_in NULL
4148 #define bfd_mach_o_swap_reloc_out NULL
4149 #define bfd_mach_o_print_thread NULL
4150
4151 #define TARGET_NAME mach_o_be_vec
4152 #define TARGET_STRING "mach-o-be"
4153 #define TARGET_ARCHITECTURE bfd_arch_unknown
4154 #define TARGET_BIG_ENDIAN 1
4155 #define TARGET_ARCHIVE 0
4156 #include "mach-o-target.c"
4157
4158 #undef TARGET_NAME
4159 #undef TARGET_STRING
4160 #undef TARGET_ARCHITECTURE
4161 #undef TARGET_BIG_ENDIAN
4162 #undef TARGET_ARCHIVE
4163
4164 #define TARGET_NAME mach_o_le_vec
4165 #define TARGET_STRING "mach-o-le"
4166 #define TARGET_ARCHITECTURE bfd_arch_unknown
4167 #define TARGET_BIG_ENDIAN 0
4168 #define TARGET_ARCHIVE 0
4169
4170 #include "mach-o-target.c"
4171
4172 #undef TARGET_NAME
4173 #undef TARGET_STRING
4174 #undef TARGET_ARCHITECTURE
4175 #undef TARGET_BIG_ENDIAN
4176 #undef TARGET_ARCHIVE
4177
4178 /* Not yet handled: creating an archive. */
4179 #define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
4180
4181 /* Not used. */
4182 #define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
4183 #define bfd_mach_o_write_ar_hdr _bfd_noarchive_write_ar_hdr
4184 #define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
4185 #define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
4186 #define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
4187 #define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
4188 #define bfd_mach_o_write_armap _bfd_noarchive_write_armap
4189 #define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
4190 #define bfd_mach_o_generic_stat_arch_elt _bfd_noarchive_generic_stat_arch_elt
4191 #define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
4192
4193 #define TARGET_NAME mach_o_fat_vec
4194 #define TARGET_STRING "mach-o-fat"
4195 #define TARGET_ARCHITECTURE bfd_arch_unknown
4196 #define TARGET_BIG_ENDIAN 1
4197 #define TARGET_ARCHIVE 1
4198
4199 #include "mach-o-target.c"
4200
4201 #undef TARGET_NAME
4202 #undef TARGET_STRING
4203 #undef TARGET_ARCHITECTURE
4204 #undef TARGET_BIG_ENDIAN
4205 #undef TARGET_ARCHIVE
This page took 0.125642 seconds and 4 git commands to generate.