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