PR 6878
[deliverable/binutils-gdb.git] / bfd / mach-o.c
1 /* Mach-O support for BFD.
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
22 #include "sysdep.h"
23 #include "mach-o.h"
24 #include "bfd.h"
25 #include "libbfd.h"
26 #include "libiberty.h"
27 #include <ctype.h>
28
29 #ifndef BFD_IO_FUNCS
30 #define BFD_IO_FUNCS 0
31 #endif
32
33 #define bfd_mach_o_mkarchive _bfd_noarchive_mkarchive
34 #define bfd_mach_o_read_ar_hdr _bfd_noarchive_read_ar_hdr
35 #define bfd_mach_o_slurp_armap _bfd_noarchive_slurp_armap
36 #define bfd_mach_o_slurp_extended_name_table _bfd_noarchive_slurp_extended_name_table
37 #define bfd_mach_o_construct_extended_name_table _bfd_noarchive_construct_extended_name_table
38 #define bfd_mach_o_truncate_arname _bfd_noarchive_truncate_arname
39 #define bfd_mach_o_write_armap _bfd_noarchive_write_armap
40 #define bfd_mach_o_get_elt_at_index _bfd_noarchive_get_elt_at_index
41 #define bfd_mach_o_generic_stat_arch_elt _bfd_noarchive_generic_stat_arch_elt
42 #define bfd_mach_o_update_armap_timestamp _bfd_noarchive_update_armap_timestamp
43 #define bfd_mach_o_close_and_cleanup _bfd_generic_close_and_cleanup
44 #define bfd_mach_o_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
45 #define bfd_mach_o_new_section_hook _bfd_generic_new_section_hook
46 #define bfd_mach_o_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
47 #define bfd_mach_o_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
48 #define bfd_mach_o_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
49 #define bfd_mach_o_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
50 #define bfd_mach_o_get_lineno _bfd_nosymbols_get_lineno
51 #define bfd_mach_o_find_nearest_line _bfd_nosymbols_find_nearest_line
52 #define bfd_mach_o_find_inliner_info _bfd_nosymbols_find_inliner_info
53 #define bfd_mach_o_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
54 #define bfd_mach_o_read_minisymbols _bfd_generic_read_minisymbols
55 #define bfd_mach_o_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
56 #define bfd_mach_o_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
57 #define bfd_mach_o_bfd_relax_section bfd_generic_relax_section
58 #define bfd_mach_o_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
59 #define bfd_mach_o_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
60 #define bfd_mach_o_bfd_link_add_symbols _bfd_generic_link_add_symbols
61 #define bfd_mach_o_bfd_link_just_syms _bfd_generic_link_just_syms
62 #define bfd_mach_o_bfd_final_link _bfd_generic_final_link
63 #define bfd_mach_o_bfd_link_split_section _bfd_generic_link_split_section
64 #define bfd_mach_o_set_arch_mach bfd_default_set_arch_mach
65 #define bfd_mach_o_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
66 #define bfd_mach_o_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
67 #define bfd_mach_o_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data
68 #define bfd_mach_o_get_section_contents _bfd_generic_get_section_contents
69 #define bfd_mach_o_set_section_contents _bfd_generic_set_section_contents
70 #define bfd_mach_o_bfd_gc_sections bfd_generic_gc_sections
71 #define bfd_mach_o_bfd_merge_sections bfd_generic_merge_sections
72 #define bfd_mach_o_bfd_is_group_section bfd_generic_is_group_section
73 #define bfd_mach_o_bfd_discard_group bfd_generic_discard_group
74 #define bfd_mach_o_section_already_linked _bfd_generic_section_already_linked
75 #define bfd_mach_o_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
76 #define bfd_mach_o_core_file_matches_executable_p generic_core_file_matches_executable_p
77
78
79 /* The flags field of a section structure is separated into two parts a section
80 type and section attributes. The section types are mutually exclusive (it
81 can only have one type) but the section attributes are not (it may have more
82 than one attribute). */
83
84 #define SECTION_TYPE 0x000000ff /* 256 section types. */
85 #define SECTION_ATTRIBUTES 0xffffff00 /* 24 section attributes. */
86
87 /* Constants for the section attributes part of the flags field of a section
88 structure. */
89
90 #define SECTION_ATTRIBUTES_USR 0xff000000 /* User-settable attributes. */
91 #define S_ATTR_PURE_INSTRUCTIONS 0x80000000 /* Section contains only true machine instructions. */
92 #define SECTION_ATTRIBUTES_SYS 0x00ffff00 /* System setable attributes. */
93 #define S_ATTR_SOME_INSTRUCTIONS 0x00000400 /* Section contains some machine instructions. */
94 #define S_ATTR_EXT_RELOC 0x00000200 /* Section has external relocation entries. */
95 #define S_ATTR_LOC_RELOC 0x00000100 /* Section has local relocation entries. */
96
97 #define N_STAB 0xe0
98 #define N_TYPE 0x1e
99 #define N_EXT 0x01
100
101 #define N_UNDF 0x0
102 #define N_ABS 0x2
103 #define N_TEXT 0x4
104 #define N_DATA 0x6
105 #define N_BSS 0x8
106 #define N_SECT 0xe
107 #define N_INDR 0xa
108
109 static unsigned int
110 bfd_mach_o_version (bfd *abfd)
111 {
112 bfd_mach_o_data_struct *mdata = NULL;
113
114 BFD_ASSERT (bfd_mach_o_valid (abfd));
115 mdata = abfd->tdata.mach_o_data;
116
117 return mdata->header.version;
118 }
119
120 bfd_boolean
121 bfd_mach_o_valid (bfd *abfd)
122 {
123 if (abfd == NULL || abfd->xvec == NULL)
124 return 0;
125
126 if (! ((abfd->xvec == &mach_o_be_vec)
127 || (abfd->xvec == &mach_o_le_vec)
128 || (abfd->xvec == &mach_o_fat_vec)))
129 return 0;
130
131 if (abfd->tdata.mach_o_data == NULL)
132 return 0;
133 return 1;
134 }
135
136 /* Copy any private info we understand from the input symbol
137 to the output symbol. */
138
139 static bfd_boolean
140 bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
141 asymbol *isymbol ATTRIBUTE_UNUSED,
142 bfd *obfd ATTRIBUTE_UNUSED,
143 asymbol *osymbol ATTRIBUTE_UNUSED)
144 {
145 return TRUE;
146 }
147
148 /* Copy any private info we understand from the input section
149 to the output section. */
150
151 static bfd_boolean
152 bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
153 asection *isection ATTRIBUTE_UNUSED,
154 bfd *obfd ATTRIBUTE_UNUSED,
155 asection *osection ATTRIBUTE_UNUSED)
156 {
157 return TRUE;
158 }
159
160 /* Copy any private info we understand from the input bfd
161 to the output bfd. */
162
163 static bfd_boolean
164 bfd_mach_o_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
165 {
166 BFD_ASSERT (bfd_mach_o_valid (ibfd));
167 BFD_ASSERT (bfd_mach_o_valid (obfd));
168
169 obfd->tdata.mach_o_data = ibfd->tdata.mach_o_data;
170 obfd->tdata.mach_o_data->ibfd = ibfd;
171 return TRUE;
172 }
173
174 static long
175 bfd_mach_o_count_symbols (bfd *abfd)
176 {
177 bfd_mach_o_data_struct *mdata = NULL;
178 long nsyms = 0;
179 unsigned long i;
180
181 BFD_ASSERT (bfd_mach_o_valid (abfd));
182 mdata = abfd->tdata.mach_o_data;
183
184 for (i = 0; i < mdata->header.ncmds; i++)
185 if (mdata->commands[i].type == BFD_MACH_O_LC_SYMTAB)
186 {
187 bfd_mach_o_symtab_command *sym = &mdata->commands[i].command.symtab;
188 nsyms += sym->nsyms;
189 }
190
191 return nsyms;
192 }
193
194 static long
195 bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
196 {
197 long nsyms = bfd_mach_o_count_symbols (abfd);
198
199 if (nsyms < 0)
200 return nsyms;
201
202 return ((nsyms + 1) * sizeof (asymbol *));
203 }
204
205 static long
206 bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
207 {
208 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
209 long nsyms = bfd_mach_o_count_symbols (abfd);
210 asymbol **csym = alocation;
211 unsigned long i, j;
212
213 if (nsyms < 0)
214 return nsyms;
215
216 for (i = 0; i < mdata->header.ncmds; i++)
217 {
218 if (mdata->commands[i].type == BFD_MACH_O_LC_SYMTAB)
219 {
220 bfd_mach_o_symtab_command *sym = &mdata->commands[i].command.symtab;
221
222 if (bfd_mach_o_scan_read_symtab_symbols (abfd, &mdata->commands[i].command.symtab) != 0)
223 {
224 fprintf (stderr, "bfd_mach_o_canonicalize_symtab: unable to load symbols for section %lu\n", i);
225 return 0;
226 }
227
228 BFD_ASSERT (sym->symbols != NULL);
229
230 for (j = 0; j < sym->nsyms; j++)
231 {
232 BFD_ASSERT (csym < (alocation + nsyms));
233 *csym++ = &sym->symbols[j];
234 }
235 }
236 }
237
238 *csym++ = NULL;
239
240 return nsyms;
241 }
242
243 static void
244 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
245 asymbol *symbol,
246 symbol_info *ret)
247 {
248 bfd_symbol_info (symbol, ret);
249 }
250
251 static void
252 bfd_mach_o_print_symbol (bfd *abfd,
253 PTR afile,
254 asymbol *symbol,
255 bfd_print_symbol_type how)
256 {
257 FILE *file = (FILE *) afile;
258
259 switch (how)
260 {
261 case bfd_print_symbol_name:
262 fprintf (file, "%s", symbol->name);
263 break;
264 default:
265 bfd_print_symbol_vandf (abfd, (PTR) file, symbol);
266 fprintf (file, " %-5s %s", symbol->section->name, symbol->name);
267 }
268 }
269
270 static void
271 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
272 bfd_mach_o_cpu_subtype msubtype ATTRIBUTE_UNUSED,
273 enum bfd_architecture *type,
274 unsigned long *subtype)
275 {
276 *subtype = bfd_arch_unknown;
277
278 switch (mtype)
279 {
280 case BFD_MACH_O_CPU_TYPE_VAX: *type = bfd_arch_vax; break;
281 case BFD_MACH_O_CPU_TYPE_MC680x0: *type = bfd_arch_m68k; break;
282 case BFD_MACH_O_CPU_TYPE_I386:
283 *type = bfd_arch_i386;
284 *subtype = bfd_mach_i386_i386;
285 break;
286 case BFD_MACH_O_CPU_TYPE_X86_64:
287 *type = bfd_arch_i386;
288 *subtype = bfd_mach_x86_64;
289 break;
290 case BFD_MACH_O_CPU_TYPE_MIPS: *type = bfd_arch_mips; break;
291 case BFD_MACH_O_CPU_TYPE_MC98000: *type = bfd_arch_m98k; break;
292 case BFD_MACH_O_CPU_TYPE_HPPA: *type = bfd_arch_hppa; break;
293 case BFD_MACH_O_CPU_TYPE_ARM: *type = bfd_arch_arm; break;
294 case BFD_MACH_O_CPU_TYPE_MC88000: *type = bfd_arch_m88k; break;
295 case BFD_MACH_O_CPU_TYPE_SPARC:
296 *type = bfd_arch_sparc;
297 *subtype = bfd_mach_sparc;
298 break;
299 case BFD_MACH_O_CPU_TYPE_I860: *type = bfd_arch_i860; break;
300 case BFD_MACH_O_CPU_TYPE_ALPHA: *type = bfd_arch_alpha; break;
301 case BFD_MACH_O_CPU_TYPE_POWERPC:
302 *type = bfd_arch_powerpc;
303 *subtype = bfd_mach_ppc;
304 break;
305 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
306 *type = bfd_arch_powerpc;
307 *subtype = bfd_mach_ppc64;
308 break;
309 default:
310 *type = bfd_arch_unknown;
311 break;
312 }
313 }
314
315 static int
316 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
317 {
318 unsigned char buf[32];
319 unsigned int size;
320
321 size = (header->version == 2) ? 32 : 28;
322
323 bfd_h_put_32 (abfd, header->magic, buf + 0);
324 bfd_h_put_32 (abfd, header->cputype, buf + 4);
325 bfd_h_put_32 (abfd, header->cpusubtype, buf + 8);
326 bfd_h_put_32 (abfd, header->filetype, buf + 12);
327 bfd_h_put_32 (abfd, header->ncmds, buf + 16);
328 bfd_h_put_32 (abfd, header->sizeofcmds, buf + 20);
329 bfd_h_put_32 (abfd, header->flags, buf + 24);
330
331 if (header->version == 2)
332 bfd_h_put_32 (abfd, header->reserved, buf + 28);
333
334 bfd_seek (abfd, 0, SEEK_SET);
335 if (bfd_bwrite ((PTR) buf, size, abfd) != size)
336 return -1;
337
338 return 0;
339 }
340
341 static int
342 bfd_mach_o_scan_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
343 {
344 bfd_mach_o_thread_command *cmd = &command->command.thread;
345 unsigned int i;
346 unsigned char buf[8];
347 bfd_vma offset;
348 unsigned int nflavours;
349
350 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
351 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
352
353 offset = 8;
354 nflavours = 0;
355 for (i = 0; i < cmd->nflavours; i++)
356 {
357 BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
358 BFD_ASSERT (cmd->flavours[i].offset == (command->offset + offset + 8));
359
360 bfd_h_put_32 (abfd, cmd->flavours[i].flavour, buf);
361 bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), buf + 4);
362
363 bfd_seek (abfd, command->offset + offset, SEEK_SET);
364 if (bfd_bwrite ((PTR) buf, 8, abfd) != 8)
365 return -1;
366
367 offset += cmd->flavours[i].size + 8;
368 }
369
370 return 0;
371 }
372
373 static int
374 bfd_mach_o_scan_write_section_32 (bfd *abfd,
375 bfd_mach_o_section *section,
376 bfd_vma offset)
377 {
378 unsigned char buf[68];
379
380 memcpy (buf, section->sectname, 16);
381 memcpy (buf + 16, section->segname, 16);
382 bfd_h_put_32 (abfd, section->addr, buf + 32);
383 bfd_h_put_32 (abfd, section->size, buf + 36);
384 bfd_h_put_32 (abfd, section->offset, buf + 40);
385 bfd_h_put_32 (abfd, section->align, buf + 44);
386 bfd_h_put_32 (abfd, section->reloff, buf + 48);
387 bfd_h_put_32 (abfd, section->nreloc, buf + 52);
388 bfd_h_put_32 (abfd, section->flags, buf + 56);
389 bfd_h_put_32 (abfd, section->reserved1, buf + 60);
390 bfd_h_put_32 (abfd, section->reserved2, buf + 64);
391
392 bfd_seek (abfd, offset, SEEK_SET);
393 if (bfd_bwrite ((PTR) buf, 68, abfd) != 68)
394 return -1;
395
396 return 0;
397 }
398
399 static int
400 bfd_mach_o_scan_write_section_64 (bfd *abfd,
401 bfd_mach_o_section *section,
402 bfd_vma offset)
403 {
404 unsigned char buf[80];
405
406 memcpy (buf, section->sectname, 16);
407 memcpy (buf + 16, section->segname, 16);
408 bfd_h_put_64 (abfd, section->addr, buf + 32);
409 bfd_h_put_64 (abfd, section->size, buf + 40);
410 bfd_h_put_32 (abfd, section->offset, buf + 48);
411 bfd_h_put_32 (abfd, section->align, buf + 52);
412 bfd_h_put_32 (abfd, section->reloff, buf + 56);
413 bfd_h_put_32 (abfd, section->nreloc, buf + 60);
414 bfd_h_put_32 (abfd, section->flags, buf + 64);
415 bfd_h_put_32 (abfd, section->reserved1, buf + 68);
416 bfd_h_put_32 (abfd, section->reserved2, buf + 72);
417 bfd_h_put_32 (abfd, section->reserved3, buf + 76);
418
419 bfd_seek (abfd, offset, SEEK_SET);
420 if (bfd_bwrite ((PTR) buf, 80, abfd) != 80)
421 return -1;
422
423 return 0;
424 }
425
426 static int
427 bfd_mach_o_scan_write_section (bfd *abfd,
428 bfd_mach_o_section *section,
429 bfd_vma offset,
430 unsigned int wide)
431 {
432 if (wide)
433 return bfd_mach_o_scan_write_section_64 (abfd, section, offset);
434 else
435 return bfd_mach_o_scan_write_section_32 (abfd, section, offset);
436 }
437
438 static int
439 bfd_mach_o_scan_write_segment (bfd *abfd,
440 bfd_mach_o_load_command *command,
441 unsigned int wide)
442 {
443 unsigned char buf[64];
444 bfd_mach_o_segment_command *seg = &command->command.segment;
445 unsigned long i;
446
447 if (wide)
448 {
449 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
450
451 memcpy (buf, seg->segname, 16);
452
453 bfd_h_put_64 (abfd, seg->vmaddr, buf + 16);
454 bfd_h_put_64 (abfd, seg->vmsize, buf + 24);
455 bfd_h_put_64 (abfd, seg->fileoff, buf + 32);
456 bfd_h_put_64 (abfd, seg->filesize, buf + 40);
457 bfd_h_put_32 (abfd, seg->maxprot, buf + 48);
458 bfd_h_put_32 (abfd, seg->initprot, buf + 52);
459 bfd_h_put_32 (abfd, seg->nsects, buf + 56);
460 bfd_h_put_32 (abfd, seg->flags, buf + 60);
461
462 bfd_seek (abfd, command->offset + 8, SEEK_SET);
463 if (bfd_bwrite ((PTR) buf, 64, abfd) != 64)
464 return -1;
465 }
466 else
467 {
468 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
469
470 memcpy (buf, seg->segname, 16);
471
472 bfd_h_put_32 (abfd, seg->vmaddr, buf + 16);
473 bfd_h_put_32 (abfd, seg->vmsize, buf + 20);
474 bfd_h_put_32 (abfd, seg->fileoff, buf + 24);
475 bfd_h_put_32 (abfd, seg->filesize, buf + 28);
476 bfd_h_put_32 (abfd, seg->maxprot, buf + 32);
477 bfd_h_put_32 (abfd, seg->initprot, buf + 36);
478 bfd_h_put_32 (abfd, seg->nsects, buf + 40);
479 bfd_h_put_32 (abfd, seg->flags, buf + 44);
480
481 bfd_seek (abfd, command->offset + 8, SEEK_SET);
482 if (bfd_bwrite ((PTR) buf, 48, abfd) != 48)
483 return -1;
484 }
485
486 {
487 char buf[1024];
488 bfd_vma nbytes = seg->filesize;
489 bfd_vma curoff = seg->fileoff;
490
491 while (nbytes > 0)
492 {
493 bfd_vma thiswrite = nbytes;
494
495 if (thiswrite > 1024)
496 thiswrite = 1024;
497
498 bfd_seek (abfd, curoff, SEEK_SET);
499 if (bfd_bread ((PTR) buf, thiswrite, abfd) != thiswrite)
500 return -1;
501
502 bfd_seek (abfd, curoff, SEEK_SET);
503 if (bfd_bwrite ((PTR) buf, thiswrite, abfd) != thiswrite)
504 return -1;
505
506 nbytes -= thiswrite;
507 curoff += thiswrite;
508 }
509 }
510
511 for (i = 0; i < seg->nsects; i++)
512 {
513 bfd_vma segoff;
514 if (wide)
515 segoff = command->offset + 64 + 8 + (i * 80);
516 else
517 segoff = command->offset + 48 + 8 + (i * 68);
518
519 if (bfd_mach_o_scan_write_section
520 (abfd, &seg->sections[i], segoff, wide) != 0)
521 return -1;
522 }
523
524 return 0;
525 }
526
527 static int
528 bfd_mach_o_scan_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
529 {
530 return bfd_mach_o_scan_write_segment (abfd, command, 0);
531 }
532
533 static int
534 bfd_mach_o_scan_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
535 {
536 return bfd_mach_o_scan_write_segment (abfd, command, 1);
537 }
538
539 static int
540 bfd_mach_o_scan_write_symtab_symbols (bfd *abfd, bfd_mach_o_load_command *command)
541 {
542 bfd_mach_o_symtab_command *sym = &command->command.symtab;
543 asymbol *s = NULL;
544 unsigned long i;
545
546 for (i = 0; i < sym->nsyms; i++)
547 {
548 unsigned char buf[12];
549 bfd_vma symoff = sym->symoff + (i * 12);
550 unsigned char ntype = 0;
551 unsigned char nsect = 0;
552 short ndesc = 0;
553
554 s = &sym->symbols[i];
555
556 /* Instead just set from the stored values. */
557 ntype = (s->udata.i >> 24) & 0xff;
558 nsect = (s->udata.i >> 16) & 0xff;
559 ndesc = s->udata.i & 0xffff;
560
561 bfd_h_put_32 (abfd, s->name - sym->strtab, buf);
562 bfd_h_put_8 (abfd, ntype, buf + 4);
563 bfd_h_put_8 (abfd, nsect, buf + 5);
564 bfd_h_put_16 (abfd, ndesc, buf + 6);
565 bfd_h_put_32 (abfd, s->section->vma + s->value, buf + 8);
566
567 bfd_seek (abfd, symoff, SEEK_SET);
568 if (bfd_bwrite ((PTR) buf, 12, abfd) != 12)
569 {
570 fprintf (stderr, "bfd_mach_o_scan_write_symtab_symbols: unable to write %d bytes at %lu\n",
571 12, (unsigned long) symoff);
572 return -1;
573 }
574 }
575
576 return 0;
577 }
578
579 static int
580 bfd_mach_o_scan_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
581 {
582 bfd_mach_o_symtab_command *seg = &command->command.symtab;
583 unsigned char buf[16];
584
585 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
586
587 bfd_h_put_32 (abfd, seg->symoff, buf);
588 bfd_h_put_32 (abfd, seg->nsyms, buf + 4);
589 bfd_h_put_32 (abfd, seg->stroff, buf + 8);
590 bfd_h_put_32 (abfd, seg->strsize, buf + 12);
591
592 bfd_seek (abfd, command->offset + 8, SEEK_SET);
593 if (bfd_bwrite ((PTR) buf, 16, abfd) != 16)
594 return -1;
595
596 if (bfd_mach_o_scan_write_symtab_symbols (abfd, command) != 0)
597 return -1;
598
599 return 0;
600 }
601
602 static bfd_boolean
603 bfd_mach_o_write_contents (bfd *abfd)
604 {
605 unsigned int i;
606 asection *s;
607
608 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
609
610 /* Write data sections first in case they overlap header data to be
611 written later. */
612
613 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
614 ;
615
616 /* Now write header information. */
617 if (bfd_mach_o_write_header (abfd, &mdata->header) != 0)
618 return FALSE;
619
620 for (i = 0; i < mdata->header.ncmds; i++)
621 {
622 unsigned char buf[8];
623 bfd_mach_o_load_command *cur = &mdata->commands[i];
624 unsigned long typeflag;
625
626 typeflag = cur->type_required ? cur->type & BFD_MACH_O_LC_REQ_DYLD : cur->type;
627
628 bfd_h_put_32 (abfd, typeflag, buf);
629 bfd_h_put_32 (abfd, cur->len, buf + 4);
630
631 bfd_seek (abfd, cur->offset, SEEK_SET);
632 if (bfd_bwrite ((PTR) buf, 8, abfd) != 8)
633 return FALSE;
634
635 switch (cur->type)
636 {
637 case BFD_MACH_O_LC_SEGMENT:
638 if (bfd_mach_o_scan_write_segment_32 (abfd, cur) != 0)
639 return FALSE;
640 break;
641 case BFD_MACH_O_LC_SEGMENT_64:
642 if (bfd_mach_o_scan_write_segment_64 (abfd, cur) != 0)
643 return FALSE;
644 break;
645 case BFD_MACH_O_LC_SYMTAB:
646 if (bfd_mach_o_scan_write_symtab (abfd, cur) != 0)
647 return FALSE;
648 break;
649 case BFD_MACH_O_LC_SYMSEG:
650 break;
651 case BFD_MACH_O_LC_THREAD:
652 case BFD_MACH_O_LC_UNIXTHREAD:
653 if (bfd_mach_o_scan_write_thread (abfd, cur) != 0)
654 return FALSE;
655 break;
656 case BFD_MACH_O_LC_LOADFVMLIB:
657 case BFD_MACH_O_LC_IDFVMLIB:
658 case BFD_MACH_O_LC_IDENT:
659 case BFD_MACH_O_LC_FVMFILE:
660 case BFD_MACH_O_LC_PREPAGE:
661 case BFD_MACH_O_LC_DYSYMTAB:
662 case BFD_MACH_O_LC_LOAD_DYLIB:
663 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
664 case BFD_MACH_O_LC_ID_DYLIB:
665 case BFD_MACH_O_LC_LOAD_DYLINKER:
666 case BFD_MACH_O_LC_ID_DYLINKER:
667 case BFD_MACH_O_LC_PREBOUND_DYLIB:
668 case BFD_MACH_O_LC_ROUTINES:
669 case BFD_MACH_O_LC_SUB_FRAMEWORK:
670 break;
671 default:
672 fprintf (stderr,
673 "unable to write unknown load command 0x%lx\n",
674 (unsigned long) cur->type);
675 return FALSE;
676 }
677 }
678
679 return TRUE;
680 }
681
682 static int
683 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
684 struct bfd_link_info *info ATTRIBUTE_UNUSED)
685 {
686 return 0;
687 }
688
689 /* Make an empty symbol. This is required only because
690 bfd_make_section_anyway wants to create a symbol for the section. */
691
692 static asymbol *
693 bfd_mach_o_make_empty_symbol (bfd *abfd)
694 {
695 asymbol *new;
696
697 new = bfd_zalloc (abfd, sizeof (* new));
698 if (new == NULL)
699 return new;
700 new->the_bfd = abfd;
701 return new;
702 }
703
704 static int
705 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
706 {
707 unsigned char buf[32];
708 unsigned int size;
709 bfd_vma (*get32) (const void *) = NULL;
710
711 bfd_seek (abfd, 0, SEEK_SET);
712
713 /* Just read the magic number. */
714 if (bfd_bread ((PTR) buf, 4, abfd) != 4)
715 return -1;
716
717 if (bfd_getb32 (buf) == 0xfeedface)
718 {
719 header->byteorder = BFD_ENDIAN_BIG;
720 header->magic = 0xfeedface;
721 header->version = 1;
722 get32 = bfd_getb32;
723 }
724 else if (bfd_getl32 (buf) == 0xfeedface)
725 {
726 header->byteorder = BFD_ENDIAN_LITTLE;
727 header->magic = 0xfeedface;
728 header->version = 1;
729 get32 = bfd_getl32;
730 }
731 else if (bfd_getb32 (buf) == 0xfeedfacf)
732 {
733 header->byteorder = BFD_ENDIAN_BIG;
734 header->magic = 0xfeedfacf;
735 header->version = 2;
736 get32 = bfd_getb32;
737 }
738 else if (bfd_getl32 (buf) == 0xfeedfacf)
739 {
740 header->byteorder = BFD_ENDIAN_LITTLE;
741 header->magic = 0xfeedfacf;
742 header->version = 2;
743 get32 = bfd_getl32;
744 }
745 else
746 {
747 header->byteorder = BFD_ENDIAN_UNKNOWN;
748 return -1;
749 }
750
751 /* Once the size of the header is known, read the full header. */
752 size = (header->version == 2) ? 32 : 28;
753
754 bfd_seek (abfd, 0, SEEK_SET);
755 if (bfd_bread ((PTR) buf, size, abfd) != size)
756 return -1;
757
758 header->cputype = (*get32) (buf + 4);
759 header->cpusubtype = (*get32) (buf + 8);
760 header->filetype = (*get32) (buf + 12);
761 header->ncmds = (*get32) (buf + 16);
762 header->sizeofcmds = (*get32) (buf + 20);
763 header->flags = (*get32) (buf + 24);
764
765 if (header->version == 2)
766 header->reserved = (*get32) (buf + 28);
767
768 return 0;
769 }
770
771 static asection *
772 bfd_mach_o_make_bfd_section (bfd *abfd, bfd_mach_o_section *section)
773 {
774 asection *bfdsec;
775 char *sname;
776 const char *prefix = "LC_SEGMENT";
777 unsigned int snamelen;
778 flagword flags;
779
780 snamelen = strlen (prefix) + 1
781 + strlen (section->segname) + 1
782 + strlen (section->sectname) + 1;
783
784 sname = bfd_alloc (abfd, snamelen);
785 if (sname == NULL)
786 return NULL;
787 sprintf (sname, "%s.%s.%s", prefix, section->segname, section->sectname);
788
789 flags = SEC_ALLOC;
790 if ((section->flags & SECTION_TYPE) != BFD_MACH_O_S_ZEROFILL)
791 flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC | SEC_CODE;
792 bfdsec = bfd_make_section_anyway_with_flags (abfd, sname, flags);
793 if (bfdsec == NULL)
794 return NULL;
795
796 bfdsec->vma = section->addr;
797 bfdsec->lma = section->addr;
798 bfdsec->size = section->size;
799 bfdsec->filepos = section->offset;
800 bfdsec->alignment_power = section->align;
801 bfdsec->segment_mark = 0;
802
803 return bfdsec;
804 }
805
806 static int
807 bfd_mach_o_scan_read_section_32 (bfd *abfd,
808 bfd_mach_o_section *section,
809 bfd_vma offset)
810 {
811 unsigned char buf[68];
812
813 bfd_seek (abfd, offset, SEEK_SET);
814 if (bfd_bread ((PTR) buf, 68, abfd) != 68)
815 return -1;
816
817 memcpy (section->sectname, buf, 16);
818 section->sectname[16] = '\0';
819 memcpy (section->segname, buf + 16, 16);
820 section->segname[16] = '\0';
821 section->addr = bfd_h_get_32 (abfd, buf + 32);
822 section->size = bfd_h_get_32 (abfd, buf + 36);
823 section->offset = bfd_h_get_32 (abfd, buf + 40);
824 section->align = bfd_h_get_32 (abfd, buf + 44);
825 section->reloff = bfd_h_get_32 (abfd, buf + 48);
826 section->nreloc = bfd_h_get_32 (abfd, buf + 52);
827 section->flags = bfd_h_get_32 (abfd, buf + 56);
828 section->reserved1 = bfd_h_get_32 (abfd, buf + 60);
829 section->reserved2 = bfd_h_get_32 (abfd, buf + 64);
830 section->reserved3 = 0;
831 section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section);
832
833 if (section->bfdsection == NULL)
834 return -1;
835
836 return 0;
837 }
838
839 static int
840 bfd_mach_o_scan_read_section_64 (bfd *abfd,
841 bfd_mach_o_section *section,
842 bfd_vma offset)
843 {
844 unsigned char buf[80];
845
846 bfd_seek (abfd, offset, SEEK_SET);
847 if (bfd_bread ((PTR) buf, 80, abfd) != 80)
848 return -1;
849
850 memcpy (section->sectname, buf, 16);
851 section->sectname[16] = '\0';
852 memcpy (section->segname, buf + 16, 16);
853 section->segname[16] = '\0';
854 section->addr = bfd_h_get_64 (abfd, buf + 32);
855 section->size = bfd_h_get_64 (abfd, buf + 40);
856 section->offset = bfd_h_get_32 (abfd, buf + 48);
857 section->align = bfd_h_get_32 (abfd, buf + 52);
858 section->reloff = bfd_h_get_32 (abfd, buf + 56);
859 section->nreloc = bfd_h_get_32 (abfd, buf + 60);
860 section->flags = bfd_h_get_32 (abfd, buf + 64);
861 section->reserved1 = bfd_h_get_32 (abfd, buf + 68);
862 section->reserved2 = bfd_h_get_32 (abfd, buf + 72);
863 section->reserved3 = bfd_h_get_32 (abfd, buf + 76);
864 section->bfdsection = bfd_mach_o_make_bfd_section (abfd, section);
865
866 if (section->bfdsection == NULL)
867 return -1;
868
869 return 0;
870 }
871
872 static int
873 bfd_mach_o_scan_read_section (bfd *abfd,
874 bfd_mach_o_section *section,
875 bfd_vma offset,
876 unsigned int wide)
877 {
878 if (wide)
879 return bfd_mach_o_scan_read_section_64 (abfd, section, offset);
880 else
881 return bfd_mach_o_scan_read_section_32 (abfd, section, offset);
882 }
883
884 int
885 bfd_mach_o_scan_read_symtab_symbol (bfd *abfd,
886 bfd_mach_o_symtab_command *sym,
887 asymbol *s,
888 unsigned long i)
889 {
890 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
891 unsigned int wide = (mdata->header.version == 2);
892 unsigned int symwidth = wide ? 16 : 12;
893 bfd_vma symoff = sym->symoff + (i * symwidth);
894 unsigned char buf[16];
895 unsigned char type = -1;
896 unsigned char section = -1;
897 short desc = -1;
898 symvalue value = -1;
899 unsigned long stroff = -1;
900 unsigned int symtype = -1;
901
902 BFD_ASSERT (sym->strtab != NULL);
903
904 bfd_seek (abfd, symoff, SEEK_SET);
905 if (bfd_bread ((PTR) buf, symwidth, abfd) != symwidth)
906 {
907 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbol: unable to read %d bytes at %lu\n",
908 symwidth, (unsigned long) symoff);
909 return -1;
910 }
911
912 stroff = bfd_h_get_32 (abfd, buf);
913 type = bfd_h_get_8 (abfd, buf + 4);
914 symtype = (type & 0x0e);
915 section = bfd_h_get_8 (abfd, buf + 5) - 1;
916 desc = bfd_h_get_16 (abfd, buf + 6);
917 if (wide)
918 value = bfd_h_get_64 (abfd, buf + 8);
919 else
920 value = bfd_h_get_32 (abfd, buf + 8);
921
922 if (stroff >= sym->strsize)
923 {
924 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbol: symbol name out of range (%lu >= %lu)\n",
925 (unsigned long) stroff, (unsigned long) sym->strsize);
926 return -1;
927 }
928
929 s->the_bfd = abfd;
930 s->name = sym->strtab + stroff;
931 s->value = value;
932 s->udata.i = (type << 24) | (section << 16) | desc;
933 s->flags = 0x0;
934
935 if (type & BFD_MACH_O_N_STAB)
936 {
937 s->flags |= BSF_DEBUGGING;
938 s->section = bfd_und_section_ptr;
939 }
940 else
941 {
942 if (type & BFD_MACH_O_N_PEXT)
943 {
944 type &= ~BFD_MACH_O_N_PEXT;
945 s->flags |= BSF_GLOBAL;
946 }
947
948 if (type & BFD_MACH_O_N_EXT)
949 {
950 type &= ~BFD_MACH_O_N_EXT;
951 s->flags |= BSF_GLOBAL;
952 }
953
954 switch (symtype)
955 {
956 case BFD_MACH_O_N_UNDF:
957 s->section = bfd_und_section_ptr;
958 break;
959 case BFD_MACH_O_N_PBUD:
960 s->section = bfd_und_section_ptr;
961 break;
962 case BFD_MACH_O_N_ABS:
963 s->section = bfd_abs_section_ptr;
964 break;
965 case BFD_MACH_O_N_SECT:
966 if ((section > 0) && (section <= mdata->nsects))
967 {
968 s->section = mdata->sections[section]->bfdsection;
969 s->value = s->value - mdata->sections[section]->addr;
970 }
971 else
972 {
973 /* Mach-O uses 0 to mean "no section"; not an error. */
974 if (section != 0)
975 {
976 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbol: "
977 "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined\n",
978 s->name, section, mdata->nsects);
979 }
980 s->section = bfd_und_section_ptr;
981 }
982 break;
983 case BFD_MACH_O_N_INDR:
984 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbol: "
985 "symbol \"%s\" is unsupported 'indirect' reference: setting to undefined\n",
986 s->name);
987 s->section = bfd_und_section_ptr;
988 break;
989 default:
990 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbol: "
991 "symbol \"%s\" specified invalid type field 0x%x: setting to undefined\n",
992 s->name, symtype);
993 s->section = bfd_und_section_ptr;
994 break;
995 }
996 }
997
998 return 0;
999 }
1000
1001 int
1002 bfd_mach_o_scan_read_symtab_strtab (bfd *abfd,
1003 bfd_mach_o_symtab_command *sym)
1004 {
1005 BFD_ASSERT (sym->strtab == NULL);
1006
1007 if (abfd->flags & BFD_IN_MEMORY)
1008 {
1009 struct bfd_in_memory *b;
1010
1011 b = (struct bfd_in_memory *) abfd->iostream;
1012
1013 if ((sym->stroff + sym->strsize) > b->size)
1014 {
1015 bfd_set_error (bfd_error_file_truncated);
1016 return -1;
1017 }
1018 sym->strtab = (char *) b->buffer + sym->stroff;
1019 return 0;
1020 }
1021
1022 sym->strtab = bfd_alloc (abfd, sym->strsize);
1023 if (sym->strtab == NULL)
1024 return -1;
1025
1026 bfd_seek (abfd, sym->stroff, SEEK_SET);
1027 if (bfd_bread ((PTR) sym->strtab, sym->strsize, abfd) != sym->strsize)
1028 {
1029 fprintf (stderr, "bfd_mach_o_scan_read_symtab_strtab: unable to read %lu bytes at %lu\n",
1030 sym->strsize, sym->stroff);
1031 return -1;
1032 }
1033
1034 return 0;
1035 }
1036
1037 int
1038 bfd_mach_o_scan_read_symtab_symbols (bfd *abfd,
1039 bfd_mach_o_symtab_command *sym)
1040 {
1041 unsigned long i;
1042 int ret;
1043
1044 BFD_ASSERT (sym->symbols == NULL);
1045 sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (asymbol));
1046
1047 if (sym->symbols == NULL)
1048 {
1049 fprintf (stderr, "bfd_mach_o_scan_read_symtab_symbols: unable to allocate memory for symbols\n");
1050 return -1;
1051 }
1052
1053 ret = bfd_mach_o_scan_read_symtab_strtab (abfd, sym);
1054 if (ret != 0)
1055 return ret;
1056
1057 for (i = 0; i < sym->nsyms; i++)
1058 {
1059 ret = bfd_mach_o_scan_read_symtab_symbol (abfd, sym, &sym->symbols[i], i);
1060 if (ret != 0)
1061 return ret;
1062 }
1063
1064 return 0;
1065 }
1066
1067 int
1068 bfd_mach_o_scan_read_dysymtab_symbol (bfd *abfd,
1069 bfd_mach_o_dysymtab_command *dysym,
1070 bfd_mach_o_symtab_command *sym,
1071 asymbol *s,
1072 unsigned long i)
1073 {
1074 unsigned long isymoff = dysym->indirectsymoff + (i * 4);
1075 unsigned long symindex;
1076 unsigned char buf[4];
1077
1078 BFD_ASSERT (i < dysym->nindirectsyms);
1079
1080 bfd_seek (abfd, isymoff, SEEK_SET);
1081 if (bfd_bread ((PTR) buf, 4, abfd) != 4)
1082 {
1083 fprintf (stderr, "bfd_mach_o_scan_read_dysymtab_symbol: unable to read %lu bytes at %lu\n",
1084 (unsigned long) 4, isymoff);
1085 return -1;
1086 }
1087 symindex = bfd_h_get_32 (abfd, buf);
1088
1089 return bfd_mach_o_scan_read_symtab_symbol (abfd, sym, s, symindex);
1090 }
1091
1092 static const char *
1093 bfd_mach_o_i386_flavour_string (unsigned int flavour)
1094 {
1095 switch ((int) flavour)
1096 {
1097 case BFD_MACH_O_i386_NEW_THREAD_STATE: return "i386_NEW_THREAD_STATE";
1098 case BFD_MACH_O_i386_FLOAT_STATE: return "i386_FLOAT_STATE";
1099 case BFD_MACH_O_i386_ISA_PORT_MAP_STATE: return "i386_ISA_PORT_MAP_STATE";
1100 case BFD_MACH_O_i386_V86_ASSIST_STATE: return "i386_V86_ASSIST_STATE";
1101 case BFD_MACH_O_i386_REGS_SEGS_STATE: return "i386_REGS_SEGS_STATE";
1102 case BFD_MACH_O_i386_THREAD_SYSCALL_STATE: return "i386_THREAD_SYSCALL_STATE";
1103 case BFD_MACH_O_i386_THREAD_STATE_NONE: return "i386_THREAD_STATE_NONE";
1104 case BFD_MACH_O_i386_SAVED_STATE: return "i386_SAVED_STATE";
1105 case BFD_MACH_O_i386_THREAD_STATE: return "i386_THREAD_STATE";
1106 case BFD_MACH_O_i386_THREAD_FPSTATE: return "i386_THREAD_FPSTATE";
1107 case BFD_MACH_O_i386_THREAD_EXCEPTSTATE: return "i386_THREAD_EXCEPTSTATE";
1108 case BFD_MACH_O_i386_THREAD_CTHREADSTATE: return "i386_THREAD_CTHREADSTATE";
1109 default: return "UNKNOWN";
1110 }
1111 }
1112
1113 static const char *
1114 bfd_mach_o_ppc_flavour_string (unsigned int flavour)
1115 {
1116 switch ((int) flavour)
1117 {
1118 case BFD_MACH_O_PPC_THREAD_STATE: return "PPC_THREAD_STATE";
1119 case BFD_MACH_O_PPC_FLOAT_STATE: return "PPC_FLOAT_STATE";
1120 case BFD_MACH_O_PPC_EXCEPTION_STATE: return "PPC_EXCEPTION_STATE";
1121 case BFD_MACH_O_PPC_VECTOR_STATE: return "PPC_VECTOR_STATE";
1122 default: return "UNKNOWN";
1123 }
1124 }
1125
1126 static int
1127 bfd_mach_o_scan_read_dylinker (bfd *abfd,
1128 bfd_mach_o_load_command *command)
1129 {
1130 bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
1131 unsigned char buf[4];
1132 unsigned int nameoff;
1133 asection *bfdsec;
1134 char *sname;
1135 const char *prefix;
1136
1137 BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLINKER)
1138 || (command->type == BFD_MACH_O_LC_LOAD_DYLINKER));
1139
1140 bfd_seek (abfd, command->offset + 8, SEEK_SET);
1141 if (bfd_bread ((PTR) buf, 4, abfd) != 4)
1142 return -1;
1143
1144 nameoff = bfd_h_get_32 (abfd, buf + 0);
1145
1146 cmd->name_offset = command->offset + nameoff;
1147 cmd->name_len = command->len - nameoff;
1148
1149 if (command->type == BFD_MACH_O_LC_LOAD_DYLINKER)
1150 prefix = "LC_LOAD_DYLINKER";
1151 else if (command->type == BFD_MACH_O_LC_ID_DYLINKER)
1152 prefix = "LC_ID_DYLINKER";
1153 else
1154 abort ();
1155
1156 sname = bfd_alloc (abfd, strlen (prefix) + 1);
1157 if (sname == NULL)
1158 return -1;
1159 strcpy (sname, prefix);
1160
1161 bfdsec = bfd_make_section_anyway_with_flags (abfd, sname, SEC_HAS_CONTENTS);
1162 if (bfdsec == NULL)
1163 return -1;
1164
1165 bfdsec->vma = 0;
1166 bfdsec->lma = 0;
1167 bfdsec->size = command->len - 8;
1168 bfdsec->filepos = command->offset + 8;
1169 bfdsec->alignment_power = 0;
1170
1171 cmd->section = bfdsec;
1172
1173 return 0;
1174 }
1175
1176 static int
1177 bfd_mach_o_scan_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
1178 {
1179 bfd_mach_o_dylib_command *cmd = &command->command.dylib;
1180 unsigned char buf[16];
1181 unsigned int nameoff;
1182 asection *bfdsec;
1183 char *sname;
1184 const char *prefix;
1185
1186 BFD_ASSERT ((command->type == BFD_MACH_O_LC_ID_DYLIB)
1187 || (command->type == BFD_MACH_O_LC_LOAD_DYLIB)
1188 || (command->type == BFD_MACH_O_LC_LOAD_WEAK_DYLIB));
1189
1190 bfd_seek (abfd, command->offset + 8, SEEK_SET);
1191 if (bfd_bread ((PTR) buf, 16, abfd) != 16)
1192 return -1;
1193
1194 nameoff = bfd_h_get_32 (abfd, buf + 0);
1195 cmd->timestamp = bfd_h_get_32 (abfd, buf + 4);
1196 cmd->current_version = bfd_h_get_32 (abfd, buf + 8);
1197 cmd->compatibility_version = bfd_h_get_32 (abfd, buf + 12);
1198
1199 cmd->name_offset = command->offset + nameoff;
1200 cmd->name_len = command->len - nameoff;
1201
1202 if (command->type == BFD_MACH_O_LC_LOAD_DYLIB)
1203 prefix = "LC_LOAD_DYLIB";
1204 else if (command->type == BFD_MACH_O_LC_LOAD_WEAK_DYLIB)
1205 prefix = "LC_LOAD_WEAK_DYLIB";
1206 else if (command->type == BFD_MACH_O_LC_ID_DYLIB)
1207 prefix = "LC_ID_DYLIB";
1208 else
1209 abort ();
1210
1211 sname = bfd_alloc (abfd, strlen (prefix) + 1);
1212 if (sname == NULL)
1213 return -1;
1214 strcpy (sname, prefix);
1215
1216 bfdsec = bfd_make_section_anyway_with_flags (abfd, sname, SEC_HAS_CONTENTS);
1217 if (bfdsec == NULL)
1218 return -1;
1219
1220 bfdsec->vma = 0;
1221 bfdsec->lma = 0;
1222 bfdsec->size = command->len - 8;
1223 bfdsec->filepos = command->offset + 8;
1224 bfdsec->alignment_power = 0;
1225
1226 cmd->section = bfdsec;
1227
1228 return 0;
1229 }
1230
1231 static int
1232 bfd_mach_o_scan_read_prebound_dylib (bfd *abfd ATTRIBUTE_UNUSED,
1233 bfd_mach_o_load_command *command ATTRIBUTE_UNUSED)
1234 {
1235 /* bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib; */
1236
1237 BFD_ASSERT (command->type == BFD_MACH_O_LC_PREBOUND_DYLIB);
1238 return 0;
1239 }
1240
1241 static int
1242 bfd_mach_o_scan_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
1243 {
1244 bfd_mach_o_data_struct *mdata = NULL;
1245 bfd_mach_o_thread_command *cmd = &command->command.thread;
1246 unsigned char buf[8];
1247 bfd_vma offset;
1248 unsigned int nflavours;
1249 unsigned int i;
1250
1251 BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
1252 || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
1253
1254 BFD_ASSERT (bfd_mach_o_valid (abfd));
1255 mdata = abfd->tdata.mach_o_data;
1256
1257 offset = 8;
1258 nflavours = 0;
1259 while (offset != command->len)
1260 {
1261 if (offset >= command->len)
1262 return -1;
1263
1264 bfd_seek (abfd, command->offset + offset, SEEK_SET);
1265
1266 if (bfd_bread ((PTR) buf, 8, abfd) != 8)
1267 return -1;
1268
1269 offset += 8 + bfd_h_get_32 (abfd, buf + 4) * 4;
1270 nflavours++;
1271 }
1272
1273 cmd->flavours = bfd_alloc (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
1274 if (cmd->flavours == NULL)
1275 return -1;
1276 cmd->nflavours = nflavours;
1277
1278 offset = 8;
1279 nflavours = 0;
1280 while (offset != command->len)
1281 {
1282 if (offset >= command->len)
1283 return -1;
1284
1285 if (nflavours >= cmd->nflavours)
1286 return -1;
1287
1288 bfd_seek (abfd, command->offset + offset, SEEK_SET);
1289
1290 if (bfd_bread ((PTR) buf, 8, abfd) != 8)
1291 return -1;
1292
1293 cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, buf);
1294 cmd->flavours[nflavours].offset = command->offset + offset + 8;
1295 cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, buf + 4) * 4;
1296 offset += cmd->flavours[nflavours].size + 8;
1297 nflavours++;
1298 }
1299
1300 for (i = 0; i < nflavours; i++)
1301 {
1302 asection *bfdsec;
1303 unsigned int snamelen;
1304 char *sname;
1305 const char *flavourstr;
1306 const char *prefix = "LC_THREAD";
1307 unsigned int j = 0;
1308
1309 switch (mdata->header.cputype)
1310 {
1311 case BFD_MACH_O_CPU_TYPE_POWERPC:
1312 case BFD_MACH_O_CPU_TYPE_POWERPC_64:
1313 flavourstr = bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
1314 break;
1315 case BFD_MACH_O_CPU_TYPE_I386:
1316 case BFD_MACH_O_CPU_TYPE_X86_64:
1317 flavourstr = bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
1318 break;
1319 default:
1320 flavourstr = "UNKNOWN_ARCHITECTURE";
1321 break;
1322 }
1323
1324 snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
1325 sname = bfd_alloc (abfd, snamelen);
1326 if (sname == NULL)
1327 return -1;
1328
1329 for (;;)
1330 {
1331 sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
1332 if (bfd_get_section_by_name (abfd, sname) == NULL)
1333 break;
1334 j++;
1335 }
1336
1337 bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
1338
1339 bfdsec->vma = 0;
1340 bfdsec->lma = 0;
1341 bfdsec->size = cmd->flavours[i].size;
1342 bfdsec->filepos = cmd->flavours[i].offset;
1343 bfdsec->alignment_power = 0x0;
1344
1345 cmd->section = bfdsec;
1346 }
1347
1348 return 0;
1349 }
1350
1351 static int
1352 bfd_mach_o_scan_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
1353 {
1354 bfd_mach_o_dysymtab_command *seg = &command->command.dysymtab;
1355 unsigned char buf[72];
1356
1357 BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
1358
1359 bfd_seek (abfd, command->offset + 8, SEEK_SET);
1360 if (bfd_bread ((PTR) buf, 72, abfd) != 72)
1361 return -1;
1362
1363 seg->ilocalsym = bfd_h_get_32 (abfd, buf + 0);
1364 seg->nlocalsym = bfd_h_get_32 (abfd, buf + 4);
1365 seg->iextdefsym = bfd_h_get_32 (abfd, buf + 8);
1366 seg->nextdefsym = bfd_h_get_32 (abfd, buf + 12);
1367 seg->iundefsym = bfd_h_get_32 (abfd, buf + 16);
1368 seg->nundefsym = bfd_h_get_32 (abfd, buf + 20);
1369 seg->tocoff = bfd_h_get_32 (abfd, buf + 24);
1370 seg->ntoc = bfd_h_get_32 (abfd, buf + 28);
1371 seg->modtaboff = bfd_h_get_32 (abfd, buf + 32);
1372 seg->nmodtab = bfd_h_get_32 (abfd, buf + 36);
1373 seg->extrefsymoff = bfd_h_get_32 (abfd, buf + 40);
1374 seg->nextrefsyms = bfd_h_get_32 (abfd, buf + 44);
1375 seg->indirectsymoff = bfd_h_get_32 (abfd, buf + 48);
1376 seg->nindirectsyms = bfd_h_get_32 (abfd, buf + 52);
1377 seg->extreloff = bfd_h_get_32 (abfd, buf + 56);
1378 seg->nextrel = bfd_h_get_32 (abfd, buf + 60);
1379 seg->locreloff = bfd_h_get_32 (abfd, buf + 64);
1380 seg->nlocrel = bfd_h_get_32 (abfd, buf + 68);
1381
1382 return 0;
1383 }
1384
1385 static int
1386 bfd_mach_o_scan_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
1387 {
1388 bfd_mach_o_symtab_command *seg = &command->command.symtab;
1389 unsigned char buf[16];
1390 asection *bfdsec;
1391 char *sname;
1392 const char *prefix = "LC_SYMTAB.stabs";
1393 int nlist_size = (bfd_mach_o_version (abfd) > 1) ? 16 : 12;
1394
1395 BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
1396
1397 bfd_seek (abfd, command->offset + 8, SEEK_SET);
1398 if (bfd_bread ((PTR) buf, 16, abfd) != 16)
1399 return -1;
1400
1401 seg->symoff = bfd_h_get_32 (abfd, buf);
1402 seg->nsyms = bfd_h_get_32 (abfd, buf + 4);
1403 seg->stroff = bfd_h_get_32 (abfd, buf + 8);
1404 seg->strsize = bfd_h_get_32 (abfd, buf + 12);
1405 seg->symbols = NULL;
1406 seg->strtab = NULL;
1407
1408 sname = bfd_alloc (abfd, strlen (prefix) + 1);
1409 if (sname == NULL)
1410 return -1;
1411 strcpy (sname, prefix);
1412
1413 bfdsec = bfd_make_section_anyway_with_flags (abfd, sname, SEC_HAS_CONTENTS);
1414 if (bfdsec == NULL)
1415 return -1;
1416
1417 bfdsec->vma = 0;
1418 bfdsec->lma = 0;
1419 bfdsec->size = seg->nsyms * nlist_size;
1420 bfdsec->filepos = seg->symoff;
1421 bfdsec->alignment_power = 0;
1422
1423 seg->stabs_segment = bfdsec;
1424
1425 prefix = "LC_SYMTAB.stabstr";
1426 sname = bfd_alloc (abfd, strlen (prefix) + 1);
1427 if (sname == NULL)
1428 return -1;
1429 strcpy (sname, prefix);
1430
1431 bfdsec = bfd_make_section_anyway_with_flags (abfd, sname, SEC_HAS_CONTENTS);
1432 if (bfdsec == NULL)
1433 return -1;
1434
1435 bfdsec->vma = 0;
1436 bfdsec->lma = 0;
1437 bfdsec->size = seg->strsize;
1438 bfdsec->filepos = seg->stroff;
1439 bfdsec->alignment_power = 0;
1440
1441 seg->stabstr_segment = bfdsec;
1442
1443 return 0;
1444 }
1445
1446 static int
1447 bfd_mach_o_scan_read_segment (bfd *abfd,
1448 bfd_mach_o_load_command *command,
1449 unsigned int wide)
1450 {
1451 unsigned char buf[64];
1452 bfd_mach_o_segment_command *seg = &command->command.segment;
1453 unsigned long i;
1454 asection *bfdsec;
1455 char *sname;
1456 const char *prefix = "LC_SEGMENT";
1457 unsigned int snamelen;
1458
1459 if (wide)
1460 {
1461 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
1462
1463 bfd_seek (abfd, command->offset + 8, SEEK_SET);
1464 if (bfd_bread ((PTR) buf, 64, abfd) != 64)
1465 return -1;
1466
1467 memcpy (seg->segname, buf, 16);
1468
1469 seg->vmaddr = bfd_h_get_64 (abfd, buf + 16);
1470 seg->vmsize = bfd_h_get_64 (abfd, buf + 24);
1471 seg->fileoff = bfd_h_get_64 (abfd, buf + 32);
1472 seg->filesize = bfd_h_get_64 (abfd, buf + 40);
1473 seg->maxprot = bfd_h_get_32 (abfd, buf + 48);
1474 seg->initprot = bfd_h_get_32 (abfd, buf + 52);
1475 seg->nsects = bfd_h_get_32 (abfd, buf + 56);
1476 seg->flags = bfd_h_get_32 (abfd, buf + 60);
1477 }
1478 else
1479 {
1480 BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
1481
1482 bfd_seek (abfd, command->offset + 8, SEEK_SET);
1483 if (bfd_bread ((PTR) buf, 48, abfd) != 48)
1484 return -1;
1485
1486 memcpy (seg->segname, buf, 16);
1487
1488 seg->vmaddr = bfd_h_get_32 (abfd, buf + 16);
1489 seg->vmsize = bfd_h_get_32 (abfd, buf + 20);
1490 seg->fileoff = bfd_h_get_32 (abfd, buf + 24);
1491 seg->filesize = bfd_h_get_32 (abfd, buf + 28);
1492 seg->maxprot = bfd_h_get_32 (abfd, buf + 32);
1493 seg->initprot = bfd_h_get_32 (abfd, buf + 36);
1494 seg->nsects = bfd_h_get_32 (abfd, buf + 40);
1495 seg->flags = bfd_h_get_32 (abfd, buf + 44);
1496 }
1497
1498 snamelen = strlen (prefix) + 1 + strlen (seg->segname) + 1;
1499 sname = bfd_alloc (abfd, snamelen);
1500 if (sname == NULL)
1501 return -1;
1502 sprintf (sname, "%s.%s", prefix, seg->segname);
1503
1504 bfdsec = bfd_make_section_anyway (abfd, sname);
1505 if (bfdsec == NULL)
1506 return -1;
1507
1508 bfdsec->vma = seg->vmaddr;
1509 bfdsec->lma = seg->vmaddr;
1510 bfdsec->size = seg->filesize;
1511 bfdsec->filepos = seg->fileoff;
1512 bfdsec->alignment_power = 0x0;
1513 bfdsec->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC | SEC_CODE;
1514 bfdsec->segment_mark = 1;
1515
1516 seg->segment = bfdsec;
1517
1518 if (seg->nsects != 0)
1519 {
1520 seg->sections = bfd_alloc (abfd, seg->nsects * sizeof (bfd_mach_o_section));
1521 if (seg->sections == NULL)
1522 return -1;
1523
1524 for (i = 0; i < seg->nsects; i++)
1525 {
1526 bfd_vma segoff;
1527 if (wide)
1528 segoff = command->offset + 64 + 8 + (i * 80);
1529 else
1530 segoff = command->offset + 48 + 8 + (i * 68);
1531
1532 if (bfd_mach_o_scan_read_section
1533 (abfd, &seg->sections[i], segoff, wide) != 0)
1534 return -1;
1535 }
1536 }
1537
1538 return 0;
1539 }
1540
1541 static int
1542 bfd_mach_o_scan_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
1543 {
1544 return bfd_mach_o_scan_read_segment (abfd, command, 0);
1545 }
1546
1547 static int
1548 bfd_mach_o_scan_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
1549 {
1550 return bfd_mach_o_scan_read_segment (abfd, command, 1);
1551 }
1552
1553 static int
1554 bfd_mach_o_scan_read_command (bfd *abfd, bfd_mach_o_load_command *command)
1555 {
1556 unsigned char buf[8];
1557
1558 bfd_seek (abfd, command->offset, SEEK_SET);
1559 if (bfd_bread ((PTR) buf, 8, abfd) != 8)
1560 return -1;
1561
1562 command->type = (bfd_h_get_32 (abfd, buf) & ~BFD_MACH_O_LC_REQ_DYLD);
1563 command->type_required = (bfd_h_get_32 (abfd, buf) & BFD_MACH_O_LC_REQ_DYLD
1564 ? 1 : 0);
1565 command->len = bfd_h_get_32 (abfd, buf + 4);
1566
1567 switch (command->type)
1568 {
1569 case BFD_MACH_O_LC_SEGMENT:
1570 if (bfd_mach_o_scan_read_segment_32 (abfd, command) != 0)
1571 return -1;
1572 break;
1573 case BFD_MACH_O_LC_SEGMENT_64:
1574 if (bfd_mach_o_scan_read_segment_64 (abfd, command) != 0)
1575 return -1;
1576 break;
1577 case BFD_MACH_O_LC_SYMTAB:
1578 if (bfd_mach_o_scan_read_symtab (abfd, command) != 0)
1579 return -1;
1580 break;
1581 case BFD_MACH_O_LC_SYMSEG:
1582 break;
1583 case BFD_MACH_O_LC_THREAD:
1584 case BFD_MACH_O_LC_UNIXTHREAD:
1585 if (bfd_mach_o_scan_read_thread (abfd, command) != 0)
1586 return -1;
1587 break;
1588 case BFD_MACH_O_LC_LOAD_DYLINKER:
1589 case BFD_MACH_O_LC_ID_DYLINKER:
1590 if (bfd_mach_o_scan_read_dylinker (abfd, command) != 0)
1591 return -1;
1592 break;
1593 case BFD_MACH_O_LC_LOAD_DYLIB:
1594 case BFD_MACH_O_LC_ID_DYLIB:
1595 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1596 if (bfd_mach_o_scan_read_dylib (abfd, command) != 0)
1597 return -1;
1598 break;
1599 case BFD_MACH_O_LC_PREBOUND_DYLIB:
1600 if (bfd_mach_o_scan_read_prebound_dylib (abfd, command) != 0)
1601 return -1;
1602 break;
1603 case BFD_MACH_O_LC_LOADFVMLIB:
1604 case BFD_MACH_O_LC_IDFVMLIB:
1605 case BFD_MACH_O_LC_IDENT:
1606 case BFD_MACH_O_LC_FVMFILE:
1607 case BFD_MACH_O_LC_PREPAGE:
1608 case BFD_MACH_O_LC_ROUTINES:
1609 case BFD_MACH_O_LC_SUB_FRAMEWORK:
1610 break;
1611 case BFD_MACH_O_LC_DYSYMTAB:
1612 if (bfd_mach_o_scan_read_dysymtab (abfd, command) != 0)
1613 return -1;
1614 break;
1615 case BFD_MACH_O_LC_SUB_UMBRELLA:
1616 case BFD_MACH_O_LC_SUB_CLIENT:
1617 case BFD_MACH_O_LC_SUB_LIBRARY:
1618 case BFD_MACH_O_LC_TWOLEVEL_HINTS:
1619 case BFD_MACH_O_LC_PREBIND_CKSUM:
1620 break;
1621 default:
1622 fprintf (stderr, "unable to read unknown load command 0x%lx\n",
1623 (unsigned long) command->type);
1624 break;
1625 }
1626
1627 return 0;
1628 }
1629
1630 static void
1631 bfd_mach_o_flatten_sections (bfd *abfd)
1632 {
1633 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
1634 long csect = 0;
1635 unsigned long i, j;
1636
1637 mdata->nsects = 0;
1638
1639 for (i = 0; i < mdata->header.ncmds; i++)
1640 {
1641 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
1642 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
1643 {
1644 bfd_mach_o_segment_command *seg;
1645
1646 seg = &mdata->commands[i].command.segment;
1647 mdata->nsects += seg->nsects;
1648 }
1649 }
1650
1651 mdata->sections = bfd_alloc (abfd,
1652 mdata->nsects * sizeof (bfd_mach_o_section *));
1653 csect = 0;
1654
1655 for (i = 0; i < mdata->header.ncmds; i++)
1656 {
1657 if (mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT
1658 || mdata->commands[i].type == BFD_MACH_O_LC_SEGMENT_64)
1659 {
1660 bfd_mach_o_segment_command *seg;
1661
1662 seg = &mdata->commands[i].command.segment;
1663 BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
1664
1665 for (j = 0; j < seg->nsects; j++)
1666 mdata->sections[csect++] = &seg->sections[j];
1667 }
1668 }
1669 }
1670
1671 int
1672 bfd_mach_o_scan_start_address (bfd *abfd)
1673 {
1674 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
1675 bfd_mach_o_thread_command *cmd = NULL;
1676 unsigned long i;
1677
1678 for (i = 0; i < mdata->header.ncmds; i++)
1679 {
1680 if ((mdata->commands[i].type == BFD_MACH_O_LC_THREAD) ||
1681 (mdata->commands[i].type == BFD_MACH_O_LC_UNIXTHREAD))
1682 {
1683 if (cmd == NULL)
1684 cmd = &mdata->commands[i].command.thread;
1685 else
1686 return 0;
1687 }
1688 }
1689
1690 if (cmd == NULL)
1691 return 0;
1692
1693 for (i = 0; i < cmd->nflavours; i++)
1694 {
1695 if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
1696 && (cmd->flavours[i].flavour
1697 == (unsigned long) BFD_MACH_O_i386_THREAD_STATE))
1698 {
1699 unsigned char buf[4];
1700
1701 bfd_seek (abfd, cmd->flavours[i].offset + 40, SEEK_SET);
1702
1703 if (bfd_bread (buf, 4, abfd) != 4)
1704 return -1;
1705
1706 abfd->start_address = bfd_h_get_32 (abfd, buf);
1707 }
1708 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
1709 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
1710 {
1711 unsigned char buf[4];
1712
1713 bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET);
1714
1715 if (bfd_bread (buf, 4, abfd) != 4)
1716 return -1;
1717
1718 abfd->start_address = bfd_h_get_32 (abfd, buf);
1719 }
1720 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
1721 && (cmd->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE_64))
1722 {
1723 unsigned char buf[8];
1724
1725 bfd_seek (abfd, cmd->flavours[i].offset + 0, SEEK_SET);
1726
1727 if (bfd_bread (buf, 8, abfd) != 8)
1728 return -1;
1729
1730 abfd->start_address = bfd_h_get_64 (abfd, buf);
1731 }
1732 else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
1733 && (cmd->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
1734 {
1735 unsigned char buf[8];
1736
1737 bfd_seek (abfd, cmd->flavours[i].offset + (16 * 8), SEEK_SET);
1738
1739 if (bfd_bread (buf, 8, abfd) != 8)
1740 return -1;
1741
1742 abfd->start_address = bfd_h_get_64 (abfd, buf);
1743 }
1744 }
1745
1746 return 0;
1747 }
1748
1749 int
1750 bfd_mach_o_scan (bfd *abfd,
1751 bfd_mach_o_header *header,
1752 bfd_mach_o_data_struct *mdata)
1753 {
1754 unsigned int i;
1755 enum bfd_architecture cputype;
1756 unsigned long cpusubtype;
1757 unsigned int hdrsize;
1758
1759 hdrsize = (header->version == 2) ? 32 : 28;
1760
1761 mdata->header = *header;
1762 mdata->symbols = NULL;
1763
1764 abfd->flags = (abfd->xvec->object_flags
1765 | (abfd->flags & (BFD_IN_MEMORY | BFD_IO_FUNCS)));
1766 abfd->tdata.mach_o_data = mdata;
1767
1768 bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
1769 &cputype, &cpusubtype);
1770 if (cputype == bfd_arch_unknown)
1771 {
1772 fprintf (stderr, "bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx\n",
1773 header->cputype, header->cpusubtype);
1774 return -1;
1775 }
1776
1777 bfd_set_arch_mach (abfd, cputype, cpusubtype);
1778
1779 if (header->ncmds != 0)
1780 {
1781 mdata->commands = bfd_alloc (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
1782 if (mdata->commands == NULL)
1783 return -1;
1784
1785 for (i = 0; i < header->ncmds; i++)
1786 {
1787 bfd_mach_o_load_command *cur = &mdata->commands[i];
1788
1789 if (i == 0)
1790 cur->offset = hdrsize;
1791 else
1792 {
1793 bfd_mach_o_load_command *prev = &mdata->commands[i - 1];
1794 cur->offset = prev->offset + prev->len;
1795 }
1796
1797 if (bfd_mach_o_scan_read_command (abfd, cur) < 0)
1798 return -1;
1799 }
1800 }
1801
1802 if (bfd_mach_o_scan_start_address (abfd) < 0)
1803 return -1;
1804
1805 bfd_mach_o_flatten_sections (abfd);
1806 return 0;
1807 }
1808
1809 bfd_boolean
1810 bfd_mach_o_mkobject (bfd *abfd)
1811 {
1812 bfd_mach_o_data_struct *mdata = NULL;
1813
1814 mdata = bfd_alloc (abfd, sizeof (bfd_mach_o_data_struct));
1815 if (mdata == NULL)
1816 return FALSE;
1817 abfd->tdata.mach_o_data = mdata;
1818
1819 mdata->header.magic = 0;
1820 mdata->header.cputype = 0;
1821 mdata->header.cpusubtype = 0;
1822 mdata->header.filetype = 0;
1823 mdata->header.ncmds = 0;
1824 mdata->header.sizeofcmds = 0;
1825 mdata->header.flags = 0;
1826 mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
1827 mdata->commands = NULL;
1828 mdata->nsymbols = 0;
1829 mdata->symbols = NULL;
1830 mdata->nsects = 0;
1831 mdata->sections = NULL;
1832 mdata->ibfd = NULL;
1833
1834 return TRUE;
1835 }
1836
1837 const bfd_target *
1838 bfd_mach_o_object_p (bfd *abfd)
1839 {
1840 struct bfd_preserve preserve;
1841 bfd_mach_o_header header;
1842
1843 preserve.marker = NULL;
1844 if (bfd_mach_o_read_header (abfd, &header) != 0)
1845 goto wrong;
1846
1847 if (! (header.byteorder == BFD_ENDIAN_BIG
1848 || header.byteorder == BFD_ENDIAN_LITTLE))
1849 {
1850 fprintf (stderr, "unknown header byte-order value 0x%lx\n",
1851 (unsigned long) header.byteorder);
1852 goto wrong;
1853 }
1854
1855 if (! ((header.byteorder == BFD_ENDIAN_BIG
1856 && abfd->xvec->byteorder == BFD_ENDIAN_BIG
1857 && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
1858 || (header.byteorder == BFD_ENDIAN_LITTLE
1859 && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
1860 && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
1861 goto wrong;
1862
1863 preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
1864 if (preserve.marker == NULL
1865 || !bfd_preserve_save (abfd, &preserve))
1866 goto fail;
1867
1868 if (bfd_mach_o_scan (abfd, &header,
1869 (bfd_mach_o_data_struct *) preserve.marker) != 0)
1870 goto wrong;
1871
1872 bfd_preserve_finish (abfd, &preserve);
1873 return abfd->xvec;
1874
1875 wrong:
1876 bfd_set_error (bfd_error_wrong_format);
1877
1878 fail:
1879 if (preserve.marker != NULL)
1880 bfd_preserve_restore (abfd, &preserve);
1881 return NULL;
1882 }
1883
1884 const bfd_target *
1885 bfd_mach_o_core_p (bfd *abfd)
1886 {
1887 struct bfd_preserve preserve;
1888 bfd_mach_o_header header;
1889
1890 preserve.marker = NULL;
1891 if (bfd_mach_o_read_header (abfd, &header) != 0)
1892 goto wrong;
1893
1894 if (! (header.byteorder == BFD_ENDIAN_BIG
1895 || header.byteorder == BFD_ENDIAN_LITTLE))
1896 {
1897 fprintf (stderr, "unknown header byte-order value 0x%lx\n",
1898 (unsigned long) header.byteorder);
1899 abort ();
1900 }
1901
1902 if (! ((header.byteorder == BFD_ENDIAN_BIG
1903 && abfd->xvec->byteorder == BFD_ENDIAN_BIG
1904 && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
1905 || (header.byteorder == BFD_ENDIAN_LITTLE
1906 && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
1907 && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
1908 goto wrong;
1909
1910 if (header.filetype != BFD_MACH_O_MH_CORE)
1911 goto wrong;
1912
1913 preserve.marker = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
1914 if (preserve.marker == NULL
1915 || !bfd_preserve_save (abfd, &preserve))
1916 goto fail;
1917
1918 if (bfd_mach_o_scan (abfd, &header,
1919 (bfd_mach_o_data_struct *) preserve.marker) != 0)
1920 goto wrong;
1921
1922 bfd_preserve_finish (abfd, &preserve);
1923 return abfd->xvec;
1924
1925 wrong:
1926 bfd_set_error (bfd_error_wrong_format);
1927
1928 fail:
1929 if (preserve.marker != NULL)
1930 bfd_preserve_restore (abfd, &preserve);
1931 return NULL;
1932 }
1933
1934 typedef struct mach_o_fat_archentry
1935 {
1936 unsigned long cputype;
1937 unsigned long cpusubtype;
1938 unsigned long offset;
1939 unsigned long size;
1940 unsigned long align;
1941 bfd *abfd;
1942 } mach_o_fat_archentry;
1943
1944 typedef struct mach_o_fat_data_struct
1945 {
1946 unsigned long magic;
1947 unsigned long nfat_arch;
1948 mach_o_fat_archentry *archentries;
1949 } mach_o_fat_data_struct;
1950
1951 const bfd_target *
1952 bfd_mach_o_archive_p (bfd *abfd)
1953 {
1954 mach_o_fat_data_struct *adata = NULL;
1955 unsigned char buf[20];
1956 unsigned long i;
1957
1958 bfd_seek (abfd, 0, SEEK_SET);
1959 if (bfd_bread ((PTR) buf, 8, abfd) != 8)
1960 goto error;
1961
1962 adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
1963 if (adata == NULL)
1964 goto error;
1965
1966 adata->magic = bfd_getb32 (buf);
1967 adata->nfat_arch = bfd_getb32 (buf + 4);
1968 if (adata->magic != 0xcafebabe)
1969 goto error;
1970
1971 adata->archentries =
1972 bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
1973 if (adata->archentries == NULL)
1974 goto error;
1975
1976 for (i = 0; i < adata->nfat_arch; i++)
1977 {
1978 bfd_seek (abfd, 8 + 20 * i, SEEK_SET);
1979
1980 if (bfd_bread ((PTR) buf, 20, abfd) != 20)
1981 goto error;
1982 adata->archentries[i].cputype = bfd_getb32 (buf);
1983 adata->archentries[i].cpusubtype = bfd_getb32 (buf + 4);
1984 adata->archentries[i].offset = bfd_getb32 (buf + 8);
1985 adata->archentries[i].size = bfd_getb32 (buf + 12);
1986 adata->archentries[i].align = bfd_getb32 (buf + 16);
1987 adata->archentries[i].abfd = NULL;
1988 }
1989
1990 abfd->tdata.mach_o_fat_data = adata;
1991 return abfd->xvec;
1992
1993 error:
1994 if (adata != NULL)
1995 bfd_release (abfd, adata);
1996 bfd_set_error (bfd_error_wrong_format);
1997 return NULL;
1998 }
1999
2000 bfd *
2001 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
2002 {
2003 mach_o_fat_data_struct *adata;
2004 mach_o_fat_archentry *entry = NULL;
2005 unsigned long i;
2006
2007 adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
2008 BFD_ASSERT (adata != NULL);
2009
2010 /* Find index of previous entry. */
2011 if (prev == NULL)
2012 i = 0; /* Start at first one. */
2013 else
2014 {
2015 for (i = 0; i < adata->nfat_arch; i++)
2016 {
2017 if (adata->archentries[i].abfd == prev)
2018 break;
2019 }
2020
2021 if (i == adata->nfat_arch)
2022 {
2023 /* Not found. */
2024 bfd_set_error (bfd_error_bad_value);
2025 return NULL;
2026 }
2027 i++; /* Get next entry. */
2028 }
2029
2030 if (i >= adata->nfat_arch)
2031 {
2032 bfd_set_error (bfd_error_no_more_archived_files);
2033 return NULL;
2034 }
2035
2036 entry = &adata->archentries[i];
2037 if (entry->abfd == NULL)
2038 {
2039 bfd *nbfd = _bfd_new_bfd_contained_in (archive);
2040 char *s = NULL;
2041
2042 if (nbfd == NULL)
2043 return NULL;
2044
2045 nbfd->origin = entry->offset;
2046 s = bfd_malloc (strlen (archive->filename) + 1);
2047 if (s == NULL)
2048 return NULL;
2049 strcpy (s, archive->filename);
2050 nbfd->filename = s;
2051 nbfd->iostream = NULL;
2052 entry->abfd = nbfd;
2053 }
2054
2055 return entry->abfd;
2056 }
2057
2058 int
2059 bfd_mach_o_lookup_section (bfd *abfd,
2060 asection *section,
2061 bfd_mach_o_load_command **mcommand,
2062 bfd_mach_o_section **msection)
2063 {
2064 struct mach_o_data_struct *md = abfd->tdata.mach_o_data;
2065 unsigned int i, j, num;
2066
2067 bfd_mach_o_load_command *ncmd = NULL;
2068 bfd_mach_o_section *nsect = NULL;
2069
2070 BFD_ASSERT (mcommand != NULL);
2071 BFD_ASSERT (msection != NULL);
2072
2073 num = 0;
2074 for (i = 0; i < md->header.ncmds; i++)
2075 {
2076 struct bfd_mach_o_load_command *cmd = &md->commands[i];
2077 struct bfd_mach_o_segment_command *seg = NULL;
2078
2079 if (cmd->type != BFD_MACH_O_LC_SEGMENT
2080 || cmd->type != BFD_MACH_O_LC_SEGMENT_64)
2081 continue;
2082 seg = &cmd->command.segment;
2083
2084 if (seg->segment == section)
2085 {
2086 if (num == 0)
2087 ncmd = cmd;
2088 num++;
2089 }
2090
2091 for (j = 0; j < seg->nsects; j++)
2092 {
2093 struct bfd_mach_o_section *sect = &seg->sections[j];
2094
2095 if (sect->bfdsection == section)
2096 {
2097 if (num == 0)
2098 nsect = sect;
2099 num++;
2100 }
2101 }
2102 }
2103
2104 *mcommand = ncmd;
2105 *msection = nsect;
2106 return num;
2107 }
2108
2109 int
2110 bfd_mach_o_lookup_command (bfd *abfd,
2111 bfd_mach_o_load_command_type type,
2112 bfd_mach_o_load_command **mcommand)
2113 {
2114 struct mach_o_data_struct *md = NULL;
2115 bfd_mach_o_load_command *ncmd = NULL;
2116 unsigned int i, num;
2117
2118 md = abfd->tdata.mach_o_data;
2119
2120 BFD_ASSERT (md != NULL);
2121 BFD_ASSERT (mcommand != NULL);
2122
2123 num = 0;
2124 for (i = 0; i < md->header.ncmds; i++)
2125 {
2126 struct bfd_mach_o_load_command *cmd = &md->commands[i];
2127
2128 if (cmd->type != type)
2129 continue;
2130
2131 if (num == 0)
2132 ncmd = cmd;
2133 num++;
2134 }
2135
2136 *mcommand = ncmd;
2137 return num;
2138 }
2139
2140 unsigned long
2141 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
2142 {
2143 switch (type)
2144 {
2145 case BFD_MACH_O_CPU_TYPE_MC680x0:
2146 return 0x04000000;
2147 case BFD_MACH_O_CPU_TYPE_MC88000:
2148 return 0xffffe000;
2149 case BFD_MACH_O_CPU_TYPE_POWERPC:
2150 return 0xc0000000;
2151 case BFD_MACH_O_CPU_TYPE_I386:
2152 return 0xc0000000;
2153 case BFD_MACH_O_CPU_TYPE_SPARC:
2154 return 0xf0000000;
2155 case BFD_MACH_O_CPU_TYPE_I860:
2156 return 0;
2157 case BFD_MACH_O_CPU_TYPE_HPPA:
2158 return 0xc0000000 - 0x04000000;
2159 default:
2160 return 0;
2161 }
2162 }
2163
2164 int
2165 bfd_mach_o_core_fetch_environment (bfd *abfd,
2166 unsigned char **rbuf,
2167 unsigned int *rlen)
2168 {
2169 bfd_mach_o_data_struct *mdata = abfd->tdata.mach_o_data;
2170 unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
2171 unsigned int i = 0;
2172
2173 for (i = 0; i < mdata->header.ncmds; i++)
2174 {
2175 bfd_mach_o_load_command *cur = &mdata->commands[i];
2176 bfd_mach_o_segment_command *seg = NULL;
2177
2178 if (cur->type != BFD_MACH_O_LC_SEGMENT)
2179 continue;
2180
2181 seg = &cur->command.segment;
2182
2183 if ((seg->vmaddr + seg->vmsize) == stackaddr)
2184 {
2185 unsigned long start = seg->fileoff;
2186 unsigned long end = seg->fileoff + seg->filesize;
2187 unsigned char *buf = bfd_malloc (1024);
2188 unsigned long size = 1024;
2189
2190 for (;;)
2191 {
2192 bfd_size_type nread = 0;
2193 unsigned long offset;
2194 int found_nonnull = 0;
2195
2196 if (size > (end - start))
2197 size = (end - start);
2198
2199 buf = bfd_realloc_or_free (buf, size);
2200 if (buf == NULL)
2201 return -1;
2202
2203 bfd_seek (abfd, end - size, SEEK_SET);
2204 nread = bfd_bread (buf, size, abfd);
2205
2206 if (nread != size)
2207 {
2208 free (buf);
2209 return -1;
2210 }
2211
2212 for (offset = 4; offset <= size; offset += 4)
2213 {
2214 unsigned long val;
2215
2216 val = *((unsigned long *) (buf + size - offset));
2217 if (! found_nonnull)
2218 {
2219 if (val != 0)
2220 found_nonnull = 1;
2221 }
2222 else if (val == 0x0)
2223 {
2224 unsigned long bottom;
2225 unsigned long top;
2226
2227 bottom = seg->fileoff + seg->filesize - offset;
2228 top = seg->fileoff + seg->filesize - 4;
2229 *rbuf = bfd_malloc (top - bottom);
2230 *rlen = top - bottom;
2231
2232 memcpy (*rbuf, buf + size - *rlen, *rlen);
2233 free (buf);
2234 return 0;
2235 }
2236 }
2237
2238 if (size == (end - start))
2239 break;
2240
2241 size *= 2;
2242 }
2243
2244 free (buf);
2245 }
2246 }
2247
2248 return -1;
2249 }
2250
2251 char *
2252 bfd_mach_o_core_file_failing_command (bfd *abfd)
2253 {
2254 unsigned char *buf = NULL;
2255 unsigned int len = 0;
2256 int ret = -1;
2257
2258 ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
2259 if (ret < 0)
2260 return NULL;
2261
2262 return (char *) buf;
2263 }
2264
2265 int
2266 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
2267 {
2268 return 0;
2269 }
2270
2271 #define TARGET_NAME mach_o_be_vec
2272 #define TARGET_STRING "mach-o-be"
2273 #define TARGET_BIG_ENDIAN 1
2274 #define TARGET_ARCHIVE 0
2275
2276 #include "mach-o-target.c"
2277
2278 #undef TARGET_NAME
2279 #undef TARGET_STRING
2280 #undef TARGET_BIG_ENDIAN
2281 #undef TARGET_ARCHIVE
2282
2283 #define TARGET_NAME mach_o_le_vec
2284 #define TARGET_STRING "mach-o-le"
2285 #define TARGET_BIG_ENDIAN 0
2286 #define TARGET_ARCHIVE 0
2287
2288 #include "mach-o-target.c"
2289
2290 #undef TARGET_NAME
2291 #undef TARGET_STRING
2292 #undef TARGET_BIG_ENDIAN
2293 #undef TARGET_ARCHIVE
2294
2295 #define TARGET_NAME mach_o_fat_vec
2296 #define TARGET_STRING "mach-o-fat"
2297 #define TARGET_BIG_ENDIAN 1
2298 #define TARGET_ARCHIVE 1
2299
2300 #include "mach-o-target.c"
2301
2302 #undef TARGET_NAME
2303 #undef TARGET_STRING
2304 #undef TARGET_BIG_ENDIAN
2305 #undef TARGET_ARCHIVE
This page took 0.174132 seconds and 4 git commands to generate.