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