1/* Mach-O support for BFD.
2   Copyright (C) 1999-2020 Free Software Foundation, Inc.
3
4   This file is part of BFD, the Binary File Descriptor library.
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 3 of the License, or
9   (at your option) any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19   MA 02110-1301, USA.  */
20
21#include "sysdep.h"
22#include <limits.h>
23#include "bfd.h"
24#include "libbfd.h"
25#include "libiberty.h"
26#include "mach-o.h"
27#include "aout/stab_gnu.h"
28#include "mach-o/reloc.h"
29#include "mach-o/external.h"
30#include <ctype.h>
31#include <stdlib.h>
32#include <string.h>
33
34#define bfd_mach_o_object_p bfd_mach_o_gen_object_p
35#define bfd_mach_o_core_p bfd_mach_o_gen_core_p
36#define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject
37
38#define FILE_ALIGN(off, algn) \
39  (((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1U << (algn)))
40
41static bfd_boolean
42bfd_mach_o_read_dyld_content (bfd *abfd, bfd_mach_o_dyld_info_command *cmd);
43
44unsigned int
45bfd_mach_o_version (bfd *abfd)
46{
47  bfd_mach_o_data_struct *mdata = NULL;
48
49  BFD_ASSERT (bfd_mach_o_valid (abfd));
50  mdata = bfd_mach_o_get_data (abfd);
51
52  return mdata->header.version;
53}
54
55bfd_boolean
56bfd_mach_o_valid (bfd *abfd)
57{
58  if (abfd == NULL || abfd->xvec == NULL)
59    return FALSE;
60
61  if (abfd->xvec->flavour != bfd_target_mach_o_flavour)
62    return FALSE;
63
64  if (bfd_mach_o_get_data (abfd) == NULL)
65    return FALSE;
66  return TRUE;
67}
68
69static INLINE bfd_boolean
70mach_o_wide_p (bfd_mach_o_header *header)
71{
72  switch (header->version)
73    {
74    case 1:
75      return FALSE;
76    case 2:
77      return TRUE;
78    default:
79      BFD_FAIL ();
80      return FALSE;
81    }
82}
83
84static INLINE bfd_boolean
85bfd_mach_o_wide_p (bfd *abfd)
86{
87  return mach_o_wide_p (&bfd_mach_o_get_data (abfd)->header);
88}
89
90/* Tables to translate well known Mach-O segment/section names to bfd
91   names.  Use of canonical names (such as .text or .debug_frame) is required
92   by gdb.  */
93
94/* __TEXT Segment.  */
95static const mach_o_section_name_xlat text_section_names_xlat[] =
96  {
97    {	".text",				"__text",
98	SEC_CODE | SEC_LOAD,			BFD_MACH_O_S_REGULAR,
99	BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS,	0},
100    {	".const",				"__const",
101	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_REGULAR,
102	BFD_MACH_O_S_ATTR_NONE,			0},
103    {	".static_const",			"__static_const",
104	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_REGULAR,
105	BFD_MACH_O_S_ATTR_NONE,			0},
106    {	".cstring",				"__cstring",
107	SEC_READONLY | SEC_DATA | SEC_LOAD | SEC_MERGE | SEC_STRINGS,
108						BFD_MACH_O_S_CSTRING_LITERALS,
109	BFD_MACH_O_S_ATTR_NONE,			0},
110    {	".literal4",				"__literal4",
111	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_4BYTE_LITERALS,
112	BFD_MACH_O_S_ATTR_NONE,			2},
113    {	".literal8",				"__literal8",
114	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_8BYTE_LITERALS,
115	BFD_MACH_O_S_ATTR_NONE,			3},
116    {	".literal16",				"__literal16",
117	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_16BYTE_LITERALS,
118	BFD_MACH_O_S_ATTR_NONE,			4},
119    {	".constructor",				"__constructor",
120	SEC_CODE | SEC_LOAD,			BFD_MACH_O_S_REGULAR,
121	BFD_MACH_O_S_ATTR_NONE,			0},
122    {	".destructor",				"__destructor",
123	SEC_CODE | SEC_LOAD,			BFD_MACH_O_S_REGULAR,
124	BFD_MACH_O_S_ATTR_NONE,			0},
125    {	".eh_frame",				"__eh_frame",
126	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_COALESCED,
127	BFD_MACH_O_S_ATTR_LIVE_SUPPORT
128	| BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS
129	| BFD_MACH_O_S_ATTR_NO_TOC,		2},
130    { NULL, NULL, 0, 0, 0, 0}
131  };
132
133/* __DATA Segment.  */
134static const mach_o_section_name_xlat data_section_names_xlat[] =
135  {
136    {	".data",			"__data",
137	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
138	BFD_MACH_O_S_ATTR_NONE,		0},
139    {	".bss",				"__bss",
140	SEC_NO_FLAGS,			BFD_MACH_O_S_ZEROFILL,
141	BFD_MACH_O_S_ATTR_NONE,		0},
142    {	".const_data",			"__const",
143	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
144	BFD_MACH_O_S_ATTR_NONE,		0},
145    {	".static_data",			"__static_data",
146	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
147	BFD_MACH_O_S_ATTR_NONE,		0},
148    {	".mod_init_func",		"__mod_init_func",
149	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS,
150	BFD_MACH_O_S_ATTR_NONE,		2},
151    {	".mod_term_func",		"__mod_term_func",
152	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS,
153	BFD_MACH_O_S_ATTR_NONE,		2},
154    {	".dyld",			"__dyld",
155	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
156	BFD_MACH_O_S_ATTR_NONE,		0},
157    {	".cfstring",			"__cfstring",
158	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
159	BFD_MACH_O_S_ATTR_NONE,		2},
160    { NULL, NULL, 0, 0, 0, 0}
161  };
162
163/* __DWARF Segment.  */
164static const mach_o_section_name_xlat dwarf_section_names_xlat[] =
165  {
166    {	".debug_frame",			"__debug_frame",
167	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
168	BFD_MACH_O_S_ATTR_DEBUG,	0},
169    {	".debug_info",			"__debug_info",
170	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
171	BFD_MACH_O_S_ATTR_DEBUG,	0},
172    {	".debug_abbrev",		"__debug_abbrev",
173	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
174	BFD_MACH_O_S_ATTR_DEBUG,	0},
175    {	".debug_aranges",		"__debug_aranges",
176	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
177	BFD_MACH_O_S_ATTR_DEBUG,	0},
178    {	".debug_macinfo",		"__debug_macinfo",
179	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
180	BFD_MACH_O_S_ATTR_DEBUG,	0},
181    {	".debug_line",			"__debug_line",
182	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
183	BFD_MACH_O_S_ATTR_DEBUG,	0},
184    {	".debug_loc",			"__debug_loc",
185	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
186	BFD_MACH_O_S_ATTR_DEBUG,	0},
187    {	".debug_pubnames",		"__debug_pubnames",
188	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
189	BFD_MACH_O_S_ATTR_DEBUG,	0},
190    {	".debug_pubtypes",		"__debug_pubtypes",
191	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
192	BFD_MACH_O_S_ATTR_DEBUG,	0},
193    {	".debug_str",			"__debug_str",
194	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
195	BFD_MACH_O_S_ATTR_DEBUG,	0},
196    {	".debug_ranges",		"__debug_ranges",
197	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
198	BFD_MACH_O_S_ATTR_DEBUG,	0},
199    {	".debug_macro",			"__debug_macro",
200	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
201	BFD_MACH_O_S_ATTR_DEBUG,	0},
202    {	".debug_gdb_scripts",		"__debug_gdb_scri",
203	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
204	BFD_MACH_O_S_ATTR_DEBUG,	0},
205    { NULL, NULL, 0, 0, 0, 0}
206  };
207
208/* __OBJC Segment.  */
209static const mach_o_section_name_xlat objc_section_names_xlat[] =
210  {
211    {	".objc_class",			"__class",
212	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
213	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
214    {	".objc_meta_class",		"__meta_class",
215	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
216	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
217    {	".objc_cat_cls_meth",		"__cat_cls_meth",
218	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
219	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
220    {	".objc_cat_inst_meth",		"__cat_inst_meth",
221	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
222	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
223    {	".objc_protocol",		"__protocol",
224	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
225	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
226    {	".objc_string_object",		"__string_object",
227	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
228	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
229    {	".objc_cls_meth",		"__cls_meth",
230	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
231	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
232    {	".objc_inst_meth",		"__inst_meth",
233	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
234	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
235    {	".objc_cls_refs",		"__cls_refs",
236	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_LITERAL_POINTERS,
237	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
238    {	".objc_message_refs",		"__message_refs",
239	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_LITERAL_POINTERS,
240	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
241    {	".objc_symbols",		"__symbols",
242	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
243	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
244    {	".objc_category",		"__category",
245	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
246	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
247    {	".objc_class_vars",		"__class_vars",
248	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
249	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
250    {	".objc_instance_vars",		"__instance_vars",
251	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
252	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
253    {	".objc_module_info",		"__module_info",
254	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
255	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
256    {	".objc_selector_strs",		"__selector_strs",
257	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_CSTRING_LITERALS,
258	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
259    {	".objc_image_info",		"__image_info",
260	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
261	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
262    {	".objc_selector_fixup",		"__sel_fixup",
263	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
264	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
265    /* Objc V1 */
266    {	".objc1_class_ext",		"__class_ext",
267	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
268	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
269    {	".objc1_property_list",		"__property",
270	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
271	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
272    {	".objc1_protocol_ext",		"__protocol_ext",
273	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
274	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
275    { NULL, NULL, 0, 0, 0, 0}
276  };
277
278static const mach_o_segment_name_xlat segsec_names_xlat[] =
279  {
280    { "__TEXT", text_section_names_xlat },
281    { "__DATA", data_section_names_xlat },
282    { "__DWARF", dwarf_section_names_xlat },
283    { "__OBJC", objc_section_names_xlat },
284    { NULL, NULL }
285  };
286
287static const char dsym_subdir[] = ".dSYM/Contents/Resources/DWARF";
288
289/* For both cases bfd-name => mach-o name and vice versa, the specific target
290   is checked before the generic.  This allows a target (e.g. ppc for cstring)
291   to override the generic definition with a more specific one.  */
292
293/* Fetch the translation from a Mach-O section designation (segment, section)
294   as a bfd short name, if one exists.  Otherwise return NULL.
295
296   Allow the segment and section names to be unterminated 16 byte arrays.  */
297
298const mach_o_section_name_xlat *
299bfd_mach_o_section_data_for_mach_sect (bfd *abfd, const char *segname,
300				       const char *sectname)
301{
302  const struct mach_o_segment_name_xlat *seg;
303  const mach_o_section_name_xlat *sec;
304  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
305
306  /* First try any target-specific translations defined...  */
307  if (bed->segsec_names_xlat)
308    for (seg = bed->segsec_names_xlat; seg->segname; seg++)
309      if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
310	for (sec = seg->sections; sec->mach_o_name; sec++)
311	  if (strncmp (sec->mach_o_name, sectname,
312		       BFD_MACH_O_SECTNAME_SIZE) == 0)
313	    return sec;
314
315  /* ... and then the Mach-O generic ones.  */
316  for (seg = segsec_names_xlat; seg->segname; seg++)
317    if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
318      for (sec = seg->sections; sec->mach_o_name; sec++)
319	if (strncmp (sec->mach_o_name, sectname,
320		     BFD_MACH_O_SECTNAME_SIZE) == 0)
321	  return sec;
322
323  return NULL;
324}
325
326/* If the bfd_name for this section is a 'canonical' form for which we
327   know the Mach-O data, return the segment name and the data for the
328   Mach-O equivalent.  Otherwise return NULL.  */
329
330const mach_o_section_name_xlat *
331bfd_mach_o_section_data_for_bfd_name (bfd *abfd, const char *bfd_name,
332				      const char **segname)
333{
334  const struct mach_o_segment_name_xlat *seg;
335  const mach_o_section_name_xlat *sec;
336  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
337  *segname = NULL;
338
339  if (bfd_name[0] != '.')
340    return NULL;
341
342  /* First try any target-specific translations defined...  */
343  if (bed->segsec_names_xlat)
344    for (seg = bed->segsec_names_xlat; seg->segname; seg++)
345      for (sec = seg->sections; sec->bfd_name; sec++)
346	if (strcmp (bfd_name, sec->bfd_name) == 0)
347	  {
348	    *segname = seg->segname;
349	    return sec;
350	  }
351
352  /* ... and then the Mach-O generic ones.  */
353  for (seg = segsec_names_xlat; seg->segname; seg++)
354    for (sec = seg->sections; sec->bfd_name; sec++)
355      if (strcmp (bfd_name, sec->bfd_name) == 0)
356	{
357	  *segname = seg->segname;
358	  return sec;
359	}
360
361  return NULL;
362}
363
364/* Convert Mach-O section name to BFD.
365
366   Try to use standard/canonical names, for which we have tables including
367   default flag settings - which are returned.  Otherwise forge a new name
368   in the form "<segmentname>.<sectionname>" this will be prefixed with
369   LC_SEGMENT. if the segment name does not begin with an underscore.
370
371   SEGNAME and SECTNAME are 16 byte arrays (they do not need to be NUL-
372   terminated if the name length is exactly 16 bytes - but must be if the name
373   length is less than 16 characters).  */
374
375void
376bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, const char *segname,
377					const char *secname, const char **name,
378					flagword *flags)
379{
380  const mach_o_section_name_xlat *xlat;
381  char *res;
382  unsigned int len;
383  const char *pfx = "";
384
385  *name = NULL;
386  *flags = SEC_NO_FLAGS;
387
388  /* First search for a canonical name...
389     xlat will be non-null if there is an entry for segname, secname.  */
390  xlat = bfd_mach_o_section_data_for_mach_sect (abfd, segname, secname);
391  if (xlat)
392    {
393      len = strlen (xlat->bfd_name);
394      res = bfd_alloc (abfd, len + 1);
395      if (res == NULL)
396	return;
397      memcpy (res, xlat->bfd_name, len+1);
398      *name = res;
399      *flags = xlat->bfd_flags;
400      return;
401    }
402
403  /* ... else we make up a bfd name from the segment concatenated with the
404     section.  */
405
406  len = 16 + 1 + 16 + 1;
407
408  /* Put "LC_SEGMENT." prefix if the segment name is weird (ie doesn't start
409     with an underscore.  */
410  if (segname[0] != '_')
411    {
412      static const char seg_pfx[] = "LC_SEGMENT.";
413
414      pfx = seg_pfx;
415      len += sizeof (seg_pfx) - 1;
416    }
417
418  res = bfd_alloc (abfd, len);
419  if (res == NULL)
420    return;
421  snprintf (res, len, "%s%.16s.%.16s", pfx, segname, secname);
422  *name = res;
423}
424
425/* Convert a bfd section name to a Mach-O segment + section name.
426
427   If the name is a canonical one for which we have a Darwin match
428   return the translation table - which contains defaults for flags,
429   type, attribute and default alignment data.
430
431   Otherwise, expand the bfd_name (assumed to be in the form
432   "[LC_SEGMENT.]<segmentname>.<sectionname>") and return NULL.  */
433
434static const mach_o_section_name_xlat *
435bfd_mach_o_convert_section_name_to_mach_o (bfd *abfd ATTRIBUTE_UNUSED,
436					   asection *sect,
437					   bfd_mach_o_section *section)
438{
439  const mach_o_section_name_xlat *xlat;
440  const char *name = bfd_section_name (sect);
441  const char *segname;
442  const char *dot;
443  unsigned int len;
444  unsigned int seglen;
445  unsigned int seclen;
446
447  memset (section->segname, 0, BFD_MACH_O_SEGNAME_SIZE + 1);
448  memset (section->sectname, 0, BFD_MACH_O_SECTNAME_SIZE + 1);
449
450  /* See if is a canonical name ... */
451  xlat = bfd_mach_o_section_data_for_bfd_name (abfd, name, &segname);
452  if (xlat)
453    {
454      strcpy (section->segname, segname);
455      strcpy (section->sectname, xlat->mach_o_name);
456      return xlat;
457    }
458
459  /* .. else we convert our constructed one back to Mach-O.
460     Strip LC_SEGMENT. prefix, if present.  */
461  if (strncmp (name, "LC_SEGMENT.", 11) == 0)
462    name += 11;
463
464  /* Find a dot.  */
465  dot = strchr (name, '.');
466  len = strlen (name);
467
468  /* Try to split name into segment and section names.  */
469  if (dot && dot != name)
470    {
471      seglen = dot - name;
472      seclen = len - (dot + 1 - name);
473
474      if (seglen <= BFD_MACH_O_SEGNAME_SIZE
475	  && seclen <= BFD_MACH_O_SECTNAME_SIZE)
476	{
477	  memcpy (section->segname, name, seglen);
478	  section->segname[seglen] = 0;
479	  memcpy (section->sectname, dot + 1, seclen);
480	  section->sectname[seclen] = 0;
481	  return NULL;
482	}
483    }
484
485  /* The segment and section names are both missing - don't make them
486     into dots.  */
487  if (dot && dot == name)
488    return NULL;
489
490  /* Just duplicate the name into both segment and section.  */
491  if (len > 16)
492    len = 16;
493  memcpy (section->segname, name, len);
494  section->segname[len] = 0;
495  memcpy (section->sectname, name, len);
496  section->sectname[len] = 0;
497  return NULL;
498}
499
500/* Return the size of an entry for section SEC.
501   Must be called only for symbol pointer section and symbol stubs
502   sections.  */
503
504unsigned int
505bfd_mach_o_section_get_entry_size (bfd *abfd, bfd_mach_o_section *sec)
506{
507  switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
508    {
509    case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
510    case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
511      return bfd_mach_o_wide_p (abfd) ? 8 : 4;
512    case BFD_MACH_O_S_SYMBOL_STUBS:
513      return sec->reserved2;
514    default:
515      BFD_FAIL ();
516      return 0;
517    }
518}
519
520/* Return the number of indirect symbols for a section.
521   Must be called only for symbol pointer section and symbol stubs
522   sections.  */
523
524unsigned int
525bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section *sec)
526{
527  unsigned int elsz;
528
529  elsz = bfd_mach_o_section_get_entry_size (abfd, sec);
530  if (elsz == 0)
531    return 0;
532  else
533    return sec->size / elsz;
534}
535
536/* Append command CMD to ABFD.  Note that header.ncmds is not updated.  */
537
538static void
539bfd_mach_o_append_command (bfd *abfd, bfd_mach_o_load_command *cmd)
540{
541  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
542
543  if (mdata->last_command != NULL)
544    mdata->last_command->next = cmd;
545  else
546    mdata->first_command = cmd;
547  mdata->last_command = cmd;
548  cmd->next = NULL;
549}
550
551/* Copy any private info we understand from the input symbol
552   to the output symbol.  */
553
554bfd_boolean
555bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
556					 asymbol *isymbol,
557					 bfd *obfd ATTRIBUTE_UNUSED,
558					 asymbol *osymbol)
559{
560  bfd_mach_o_asymbol *os, *is;
561
562  os = (bfd_mach_o_asymbol *)osymbol;
563  is = (bfd_mach_o_asymbol *)isymbol;
564  os->n_type = is->n_type;
565  os->n_sect = is->n_sect;
566  os->n_desc = is->n_desc;
567  os->symbol.udata.i = is->symbol.udata.i;
568
569  return TRUE;
570}
571
572/* Copy any private info we understand from the input section
573   to the output section.  */
574
575bfd_boolean
576bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd, asection *isection,
577					  bfd *obfd, asection *osection)
578{
579  bfd_mach_o_section *os = bfd_mach_o_get_mach_o_section (osection);
580  bfd_mach_o_section *is = bfd_mach_o_get_mach_o_section (isection);
581
582  if (ibfd->xvec->flavour != bfd_target_mach_o_flavour
583      || obfd->xvec->flavour != bfd_target_mach_o_flavour)
584    return TRUE;
585
586  BFD_ASSERT (is != NULL && os != NULL);
587
588  os->flags = is->flags;
589  os->reserved1 = is->reserved1;
590  os->reserved2 = is->reserved2;
591  os->reserved3 = is->reserved3;
592
593  return TRUE;
594}
595
596static const char *
597cputype (unsigned long value)
598{
599  switch (value)
600    {
601    case BFD_MACH_O_CPU_TYPE_VAX: return "VAX";
602    case BFD_MACH_O_CPU_TYPE_MC680x0: return "MC68k";
603    case BFD_MACH_O_CPU_TYPE_I386: return "I386";
604    case BFD_MACH_O_CPU_TYPE_MIPS: return "MIPS";
605    case BFD_MACH_O_CPU_TYPE_MC98000: return "MC98k";
606    case BFD_MACH_O_CPU_TYPE_HPPA: return "HPPA";
607    case BFD_MACH_O_CPU_TYPE_ARM: return "ARM";
608    case BFD_MACH_O_CPU_TYPE_MC88000: return "MC88K";
609    case BFD_MACH_O_CPU_TYPE_SPARC: return "SPARC";
610    case BFD_MACH_O_CPU_TYPE_I860: return "I860";
611    case BFD_MACH_O_CPU_TYPE_ALPHA: return "ALPHA";
612    case BFD_MACH_O_CPU_TYPE_POWERPC: return "PPC";
613    case BFD_MACH_O_CPU_TYPE_POWERPC_64: return "PPC64";
614    case BFD_MACH_O_CPU_TYPE_X86_64: return "X86_64";
615    case BFD_MACH_O_CPU_TYPE_ARM64: return "ARM64";
616    default: return _("<unknown>");
617    }
618}
619
620static const char *
621cpusubtype (unsigned long cpu_type, unsigned long cpu_subtype)
622{
623  static char buffer[128];
624
625  buffer[0] = 0;
626  switch (cpu_subtype & BFD_MACH_O_CPU_SUBTYPE_MASK)
627    {
628    case 0:
629      break;
630    case BFD_MACH_O_CPU_SUBTYPE_LIB64:
631      sprintf (buffer, " (LIB64)"); break;
632    default:
633      sprintf (buffer, _("<unknown mask flags>")); break;
634    }
635
636  cpu_subtype &= ~ BFD_MACH_O_CPU_SUBTYPE_MASK;
637
638  switch (cpu_type)
639    {
640    case BFD_MACH_O_CPU_TYPE_X86_64:
641    case BFD_MACH_O_CPU_TYPE_I386:
642      switch (cpu_subtype)
643	{
644	case BFD_MACH_O_CPU_SUBTYPE_X86_ALL:
645	  return strcat (buffer, " (X86_ALL)");
646	default:
647	  break;
648	}
649      break;
650
651    case BFD_MACH_O_CPU_TYPE_ARM:
652      switch (cpu_subtype)
653	{
654	case BFD_MACH_O_CPU_SUBTYPE_ARM_ALL:
655	  return strcat (buffer, " (ARM_ALL)");
656	case BFD_MACH_O_CPU_SUBTYPE_ARM_V4T:
657	  return strcat (buffer, " (ARM_V4T)");
658	case BFD_MACH_O_CPU_SUBTYPE_ARM_V6:
659	  return strcat (buffer, " (ARM_V6)");
660	case BFD_MACH_O_CPU_SUBTYPE_ARM_V5TEJ:
661	  return strcat (buffer, " (ARM_V5TEJ)");
662	case BFD_MACH_O_CPU_SUBTYPE_ARM_XSCALE:
663	  return strcat (buffer, " (ARM_XSCALE)");
664	case BFD_MACH_O_CPU_SUBTYPE_ARM_V7:
665	  return strcat (buffer, " (ARM_V7)");
666	default:
667	  break;
668	}
669      break;
670
671    case BFD_MACH_O_CPU_TYPE_ARM64:
672      switch (cpu_subtype)
673	{
674	case BFD_MACH_O_CPU_SUBTYPE_ARM64_ALL:
675	  return strcat (buffer, " (ARM64_ALL)");
676	case BFD_MACH_O_CPU_SUBTYPE_ARM64_V8:
677	  return strcat (buffer, " (ARM64_V8)");
678	default:
679	  break;
680	}
681      break;
682
683    default:
684      break;
685    }
686
687  if (cpu_subtype != 0)
688    return strcat (buffer, _(" (<unknown>)"));
689
690  return buffer;
691}
692
693bfd_boolean
694bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, void *ptr)
695{
696  FILE * file = (FILE *) ptr;
697  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
698
699  fprintf (file, _(" MACH-O header:\n"));
700  fprintf (file, _("   magic:      %#lx\n"), (long) mdata->header.magic);
701  fprintf (file, _("   cputype:    %#lx (%s)\n"), (long) mdata->header.cputype,
702	   cputype (mdata->header.cputype));
703  fprintf (file, _("   cpusubtype: %#lx%s\n"), (long) mdata->header.cpusubtype,
704	   cpusubtype (mdata->header.cputype, mdata->header.cpusubtype));
705  fprintf (file, _("   filetype:   %#lx\n"), (long) mdata->header.filetype);
706  fprintf (file, _("   ncmds:      %#lx\n"), (long) mdata->header.ncmds);
707  fprintf (file, _("   sizeocmds:  %#lx\n"), (long) mdata->header.sizeofcmds);
708  fprintf (file, _("   flags:      %#lx\n"), (long) mdata->header.flags);
709  fprintf (file, _("   version:    %x\n"), mdata->header.version);
710
711  return TRUE;
712}
713
714/* Copy any private info we understand from the input bfd
715   to the output bfd.  */
716
717bfd_boolean
718bfd_mach_o_bfd_copy_private_header_data (bfd *ibfd, bfd *obfd)
719{
720  bfd_mach_o_data_struct *imdata;
721  bfd_mach_o_data_struct *omdata;
722  bfd_mach_o_load_command *icmd;
723
724  if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour
725      || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour)
726    return TRUE;
727
728  BFD_ASSERT (bfd_mach_o_valid (ibfd));
729  BFD_ASSERT (bfd_mach_o_valid (obfd));
730
731  imdata = bfd_mach_o_get_data (ibfd);
732  omdata = bfd_mach_o_get_data (obfd);
733
734  /* Copy header flags.  */
735  omdata->header.flags = imdata->header.flags;
736
737  /* PR 23299.  Copy the cputype.  */
738  if (imdata->header.cputype != omdata->header.cputype)
739    {
740      if (omdata->header.cputype == 0)
741	omdata->header.cputype = imdata->header.cputype;
742      else if (imdata->header.cputype != 0)
743	/* Urg - what has happened ?  */
744	_bfd_error_handler (_("incompatible cputypes in mach-o files: %ld vs %ld"),
745			    (long) imdata->header.cputype,
746			    (long) omdata->header.cputype);
747    }
748
749  /* Copy the cpusubtype.  */
750  omdata->header.cpusubtype = imdata->header.cpusubtype;
751
752  /* Copy commands.  */
753  for (icmd = imdata->first_command; icmd != NULL; icmd = icmd->next)
754    {
755      bfd_mach_o_load_command *ocmd;
756
757      switch (icmd->type)
758	{
759	case BFD_MACH_O_LC_LOAD_DYLIB:
760	case BFD_MACH_O_LC_LOAD_DYLINKER:
761	case BFD_MACH_O_LC_DYLD_INFO:
762	  /* Command is copied.  */
763	  ocmd = bfd_alloc (obfd, sizeof (bfd_mach_o_load_command));
764	  if (ocmd == NULL)
765	    return FALSE;
766
767	  /* Copy common fields.  */
768	  ocmd->type = icmd->type;
769	  ocmd->type_required = icmd->type_required;
770	  ocmd->offset = 0;
771	  ocmd->len = icmd->len;
772	  break;
773
774	default:
775	  /* Command is not copied.  */
776	  continue;
777	  break;
778	}
779
780      switch (icmd->type)
781	{
782	case BFD_MACH_O_LC_LOAD_DYLIB:
783	  {
784	    bfd_mach_o_dylib_command *idy = &icmd->command.dylib;
785	    bfd_mach_o_dylib_command *ody = &ocmd->command.dylib;
786
787	    ody->name_offset = idy->name_offset;
788	    ody->timestamp = idy->timestamp;
789	    ody->current_version = idy->current_version;
790	    ody->compatibility_version = idy->compatibility_version;
791	    ody->name_str = idy->name_str;
792	  }
793	  break;
794
795	case BFD_MACH_O_LC_LOAD_DYLINKER:
796	  {
797	    bfd_mach_o_dylinker_command *idy = &icmd->command.dylinker;
798	    bfd_mach_o_dylinker_command *ody = &ocmd->command.dylinker;
799
800	    ody->name_offset = idy->name_offset;
801	    ody->name_str = idy->name_str;
802	  }
803	  break;
804
805	case BFD_MACH_O_LC_DYLD_INFO:
806	  {
807	    bfd_mach_o_dyld_info_command *idy = &icmd->command.dyld_info;
808	    bfd_mach_o_dyld_info_command *ody = &ocmd->command.dyld_info;
809
810	    if (bfd_mach_o_read_dyld_content (ibfd, idy))
811	      {
812		ody->rebase_size = idy->rebase_size;
813		ody->rebase_content = idy->rebase_content;
814
815		ody->bind_size = idy->bind_size;
816		ody->bind_content = idy->bind_content;
817
818		ody->weak_bind_size = idy->weak_bind_size;
819		ody->weak_bind_content = idy->weak_bind_content;
820
821		ody->lazy_bind_size = idy->lazy_bind_size;
822		ody->lazy_bind_content = idy->lazy_bind_content;
823
824		ody->export_size = idy->export_size;
825		ody->export_content = idy->export_content;
826	      }
827	    /* PR 17512L: file: 730e492d.  */
828	    else
829	      {
830		ody->rebase_size =
831		  ody->bind_size =
832		  ody->weak_bind_size =
833		  ody->lazy_bind_size =
834		  ody->export_size = 0;
835		ody->rebase_content =
836		  ody->bind_content =
837		  ody->weak_bind_content =
838		  ody->lazy_bind_content =
839		  ody->export_content = NULL;
840	      }
841	  }
842	  break;
843
844	default:
845	  /* That command should be handled.  */
846	  abort ();
847	}
848
849      /* Insert command.  */
850      bfd_mach_o_append_command (obfd, ocmd);
851    }
852
853  return TRUE;
854}
855
856/* This allows us to set up to 32 bits of flags (unless we invent some
857   fiendish scheme to subdivide).  For now, we'll just set the file flags
858   without error checking - just overwrite.  */
859
860bfd_boolean
861bfd_mach_o_bfd_set_private_flags (bfd *abfd, flagword flags)
862{
863  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
864
865  if (!mdata)
866    return FALSE;
867
868  mdata->header.flags = flags;
869  return TRUE;
870}
871
872/* Count the total number of symbols.  */
873
874static long
875bfd_mach_o_count_symbols (bfd *abfd)
876{
877  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
878
879  if (mdata->symtab == NULL)
880    return 0;
881  return mdata->symtab->nsyms;
882}
883
884long
885bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
886{
887  long nsyms = bfd_mach_o_count_symbols (abfd);
888
889  return ((nsyms + 1) * sizeof (asymbol *));
890}
891
892long
893bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
894{
895  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
896  long nsyms = bfd_mach_o_count_symbols (abfd);
897  bfd_mach_o_symtab_command *sym = mdata->symtab;
898  unsigned long j;
899
900  if (nsyms < 0)
901    return nsyms;
902
903  if (nsyms == 0)
904    {
905      /* Do not try to read symbols if there are none.  */
906      alocation[0] = NULL;
907      return 0;
908    }
909
910  if (!bfd_mach_o_read_symtab_symbols (abfd))
911    {
912      _bfd_error_handler
913	(_("bfd_mach_o_canonicalize_symtab: unable to load symbols"));
914      return 0;
915    }
916
917  BFD_ASSERT (sym->symbols != NULL);
918
919  for (j = 0; j < sym->nsyms; j++)
920    alocation[j] = &sym->symbols[j].symbol;
921
922  alocation[j] = NULL;
923
924  return nsyms;
925}
926
927/* Create synthetic symbols for indirect symbols.  */
928
929long
930bfd_mach_o_get_synthetic_symtab (bfd *abfd,
931				 long symcount ATTRIBUTE_UNUSED,
932				 asymbol **syms ATTRIBUTE_UNUSED,
933				 long dynsymcount ATTRIBUTE_UNUSED,
934				 asymbol **dynsyms ATTRIBUTE_UNUSED,
935				 asymbol **ret)
936{
937  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
938  bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
939  bfd_mach_o_symtab_command *symtab = mdata->symtab;
940  asymbol *s;
941  char * s_start;
942  char * s_end;
943  unsigned long count, i, j, n;
944  size_t size;
945  char *names;
946  char *nul_name;
947  const char stub [] = "$stub";
948
949  *ret = NULL;
950
951  /* Stop now if no symbols or no indirect symbols.  */
952  if (dysymtab == NULL || dysymtab->nindirectsyms == 0
953      || symtab == NULL || symtab->symbols == NULL)
954    return 0;
955
956  /* We need to allocate a bfd symbol for every indirect symbol and to
957     allocate the memory for its name.  */
958  count = dysymtab->nindirectsyms;
959  size = count * sizeof (asymbol) + 1;
960
961  for (j = 0; j < count; j++)
962    {
963      const char * strng;
964      unsigned int isym = dysymtab->indirect_syms[j];
965
966      /* Some indirect symbols are anonymous.  */
967      if (isym < symtab->nsyms && (strng = symtab->symbols[isym].symbol.name))
968	/* PR 17512: file: f5b8eeba.  */
969	size += strnlen (strng, symtab->strsize - (strng - symtab->strtab)) + sizeof (stub);
970    }
971
972  s_start = bfd_malloc (size);
973  s = *ret = (asymbol *) s_start;
974  if (s == NULL)
975    return -1;
976  names = (char *) (s + count);
977  nul_name = names;
978  *names++ = 0;
979  s_end = s_start + size;
980
981  n = 0;
982  for (i = 0; i < mdata->nsects; i++)
983    {
984      bfd_mach_o_section *sec = mdata->sections[i];
985      unsigned int first, last;
986      bfd_vma addr;
987      bfd_vma entry_size;
988
989      switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
990	{
991	case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
992	case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
993	case BFD_MACH_O_S_SYMBOL_STUBS:
994	  /* Only these sections have indirect symbols.  */
995	  first = sec->reserved1;
996	  last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
997	  addr = sec->addr;
998	  entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
999
1000	  /* PR 17512: file: 08e15eec.  */
1001	  if (first >= count || last >= count || first > last)
1002	    goto fail;
1003
1004	  for (j = first; j < last; j++)
1005	    {
1006	      unsigned int isym = dysymtab->indirect_syms[j];
1007
1008	      /* PR 17512: file: 04d64d9b.  */
1009	      if (((char *) s) + sizeof (* s) > s_end)
1010		goto fail;
1011
1012	      s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
1013	      s->section = sec->bfdsection;
1014	      s->value = addr - sec->addr;
1015	      s->udata.p = NULL;
1016
1017	      if (isym < symtab->nsyms
1018		  && symtab->symbols[isym].symbol.name)
1019		{
1020		  const char *sym = symtab->symbols[isym].symbol.name;
1021		  size_t len;
1022
1023		  s->name = names;
1024		  len = strlen (sym);
1025		  /* PR 17512: file: 47dfd4d2.  */
1026		  if (names + len >= s_end)
1027		    goto fail;
1028		  memcpy (names, sym, len);
1029		  names += len;
1030		  /* PR 17512: file: 18f340a4.  */
1031		  if (names + sizeof (stub) >= s_end)
1032		    goto fail;
1033		  memcpy (names, stub, sizeof (stub));
1034		  names += sizeof (stub);
1035		}
1036	      else
1037		s->name = nul_name;
1038
1039	      addr += entry_size;
1040	      s++;
1041	      n++;
1042	    }
1043	  break;
1044	default:
1045	  break;
1046	}
1047    }
1048
1049  return n;
1050
1051 fail:
1052  free (s_start);
1053  * ret = NULL;
1054  return -1;
1055}
1056
1057void
1058bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
1059			    asymbol *symbol,
1060			    symbol_info *ret)
1061{
1062  bfd_symbol_info (symbol, ret);
1063}
1064
1065void
1066bfd_mach_o_print_symbol (bfd *abfd,
1067			 void * afile,
1068			 asymbol *symbol,
1069			 bfd_print_symbol_type how)
1070{
1071  FILE *file = (FILE *) afile;
1072  const char *name;
1073  bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)symbol;
1074
1075  switch (how)
1076    {
1077    case bfd_print_symbol_name:
1078      fprintf (file, "%s", symbol->name);
1079      break;
1080    default:
1081      bfd_print_symbol_vandf (abfd, (void *) file, symbol);
1082      if (asym->n_type & BFD_MACH_O_N_STAB)
1083	name = bfd_get_stab_name (asym->n_type);
1084      else
1085	switch (asym->n_type & BFD_MACH_O_N_TYPE)
1086	  {
1087	  case BFD_MACH_O_N_UNDF:
1088	    if (symbol->value == 0)
1089	      name = "UND";
1090	    else
1091	      name = "COM";
1092	    break;
1093	  case BFD_MACH_O_N_ABS:
1094	    name = "ABS";
1095	    break;
1096	  case BFD_MACH_O_N_INDR:
1097	    name = "INDR";
1098	    break;
1099	  case BFD_MACH_O_N_PBUD:
1100	    name = "PBUD";
1101	    break;
1102	  case BFD_MACH_O_N_SECT:
1103	    name = "SECT";
1104	    break;
1105	  default:
1106	    name = "???";
1107	    break;
1108	  }
1109      if (name == NULL)
1110	name = "";
1111      fprintf (file, " %02x %-6s %02x %04x",
1112	       asym->n_type, name, asym->n_sect, asym->n_desc);
1113      if ((asym->n_type & BFD_MACH_O_N_STAB) == 0
1114	  && (asym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
1115	fprintf (file, " [%s]", symbol->section->name);
1116      fprintf (file, " %s", symbol->name);
1117    }
1118}
1119
1120static void
1121bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
1122				 bfd_mach_o_cpu_subtype msubtype,
1123				 enum bfd_architecture *type,
1124				 unsigned long *subtype)
1125{
1126  *subtype = bfd_arch_unknown;
1127
1128  switch (mtype)
1129    {
1130    case BFD_MACH_O_CPU_TYPE_VAX:
1131      *type = bfd_arch_vax;
1132      break;
1133    case BFD_MACH_O_CPU_TYPE_MC680x0:
1134      *type = bfd_arch_m68k;
1135      break;
1136    case BFD_MACH_O_CPU_TYPE_I386:
1137      *type = bfd_arch_i386;
1138      *subtype = bfd_mach_i386_i386;
1139      break;
1140    case BFD_MACH_O_CPU_TYPE_X86_64:
1141      *type = bfd_arch_i386;
1142      *subtype = bfd_mach_x86_64;
1143      break;
1144    case BFD_MACH_O_CPU_TYPE_MIPS:
1145      *type = bfd_arch_mips;
1146      break;
1147    case BFD_MACH_O_CPU_TYPE_MC98000:
1148      *type = bfd_arch_m98k;
1149      break;
1150    case BFD_MACH_O_CPU_TYPE_HPPA:
1151      *type = bfd_arch_hppa;
1152      break;
1153    case BFD_MACH_O_CPU_TYPE_ARM:
1154      *type = bfd_arch_arm;
1155      switch (msubtype)
1156	{
1157	case BFD_MACH_O_CPU_SUBTYPE_ARM_V4T:
1158	  *subtype = bfd_mach_arm_4T;
1159	  break;
1160	case BFD_MACH_O_CPU_SUBTYPE_ARM_V6:
1161	  *subtype = bfd_mach_arm_4T;	/* Best fit ?  */
1162	  break;
1163	case BFD_MACH_O_CPU_SUBTYPE_ARM_V5TEJ:
1164	  *subtype = bfd_mach_arm_5TE;
1165	  break;
1166	case BFD_MACH_O_CPU_SUBTYPE_ARM_XSCALE:
1167	  *subtype = bfd_mach_arm_XScale;
1168	  break;
1169	case BFD_MACH_O_CPU_SUBTYPE_ARM_V7:
1170	  *subtype = bfd_mach_arm_5TE;	/* Best fit ?  */
1171	  break;
1172	case BFD_MACH_O_CPU_SUBTYPE_ARM_ALL:
1173	default:
1174	  break;
1175	}
1176      break;
1177    case BFD_MACH_O_CPU_TYPE_SPARC:
1178      *type = bfd_arch_sparc;
1179      *subtype = bfd_mach_sparc;
1180      break;
1181    case BFD_MACH_O_CPU_TYPE_ALPHA:
1182      *type = bfd_arch_alpha;
1183      break;
1184    case BFD_MACH_O_CPU_TYPE_POWERPC:
1185      *type = bfd_arch_powerpc;
1186      *subtype = bfd_mach_ppc;
1187      break;
1188    case BFD_MACH_O_CPU_TYPE_POWERPC_64:
1189      *type = bfd_arch_powerpc;
1190      *subtype = bfd_mach_ppc64;
1191      break;
1192    case BFD_MACH_O_CPU_TYPE_ARM64:
1193      *type = bfd_arch_aarch64;
1194      *subtype = bfd_mach_aarch64;
1195      break;
1196    default:
1197      *type = bfd_arch_unknown;
1198      break;
1199    }
1200}
1201
1202/* Write n NUL bytes to ABFD so that LEN + n is a multiple of 4.  Return the
1203   number of bytes written or -1 in case of error.  */
1204
1205static int
1206bfd_mach_o_pad4 (bfd *abfd, unsigned int len)
1207{
1208  if (len % 4 != 0)
1209    {
1210      char pad[4] = {0,0,0,0};
1211      unsigned int padlen = 4 - (len % 4);
1212
1213      if (bfd_bwrite (pad, padlen, abfd) != padlen)
1214	return -1;
1215
1216      return padlen;
1217    }
1218  else
1219    return 0;
1220}
1221
1222/* Likewise, but for a command.  */
1223
1224static int
1225bfd_mach_o_pad_command (bfd *abfd, unsigned int len)
1226{
1227  unsigned int align = bfd_mach_o_wide_p (abfd) ? 8 : 4;
1228
1229  if (len % align != 0)
1230    {
1231      char pad[8] = {0};
1232      unsigned int padlen = align - (len % align);
1233
1234      if (bfd_bwrite (pad, padlen, abfd) != padlen)
1235	return -1;
1236
1237      return padlen;
1238    }
1239  else
1240    return 0;
1241}
1242
1243static bfd_boolean
1244bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
1245{
1246  struct mach_o_header_external raw;
1247  unsigned int size;
1248
1249  size = mach_o_wide_p (header) ?
1250    BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
1251
1252  bfd_h_put_32 (abfd, header->magic, raw.magic);
1253  bfd_h_put_32 (abfd, header->cputype, raw.cputype);
1254  bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype);
1255  bfd_h_put_32 (abfd, header->filetype, raw.filetype);
1256  bfd_h_put_32 (abfd, header->ncmds, raw.ncmds);
1257  bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds);
1258  bfd_h_put_32 (abfd, header->flags, raw.flags);
1259
1260  if (mach_o_wide_p (header))
1261    bfd_h_put_32 (abfd, header->reserved, raw.reserved);
1262
1263  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1264      || bfd_bwrite (&raw, size, abfd) != size)
1265    return FALSE;
1266
1267  return TRUE;
1268}
1269
1270static bfd_boolean
1271bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
1272{
1273  bfd_mach_o_thread_command *cmd = &command->command.thread;
1274  unsigned int i;
1275  struct mach_o_thread_command_external raw;
1276  unsigned int offset;
1277
1278  BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
1279	      || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
1280
1281  offset = BFD_MACH_O_LC_SIZE;
1282  for (i = 0; i < cmd->nflavours; i++)
1283    {
1284      BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
1285      BFD_ASSERT (cmd->flavours[i].offset ==
1286		  (command->offset + offset + BFD_MACH_O_LC_SIZE));
1287
1288      bfd_h_put_32 (abfd, cmd->flavours[i].flavour, raw.flavour);
1289      bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), raw.count);
1290
1291      if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
1292	  || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1293	return FALSE;
1294
1295      offset += cmd->flavours[i].size + sizeof (raw);
1296    }
1297
1298  return TRUE;
1299}
1300
1301static bfd_boolean
1302bfd_mach_o_write_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
1303{
1304  bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
1305  struct mach_o_str_command_external raw;
1306  unsigned int namelen;
1307
1308  bfd_h_put_32 (abfd, cmd->name_offset, raw.str);
1309
1310  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1311      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1312    return FALSE;
1313
1314  namelen = strlen (cmd->name_str) + 1;
1315  if (bfd_bwrite (cmd->name_str, namelen, abfd) != namelen)
1316    return FALSE;
1317
1318  if (bfd_mach_o_pad_command (abfd, namelen) < 0)
1319    return FALSE;
1320
1321  return TRUE;
1322}
1323
1324static bfd_boolean
1325bfd_mach_o_write_dylib (bfd *abfd, bfd_mach_o_load_command *command)
1326{
1327  bfd_mach_o_dylib_command *cmd = &command->command.dylib;
1328  struct mach_o_dylib_command_external raw;
1329  unsigned int namelen;
1330
1331  bfd_h_put_32 (abfd, cmd->name_offset, raw.name);
1332  bfd_h_put_32 (abfd, cmd->timestamp, raw.timestamp);
1333  bfd_h_put_32 (abfd, cmd->current_version, raw.current_version);
1334  bfd_h_put_32 (abfd, cmd->compatibility_version, raw.compatibility_version);
1335
1336  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1337      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1338    return FALSE;
1339
1340  namelen = strlen (cmd->name_str) + 1;
1341  if (bfd_bwrite (cmd->name_str, namelen, abfd) != namelen)
1342    return FALSE;
1343
1344  if (bfd_mach_o_pad_command (abfd, namelen) < 0)
1345    return FALSE;
1346
1347  return TRUE;
1348}
1349
1350static bfd_boolean
1351bfd_mach_o_write_main (bfd *abfd, bfd_mach_o_load_command *command)
1352{
1353  bfd_mach_o_main_command *cmd = &command->command.main;
1354  struct mach_o_entry_point_command_external raw;
1355
1356  bfd_h_put_64 (abfd, cmd->entryoff, raw.entryoff);
1357  bfd_h_put_64 (abfd, cmd->stacksize, raw.stacksize);
1358
1359  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1360      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1361    return FALSE;
1362
1363  return TRUE;
1364}
1365
1366static bfd_boolean
1367bfd_mach_o_write_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
1368{
1369  bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
1370  struct mach_o_dyld_info_command_external raw;
1371
1372  bfd_h_put_32 (abfd, cmd->rebase_off, raw.rebase_off);
1373  bfd_h_put_32 (abfd, cmd->rebase_size, raw.rebase_size);
1374  bfd_h_put_32 (abfd, cmd->bind_off, raw.bind_off);
1375  bfd_h_put_32 (abfd, cmd->bind_size, raw.bind_size);
1376  bfd_h_put_32 (abfd, cmd->weak_bind_off, raw.weak_bind_off);
1377  bfd_h_put_32 (abfd, cmd->weak_bind_size, raw.weak_bind_size);
1378  bfd_h_put_32 (abfd, cmd->lazy_bind_off, raw.lazy_bind_off);
1379  bfd_h_put_32 (abfd, cmd->lazy_bind_size, raw.lazy_bind_size);
1380  bfd_h_put_32 (abfd, cmd->export_off, raw.export_off);
1381  bfd_h_put_32 (abfd, cmd->export_size, raw.export_size);
1382
1383  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1384      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1385    return FALSE;
1386
1387  if (cmd->rebase_size != 0)
1388    if (bfd_seek (abfd, cmd->rebase_off, SEEK_SET) != 0
1389	|| (bfd_bwrite (cmd->rebase_content, cmd->rebase_size, abfd) !=
1390	    cmd->rebase_size))
1391      return FALSE;
1392
1393  if (cmd->bind_size != 0)
1394    if (bfd_seek (abfd, cmd->bind_off, SEEK_SET) != 0
1395	|| (bfd_bwrite (cmd->bind_content, cmd->bind_size, abfd) !=
1396	    cmd->bind_size))
1397      return FALSE;
1398
1399  if (cmd->weak_bind_size != 0)
1400    if (bfd_seek (abfd, cmd->weak_bind_off, SEEK_SET) != 0
1401	|| (bfd_bwrite (cmd->weak_bind_content, cmd->weak_bind_size, abfd) !=
1402	    cmd->weak_bind_size))
1403      return FALSE;
1404
1405  if (cmd->lazy_bind_size != 0)
1406    if (bfd_seek (abfd, cmd->lazy_bind_off, SEEK_SET) != 0
1407	|| (bfd_bwrite (cmd->lazy_bind_content, cmd->lazy_bind_size, abfd) !=
1408	    cmd->lazy_bind_size))
1409      return FALSE;
1410
1411  if (cmd->export_size != 0)
1412    if (bfd_seek (abfd, cmd->export_off, SEEK_SET) != 0
1413	|| (bfd_bwrite (cmd->export_content, cmd->export_size, abfd) !=
1414	    cmd->export_size))
1415      return FALSE;
1416
1417  return TRUE;
1418}
1419
1420long
1421bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
1422				  asection *asect)
1423{
1424#if SIZEOF_LONG == SIZEOF_INT
1425   if (asect->reloc_count >= LONG_MAX / sizeof (arelent *))
1426    {
1427      bfd_set_error (bfd_error_file_too_big);
1428      return -1;
1429    }
1430#endif
1431 return (asect->reloc_count + 1) * sizeof (arelent *);
1432}
1433
1434/* In addition to the need to byte-swap the symbol number, the bit positions
1435   of the fields in the relocation information vary per target endian-ness.  */
1436
1437void
1438bfd_mach_o_swap_in_non_scattered_reloc (bfd *abfd, bfd_mach_o_reloc_info *rel,
1439					unsigned char *fields)
1440{
1441  unsigned char info = fields[3];
1442
1443  if (bfd_big_endian (abfd))
1444    {
1445      rel->r_value = (fields[0] << 16) | (fields[1] << 8) | fields[2];
1446      rel->r_type = (info >> BFD_MACH_O_BE_TYPE_SHIFT) & BFD_MACH_O_TYPE_MASK;
1447      rel->r_pcrel = (info & BFD_MACH_O_BE_PCREL) ? 1 : 0;
1448      rel->r_length = (info >> BFD_MACH_O_BE_LENGTH_SHIFT)
1449		      & BFD_MACH_O_LENGTH_MASK;
1450      rel->r_extern = (info & BFD_MACH_O_BE_EXTERN) ? 1 : 0;
1451    }
1452  else
1453    {
1454      rel->r_value = (fields[2] << 16) | (fields[1] << 8) | fields[0];
1455      rel->r_type = (info >> BFD_MACH_O_LE_TYPE_SHIFT) & BFD_MACH_O_TYPE_MASK;
1456      rel->r_pcrel = (info & BFD_MACH_O_LE_PCREL) ? 1 : 0;
1457      rel->r_length = (info >> BFD_MACH_O_LE_LENGTH_SHIFT)
1458		      & BFD_MACH_O_LENGTH_MASK;
1459      rel->r_extern = (info & BFD_MACH_O_LE_EXTERN) ? 1 : 0;
1460    }
1461}
1462
1463/* Set syms_ptr_ptr and addend of RES.  */
1464
1465bfd_boolean
1466bfd_mach_o_canonicalize_non_scattered_reloc (bfd *abfd,
1467					     bfd_mach_o_reloc_info *reloc,
1468					     arelent *res, asymbol **syms)
1469{
1470  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1471  unsigned int num;
1472  asymbol **sym;
1473
1474  /* Non-scattered relocation.  */
1475  reloc->r_scattered = 0;
1476  res->addend = 0;
1477
1478  num = reloc->r_value;
1479
1480  if (reloc->r_extern)
1481    {
1482      /* PR 17512: file: 8396-1185-0.004.  */
1483      if (num >= (unsigned) bfd_mach_o_count_symbols (abfd))
1484	sym = bfd_und_section_ptr->symbol_ptr_ptr;
1485      else if (syms == NULL)
1486	sym = bfd_und_section_ptr->symbol_ptr_ptr;
1487      else
1488	/* An external symbol number.  */
1489	sym = syms + num;
1490    }
1491  else if (num == 0x00ffffff || num == 0)
1492    {
1493      /* The 'symnum' in a non-scattered PAIR is 0x00ffffff.  But as this
1494	 is generic code, we don't know wether this is really a PAIR.
1495	 This value is almost certainly not a valid section number, hence
1496	 this specific case to avoid an assertion failure.
1497	 Target specific swap_reloc_in routine should adjust that.  */
1498      sym = bfd_abs_section_ptr->symbol_ptr_ptr;
1499    }
1500  else
1501    {
1502      /* PR 17512: file: 006-2964-0.004.  */
1503      if (num > mdata->nsects)
1504	{
1505	  _bfd_error_handler (_("\
1506malformed mach-o reloc: section index is greater than the number of sections"));
1507	  return FALSE;
1508	}
1509
1510      /* A section number.  */
1511      sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr;
1512      /* For a symbol defined in section S, the addend (stored in the
1513	 binary) contains the address of the section.  To comply with
1514	 bfd convention, subtract the section address.
1515	 Use the address from the header, so that the user can modify
1516	     the vma of the section.  */
1517      res->addend = -mdata->sections[num - 1]->addr;
1518    }
1519
1520  /* Note: Pairs for PPC LO/HI/HA are not scattered, but contain the offset
1521     in the lower 16bits of the address value.  So we have to find the
1522     'symbol' from the preceding reloc.  We do this even though the
1523     section symbol is probably not needed here, because NULL symbol
1524     values cause an assert in generic BFD code.  This must be done in
1525     the PPC swap_reloc_in routine.  */
1526  res->sym_ptr_ptr = sym;
1527
1528  return TRUE;
1529}
1530
1531/* Do most of the work for canonicalize_relocs on RAW: create internal
1532   representation RELOC and set most fields of RES using symbol table SYMS.
1533   Each target still has to set the howto of RES and possibly adjust other
1534   fields.
1535   Previously the Mach-O hook point was simply swap_in, but some targets
1536   (like arm64) don't follow the generic rules (symnum is a value for the
1537   non-scattered relocation ADDEND).  */
1538
1539bfd_boolean
1540bfd_mach_o_pre_canonicalize_one_reloc (bfd *abfd,
1541				       struct mach_o_reloc_info_external *raw,
1542				       bfd_mach_o_reloc_info *reloc,
1543				       arelent *res, asymbol **syms)
1544{
1545  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1546  bfd_vma addr;
1547
1548  addr = bfd_get_32 (abfd, raw->r_address);
1549  res->sym_ptr_ptr = NULL;
1550  res->addend = 0;
1551
1552  if (addr & BFD_MACH_O_SR_SCATTERED)
1553    {
1554      unsigned int j;
1555      bfd_vma symnum = bfd_get_32 (abfd, raw->r_symbolnum);
1556
1557      /* Scattered relocation, can't be extern. */
1558      reloc->r_scattered = 1;
1559      reloc->r_extern = 0;
1560
1561      /*   Extract section and offset from r_value (symnum).  */
1562      reloc->r_value = symnum;
1563      /* FIXME: This breaks when a symbol in a reloc exactly follows the
1564	 end of the data for the section (e.g. in a calculation of section
1565	 data length).  At present, the symbol will end up associated with
1566	 the following section or, if it falls within alignment padding, as
1567	 null - which will assert later.  */
1568      for (j = 0; j < mdata->nsects; j++)
1569	{
1570	  bfd_mach_o_section *sect = mdata->sections[j];
1571	  if (symnum >= sect->addr && symnum < sect->addr + sect->size)
1572	    {
1573	      res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr;
1574	      res->addend = symnum - sect->addr;
1575	      break;
1576	    }
1577	}
1578
1579      /* Extract the info and address fields from r_address.  */
1580      reloc->r_type = BFD_MACH_O_GET_SR_TYPE (addr);
1581      reloc->r_length = BFD_MACH_O_GET_SR_LENGTH (addr);
1582      reloc->r_pcrel = addr & BFD_MACH_O_SR_PCREL;
1583      reloc->r_address = BFD_MACH_O_GET_SR_TYPE (addr);
1584      res->address = BFD_MACH_O_GET_SR_ADDRESS (addr);
1585    }
1586  else
1587    {
1588      /* Non-scattered relocation.  */
1589      reloc->r_scattered = 0;
1590      reloc->r_address = addr;
1591      res->address = addr;
1592
1593      /* The value and info fields have to be extracted dependent on target
1594	 endian-ness.  */
1595      bfd_mach_o_swap_in_non_scattered_reloc (abfd, reloc, raw->r_symbolnum);
1596
1597      if (!bfd_mach_o_canonicalize_non_scattered_reloc (abfd, reloc,
1598							res, syms))
1599	return FALSE;
1600    }
1601
1602  /* We have set up a reloc with all the information present, so the swapper
1603     can modify address, value and addend fields, if necessary, to convey
1604     information in the generic BFD reloc that is mach-o specific.  */
1605
1606  return TRUE;
1607}
1608
1609static int
1610bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
1611				unsigned long count,
1612				arelent *res, asymbol **syms)
1613{
1614  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1615  unsigned long i;
1616  struct mach_o_reloc_info_external *native_relocs = NULL;
1617  size_t native_size;
1618
1619  /* Allocate and read relocs.  */
1620  if (_bfd_mul_overflow (count, BFD_MACH_O_RELENT_SIZE, &native_size))
1621    /* PR 17512: file: 09477b57.  */
1622    goto err;
1623
1624  if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
1625    return -1;
1626  native_relocs = (struct mach_o_reloc_info_external *)
1627    _bfd_malloc_and_read (abfd, native_size, native_size);
1628  if (native_relocs == NULL)
1629    return -1;
1630
1631  for (i = 0; i < count; i++)
1632    {
1633      if (!(*bed->_bfd_mach_o_canonicalize_one_reloc)(abfd, &native_relocs[i],
1634						      &res[i], syms, res))
1635	goto err;
1636    }
1637  free (native_relocs);
1638  return i;
1639
1640 err:
1641  free (native_relocs);
1642  if (bfd_get_error () == bfd_error_no_error)
1643    bfd_set_error (bfd_error_invalid_operation);
1644  return -1;
1645}
1646
1647long
1648bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect,
1649			       arelent **rels, asymbol **syms)
1650{
1651  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1652  unsigned long i;
1653  arelent *res;
1654
1655  if (asect->reloc_count == 0)
1656    return 0;
1657
1658  /* No need to go further if we don't know how to read relocs.  */
1659  if (bed->_bfd_mach_o_canonicalize_one_reloc == NULL)
1660    return 0;
1661
1662  if (asect->relocation == NULL)
1663    {
1664      size_t amt;
1665
1666      if (_bfd_mul_overflow (asect->reloc_count, sizeof (arelent), &amt))
1667	return -1;
1668      res = bfd_malloc (amt);
1669      if (res == NULL)
1670	return -1;
1671
1672      if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos,
1673					  asect->reloc_count, res, syms) < 0)
1674	{
1675	  free (res);
1676	  return -1;
1677	}
1678      asect->relocation = res;
1679    }
1680
1681  res = asect->relocation;
1682  for (i = 0; i < asect->reloc_count; i++)
1683    rels[i] = &res[i];
1684  rels[i] = NULL;
1685
1686  return i;
1687}
1688
1689long
1690bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd)
1691{
1692  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1693
1694  if (mdata->dysymtab == NULL)
1695    return 1;
1696  return (mdata->dysymtab->nextrel + mdata->dysymtab->nlocrel + 1)
1697    * sizeof (arelent *);
1698}
1699
1700long
1701bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
1702				       struct bfd_symbol **syms)
1703{
1704  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1705  bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
1706  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1707  unsigned long i;
1708  arelent *res;
1709
1710  if (dysymtab == NULL)
1711    return 0;
1712  if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0)
1713    return 0;
1714
1715  /* No need to go further if we don't know how to read relocs.  */
1716  if (bed->_bfd_mach_o_canonicalize_one_reloc == NULL)
1717    return 0;
1718
1719  if (mdata->dyn_reloc_cache == NULL)
1720    {
1721      ufile_ptr filesize = bfd_get_file_size (abfd);
1722      size_t amt;
1723
1724      if (filesize != 0)
1725	{
1726	  if (dysymtab->extreloff > filesize
1727	      || dysymtab->nextrel > ((filesize - dysymtab->extreloff)
1728				      / BFD_MACH_O_RELENT_SIZE)
1729	      || dysymtab->locreloff > filesize
1730	      || dysymtab->nlocrel > ((filesize - dysymtab->locreloff)
1731				      / BFD_MACH_O_RELENT_SIZE))
1732	    {
1733	      bfd_set_error (bfd_error_file_truncated);
1734	      return -1;
1735	    }
1736	}
1737      if (_bfd_mul_overflow (dysymtab->nextrel + dysymtab->nlocrel,
1738			     sizeof (arelent), &amt))
1739	{
1740	  bfd_set_error (bfd_error_file_too_big);
1741	  return -1;
1742	}
1743
1744      res = bfd_malloc (amt);
1745      if (res == NULL)
1746	return -1;
1747
1748      if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff,
1749					  dysymtab->nextrel, res, syms) < 0)
1750	{
1751	  free (res);
1752	  return -1;
1753	}
1754
1755      if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff,
1756					  dysymtab->nlocrel,
1757					  res + dysymtab->nextrel, syms) < 0)
1758	{
1759	  free (res);
1760	  return -1;
1761	}
1762
1763      mdata->dyn_reloc_cache = res;
1764    }
1765
1766  res = mdata->dyn_reloc_cache;
1767  for (i = 0; i < dysymtab->nextrel + dysymtab->nlocrel; i++)
1768    rels[i] = &res[i];
1769  rels[i] = NULL;
1770  return i;
1771}
1772
1773/* In addition to the need to byte-swap the symbol number, the bit positions
1774   of the fields in the relocation information vary per target endian-ness.  */
1775
1776static void
1777bfd_mach_o_swap_out_non_scattered_reloc (bfd *abfd, unsigned char *fields,
1778					 bfd_mach_o_reloc_info *rel)
1779{
1780  unsigned char info = 0;
1781
1782  BFD_ASSERT (rel->r_type <= 15);
1783  BFD_ASSERT (rel->r_length <= 3);
1784
1785  if (bfd_big_endian (abfd))
1786    {
1787      fields[0] = (rel->r_value >> 16) & 0xff;
1788      fields[1] = (rel->r_value >> 8) & 0xff;
1789      fields[2] = rel->r_value & 0xff;
1790      info |= rel->r_type << BFD_MACH_O_BE_TYPE_SHIFT;
1791      info |= rel->r_pcrel ? BFD_MACH_O_BE_PCREL : 0;
1792      info |= rel->r_length << BFD_MACH_O_BE_LENGTH_SHIFT;
1793      info |= rel->r_extern ? BFD_MACH_O_BE_EXTERN : 0;
1794    }
1795  else
1796    {
1797      fields[2] = (rel->r_value >> 16) & 0xff;
1798      fields[1] = (rel->r_value >> 8) & 0xff;
1799      fields[0] = rel->r_value & 0xff;
1800      info |= rel->r_type << BFD_MACH_O_LE_TYPE_SHIFT;
1801      info |= rel->r_pcrel ? BFD_MACH_O_LE_PCREL : 0;
1802      info |= rel->r_length << BFD_MACH_O_LE_LENGTH_SHIFT;
1803      info |= rel->r_extern ? BFD_MACH_O_LE_EXTERN : 0;
1804    }
1805  fields[3] = info;
1806}
1807
1808static bfd_boolean
1809bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
1810{
1811  unsigned int i;
1812  arelent **entries;
1813  asection *sec;
1814  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1815
1816  sec = section->bfdsection;
1817  if (sec->reloc_count == 0)
1818    return TRUE;
1819
1820  if (bed->_bfd_mach_o_swap_reloc_out == NULL)
1821    return TRUE;
1822
1823  if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0)
1824    return FALSE;
1825
1826  /* Convert and write.  */
1827  entries = section->bfdsection->orelocation;
1828  for (i = 0; i < section->nreloc; i++)
1829    {
1830      arelent *rel = entries[i];
1831      struct mach_o_reloc_info_external raw;
1832      bfd_mach_o_reloc_info info, *pinfo = &info;
1833
1834      /* Convert relocation to an intermediate representation.  */
1835      if (!(*bed->_bfd_mach_o_swap_reloc_out) (rel, pinfo))
1836	return FALSE;
1837
1838      /* Lower the relocation info.  */
1839      if (pinfo->r_scattered)
1840	{
1841	  unsigned long v;
1842
1843	  v = BFD_MACH_O_SR_SCATTERED
1844	    | (pinfo->r_pcrel ? BFD_MACH_O_SR_PCREL : 0)
1845	    | BFD_MACH_O_SET_SR_LENGTH (pinfo->r_length)
1846	    | BFD_MACH_O_SET_SR_TYPE (pinfo->r_type)
1847	    | BFD_MACH_O_SET_SR_ADDRESS (pinfo->r_address);
1848	  /* Note: scattered relocs have field in reverse order...  */
1849	  bfd_put_32 (abfd, v, raw.r_address);
1850	  bfd_put_32 (abfd, pinfo->r_value, raw.r_symbolnum);
1851	}
1852      else
1853	{
1854	  bfd_put_32 (abfd, pinfo->r_address, raw.r_address);
1855	  bfd_mach_o_swap_out_non_scattered_reloc (abfd, raw.r_symbolnum,
1856						   pinfo);
1857	}
1858
1859      if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd)
1860	  != BFD_MACH_O_RELENT_SIZE)
1861	return FALSE;
1862    }
1863  return TRUE;
1864}
1865
1866static bfd_boolean
1867bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
1868{
1869  struct mach_o_section_32_external raw;
1870
1871  memcpy (raw.sectname, section->sectname, 16);
1872  memcpy (raw.segname, section->segname, 16);
1873  bfd_h_put_32 (abfd, section->addr, raw.addr);
1874  bfd_h_put_32 (abfd, section->size, raw.size);
1875  bfd_h_put_32 (abfd, section->offset, raw.offset);
1876  bfd_h_put_32 (abfd, section->align, raw.align);
1877  bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1878  bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1879  bfd_h_put_32 (abfd, section->flags, raw.flags);
1880  bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1881  bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1882
1883  if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
1884      != BFD_MACH_O_SECTION_SIZE)
1885    return FALSE;
1886
1887  return TRUE;
1888}
1889
1890static bfd_boolean
1891bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
1892{
1893  struct mach_o_section_64_external raw;
1894
1895  memcpy (raw.sectname, section->sectname, 16);
1896  memcpy (raw.segname, section->segname, 16);
1897  bfd_h_put_64 (abfd, section->addr, raw.addr);
1898  bfd_h_put_64 (abfd, section->size, raw.size);
1899  bfd_h_put_32 (abfd, section->offset, raw.offset);
1900  bfd_h_put_32 (abfd, section->align, raw.align);
1901  bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1902  bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1903  bfd_h_put_32 (abfd, section->flags, raw.flags);
1904  bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1905  bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1906  bfd_h_put_32 (abfd, section->reserved3, raw.reserved3);
1907
1908  if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
1909      != BFD_MACH_O_SECTION_64_SIZE)
1910    return FALSE;
1911
1912  return TRUE;
1913}
1914
1915static bfd_boolean
1916bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
1917{
1918  struct mach_o_segment_command_32_external raw;
1919  bfd_mach_o_segment_command *seg = &command->command.segment;
1920  bfd_mach_o_section *sec;
1921
1922  BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
1923
1924  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1925    if (!bfd_mach_o_write_relocs (abfd, sec))
1926      return FALSE;
1927
1928  memcpy (raw.segname, seg->segname, 16);
1929  bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr);
1930  bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize);
1931  bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff);
1932  bfd_h_put_32 (abfd, seg->filesize, raw.filesize);
1933  bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1934  bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1935  bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1936  bfd_h_put_32 (abfd, seg->flags, raw.flags);
1937
1938  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1939      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1940    return FALSE;
1941
1942  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1943    if (!bfd_mach_o_write_section_32 (abfd, sec))
1944      return FALSE;
1945
1946  return TRUE;
1947}
1948
1949static bfd_boolean
1950bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
1951{
1952  struct mach_o_segment_command_64_external raw;
1953  bfd_mach_o_segment_command *seg = &command->command.segment;
1954  bfd_mach_o_section *sec;
1955
1956  BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
1957
1958  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1959    if (!bfd_mach_o_write_relocs (abfd, sec))
1960      return FALSE;
1961
1962  memcpy (raw.segname, seg->segname, 16);
1963  bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr);
1964  bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize);
1965  bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff);
1966  bfd_h_put_64 (abfd, seg->filesize, raw.filesize);
1967  bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1968  bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1969  bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1970  bfd_h_put_32 (abfd, seg->flags, raw.flags);
1971
1972  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1973      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1974    return FALSE;
1975
1976  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1977    if (!bfd_mach_o_write_section_64 (abfd, sec))
1978      return FALSE;
1979
1980  return TRUE;
1981}
1982
1983static bfd_boolean
1984bfd_mach_o_write_symtab_content (bfd *abfd, bfd_mach_o_symtab_command *sym)
1985{
1986  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1987  unsigned long i;
1988  unsigned int wide = bfd_mach_o_wide_p (abfd);
1989  struct bfd_strtab_hash *strtab;
1990  asymbol **symbols = bfd_get_outsymbols (abfd);
1991  int padlen;
1992
1993  /* Write the symbols first.  */
1994  if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0)
1995    return FALSE;
1996
1997  strtab = _bfd_stringtab_init ();
1998  if (strtab == NULL)
1999    return FALSE;
2000
2001  if (sym->nsyms > 0)
2002    /* Although we don't strictly need to do this, for compatibility with
2003       Darwin system tools, actually output an empty string for the index
2004       0 entry.  */
2005    _bfd_stringtab_add (strtab, "", TRUE, FALSE);
2006
2007  for (i = 0; i < sym->nsyms; i++)
2008    {
2009      bfd_size_type str_index;
2010      bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2011
2012      if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
2013	/* An index of 0 always means the empty string.  */
2014	str_index = 0;
2015      else
2016	{
2017	  str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
2018
2019	  if (str_index == (bfd_size_type) -1)
2020	    goto err;
2021	}
2022
2023      if (wide)
2024	{
2025	  struct mach_o_nlist_64_external raw;
2026
2027	  bfd_h_put_32 (abfd, str_index, raw.n_strx);
2028	  bfd_h_put_8 (abfd, s->n_type, raw.n_type);
2029	  bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
2030	  bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
2031	  bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value,
2032			raw.n_value);
2033
2034	  if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2035	    goto err;
2036	}
2037      else
2038	{
2039	  struct mach_o_nlist_external raw;
2040
2041	  bfd_h_put_32 (abfd, str_index, raw.n_strx);
2042	  bfd_h_put_8 (abfd, s->n_type, raw.n_type);
2043	  bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
2044	  bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
2045	  bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value,
2046			raw.n_value);
2047
2048	  if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2049	    goto err;
2050	}
2051    }
2052  sym->strsize = _bfd_stringtab_size (strtab);
2053  sym->stroff = mdata->filelen;
2054  mdata->filelen += sym->strsize;
2055
2056  if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0)
2057    goto err;
2058
2059  if (!_bfd_stringtab_emit (abfd, strtab))
2060    goto err;
2061
2062  /* Pad string table.  */
2063  padlen = bfd_mach_o_pad4 (abfd, sym->strsize);
2064  if (padlen < 0)
2065    return FALSE;
2066  mdata->filelen += padlen;
2067  sym->strsize += padlen;
2068
2069  return TRUE;
2070
2071 err:
2072  _bfd_stringtab_free (strtab);
2073  sym->strsize = 0;
2074  return FALSE;
2075}
2076
2077static bfd_boolean
2078bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
2079{
2080  bfd_mach_o_symtab_command *sym = &command->command.symtab;
2081  struct mach_o_symtab_command_external raw;
2082
2083  BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
2084
2085  /* The command.  */
2086  bfd_h_put_32 (abfd, sym->symoff, raw.symoff);
2087  bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms);
2088  bfd_h_put_32 (abfd, sym->stroff, raw.stroff);
2089  bfd_h_put_32 (abfd, sym->strsize, raw.strsize);
2090
2091  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2092      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2093    return FALSE;
2094
2095  return TRUE;
2096}
2097
2098/* Count the number of indirect symbols in the image.
2099   Requires that the sections are in their final order.  */
2100
2101static unsigned int
2102bfd_mach_o_count_indirect_symbols (bfd *abfd, bfd_mach_o_data_struct *mdata)
2103{
2104  unsigned int i;
2105  unsigned int nisyms = 0;
2106
2107  for (i = 0; i < mdata->nsects; ++i)
2108    {
2109      bfd_mach_o_section *sec = mdata->sections[i];
2110
2111      switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2112	{
2113	  case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
2114	  case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
2115	  case BFD_MACH_O_S_SYMBOL_STUBS:
2116	    nisyms += bfd_mach_o_section_get_nbr_indirect (abfd, sec);
2117	    break;
2118	  default:
2119	    break;
2120	}
2121    }
2122  return nisyms;
2123}
2124
2125/* Create the dysymtab.  */
2126
2127static bfd_boolean
2128bfd_mach_o_build_dysymtab (bfd *abfd, bfd_mach_o_dysymtab_command *cmd)
2129{
2130  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2131
2132  /* TODO:
2133     We are not going to try and fill these in yet and, moreover, we are
2134     going to bail if they are already set.  */
2135  if (cmd->nmodtab != 0
2136      || cmd->ntoc != 0
2137      || cmd->nextrefsyms != 0)
2138    {
2139      _bfd_error_handler (_("sorry: modtab, toc and extrefsyms are not yet"
2140			    " implemented for dysymtab commands."));
2141      return FALSE;
2142    }
2143
2144  cmd->ilocalsym = 0;
2145
2146  if (bfd_get_symcount (abfd) > 0)
2147    {
2148      asymbol **symbols = bfd_get_outsymbols (abfd);
2149      unsigned long i;
2150
2151       /* Count the number of each kind of symbol.  */
2152      for (i = 0; i < bfd_get_symcount (abfd); ++i)
2153	{
2154	  bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2155	  if (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT))
2156	    break;
2157	}
2158      cmd->nlocalsym = i;
2159      cmd->iextdefsym = i;
2160      for (; i < bfd_get_symcount (abfd); ++i)
2161	{
2162	  bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2163	  if ((s->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF)
2164	    break;
2165	}
2166      cmd->nextdefsym = i - cmd->nlocalsym;
2167      cmd->iundefsym = cmd->nextdefsym + cmd->iextdefsym;
2168      cmd->nundefsym = bfd_get_symcount (abfd)
2169			- cmd->nlocalsym
2170			- cmd->nextdefsym;
2171    }
2172  else
2173    {
2174      cmd->nlocalsym = 0;
2175      cmd->iextdefsym = 0;
2176      cmd->nextdefsym = 0;
2177      cmd->iundefsym = 0;
2178      cmd->nundefsym = 0;
2179    }
2180
2181  cmd->nindirectsyms = bfd_mach_o_count_indirect_symbols (abfd, mdata);
2182  if (cmd->nindirectsyms > 0)
2183    {
2184      unsigned i;
2185      unsigned n;
2186      size_t amt;
2187
2188      mdata->filelen = FILE_ALIGN (mdata->filelen, 2);
2189      cmd->indirectsymoff = mdata->filelen;
2190      if (_bfd_mul_overflow (cmd->nindirectsyms, 4, &amt))
2191	return FALSE;
2192      mdata->filelen += amt;
2193
2194      cmd->indirect_syms = bfd_zalloc (abfd, amt);
2195      if (cmd->indirect_syms == NULL)
2196	return FALSE;
2197
2198      n = 0;
2199      for (i = 0; i < mdata->nsects; ++i)
2200	{
2201	  bfd_mach_o_section *sec = mdata->sections[i];
2202
2203	  switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2204	    {
2205	      case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
2206	      case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
2207	      case BFD_MACH_O_S_SYMBOL_STUBS:
2208		{
2209		  unsigned j, num;
2210		  bfd_mach_o_asymbol **isyms = sec->indirect_syms;
2211
2212		  num = bfd_mach_o_section_get_nbr_indirect (abfd, sec);
2213		  if (isyms == NULL || num == 0)
2214		    break;
2215		  /* Record the starting index in the reserved1 field.  */
2216		  sec->reserved1 = n;
2217		  for (j = 0; j < num; j++, n++)
2218		    {
2219		      if (isyms[j] == NULL)
2220			cmd->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL;
2221		      else if (isyms[j]->symbol.section == bfd_abs_section_ptr
2222			       && ! (isyms[j]->n_type & BFD_MACH_O_N_EXT))
2223			cmd->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL
2224						 | BFD_MACH_O_INDIRECT_SYM_ABS;
2225		      else
2226			cmd->indirect_syms[n] = isyms[j]->symbol.udata.i;
2227		    }
2228		}
2229		break;
2230	      default:
2231		break;
2232	    }
2233	}
2234    }
2235
2236  return TRUE;
2237}
2238
2239/* Write a dysymtab command.
2240   TODO: Possibly coalesce writes of smaller objects.  */
2241
2242static bfd_boolean
2243bfd_mach_o_write_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
2244{
2245  bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
2246
2247  BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
2248
2249  if (cmd->nmodtab != 0)
2250    {
2251      unsigned int i;
2252
2253      if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
2254	return FALSE;
2255
2256      for (i = 0; i < cmd->nmodtab; i++)
2257	{
2258	  bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
2259	  unsigned int iinit;
2260	  unsigned int ninit;
2261
2262	  iinit = module->iinit & 0xffff;
2263	  iinit |= ((module->iterm & 0xffff) << 16);
2264
2265	  ninit = module->ninit & 0xffff;
2266	  ninit |= ((module->nterm & 0xffff) << 16);
2267
2268	  if (bfd_mach_o_wide_p (abfd))
2269	    {
2270	      struct mach_o_dylib_module_64_external w;
2271
2272	      bfd_h_put_32 (abfd, module->module_name_idx, &w.module_name);
2273	      bfd_h_put_32 (abfd, module->iextdefsym, &w.iextdefsym);
2274	      bfd_h_put_32 (abfd, module->nextdefsym, &w.nextdefsym);
2275	      bfd_h_put_32 (abfd, module->irefsym, &w.irefsym);
2276	      bfd_h_put_32 (abfd, module->nrefsym, &w.nrefsym);
2277	      bfd_h_put_32 (abfd, module->ilocalsym, &w.ilocalsym);
2278	      bfd_h_put_32 (abfd, module->nlocalsym, &w.nlocalsym);
2279	      bfd_h_put_32 (abfd, module->iextrel, &w.iextrel);
2280	      bfd_h_put_32 (abfd, module->nextrel, &w.nextrel);
2281	      bfd_h_put_32 (abfd, iinit, &w.iinit_iterm);
2282	      bfd_h_put_32 (abfd, ninit, &w.ninit_nterm);
2283	      bfd_h_put_64 (abfd, module->objc_module_info_addr,
2284			    &w.objc_module_info_addr);
2285	      bfd_h_put_32 (abfd, module->objc_module_info_size,
2286			    &w.objc_module_info_size);
2287
2288	      if (bfd_bwrite ((void *) &w, sizeof (w), abfd) != sizeof (w))
2289		return FALSE;
2290	    }
2291	  else
2292	    {
2293	      struct mach_o_dylib_module_external n;
2294
2295	      bfd_h_put_32 (abfd, module->module_name_idx, &n.module_name);
2296	      bfd_h_put_32 (abfd, module->iextdefsym, &n.iextdefsym);
2297	      bfd_h_put_32 (abfd, module->nextdefsym, &n.nextdefsym);
2298	      bfd_h_put_32 (abfd, module->irefsym, &n.irefsym);
2299	      bfd_h_put_32 (abfd, module->nrefsym, &n.nrefsym);
2300	      bfd_h_put_32 (abfd, module->ilocalsym, &n.ilocalsym);
2301	      bfd_h_put_32 (abfd, module->nlocalsym, &n.nlocalsym);
2302	      bfd_h_put_32 (abfd, module->iextrel, &n.iextrel);
2303	      bfd_h_put_32 (abfd, module->nextrel, &n.nextrel);
2304	      bfd_h_put_32 (abfd, iinit, &n.iinit_iterm);
2305	      bfd_h_put_32 (abfd, ninit, &n.ninit_nterm);
2306	      bfd_h_put_32 (abfd, module->objc_module_info_addr,
2307			    &n.objc_module_info_addr);
2308	      bfd_h_put_32 (abfd, module->objc_module_info_size,
2309			    &n.objc_module_info_size);
2310
2311	      if (bfd_bwrite ((void *) &n, sizeof (n), abfd) != sizeof (n))
2312		return FALSE;
2313	    }
2314	}
2315    }
2316
2317  if (cmd->ntoc != 0)
2318    {
2319      unsigned int i;
2320
2321      if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
2322	return FALSE;
2323
2324      for (i = 0; i < cmd->ntoc; i++)
2325	{
2326	  struct mach_o_dylib_table_of_contents_external raw;
2327	  bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
2328
2329	  bfd_h_put_32 (abfd, toc->symbol_index, &raw.symbol_index);
2330	  bfd_h_put_32 (abfd, toc->module_index, &raw.module_index);
2331
2332	  if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2333	    return FALSE;
2334	}
2335    }
2336
2337  if (cmd->nindirectsyms > 0)
2338    {
2339      unsigned int i;
2340
2341      if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
2342	return FALSE;
2343
2344      for (i = 0; i < cmd->nindirectsyms; ++i)
2345	{
2346	  unsigned char raw[4];
2347
2348	  bfd_h_put_32 (abfd, cmd->indirect_syms[i], &raw);
2349	  if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
2350	    return FALSE;
2351	}
2352    }
2353
2354  if (cmd->nextrefsyms != 0)
2355    {
2356      unsigned int i;
2357
2358      if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
2359	return FALSE;
2360
2361      for (i = 0; i < cmd->nextrefsyms; i++)
2362	{
2363	  unsigned long v;
2364	  unsigned char raw[4];
2365	  bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
2366
2367	  /* Fields isym and flags are written as bit-fields, thus we need
2368	     a specific processing for endianness.  */
2369
2370	  if (bfd_big_endian (abfd))
2371	    {
2372	      v = ((ref->isym & 0xffffff) << 8);
2373	      v |= ref->flags & 0xff;
2374	    }
2375	  else
2376	    {
2377	      v = ref->isym  & 0xffffff;
2378	      v |= ((ref->flags & 0xff) << 24);
2379	    }
2380
2381	  bfd_h_put_32 (abfd, v, raw);
2382	  if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
2383	    return FALSE;
2384	}
2385    }
2386
2387  /* The command.  */
2388  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0)
2389    return FALSE;
2390  else
2391    {
2392      struct mach_o_dysymtab_command_external raw;
2393
2394      bfd_h_put_32 (abfd, cmd->ilocalsym, &raw.ilocalsym);
2395      bfd_h_put_32 (abfd, cmd->nlocalsym, &raw.nlocalsym);
2396      bfd_h_put_32 (abfd, cmd->iextdefsym, &raw.iextdefsym);
2397      bfd_h_put_32 (abfd, cmd->nextdefsym, &raw.nextdefsym);
2398      bfd_h_put_32 (abfd, cmd->iundefsym, &raw.iundefsym);
2399      bfd_h_put_32 (abfd, cmd->nundefsym, &raw.nundefsym);
2400      bfd_h_put_32 (abfd, cmd->tocoff, &raw.tocoff);
2401      bfd_h_put_32 (abfd, cmd->ntoc, &raw.ntoc);
2402      bfd_h_put_32 (abfd, cmd->modtaboff, &raw.modtaboff);
2403      bfd_h_put_32 (abfd, cmd->nmodtab, &raw.nmodtab);
2404      bfd_h_put_32 (abfd, cmd->extrefsymoff, &raw.extrefsymoff);
2405      bfd_h_put_32 (abfd, cmd->nextrefsyms, &raw.nextrefsyms);
2406      bfd_h_put_32 (abfd, cmd->indirectsymoff, &raw.indirectsymoff);
2407      bfd_h_put_32 (abfd, cmd->nindirectsyms, &raw.nindirectsyms);
2408      bfd_h_put_32 (abfd, cmd->extreloff, &raw.extreloff);
2409      bfd_h_put_32 (abfd, cmd->nextrel, &raw.nextrel);
2410      bfd_h_put_32 (abfd, cmd->locreloff, &raw.locreloff);
2411      bfd_h_put_32 (abfd, cmd->nlocrel, &raw.nlocrel);
2412
2413      if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2414	return FALSE;
2415    }
2416
2417  return TRUE;
2418}
2419
2420static unsigned
2421bfd_mach_o_primary_symbol_sort_key (bfd_mach_o_asymbol *s)
2422{
2423  unsigned mtyp = s->n_type & BFD_MACH_O_N_TYPE;
2424
2425  /* Just leave debug symbols where they are (pretend they are local, and
2426     then they will just be sorted on position).  */
2427  if (s->n_type & BFD_MACH_O_N_STAB)
2428    return 0;
2429
2430  /* Local (we should never see an undefined local AFAICT).  */
2431  if (! (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT)))
2432    return 0;
2433
2434  /* Common symbols look like undefined externs.  */
2435  if (mtyp == BFD_MACH_O_N_UNDF)
2436    return 2;
2437
2438  /* A defined non-local, non-debug symbol.  */
2439  return 1;
2440}
2441
2442static int
2443bfd_mach_o_cf_symbols (const void *a, const void *b)
2444{
2445  bfd_mach_o_asymbol *sa = *(bfd_mach_o_asymbol **) a;
2446  bfd_mach_o_asymbol *sb = *(bfd_mach_o_asymbol **) b;
2447  unsigned int soa, sob;
2448
2449  soa = bfd_mach_o_primary_symbol_sort_key (sa);
2450  sob = bfd_mach_o_primary_symbol_sort_key (sb);
2451  if (soa < sob)
2452    return -1;
2453
2454  if (soa > sob)
2455    return 1;
2456
2457  /* If it's local or stab, just preserve the input order.  */
2458  if (soa == 0)
2459    {
2460      if (sa->symbol.udata.i < sb->symbol.udata.i)
2461	return -1;
2462      if (sa->symbol.udata.i > sb->symbol.udata.i)
2463	return  1;
2464
2465      /* This is probably an error.  */
2466      return 0;
2467    }
2468
2469  /* The second sort key is name.  */
2470  return strcmp (sa->symbol.name, sb->symbol.name);
2471}
2472
2473/* Process the symbols.
2474
2475   This should be OK for single-module files - but it is not likely to work
2476   for multi-module shared libraries.
2477
2478   (a) If the application has not filled in the relevant mach-o fields, make
2479       an estimate.
2480
2481   (b) Order them, like this:
2482	(  i) local.
2483		(unsorted)
2484	( ii) external defined
2485		(by name)
2486	(iii) external undefined/common
2487		(by name)
2488	( iv) common
2489		(by name)
2490*/
2491
2492static bfd_boolean
2493bfd_mach_o_mangle_symbols (bfd *abfd)
2494{
2495  unsigned long i;
2496  asymbol **symbols = bfd_get_outsymbols (abfd);
2497
2498  if (symbols == NULL || bfd_get_symcount (abfd) == 0)
2499    return TRUE;
2500
2501  for (i = 0; i < bfd_get_symcount (abfd); i++)
2502    {
2503      bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2504
2505      /* We use this value, which is out-of-range as a symbol index, to signal
2506	 that the mach-o-specific data are not filled in and need to be created
2507	 from the bfd values.  It is much preferable for the application to do
2508	 this, since more meaningful diagnostics can be made that way.  */
2509
2510      if (s->symbol.udata.i == SYM_MACHO_FIELDS_UNSET)
2511	{
2512	  /* No symbol information has been set - therefore determine
2513	     it from the bfd symbol flags/info.  */
2514	  if (s->symbol.section == bfd_abs_section_ptr)
2515	    s->n_type = BFD_MACH_O_N_ABS;
2516	  else if (s->symbol.section == bfd_und_section_ptr)
2517	    {
2518	      s->n_type = BFD_MACH_O_N_UNDF;
2519	      if (s->symbol.flags & BSF_WEAK)
2520		s->n_desc |= BFD_MACH_O_N_WEAK_REF;
2521	      /* mach-o automatically makes undefined symbols extern.  */
2522	      s->n_type |= BFD_MACH_O_N_EXT;
2523	      s->symbol.flags |= BSF_GLOBAL;
2524	    }
2525	  else if (s->symbol.section == bfd_com_section_ptr)
2526	    {
2527	      s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
2528	      s->symbol.flags |= BSF_GLOBAL;
2529	    }
2530	  else
2531	    s->n_type = BFD_MACH_O_N_SECT;
2532	}
2533
2534      /* Update external symbol bit in case objcopy changed it.  */
2535      if (s->symbol.flags & BSF_GLOBAL)
2536	s->n_type |= BFD_MACH_O_N_EXT;
2537      else
2538	s->n_type &= ~BFD_MACH_O_N_EXT;
2539
2540      /* Put the section index in, where required.  */
2541      if ((s->symbol.section != bfd_abs_section_ptr
2542	  && s->symbol.section != bfd_und_section_ptr
2543	  && s->symbol.section != bfd_com_section_ptr)
2544	  || ((s->n_type & BFD_MACH_O_N_STAB) != 0
2545	       && s->symbol.name == NULL))
2546	s->n_sect = s->symbol.section->output_section->target_index;
2547
2548      /* Number to preserve order for local and debug syms.  */
2549      s->symbol.udata.i = i;
2550    }
2551
2552  /* Sort the symbols.  */
2553  qsort ((void *) symbols, (size_t) bfd_get_symcount (abfd),
2554	 sizeof (asymbol *), bfd_mach_o_cf_symbols);
2555
2556  for (i = 0; i < bfd_get_symcount (abfd); ++i)
2557    {
2558      bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2559      s->symbol.udata.i = i;  /* renumber.  */
2560    }
2561
2562  return TRUE;
2563}
2564
2565/* We build a flat table of sections, which can be re-ordered if necessary.
2566   Fill in the section number and other mach-o-specific data.  */
2567
2568static bfd_boolean
2569bfd_mach_o_mangle_sections (bfd *abfd, bfd_mach_o_data_struct *mdata)
2570{
2571  asection *sec;
2572  unsigned target_index;
2573  unsigned nsect;
2574  size_t amt;
2575
2576  nsect = bfd_count_sections (abfd);
2577
2578  /* Don't do it if it's already set - assume the application knows what it's
2579     doing.  */
2580  if (mdata->nsects == nsect
2581      && (mdata->nsects == 0 || mdata->sections != NULL))
2582    return TRUE;
2583
2584  /* We need to check that this can be done...  */
2585  if (nsect > 255)
2586    {
2587      _bfd_error_handler (_("mach-o: there are too many sections (%u)"
2588			    " maximum is 255,\n"), nsect);
2589      return FALSE;
2590    }
2591
2592  mdata->nsects = nsect;
2593  amt = mdata->nsects * sizeof (bfd_mach_o_section *);
2594  mdata->sections = bfd_alloc (abfd, amt);
2595  if (mdata->sections == NULL)
2596    return FALSE;
2597
2598  /* Create Mach-O sections.
2599     Section type, attribute and align should have been set when the
2600     section was created - either read in or specified.  */
2601  target_index = 0;
2602  for (sec = abfd->sections; sec; sec = sec->next)
2603    {
2604      unsigned bfd_align = bfd_section_alignment (sec);
2605      bfd_mach_o_section *msect = bfd_mach_o_get_mach_o_section (sec);
2606
2607      mdata->sections[target_index] = msect;
2608
2609      msect->addr = bfd_section_vma (sec);
2610      msect->size = bfd_section_size (sec);
2611
2612      /* Use the largest alignment set, in case it was bumped after the
2613	 section was created.  */
2614      msect->align = msect->align > bfd_align ? msect->align : bfd_align;
2615
2616      msect->offset = 0;
2617      sec->target_index = ++target_index;
2618    }
2619
2620  return TRUE;
2621}
2622
2623bfd_boolean
2624bfd_mach_o_write_contents (bfd *abfd)
2625{
2626  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2627  bfd_mach_o_load_command *cmd;
2628  bfd_mach_o_symtab_command *symtab = NULL;
2629  bfd_mach_o_dysymtab_command *dysymtab = NULL;
2630  bfd_mach_o_segment_command *linkedit = NULL;
2631
2632  /* Make the commands, if not already present.  */
2633  if (!abfd->output_has_begun && !bfd_mach_o_build_commands (abfd))
2634    return FALSE;
2635  abfd->output_has_begun = TRUE;
2636
2637  /* Write the header.  */
2638  if (!bfd_mach_o_write_header (abfd, &mdata->header))
2639    return FALSE;
2640
2641  /* First pass: allocate the linkedit segment.  */
2642  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
2643    switch (cmd->type)
2644      {
2645      case BFD_MACH_O_LC_SEGMENT_64:
2646      case BFD_MACH_O_LC_SEGMENT:
2647	if (strcmp (cmd->command.segment.segname, "__LINKEDIT") == 0)
2648	  linkedit = &cmd->command.segment;
2649	break;
2650      case BFD_MACH_O_LC_SYMTAB:
2651	symtab = &cmd->command.symtab;
2652	break;
2653      case BFD_MACH_O_LC_DYSYMTAB:
2654	dysymtab = &cmd->command.dysymtab;
2655	break;
2656      case BFD_MACH_O_LC_DYLD_INFO:
2657	{
2658	  bfd_mach_o_dyld_info_command *di = &cmd->command.dyld_info;
2659
2660	  if (di->rebase_size != 0)
2661	    {
2662	      di->rebase_off = mdata->filelen;
2663	      mdata->filelen += di->rebase_size;
2664	    }
2665	  if (di->bind_size != 0)
2666	    {
2667	      di->bind_off = mdata->filelen;
2668	      mdata->filelen += di->bind_size;
2669	    }
2670	  if (di->weak_bind_size != 0)
2671	    {
2672	      di->weak_bind_off = mdata->filelen;
2673	      mdata->filelen += di->weak_bind_size;
2674	    }
2675	  if (di->lazy_bind_size != 0)
2676	    {
2677	      di->lazy_bind_off = mdata->filelen;
2678	      mdata->filelen += di->lazy_bind_size;
2679	    }
2680	  if (di->export_size != 0)
2681	    {
2682	      di->export_off = mdata->filelen;
2683	      mdata->filelen += di->export_size;
2684	    }
2685	}
2686	break;
2687      case BFD_MACH_O_LC_LOAD_DYLIB:
2688      case BFD_MACH_O_LC_LOAD_DYLINKER:
2689      case BFD_MACH_O_LC_MAIN:
2690	/* Nothing to do.  */
2691	break;
2692      default:
2693	_bfd_error_handler
2694	  (_("unable to allocate data for load command %#x"),
2695	   cmd->type);
2696	break;
2697      }
2698
2699  /* Specially handle symtab and dysymtab.  */
2700
2701  /* Pre-allocate the symbol table (but not the string table).  The reason
2702     is that the dysymtab is after the symbol table but before the string
2703     table (required by the native strip tool).  */
2704  if (symtab != NULL)
2705    {
2706      unsigned int symlen;
2707      unsigned int wide = bfd_mach_o_wide_p (abfd);
2708
2709      symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
2710
2711      /* Align for symbols.  */
2712      mdata->filelen = FILE_ALIGN (mdata->filelen, wide ? 3 : 2);
2713      symtab->symoff = mdata->filelen;
2714
2715      symtab->nsyms = bfd_get_symcount (abfd);
2716      mdata->filelen += symtab->nsyms * symlen;
2717    }
2718
2719  /* Build the dysymtab.  */
2720  if (dysymtab != NULL)
2721    if (!bfd_mach_o_build_dysymtab (abfd, dysymtab))
2722      return FALSE;
2723
2724  /* Write symtab and strtab.  */
2725  if (symtab != NULL)
2726    if (!bfd_mach_o_write_symtab_content (abfd, symtab))
2727      return FALSE;
2728
2729  /* Adjust linkedit size.  */
2730  if (linkedit != NULL)
2731    {
2732      /* bfd_vma pagemask = bfd_mach_o_get_backend_data (abfd)->page_size - 1; */
2733
2734      linkedit->vmsize = mdata->filelen - linkedit->fileoff;
2735      /* linkedit->vmsize = (linkedit->vmsize + pagemask) & ~pagemask; */
2736      linkedit->filesize = mdata->filelen - linkedit->fileoff;
2737
2738      linkedit->initprot = BFD_MACH_O_PROT_READ;
2739      linkedit->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
2740	| BFD_MACH_O_PROT_EXECUTE;
2741    }
2742
2743  /* Second pass: write commands.  */
2744  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
2745    {
2746      struct mach_o_load_command_external raw;
2747      unsigned long typeflag;
2748
2749      typeflag = cmd->type | (cmd->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
2750
2751      bfd_h_put_32 (abfd, typeflag, raw.cmd);
2752      bfd_h_put_32 (abfd, cmd->len, raw.cmdsize);
2753
2754      if (bfd_seek (abfd, cmd->offset, SEEK_SET) != 0
2755	  || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8)
2756	return FALSE;
2757
2758      switch (cmd->type)
2759	{
2760	case BFD_MACH_O_LC_SEGMENT:
2761	  if (!bfd_mach_o_write_segment_32 (abfd, cmd))
2762	    return FALSE;
2763	  break;
2764	case BFD_MACH_O_LC_SEGMENT_64:
2765	  if (!bfd_mach_o_write_segment_64 (abfd, cmd))
2766	    return FALSE;
2767	  break;
2768	case BFD_MACH_O_LC_SYMTAB:
2769	  if (!bfd_mach_o_write_symtab (abfd, cmd))
2770	    return FALSE;
2771	  break;
2772	case BFD_MACH_O_LC_DYSYMTAB:
2773	  if (!bfd_mach_o_write_dysymtab (abfd, cmd))
2774	    return FALSE;
2775	  break;
2776	case BFD_MACH_O_LC_THREAD:
2777	case BFD_MACH_O_LC_UNIXTHREAD:
2778	  if (!bfd_mach_o_write_thread (abfd, cmd))
2779	    return FALSE;
2780	  break;
2781	case BFD_MACH_O_LC_LOAD_DYLIB:
2782	  if (!bfd_mach_o_write_dylib (abfd, cmd))
2783	    return FALSE;
2784	  break;
2785	case BFD_MACH_O_LC_LOAD_DYLINKER:
2786	  if (!bfd_mach_o_write_dylinker (abfd, cmd))
2787	    return FALSE;
2788	  break;
2789	case BFD_MACH_O_LC_MAIN:
2790	  if (!bfd_mach_o_write_main (abfd, cmd))
2791	    return FALSE;
2792	  break;
2793	case BFD_MACH_O_LC_DYLD_INFO:
2794	  if (!bfd_mach_o_write_dyld_info (abfd, cmd))
2795	    return FALSE;
2796	  break;
2797	default:
2798	  _bfd_error_handler
2799	    (_("unable to write unknown load command %#x"),
2800	     cmd->type);
2801	  return FALSE;
2802	}
2803    }
2804
2805  return TRUE;
2806}
2807
2808static void
2809bfd_mach_o_append_section_to_segment (bfd_mach_o_segment_command *seg,
2810				      bfd_mach_o_section *s)
2811{
2812  if (seg->sect_head == NULL)
2813    seg->sect_head = s;
2814  else
2815    seg->sect_tail->next = s;
2816  seg->sect_tail = s;
2817}
2818
2819/* Create section Mach-O flags from BFD flags.  */
2820
2821static void
2822bfd_mach_o_set_section_flags_from_bfd (bfd *abfd ATTRIBUTE_UNUSED,
2823				       asection *sec)
2824{
2825  flagword bfd_flags;
2826  bfd_mach_o_section *s = bfd_mach_o_get_mach_o_section (sec);
2827
2828  /* Create default flags.  */
2829  bfd_flags = bfd_section_flags (sec);
2830  if ((bfd_flags & SEC_CODE) == SEC_CODE)
2831    s->flags = BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS
2832      | BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS
2833      | BFD_MACH_O_S_REGULAR;
2834  else if ((bfd_flags & (SEC_ALLOC | SEC_LOAD)) == SEC_ALLOC)
2835    s->flags = BFD_MACH_O_S_ZEROFILL;
2836  else if (bfd_flags & SEC_DEBUGGING)
2837    s->flags = BFD_MACH_O_S_REGULAR |  BFD_MACH_O_S_ATTR_DEBUG;
2838  else
2839    s->flags = BFD_MACH_O_S_REGULAR;
2840}
2841
2842static bfd_boolean
2843bfd_mach_o_build_obj_seg_command (bfd *abfd, bfd_mach_o_segment_command *seg)
2844{
2845  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2846  unsigned int i, j;
2847
2848  seg->vmaddr = 0;
2849  seg->fileoff = mdata->filelen;
2850  seg->initprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
2851    | BFD_MACH_O_PROT_EXECUTE;
2852  seg->maxprot = seg->initprot;
2853
2854  /*  Append sections to the segment.
2855
2856      This is a little tedious, we have to honor the need to account zerofill
2857      sections after all the rest.  This forces us to do the calculation of
2858      total vmsize in three passes so that any alignment increments are
2859      properly accounted.  */
2860  for (i = 0; i < mdata->nsects; ++i)
2861    {
2862      bfd_mach_o_section *s = mdata->sections[i];
2863      asection *sec = s->bfdsection;
2864
2865      /* Although we account for zerofill section sizes in vm order, they are
2866	 placed in the file in source sequence.  */
2867      bfd_mach_o_append_section_to_segment (seg, s);
2868      s->offset = 0;
2869
2870      /* Zerofill sections have zero file size & offset, the only content
2871	 written to the file is the symbols.  */
2872      if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) == BFD_MACH_O_S_ZEROFILL
2873	  || ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2874	      == BFD_MACH_O_S_GB_ZEROFILL))
2875	continue;
2876
2877      /* The Darwin system tools (in MH_OBJECT files, at least) always account
2878	 sections, even those with zero size.  */
2879      if (s->size > 0)
2880	{
2881	  seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
2882	  seg->vmsize += s->size;
2883
2884	  /* MH_OBJECT files have unaligned content.  */
2885	  if (1)
2886	    {
2887	      seg->filesize = FILE_ALIGN (seg->filesize, s->align);
2888	      mdata->filelen = FILE_ALIGN (mdata->filelen, s->align);
2889	    }
2890	  seg->filesize += s->size;
2891
2892	  /* The system tools write even zero-sized sections with an offset
2893	     field set to the current file position.  */
2894	  s->offset = mdata->filelen;
2895	}
2896
2897      sec->filepos = s->offset;
2898      mdata->filelen += s->size;
2899    }
2900
2901  /* Now pass through again, for zerofill, only now we just update the
2902     vmsize, and then for zerofill_GB.  */
2903  for (j = 0; j < 2; j++)
2904    {
2905      unsigned int stype;
2906
2907      if (j == 0)
2908	stype = BFD_MACH_O_S_ZEROFILL;
2909      else
2910	stype = BFD_MACH_O_S_GB_ZEROFILL;
2911
2912      for (i = 0; i < mdata->nsects; ++i)
2913	{
2914	  bfd_mach_o_section *s = mdata->sections[i];
2915
2916	  if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) != stype)
2917	    continue;
2918
2919	  if (s->size > 0)
2920	    {
2921	      seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
2922	      seg->vmsize += s->size;
2923	    }
2924	}
2925    }
2926
2927  /* Allocate space for the relocations.  */
2928  mdata->filelen = FILE_ALIGN (mdata->filelen, 2);
2929
2930  for (i = 0; i < mdata->nsects; ++i)
2931    {
2932      bfd_mach_o_section *ms = mdata->sections[i];
2933      asection *sec = ms->bfdsection;
2934
2935      ms->nreloc = sec->reloc_count;
2936      if (ms->nreloc == 0)
2937	{
2938	  /* Clear nreloc and reloff if there is no relocs.  */
2939	  ms->reloff = 0;
2940	  continue;
2941	}
2942      sec->rel_filepos = mdata->filelen;
2943      ms->reloff = sec->rel_filepos;
2944      mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
2945    }
2946
2947  return TRUE;
2948}
2949
2950static bfd_boolean
2951bfd_mach_o_build_exec_seg_command (bfd *abfd, bfd_mach_o_segment_command *seg)
2952{
2953  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2954  unsigned int i;
2955  bfd_vma pagemask = bfd_mach_o_get_backend_data (abfd)->page_size - 1;
2956  bfd_vma vma;
2957  bfd_mach_o_section *s;
2958
2959  seg->vmsize = 0;
2960
2961  seg->fileoff = mdata->filelen;
2962  seg->maxprot = 0;
2963  seg->initprot = 0;
2964  seg->flags = 0;
2965
2966  /*  Append sections to the segment.  We assume they are properly ordered
2967      by vma (but we check that).  */
2968  vma = 0;
2969  for (i = 0; i < mdata->nsects; ++i)
2970    {
2971      s = mdata->sections[i];
2972
2973      /* Consider only sections for this segment.  */
2974      if (strcmp (seg->segname, s->segname) != 0)
2975	continue;
2976
2977      bfd_mach_o_append_section_to_segment (seg, s);
2978
2979      if (s->addr < vma)
2980	{
2981	  _bfd_error_handler
2982	    /* xgettext:c-format */
2983	    (_("section address (%#" PRIx64 ") "
2984	       "below start of segment (%#" PRIx64 ")"),
2985	       (uint64_t) s->addr, (uint64_t) vma);
2986	  return FALSE;
2987	}
2988
2989      vma = s->addr + s->size;
2990    }
2991
2992  /* Set segment file offset: make it page aligned.  */
2993  vma = seg->sect_head->addr;
2994  seg->vmaddr = vma & ~pagemask;
2995  if ((mdata->filelen & pagemask) > (vma & pagemask))
2996    mdata->filelen += pagemask + 1;
2997  seg->fileoff = mdata->filelen & ~pagemask;
2998  mdata->filelen = seg->fileoff + (vma & pagemask);
2999
3000  /* Set section file offset.  */
3001  for (s = seg->sect_head; s != NULL; s = s->next)
3002    {
3003      asection *sec = s->bfdsection;
3004      flagword flags = bfd_section_flags (sec);
3005
3006      /* Adjust segment size.  */
3007      seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
3008      seg->vmsize += s->size;
3009
3010      /* File offset and length.  */
3011      seg->filesize = FILE_ALIGN (seg->filesize, s->align);
3012
3013      if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) != BFD_MACH_O_S_ZEROFILL
3014	  && ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3015	      != BFD_MACH_O_S_GB_ZEROFILL))
3016	{
3017	  mdata->filelen = FILE_ALIGN (mdata->filelen, s->align);
3018
3019	  s->offset = mdata->filelen;
3020	  s->bfdsection->filepos = s->offset;
3021
3022	  seg->filesize += s->size;
3023	  mdata->filelen += s->size;
3024	}
3025      else
3026	{
3027	  s->offset = 0;
3028	  s->bfdsection->filepos = 0;
3029	}
3030
3031      /* Set protection.  */
3032      if (flags & SEC_LOAD)
3033	{
3034	  if (flags & SEC_CODE)
3035	    seg->initprot |= BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_EXECUTE;
3036	  if ((flags & (SEC_DATA | SEC_READONLY)) == SEC_DATA)
3037	    seg->initprot |= BFD_MACH_O_PROT_WRITE | BFD_MACH_O_PROT_READ;
3038	}
3039
3040      /* Relocs shouldn't appear in non-object files.  */
3041      if (s->bfdsection->reloc_count != 0)
3042	return FALSE;
3043    }
3044
3045  /* Set maxprot.  */
3046  if (seg->initprot != 0)
3047    seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
3048		 | BFD_MACH_O_PROT_EXECUTE;
3049  else
3050    seg->maxprot = 0;
3051
3052  /* Round segment size (and file size).  */
3053  seg->vmsize = (seg->vmsize + pagemask) & ~pagemask;
3054  seg->filesize = (seg->filesize + pagemask) & ~pagemask;
3055  mdata->filelen = (mdata->filelen + pagemask) & ~pagemask;
3056
3057  return TRUE;
3058}
3059
3060/* Layout the commands: set commands size and offset, set ncmds and sizeofcmds
3061   fields in header.  */
3062
3063static bfd_boolean
3064bfd_mach_o_layout_commands (bfd_mach_o_data_struct *mdata)
3065{
3066  unsigned wide = mach_o_wide_p (&mdata->header);
3067  unsigned int hdrlen;
3068  ufile_ptr offset;
3069  bfd_mach_o_load_command *cmd;
3070  unsigned int align;
3071  bfd_boolean ret = TRUE;
3072
3073  hdrlen = wide ? BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
3074  align = wide ? 8 - 1 : 4 - 1;
3075  offset = hdrlen;
3076  mdata->header.ncmds = 0;
3077
3078  for (cmd = mdata->first_command; cmd; cmd = cmd->next)
3079    {
3080      mdata->header.ncmds++;
3081      cmd->offset = offset;
3082
3083      switch (cmd->type)
3084	{
3085	case BFD_MACH_O_LC_SEGMENT_64:
3086	  cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE
3087	    + BFD_MACH_O_SECTION_64_SIZE * cmd->command.segment.nsects;
3088	  break;
3089	case BFD_MACH_O_LC_SEGMENT:
3090	  cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE
3091	    + BFD_MACH_O_SECTION_SIZE * cmd->command.segment.nsects;
3092	  break;
3093	case BFD_MACH_O_LC_SYMTAB:
3094	  cmd->len = sizeof (struct mach_o_symtab_command_external)
3095	    + BFD_MACH_O_LC_SIZE;
3096	  break;
3097	case BFD_MACH_O_LC_DYSYMTAB:
3098	  cmd->len = sizeof (struct mach_o_dysymtab_command_external)
3099		 + BFD_MACH_O_LC_SIZE;
3100	  break;
3101	case BFD_MACH_O_LC_LOAD_DYLIB:
3102	  cmd->len = sizeof (struct mach_o_dylib_command_external)
3103		 + BFD_MACH_O_LC_SIZE;
3104	  cmd->command.dylib.name_offset = cmd->len;
3105	  cmd->len += strlen (cmd->command.dylib.name_str);
3106	  cmd->len = (cmd->len + align) & ~align;
3107	  break;
3108	case BFD_MACH_O_LC_LOAD_DYLINKER:
3109	  cmd->len = sizeof (struct mach_o_str_command_external)
3110		 + BFD_MACH_O_LC_SIZE;
3111	  cmd->command.dylinker.name_offset = cmd->len;
3112	  cmd->len += strlen (cmd->command.dylinker.name_str);
3113	  cmd->len = (cmd->len + align) & ~align;
3114	  break;
3115	case BFD_MACH_O_LC_MAIN:
3116	  cmd->len = sizeof (struct mach_o_entry_point_command_external)
3117		 + BFD_MACH_O_LC_SIZE;
3118	  break;
3119	case BFD_MACH_O_LC_DYLD_INFO:
3120	  cmd->len = sizeof (struct mach_o_dyld_info_command_external)
3121		 + BFD_MACH_O_LC_SIZE;
3122	  break;
3123	default:
3124	  _bfd_error_handler
3125	    (_("unable to layout unknown load command %#x"),
3126	     cmd->type);
3127	  ret = FALSE;
3128	  break;
3129	}
3130
3131      BFD_ASSERT (cmd->len % (align + 1) == 0);
3132      offset += cmd->len;
3133    }
3134  mdata->header.sizeofcmds = offset - hdrlen;
3135  mdata->filelen = offset;
3136
3137  return ret;
3138}
3139
3140/* Subroutine of bfd_mach_o_build_commands: set type, name and nsects of a
3141   segment.  */
3142
3143static void
3144bfd_mach_o_init_segment (bfd_mach_o_data_struct *mdata,
3145			 bfd_mach_o_load_command *cmd,
3146			 const char *segname, unsigned int nbr_sect)
3147{
3148  bfd_mach_o_segment_command *seg = &cmd->command.segment;
3149  unsigned wide = mach_o_wide_p (&mdata->header);
3150
3151  /* Init segment command.  */
3152  cmd->type = wide ? BFD_MACH_O_LC_SEGMENT_64 : BFD_MACH_O_LC_SEGMENT;
3153  cmd->type_required = FALSE;
3154
3155  strcpy (seg->segname, segname);
3156  seg->nsects = nbr_sect;
3157
3158  seg->vmaddr = 0;
3159  seg->vmsize = 0;
3160
3161  seg->fileoff = 0;
3162  seg->filesize = 0;
3163  seg->maxprot = 0;
3164  seg->initprot = 0;
3165  seg->flags = 0;
3166  seg->sect_head = NULL;
3167  seg->sect_tail = NULL;
3168}
3169
3170/* Build Mach-O load commands (currently assuming an MH_OBJECT file).
3171   TODO: Other file formats, rebuilding symtab/dysymtab commands for strip
3172   and copy functionality.  */
3173
3174bfd_boolean
3175bfd_mach_o_build_commands (bfd *abfd)
3176{
3177  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3178  unsigned wide = mach_o_wide_p (&mdata->header);
3179  unsigned int nbr_segcmd = 0;
3180  bfd_mach_o_load_command *commands;
3181  unsigned int nbr_commands;
3182  int symtab_idx = -1;
3183  int dysymtab_idx = -1;
3184  int main_idx = -1;
3185  unsigned int i;
3186
3187  /* Return now if already built.  */
3188  if (mdata->header.ncmds != 0)
3189    return TRUE;
3190
3191  /* Fill in the file type, if not already set.  */
3192  if (mdata->header.filetype == 0)
3193    {
3194      if (abfd->flags & EXEC_P)
3195	mdata->header.filetype = BFD_MACH_O_MH_EXECUTE;
3196      else if (abfd->flags & DYNAMIC)
3197	mdata->header.filetype = BFD_MACH_O_MH_DYLIB;
3198      else
3199	mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
3200    }
3201
3202  /* If hasn't already been done, flatten sections list, and sort
3203     if/when required.  Must be done before the symbol table is adjusted,
3204     since that depends on properly numbered sections.  */
3205  if (mdata->nsects == 0 || mdata->sections == NULL)
3206    if (! bfd_mach_o_mangle_sections (abfd, mdata))
3207      return FALSE;
3208
3209  /* Order the symbol table, fill-in/check mach-o specific fields and
3210     partition out any indirect symbols.  */
3211  if (!bfd_mach_o_mangle_symbols (abfd))
3212    return FALSE;
3213
3214  /* Segment commands.  */
3215  if (mdata->header.filetype == BFD_MACH_O_MH_OBJECT)
3216    {
3217      /* Only one segment for all the sections.  But the segment is
3218	 optional if there is no sections.  */
3219      nbr_segcmd = (mdata->nsects > 0) ? 1 : 0;
3220    }
3221  else
3222    {
3223      bfd_mach_o_section *prev_sect = NULL;
3224
3225      /* One pagezero segment and one linkedit segment.  */
3226      nbr_segcmd = 2;
3227
3228      /* Create one segment for associated segment name in sections.
3229	 Assume that sections with the same segment name are consecutive.  */
3230      for (i = 0; i < mdata->nsects; i++)
3231	{
3232	  bfd_mach_o_section *this_sect = mdata->sections[i];
3233
3234	  if (prev_sect == NULL
3235	      || strcmp (prev_sect->segname, this_sect->segname) != 0)
3236	    {
3237	      nbr_segcmd++;
3238	      prev_sect = this_sect;
3239	    }
3240	}
3241    }
3242
3243  nbr_commands = nbr_segcmd;
3244
3245  /* One command for the symbol table (only if there are symbols.  */
3246  if (bfd_get_symcount (abfd) > 0)
3247    symtab_idx = nbr_commands++;
3248
3249  /* FIXME:
3250     This is a rather crude test for whether we should build a dysymtab.  */
3251  if (bfd_mach_o_should_emit_dysymtab ()
3252      && bfd_get_symcount (abfd))
3253    {
3254      /* If there should be a case where a dysymtab could be emitted without
3255	 a symtab (seems improbable), this would need amending.  */
3256      dysymtab_idx = nbr_commands++;
3257    }
3258
3259  /* Add an entry point command.  */
3260  if (mdata->header.filetype == BFD_MACH_O_MH_EXECUTE
3261      && bfd_get_start_address (abfd) != 0)
3262    main_idx = nbr_commands++;
3263
3264  /* Well, we must have a header, at least.  */
3265  mdata->filelen = wide ? BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
3266
3267  /* A bit unusual, but no content is valid;
3268     as -n empty.s -o empty.o  */
3269  if (nbr_commands == 0)
3270    {
3271      /* Layout commands (well none...) and set headers command fields.  */
3272      return bfd_mach_o_layout_commands (mdata);
3273    }
3274
3275  /* Create commands for segments (and symtabs), prepend them.  */
3276  commands = bfd_zalloc (abfd, nbr_commands * sizeof (bfd_mach_o_load_command));
3277  if (commands == NULL)
3278    return FALSE;
3279  for (i = 0; i < nbr_commands - 1; i++)
3280    commands[i].next = &commands[i + 1];
3281  commands[nbr_commands - 1].next = mdata->first_command;
3282  if (mdata->first_command == NULL)
3283    mdata->last_command = &commands[nbr_commands - 1];
3284  mdata->first_command = &commands[0];
3285
3286  if (mdata->header.filetype == BFD_MACH_O_MH_OBJECT && nbr_segcmd != 0)
3287    {
3288      /* For object file, there is only one segment.  */
3289      bfd_mach_o_init_segment (mdata, &commands[0], "", mdata->nsects);
3290    }
3291  else if (nbr_segcmd != 0)
3292    {
3293      bfd_mach_o_load_command *cmd;
3294
3295      BFD_ASSERT (nbr_segcmd >= 2);
3296
3297      /* The pagezero.  */
3298      cmd = &commands[0];
3299      bfd_mach_o_init_segment (mdata, cmd, "__PAGEZERO", 0);
3300
3301      /* Segments from sections.  */
3302      cmd++;
3303      for (i = 0; i < mdata->nsects;)
3304	{
3305	  const char *segname = mdata->sections[i]->segname;
3306	  unsigned int nbr_sect = 1;
3307
3308	  /* Count number of sections for this segment.  */
3309	  for (i++; i < mdata->nsects; i++)
3310	    if (strcmp (mdata->sections[i]->segname, segname) == 0)
3311	      nbr_sect++;
3312	    else
3313	      break;
3314
3315	  bfd_mach_o_init_segment (mdata, cmd, segname, nbr_sect);
3316	  cmd++;
3317	}
3318
3319      /* The linkedit.  */
3320      bfd_mach_o_init_segment (mdata, cmd, "__LINKEDIT", 0);
3321    }
3322
3323  if (symtab_idx >= 0)
3324    {
3325      /* Init symtab command.  */
3326      bfd_mach_o_load_command *cmd = &commands[symtab_idx];
3327
3328      cmd->type = BFD_MACH_O_LC_SYMTAB;
3329      cmd->type_required = FALSE;
3330    }
3331
3332  /* If required, setup symtab command, see comment above about the quality
3333     of this test.  */
3334  if (dysymtab_idx >= 0)
3335    {
3336      bfd_mach_o_load_command *cmd = &commands[dysymtab_idx];
3337
3338      cmd->type = BFD_MACH_O_LC_DYSYMTAB;
3339      cmd->type_required = FALSE;
3340    }
3341
3342  /* Create the main command.  */
3343  if (main_idx >= 0)
3344    {
3345      bfd_mach_o_load_command *cmd = &commands[main_idx];
3346
3347      cmd->type = BFD_MACH_O_LC_MAIN;
3348      cmd->type_required = TRUE;
3349
3350      cmd->command.main.entryoff = 0;
3351      cmd->command.main.stacksize = 0;
3352    }
3353
3354  /* Layout commands.  */
3355  if (! bfd_mach_o_layout_commands (mdata))
3356    return FALSE;
3357
3358  /* So, now we have sized the commands and the filelen set to that.
3359     Now we can build the segment command and set the section file offsets.  */
3360  if (mdata->header.filetype == BFD_MACH_O_MH_OBJECT)
3361    {
3362      for (i = 0; i < nbr_segcmd; i++)
3363	if (!bfd_mach_o_build_obj_seg_command
3364	    (abfd, &commands[i].command.segment))
3365	  return FALSE;
3366    }
3367  else
3368    {
3369      bfd_vma maxvma = 0;
3370
3371      /* Skip pagezero and linkedit segments.  */
3372      for (i = 1; i < nbr_segcmd - 1; i++)
3373	{
3374	  bfd_mach_o_segment_command *seg = &commands[i].command.segment;
3375
3376	  if (!bfd_mach_o_build_exec_seg_command (abfd, seg))
3377	    return FALSE;
3378
3379	  if (seg->vmaddr + seg->vmsize > maxvma)
3380	    maxvma = seg->vmaddr + seg->vmsize;
3381	}
3382
3383      /* Set the size of __PAGEZERO.  */
3384      commands[0].command.segment.vmsize =
3385	commands[1].command.segment.vmaddr;
3386
3387      /* Set the vma and fileoff of __LINKEDIT.  */
3388      commands[nbr_segcmd - 1].command.segment.vmaddr = maxvma;
3389      commands[nbr_segcmd - 1].command.segment.fileoff = mdata->filelen;
3390
3391      /* Set entry point (once segments have been laid out).  */
3392      if (main_idx >= 0)
3393	commands[main_idx].command.main.entryoff =
3394	  bfd_get_start_address (abfd) - commands[1].command.segment.vmaddr;
3395    }
3396
3397  return TRUE;
3398}
3399
3400/* Set the contents of a section.  */
3401
3402bfd_boolean
3403bfd_mach_o_set_section_contents (bfd *abfd,
3404				 asection *section,
3405				 const void * location,
3406				 file_ptr offset,
3407				 bfd_size_type count)
3408{
3409  file_ptr pos;
3410
3411  /* Trying to write the first section contents will trigger the creation of
3412     the load commands if they are not already present.  */
3413  if (!abfd->output_has_begun && !bfd_mach_o_build_commands (abfd))
3414    return FALSE;
3415
3416  if (count == 0)
3417    return TRUE;
3418
3419  pos = section->filepos + offset;
3420  if (bfd_seek (abfd, pos, SEEK_SET) != 0
3421      || bfd_bwrite (location, count, abfd) != count)
3422    return FALSE;
3423
3424  return TRUE;
3425}
3426
3427int
3428bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
3429			   struct bfd_link_info *info ATTRIBUTE_UNUSED)
3430{
3431  return 0;
3432}
3433
3434/* Make an empty symbol.  This is required only because
3435   bfd_make_section_anyway wants to create a symbol for the section.  */
3436
3437asymbol *
3438bfd_mach_o_make_empty_symbol (bfd *abfd)
3439{
3440  asymbol *new_symbol;
3441
3442  new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol));
3443  if (new_symbol == NULL)
3444    return new_symbol;
3445  new_symbol->the_bfd = abfd;
3446  new_symbol->udata.i = SYM_MACHO_FIELDS_UNSET;
3447  return new_symbol;
3448}
3449
3450static bfd_boolean
3451bfd_mach_o_read_header (bfd *abfd, file_ptr hdr_off, bfd_mach_o_header *header)
3452{
3453  struct mach_o_header_external raw;
3454  unsigned int size;
3455  bfd_vma (*get32) (const void *) = NULL;
3456
3457  /* Just read the magic number.  */
3458  if (bfd_seek (abfd, hdr_off, SEEK_SET) != 0
3459      || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4)
3460    return FALSE;
3461
3462  if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
3463    {
3464      header->byteorder = BFD_ENDIAN_BIG;
3465      header->magic = BFD_MACH_O_MH_MAGIC;
3466      header->version = 1;
3467      get32 = bfd_getb32;
3468    }
3469  else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
3470    {
3471      header->byteorder = BFD_ENDIAN_LITTLE;
3472      header->magic = BFD_MACH_O_MH_MAGIC;
3473      header->version = 1;
3474      get32 = bfd_getl32;
3475    }
3476  else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
3477    {
3478      header->byteorder = BFD_ENDIAN_BIG;
3479      header->magic = BFD_MACH_O_MH_MAGIC_64;
3480      header->version = 2;
3481      get32 = bfd_getb32;
3482    }
3483  else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
3484    {
3485      header->byteorder = BFD_ENDIAN_LITTLE;
3486      header->magic = BFD_MACH_O_MH_MAGIC_64;
3487      header->version = 2;
3488      get32 = bfd_getl32;
3489    }
3490  else
3491    {
3492      header->byteorder = BFD_ENDIAN_UNKNOWN;
3493      return FALSE;
3494    }
3495
3496  /* Once the size of the header is known, read the full header.  */
3497  size = mach_o_wide_p (header) ?
3498    BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
3499
3500  if (bfd_seek (abfd, hdr_off, SEEK_SET) != 0
3501      || bfd_bread (&raw, size, abfd) != size)
3502    return FALSE;
3503
3504  header->cputype = (*get32) (raw.cputype);
3505  header->cpusubtype = (*get32) (raw.cpusubtype);
3506  header->filetype = (*get32) (raw.filetype);
3507  header->ncmds = (*get32) (raw.ncmds);
3508  header->sizeofcmds = (*get32) (raw.sizeofcmds);
3509  header->flags = (*get32) (raw.flags);
3510
3511  if (mach_o_wide_p (header))
3512    header->reserved = (*get32) (raw.reserved);
3513  else
3514    header->reserved = 0;
3515
3516  return TRUE;
3517}
3518
3519bfd_boolean
3520bfd_mach_o_new_section_hook (bfd *abfd, asection *sec)
3521{
3522  bfd_mach_o_section *s;
3523  unsigned bfdalign = bfd_section_alignment (sec);
3524
3525  s = bfd_mach_o_get_mach_o_section (sec);
3526  if (s == NULL)
3527    {
3528      flagword bfd_flags;
3529      static const mach_o_section_name_xlat * xlat;
3530
3531      s = (bfd_mach_o_section *) bfd_zalloc (abfd, sizeof (*s));
3532      if (s == NULL)
3533	return FALSE;
3534      sec->used_by_bfd = s;
3535      s->bfdsection = sec;
3536
3537      /* Create the Darwin seg/sect name pair from the bfd name.
3538	 If this is a canonical name for which a specific paiting exists
3539	 there will also be defined flags, type, attribute and alignment
3540	 values.  */
3541      xlat = bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, s);
3542      if (xlat != NULL)
3543	{
3544	  s->flags = xlat->macho_sectype | xlat->macho_secattr;
3545	  s->align = xlat->sectalign > bfdalign ? xlat->sectalign
3546						: bfdalign;
3547	  bfd_set_section_alignment (sec, s->align);
3548	  bfd_flags = bfd_section_flags (sec);
3549	  if (bfd_flags == SEC_NO_FLAGS)
3550	    bfd_set_section_flags (sec, xlat->bfd_flags);
3551	}
3552      else
3553	/* Create default flags.  */
3554	bfd_mach_o_set_section_flags_from_bfd (abfd, sec);
3555    }
3556
3557  return _bfd_generic_new_section_hook (abfd, sec);
3558}
3559
3560static void
3561bfd_mach_o_init_section_from_mach_o (asection *sec, unsigned long prot)
3562{
3563  flagword flags;
3564  bfd_mach_o_section *section;
3565
3566  flags = bfd_section_flags (sec);
3567  section = bfd_mach_o_get_mach_o_section (sec);
3568
3569  /* TODO: see if we should use the xlat system for doing this by
3570     preference and fall back to this for unknown sections.  */
3571
3572  if (flags == SEC_NO_FLAGS)
3573    {
3574      /* Try to guess flags.  */
3575      if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
3576	flags = SEC_DEBUGGING;
3577      else
3578	{
3579	  flags = SEC_ALLOC;
3580	  if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3581	      != BFD_MACH_O_S_ZEROFILL)
3582	    {
3583	      flags |= SEC_LOAD;
3584	      if (prot & BFD_MACH_O_PROT_EXECUTE)
3585		flags |= SEC_CODE;
3586	      if (prot & BFD_MACH_O_PROT_WRITE)
3587		flags |= SEC_DATA;
3588	      else if (prot & BFD_MACH_O_PROT_READ)
3589		flags |= SEC_READONLY;
3590	    }
3591	}
3592    }
3593  else
3594    {
3595      if ((flags & SEC_DEBUGGING) == 0)
3596	flags |= SEC_ALLOC;
3597    }
3598
3599  if (section->offset != 0)
3600    flags |= SEC_HAS_CONTENTS;
3601  if (section->nreloc != 0)
3602    flags |= SEC_RELOC;
3603
3604  bfd_set_section_flags (sec, flags);
3605
3606  sec->vma = section->addr;
3607  sec->lma = section->addr;
3608  sec->size = section->size;
3609  sec->filepos = section->offset;
3610  sec->alignment_power = section->align;
3611  sec->segment_mark = 0;
3612  sec->reloc_count = section->nreloc;
3613  sec->rel_filepos = section->reloff;
3614}
3615
3616static asection *
3617bfd_mach_o_make_bfd_section (bfd *abfd,
3618			     const unsigned char *segname,
3619			     const unsigned char *sectname)
3620{
3621  const char *sname;
3622  flagword flags;
3623
3624  bfd_mach_o_convert_section_name_to_bfd
3625    (abfd, (const char *)segname, (const char *)sectname, &sname, &flags);
3626  if (sname == NULL)
3627    return NULL;
3628
3629  return bfd_make_section_anyway_with_flags (abfd, sname, flags);
3630}
3631
3632static asection *
3633bfd_mach_o_read_section_32 (bfd *abfd, unsigned long prot)
3634{
3635  struct mach_o_section_32_external raw;
3636  asection *sec;
3637  bfd_mach_o_section *section;
3638
3639  if (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
3640      != BFD_MACH_O_SECTION_SIZE)
3641    return NULL;
3642
3643  sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
3644  if (sec == NULL)
3645    return NULL;
3646
3647  section = bfd_mach_o_get_mach_o_section (sec);
3648  memcpy (section->segname, raw.segname, sizeof (raw.segname));
3649  section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
3650  memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
3651  section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
3652  section->addr = bfd_h_get_32 (abfd, raw.addr);
3653  section->size = bfd_h_get_32 (abfd, raw.size);
3654  section->offset = bfd_h_get_32 (abfd, raw.offset);
3655  section->align = bfd_h_get_32 (abfd, raw.align);
3656  /* PR 17512: file: 0017eb76.  */
3657  if (section->align > 64)
3658    {
3659      _bfd_error_handler
3660	(_("bfd_mach_o_read_section_32: overlarge alignment value: %#lx, "
3661	   "using 32 instead"), section->align);
3662      section->align = 32;
3663    }
3664  section->reloff = bfd_h_get_32 (abfd, raw.reloff);
3665  section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
3666  section->flags = bfd_h_get_32 (abfd, raw.flags);
3667  section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
3668  section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
3669  section->reserved3 = 0;
3670
3671  bfd_mach_o_init_section_from_mach_o (sec, prot);
3672
3673  return sec;
3674}
3675
3676static asection *
3677bfd_mach_o_read_section_64 (bfd *abfd, unsigned long prot)
3678{
3679  struct mach_o_section_64_external raw;
3680  asection *sec;
3681  bfd_mach_o_section *section;
3682
3683  if (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
3684      != BFD_MACH_O_SECTION_64_SIZE)
3685    return NULL;
3686
3687  sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
3688  if (sec == NULL)
3689    return NULL;
3690
3691  section = bfd_mach_o_get_mach_o_section (sec);
3692  memcpy (section->segname, raw.segname, sizeof (raw.segname));
3693  section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
3694  memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
3695  section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
3696  section->addr = bfd_h_get_64 (abfd, raw.addr);
3697  section->size = bfd_h_get_64 (abfd, raw.size);
3698  section->offset = bfd_h_get_32 (abfd, raw.offset);
3699  section->align = bfd_h_get_32 (abfd, raw.align);
3700  if (section->align > 64)
3701    {
3702      _bfd_error_handler
3703	(_("bfd_mach_o_read_section_64: overlarge alignment value: %#lx, "
3704	   "using 32 instead"), section->align);
3705      section->align = 32;
3706    }
3707  section->reloff = bfd_h_get_32 (abfd, raw.reloff);
3708  section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
3709  section->flags = bfd_h_get_32 (abfd, raw.flags);
3710  section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
3711  section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
3712  section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3);
3713
3714  bfd_mach_o_init_section_from_mach_o (sec, prot);
3715
3716  return sec;
3717}
3718
3719static asection *
3720bfd_mach_o_read_section (bfd *abfd, unsigned long prot, unsigned int wide)
3721{
3722  if (wide)
3723    return bfd_mach_o_read_section_64 (abfd, prot);
3724  else
3725    return bfd_mach_o_read_section_32 (abfd, prot);
3726}
3727
3728static bfd_boolean
3729bfd_mach_o_read_symtab_symbol (bfd *abfd,
3730			       bfd_mach_o_symtab_command *sym,
3731			       bfd_mach_o_asymbol *s,
3732			       unsigned long i)
3733{
3734  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3735  unsigned int wide = mach_o_wide_p (&mdata->header);
3736  unsigned int symwidth =
3737    wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
3738  unsigned int symoff = sym->symoff + (i * symwidth);
3739  struct mach_o_nlist_64_external raw;
3740  unsigned char type = -1;
3741  unsigned char section = -1;
3742  short desc = -1;
3743  symvalue value = -1;
3744  unsigned long stroff = -1;
3745  unsigned int symtype = -1;
3746
3747  BFD_ASSERT (sym->strtab != NULL);
3748
3749  if (bfd_seek (abfd, symoff, SEEK_SET) != 0
3750      || bfd_bread (&raw, symwidth, abfd) != symwidth)
3751    {
3752      _bfd_error_handler
3753	/* xgettext:c-format */
3754	(_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %u"),
3755	 symwidth, symoff);
3756      return FALSE;
3757    }
3758
3759  stroff = bfd_h_get_32 (abfd, raw.n_strx);
3760  type = bfd_h_get_8 (abfd, raw.n_type);
3761  symtype = type & BFD_MACH_O_N_TYPE;
3762  section = bfd_h_get_8 (abfd, raw.n_sect);
3763  desc = bfd_h_get_16 (abfd, raw.n_desc);
3764  if (wide)
3765    value = bfd_h_get_64 (abfd, raw.n_value);
3766  else
3767    value = bfd_h_get_32 (abfd, raw.n_value);
3768
3769  if (stroff >= sym->strsize)
3770    {
3771      _bfd_error_handler
3772	/* xgettext:c-format */
3773	(_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %u)"),
3774	 stroff,
3775	 sym->strsize);
3776      return FALSE;
3777    }
3778
3779  s->symbol.the_bfd = abfd;
3780  s->symbol.name = sym->strtab + stroff;
3781  s->symbol.value = value;
3782  s->symbol.flags = 0x0;
3783  s->symbol.udata.i = i;
3784  s->n_type = type;
3785  s->n_sect = section;
3786  s->n_desc = desc;
3787
3788  if (type & BFD_MACH_O_N_STAB)
3789    {
3790      s->symbol.flags |= BSF_DEBUGGING;
3791      s->symbol.section = bfd_und_section_ptr;
3792      switch (type)
3793	{
3794	case N_FUN:
3795	case N_STSYM:
3796	case N_LCSYM:
3797	case N_BNSYM:
3798	case N_SLINE:
3799	case N_ENSYM:
3800	case N_ECOMM:
3801	case N_ECOML:
3802	case N_GSYM:
3803	  if ((section > 0) && (section <= mdata->nsects))
3804	    {
3805	      s->symbol.section = mdata->sections[section - 1]->bfdsection;
3806	      s->symbol.value =
3807		s->symbol.value - mdata->sections[section - 1]->addr;
3808	    }
3809	  break;
3810	}
3811    }
3812  else
3813    {
3814      if (type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT))
3815	s->symbol.flags |= BSF_GLOBAL;
3816      else
3817	s->symbol.flags |= BSF_LOCAL;
3818
3819      switch (symtype)
3820	{
3821	case BFD_MACH_O_N_UNDF:
3822	  if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT)
3823	      && s->symbol.value != 0)
3824	    {
3825	      /* A common symbol.  */
3826	      s->symbol.section = bfd_com_section_ptr;
3827	      s->symbol.flags = BSF_NO_FLAGS;
3828	    }
3829	  else
3830	    {
3831	      s->symbol.section = bfd_und_section_ptr;
3832	      if (s->n_desc & BFD_MACH_O_N_WEAK_REF)
3833		s->symbol.flags |= BSF_WEAK;
3834	    }
3835	  break;
3836	case BFD_MACH_O_N_PBUD:
3837	  s->symbol.section = bfd_und_section_ptr;
3838	  break;
3839	case BFD_MACH_O_N_ABS:
3840	  s->symbol.section = bfd_abs_section_ptr;
3841	  break;
3842	case BFD_MACH_O_N_SECT:
3843	  if ((section > 0) && (section <= mdata->nsects))
3844	    {
3845	      s->symbol.section = mdata->sections[section - 1]->bfdsection;
3846	      s->symbol.value =
3847		s->symbol.value - mdata->sections[section - 1]->addr;
3848	    }
3849	  else
3850	    {
3851	      /* Mach-O uses 0 to mean "no section"; not an error.  */
3852	      if (section != 0)
3853		{
3854		  _bfd_error_handler
3855		    /* xgettext:c-format */
3856		    (_("bfd_mach_o_read_symtab_symbol: "
3857		       "symbol \"%s\" specified invalid section %d (max %lu): "
3858		       "setting to undefined"),
3859		     s->symbol.name, section, mdata->nsects);
3860		}
3861	      s->symbol.section = bfd_und_section_ptr;
3862	    }
3863	  break;
3864	case BFD_MACH_O_N_INDR:
3865	  /* FIXME: we don't follow the BFD convention as this indirect symbol
3866	     won't be followed by the referenced one.  This looks harmless
3867	     unless we start using the linker.	*/
3868	  s->symbol.flags |= BSF_INDIRECT;
3869	  s->symbol.section = bfd_ind_section_ptr;
3870	  s->symbol.value = 0;
3871	  break;
3872	default:
3873	  _bfd_error_handler
3874	    /* xgettext:c-format */
3875	    (_("bfd_mach_o_read_symtab_symbol: "
3876	       "symbol \"%s\" specified invalid type field 0x%x: "
3877	       "setting to undefined"), s->symbol.name, symtype);
3878	  s->symbol.section = bfd_und_section_ptr;
3879	  break;
3880	}
3881    }
3882
3883  return TRUE;
3884}
3885
3886bfd_boolean
3887bfd_mach_o_read_symtab_strtab (bfd *abfd)
3888{
3889  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3890  bfd_mach_o_symtab_command *sym = mdata->symtab;
3891
3892  /* Fail if there is no symtab.  */
3893  if (sym == NULL)
3894    return FALSE;
3895
3896  /* Success if already loaded.  */
3897  if (sym->strtab)
3898    return TRUE;
3899
3900  if (abfd->flags & BFD_IN_MEMORY)
3901    {
3902      struct bfd_in_memory *b;
3903
3904      b = (struct bfd_in_memory *) abfd->iostream;
3905
3906      if ((sym->stroff + sym->strsize) > b->size)
3907	{
3908	  bfd_set_error (bfd_error_file_truncated);
3909	  return FALSE;
3910	}
3911      sym->strtab = (char *) b->buffer + sym->stroff;
3912    }
3913  else
3914    {
3915      /* See PR 21840 for a reproducer.  */
3916      if ((sym->strsize + 1) == 0)
3917	return FALSE;
3918      if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0)
3919	return FALSE;
3920      sym->strtab = (char *) _bfd_alloc_and_read (abfd, sym->strsize + 1,
3921						  sym->strsize);
3922      if (sym->strtab == NULL)
3923	return FALSE;
3924
3925      /* Zero terminate the string table.  */
3926      sym->strtab[sym->strsize] = 0;
3927    }
3928
3929  return TRUE;
3930}
3931
3932bfd_boolean
3933bfd_mach_o_read_symtab_symbols (bfd *abfd)
3934{
3935  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3936  bfd_mach_o_symtab_command *sym = mdata->symtab;
3937  unsigned long i;
3938  size_t amt;
3939  ufile_ptr filesize;
3940
3941  if (sym == NULL || sym->nsyms == 0 || sym->symbols)
3942    /* Return now if there are no symbols or if already loaded.  */
3943    return TRUE;
3944
3945  filesize = bfd_get_file_size (abfd);
3946  if (filesize != 0)
3947    {
3948      unsigned int wide = mach_o_wide_p (&mdata->header);
3949      unsigned int symwidth
3950	= wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
3951
3952      if (sym->symoff > filesize
3953	  || sym->nsyms > (filesize - sym->symoff) / symwidth)
3954	{
3955	  bfd_set_error (bfd_error_file_truncated);
3956	  sym->nsyms = 0;
3957	  return FALSE;
3958	}
3959    }
3960  if (_bfd_mul_overflow (sym->nsyms, sizeof (bfd_mach_o_asymbol), &amt)
3961      || (sym->symbols = bfd_alloc (abfd, amt)) == NULL)
3962    {
3963      bfd_set_error (bfd_error_no_memory);
3964      sym->nsyms = 0;
3965      return FALSE;
3966    }
3967
3968  if (!bfd_mach_o_read_symtab_strtab (abfd))
3969    goto fail;
3970
3971  for (i = 0; i < sym->nsyms; i++)
3972    if (!bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i))
3973      goto fail;
3974
3975  return TRUE;
3976
3977 fail:
3978  bfd_release (abfd, sym->symbols);
3979  sym->symbols = NULL;
3980  sym->nsyms = 0;
3981  return FALSE;
3982}
3983
3984static const char *
3985bfd_mach_o_i386_flavour_string (unsigned int flavour)
3986{
3987  switch ((int) flavour)
3988    {
3989    case BFD_MACH_O_x86_THREAD_STATE32:    return "x86_THREAD_STATE32";
3990    case BFD_MACH_O_x86_FLOAT_STATE32:     return "x86_FLOAT_STATE32";
3991    case BFD_MACH_O_x86_EXCEPTION_STATE32: return "x86_EXCEPTION_STATE32";
3992    case BFD_MACH_O_x86_THREAD_STATE64:    return "x86_THREAD_STATE64";
3993    case BFD_MACH_O_x86_FLOAT_STATE64:     return "x86_FLOAT_STATE64";
3994    case BFD_MACH_O_x86_EXCEPTION_STATE64: return "x86_EXCEPTION_STATE64";
3995    case BFD_MACH_O_x86_THREAD_STATE:      return "x86_THREAD_STATE";
3996    case BFD_MACH_O_x86_FLOAT_STATE:       return "x86_FLOAT_STATE";
3997    case BFD_MACH_O_x86_EXCEPTION_STATE:   return "x86_EXCEPTION_STATE";
3998    case BFD_MACH_O_x86_DEBUG_STATE32:     return "x86_DEBUG_STATE32";
3999    case BFD_MACH_O_x86_DEBUG_STATE64:     return "x86_DEBUG_STATE64";
4000    case BFD_MACH_O_x86_DEBUG_STATE:       return "x86_DEBUG_STATE";
4001    case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE";
4002    default: return "UNKNOWN";
4003    }
4004}
4005
4006static const char *
4007bfd_mach_o_ppc_flavour_string (unsigned int flavour)
4008{
4009  switch ((int) flavour)
4010    {
4011    case BFD_MACH_O_PPC_THREAD_STATE:      return "PPC_THREAD_STATE";
4012    case BFD_MACH_O_PPC_FLOAT_STATE:       return "PPC_FLOAT_STATE";
4013    case BFD_MACH_O_PPC_EXCEPTION_STATE:   return "PPC_EXCEPTION_STATE";
4014    case BFD_MACH_O_PPC_VECTOR_STATE:      return "PPC_VECTOR_STATE";
4015    case BFD_MACH_O_PPC_THREAD_STATE64:    return "PPC_THREAD_STATE64";
4016    case BFD_MACH_O_PPC_EXCEPTION_STATE64: return "PPC_EXCEPTION_STATE64";
4017    default: return "UNKNOWN";
4018    }
4019}
4020
4021static unsigned char *
4022bfd_mach_o_alloc_and_read (bfd *abfd, file_ptr filepos, size_t size)
4023{
4024  if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
4025    return NULL;
4026  return _bfd_alloc_and_read (abfd, size, size);
4027}
4028
4029static bfd_boolean
4030bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
4031{
4032  bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
4033  struct mach_o_str_command_external raw;
4034  unsigned int nameoff;
4035  unsigned int namelen;
4036
4037  if (command->len < sizeof (raw) + 8)
4038    return FALSE;
4039  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4040    return FALSE;
4041
4042  nameoff = bfd_h_get_32 (abfd, raw.str);
4043  if (nameoff > command->len)
4044    return FALSE;
4045
4046  cmd->name_offset = nameoff;
4047  namelen = command->len - nameoff;
4048  nameoff += command->offset;
4049  cmd->name_str = (char *) bfd_mach_o_alloc_and_read (abfd, nameoff, namelen);
4050  return cmd->name_str != NULL;
4051}
4052
4053static bfd_boolean
4054bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
4055{
4056  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4057  bfd_mach_o_dylib_command *cmd = &command->command.dylib;
4058  struct mach_o_dylib_command_external raw;
4059  unsigned int nameoff;
4060  unsigned int namelen;
4061  file_ptr pos;
4062
4063  if (command->len < sizeof (raw) + 8)
4064    return FALSE;
4065  switch (command->type)
4066    {
4067    case BFD_MACH_O_LC_LOAD_DYLIB:
4068    case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
4069    case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
4070    case BFD_MACH_O_LC_ID_DYLIB:
4071    case BFD_MACH_O_LC_REEXPORT_DYLIB:
4072    case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
4073      break;
4074    default:
4075      BFD_FAIL ();
4076      return FALSE;
4077    }
4078
4079  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4080    return FALSE;
4081
4082  nameoff = bfd_h_get_32 (abfd, raw.name);
4083  if (nameoff > command->len)
4084    return FALSE;
4085  cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp);
4086  cmd->current_version = bfd_h_get_32 (abfd, raw.current_version);
4087  cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version);
4088
4089  cmd->name_offset = command->offset + nameoff;
4090  namelen = command->len - nameoff;
4091  pos = mdata->hdr_offset + cmd->name_offset;
4092  cmd->name_str = (char *) bfd_mach_o_alloc_and_read (abfd, pos, namelen);
4093  return cmd->name_str != NULL;
4094}
4095
4096static bfd_boolean
4097bfd_mach_o_read_prebound_dylib (bfd *abfd,
4098				bfd_mach_o_load_command *command)
4099{
4100  bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib;
4101  struct mach_o_prebound_dylib_command_external raw;
4102  unsigned int nameoff;
4103  unsigned int modoff;
4104  unsigned int str_len;
4105  unsigned char *str;
4106
4107  if (command->len < sizeof (raw) + 8)
4108    return FALSE;
4109  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4110    return FALSE;
4111
4112  nameoff = bfd_h_get_32 (abfd, raw.name);
4113  modoff = bfd_h_get_32 (abfd, raw.linked_modules);
4114  if (nameoff > command->len || modoff > command->len)
4115    return FALSE;
4116
4117  str_len = command->len - sizeof (raw);
4118  str = _bfd_alloc_and_read (abfd, str_len, str_len);
4119  if (str == NULL)
4120    return FALSE;
4121
4122  cmd->name_offset = command->offset + nameoff;
4123  cmd->nmodules = bfd_h_get_32 (abfd, raw.nmodules);
4124  cmd->linked_modules_offset = command->offset + modoff;
4125
4126  cmd->name_str = (char *)str + nameoff - (sizeof (raw) + BFD_MACH_O_LC_SIZE);
4127  cmd->linked_modules = str + modoff - (sizeof (raw) + BFD_MACH_O_LC_SIZE);
4128  return TRUE;
4129}
4130
4131static bfd_boolean
4132bfd_mach_o_read_prebind_cksum (bfd *abfd,
4133			       bfd_mach_o_load_command *command)
4134{
4135  bfd_mach_o_prebind_cksum_command *cmd = &command->command.prebind_cksum;
4136  struct mach_o_prebind_cksum_command_external raw;
4137
4138  if (command->len < sizeof (raw) + 8)
4139    return FALSE;
4140  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4141    return FALSE;
4142
4143  cmd->cksum = bfd_get_32 (abfd, raw.cksum);
4144  return TRUE;
4145}
4146
4147static bfd_boolean
4148bfd_mach_o_read_twolevel_hints (bfd *abfd,
4149				bfd_mach_o_load_command *command)
4150{
4151  bfd_mach_o_twolevel_hints_command *cmd = &command->command.twolevel_hints;
4152  struct mach_o_twolevel_hints_command_external raw;
4153
4154  if (command->len < sizeof (raw) + 8)
4155    return FALSE;
4156  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4157    return FALSE;
4158
4159  cmd->offset = bfd_get_32 (abfd, raw.offset);
4160  cmd->nhints = bfd_get_32 (abfd, raw.nhints);
4161  return TRUE;
4162}
4163
4164static bfd_boolean
4165bfd_mach_o_read_fvmlib (bfd *abfd, bfd_mach_o_load_command *command)
4166{
4167  bfd_mach_o_fvmlib_command *fvm = &command->command.fvmlib;
4168  struct mach_o_fvmlib_command_external raw;
4169  unsigned int nameoff;
4170  unsigned int namelen;
4171
4172  if (command->len < sizeof (raw) + 8)
4173    return FALSE;
4174  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4175    return FALSE;
4176
4177  nameoff = bfd_h_get_32 (abfd, raw.name);
4178  if (nameoff > command->len)
4179    return FALSE;
4180  fvm->minor_version = bfd_h_get_32 (abfd, raw.minor_version);
4181  fvm->header_addr = bfd_h_get_32 (abfd, raw.header_addr);
4182
4183  fvm->name_offset = command->offset + nameoff;
4184  namelen = command->len - nameoff;
4185  fvm->name_str = (char *) bfd_mach_o_alloc_and_read (abfd, fvm->name_offset,
4186						      namelen);
4187  return fvm->name_str != NULL;
4188}
4189
4190static bfd_boolean
4191bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
4192{
4193  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4194  bfd_mach_o_thread_command *cmd = &command->command.thread;
4195  unsigned int offset;
4196  unsigned int nflavours;
4197  unsigned int i;
4198  struct mach_o_thread_command_external raw;
4199  size_t amt;
4200
4201  BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
4202	      || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
4203
4204  /* Count the number of threads.  */
4205  offset = 8;
4206  nflavours = 0;
4207  while (offset + sizeof (raw) <= command->len)
4208    {
4209      unsigned int count;
4210
4211      if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
4212	  || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4213	return FALSE;
4214
4215      count = bfd_h_get_32 (abfd, raw.count);
4216      if (count > (unsigned) -1 / 4
4217	  || command->len - (offset + sizeof (raw)) < count * 4)
4218	return FALSE;
4219      offset += sizeof (raw) + count * 4;
4220      nflavours++;
4221    }
4222  if (nflavours == 0 || offset != command->len)
4223    return FALSE;
4224
4225  /* Allocate threads.  */
4226  if (_bfd_mul_overflow (nflavours, sizeof (bfd_mach_o_thread_flavour), &amt))
4227    {
4228      bfd_set_error (bfd_error_file_too_big);
4229      return FALSE;
4230    }
4231  cmd->flavours = bfd_alloc (abfd, amt);
4232  if (cmd->flavours == NULL)
4233    return FALSE;
4234  cmd->nflavours = nflavours;
4235
4236  offset = 8;
4237  nflavours = 0;
4238  while (offset != command->len)
4239    {
4240      if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
4241	  || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4242	return FALSE;
4243
4244      cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour);
4245      cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw);
4246      cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4;
4247      offset += cmd->flavours[nflavours].size + sizeof (raw);
4248      nflavours++;
4249    }
4250
4251  for (i = 0; i < nflavours; i++)
4252    {
4253      asection *bfdsec;
4254      unsigned int snamelen;
4255      char *sname;
4256      const char *flavourstr;
4257      const char *prefix = "LC_THREAD";
4258      unsigned int j = 0;
4259
4260      switch (mdata->header.cputype)
4261	{
4262	case BFD_MACH_O_CPU_TYPE_POWERPC:
4263	case BFD_MACH_O_CPU_TYPE_POWERPC_64:
4264	  flavourstr =
4265	    bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
4266	  break;
4267	case BFD_MACH_O_CPU_TYPE_I386:
4268	case BFD_MACH_O_CPU_TYPE_X86_64:
4269	  flavourstr =
4270	    bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
4271	  break;
4272	default:
4273	  flavourstr = "UNKNOWN_ARCHITECTURE";
4274	  break;
4275	}
4276
4277      snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
4278      sname = bfd_alloc (abfd, snamelen);
4279      if (sname == NULL)
4280	return FALSE;
4281
4282      for (;;)
4283	{
4284	  sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
4285	  if (bfd_get_section_by_name (abfd, sname) == NULL)
4286	    break;
4287	  j++;
4288	}
4289
4290      bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
4291
4292      bfdsec->vma = 0;
4293      bfdsec->lma = 0;
4294      bfdsec->size = cmd->flavours[i].size;
4295      bfdsec->filepos = cmd->flavours[i].offset;
4296      bfdsec->alignment_power = 0x0;
4297
4298      cmd->section = bfdsec;
4299    }
4300
4301  return TRUE;
4302}
4303
4304static bfd_boolean
4305bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command,
4306			  ufile_ptr filesize)
4307{
4308  bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
4309  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4310
4311  BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
4312
4313  {
4314    struct mach_o_dysymtab_command_external raw;
4315
4316    if (command->len < sizeof (raw) + 8)
4317      return FALSE;
4318    if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4319      return FALSE;
4320
4321    cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym);
4322    cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym);
4323    cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym);
4324    cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym);
4325    cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym);
4326    cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym);
4327    cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff);
4328    cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc);
4329    cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff);
4330    cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab);
4331    cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff);
4332    cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms);
4333    cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff);
4334    cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms);
4335    cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff);
4336    cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel);
4337    cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff);
4338    cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel);
4339  }
4340
4341  if (cmd->nmodtab != 0)
4342    {
4343      unsigned int i;
4344      int wide = bfd_mach_o_wide_p (abfd);
4345      unsigned int module_len = wide ? 56 : 52;
4346      size_t amt;
4347
4348      if (cmd->modtaboff > filesize
4349	  || cmd->nmodtab > (filesize - cmd->modtaboff) / module_len)
4350	{
4351	  bfd_set_error (bfd_error_file_truncated);
4352	  return FALSE;
4353	}
4354      if (_bfd_mul_overflow (cmd->nmodtab,
4355			     sizeof (bfd_mach_o_dylib_module), &amt))
4356	{
4357	  bfd_set_error (bfd_error_file_too_big);
4358	  return FALSE;
4359	}
4360      cmd->dylib_module = bfd_alloc (abfd, amt);
4361      if (cmd->dylib_module == NULL)
4362	return FALSE;
4363
4364      if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
4365	return FALSE;
4366
4367      for (i = 0; i < cmd->nmodtab; i++)
4368	{
4369	  bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
4370	  unsigned long v;
4371	  unsigned char buf[56];
4372
4373	  if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
4374	    return FALSE;
4375
4376	  module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
4377	  module->iextdefsym = bfd_h_get_32 (abfd, buf + 4);
4378	  module->nextdefsym = bfd_h_get_32 (abfd, buf + 8);
4379	  module->irefsym = bfd_h_get_32 (abfd, buf + 12);
4380	  module->nrefsym = bfd_h_get_32 (abfd, buf + 16);
4381	  module->ilocalsym = bfd_h_get_32 (abfd, buf + 20);
4382	  module->nlocalsym = bfd_h_get_32 (abfd, buf + 24);
4383	  module->iextrel = bfd_h_get_32 (abfd, buf + 28);
4384	  module->nextrel = bfd_h_get_32 (abfd, buf + 32);
4385	  v = bfd_h_get_32 (abfd, buf +36);
4386	  module->iinit = v & 0xffff;
4387	  module->iterm = (v >> 16) & 0xffff;
4388	  v = bfd_h_get_32 (abfd, buf + 40);
4389	  module->ninit = v & 0xffff;
4390	  module->nterm = (v >> 16) & 0xffff;
4391	  if (wide)
4392	    {
4393	      module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44);
4394	      module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48);
4395	    }
4396	  else
4397	    {
4398	      module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44);
4399	      module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48);
4400	    }
4401	}
4402    }
4403
4404  if (cmd->ntoc != 0)
4405    {
4406      unsigned long i;
4407      size_t amt;
4408      struct mach_o_dylib_table_of_contents_external raw;
4409
4410      if (cmd->tocoff > filesize
4411	  || cmd->ntoc > (filesize - cmd->tocoff) / sizeof (raw))
4412	{
4413	  bfd_set_error (bfd_error_file_truncated);
4414	  return FALSE;
4415	}
4416      if (_bfd_mul_overflow (cmd->ntoc,
4417			     sizeof (bfd_mach_o_dylib_table_of_content), &amt))
4418	{
4419	  bfd_set_error (bfd_error_file_too_big);
4420	  return FALSE;
4421	}
4422      cmd->dylib_toc = bfd_alloc (abfd, amt);
4423      if (cmd->dylib_toc == NULL)
4424	return FALSE;
4425
4426      if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
4427	return FALSE;
4428
4429      for (i = 0; i < cmd->ntoc; i++)
4430	{
4431	  bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
4432
4433	  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4434	    return FALSE;
4435
4436	  toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index);
4437	  toc->module_index = bfd_h_get_32 (abfd, raw.module_index);
4438	}
4439    }
4440
4441  if (cmd->nindirectsyms != 0)
4442    {
4443      unsigned int i;
4444      size_t amt;
4445
4446      if (cmd->indirectsymoff > filesize
4447	  || cmd->nindirectsyms > (filesize - cmd->indirectsymoff) / 4)
4448	{
4449	  bfd_set_error (bfd_error_file_truncated);
4450	  return FALSE;
4451	}
4452      if (_bfd_mul_overflow (cmd->nindirectsyms, sizeof (unsigned int), &amt))
4453	{
4454	  bfd_set_error (bfd_error_file_too_big);
4455	  return FALSE;
4456	}
4457      cmd->indirect_syms = bfd_alloc (abfd, amt);
4458      if (cmd->indirect_syms == NULL)
4459	return FALSE;
4460
4461      if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
4462	return FALSE;
4463
4464      for (i = 0; i < cmd->nindirectsyms; i++)
4465	{
4466	  unsigned char raw[4];
4467	  unsigned int *is = &cmd->indirect_syms[i];
4468
4469	  if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
4470	    return FALSE;
4471
4472	  *is = bfd_h_get_32 (abfd, raw);
4473	}
4474    }
4475
4476  if (cmd->nextrefsyms != 0)
4477    {
4478      unsigned long v;
4479      unsigned int i;
4480      size_t amt;
4481
4482      if (cmd->extrefsymoff > filesize
4483	  || cmd->nextrefsyms > (filesize - cmd->extrefsymoff) / 4)
4484	{
4485	  bfd_set_error (bfd_error_file_truncated);
4486	  return FALSE;
4487	}
4488      if (_bfd_mul_overflow (cmd->nextrefsyms,
4489			     sizeof (bfd_mach_o_dylib_reference), &amt))
4490	{
4491	  bfd_set_error (bfd_error_file_too_big);
4492	  return FALSE;
4493	}
4494      cmd->ext_refs = bfd_alloc (abfd, amt);
4495      if (cmd->ext_refs == NULL)
4496	return FALSE;
4497
4498      if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
4499	return FALSE;
4500
4501      for (i = 0; i < cmd->nextrefsyms; i++)
4502	{
4503	  unsigned char raw[4];
4504	  bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
4505
4506	  if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
4507	    return FALSE;
4508
4509	  /* Fields isym and flags are written as bit-fields, thus we need
4510	     a specific processing for endianness.  */
4511	  v = bfd_h_get_32 (abfd, raw);
4512	  if (bfd_big_endian (abfd))
4513	    {
4514	      ref->isym = (v >> 8) & 0xffffff;
4515	      ref->flags = v & 0xff;
4516	    }
4517	  else
4518	    {
4519	      ref->isym = v & 0xffffff;
4520	      ref->flags = (v >> 24) & 0xff;
4521	    }
4522	}
4523    }
4524
4525  if (mdata->dysymtab)
4526    return FALSE;
4527  mdata->dysymtab = cmd;
4528
4529  return TRUE;
4530}
4531
4532static bfd_boolean
4533bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command,
4534			ufile_ptr filesize)
4535{
4536  bfd_mach_o_symtab_command *symtab = &command->command.symtab;
4537  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4538  struct mach_o_symtab_command_external raw;
4539
4540  BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
4541
4542  if (command->len < sizeof (raw) + 8)
4543    return FALSE;
4544  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4545    return FALSE;
4546
4547  symtab->symoff = bfd_h_get_32 (abfd, raw.symoff);
4548  symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms);
4549  symtab->stroff = bfd_h_get_32 (abfd, raw.stroff);
4550  symtab->strsize = bfd_h_get_32 (abfd, raw.strsize);
4551  symtab->symbols = NULL;
4552  symtab->strtab = NULL;
4553
4554  if (symtab->symoff > filesize
4555      || symtab->nsyms > (filesize - symtab->symoff) / BFD_MACH_O_NLIST_SIZE
4556      || symtab->stroff > filesize
4557      || symtab->strsize > filesize - symtab->stroff)
4558    {
4559      bfd_set_error (bfd_error_file_truncated);
4560      return FALSE;
4561    }
4562
4563  if (symtab->nsyms != 0)
4564    abfd->flags |= HAS_SYMS;
4565
4566  if (mdata->symtab)
4567    return FALSE;
4568  mdata->symtab = symtab;
4569  return TRUE;
4570}
4571
4572static bfd_boolean
4573bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
4574{
4575  bfd_mach_o_uuid_command *cmd = &command->command.uuid;
4576
4577  BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
4578
4579  if (command->len < 16 + 8)
4580    return FALSE;
4581  if (bfd_bread (cmd->uuid, 16, abfd) != 16)
4582    return FALSE;
4583
4584  return TRUE;
4585}
4586
4587static bfd_boolean
4588bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
4589{
4590  bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
4591  struct mach_o_linkedit_data_command_external raw;
4592
4593  if (command->len < sizeof (raw) + 8)
4594    return FALSE;
4595  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4596    return FALSE;
4597
4598  cmd->dataoff = bfd_get_32 (abfd, raw.dataoff);
4599  cmd->datasize = bfd_get_32 (abfd, raw.datasize);
4600  return TRUE;
4601}
4602
4603static bfd_boolean
4604bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
4605{
4606  bfd_mach_o_str_command *cmd = &command->command.str;
4607  struct mach_o_str_command_external raw;
4608  unsigned long off;
4609
4610  if (command->len < sizeof (raw) + 8)
4611    return FALSE;
4612  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4613    return FALSE;
4614
4615  off = bfd_get_32 (abfd, raw.str);
4616  if (off > command->len)
4617    return FALSE;
4618
4619  cmd->stroff = command->offset + off;
4620  cmd->str_len = command->len - off;
4621  cmd->str = (char *) bfd_mach_o_alloc_and_read (abfd, cmd->stroff,
4622						 cmd->str_len);
4623  return cmd->str != NULL;
4624}
4625
4626static bfd_boolean
4627bfd_mach_o_read_dyld_content (bfd *abfd, bfd_mach_o_dyld_info_command *cmd)
4628{
4629  /* Read rebase content.  */
4630  if (cmd->rebase_content == NULL && cmd->rebase_size != 0)
4631    {
4632      cmd->rebase_content
4633	= bfd_mach_o_alloc_and_read (abfd, cmd->rebase_off, cmd->rebase_size);
4634      if (cmd->rebase_content == NULL)
4635	return FALSE;
4636    }
4637
4638  /* Read bind content.  */
4639  if (cmd->bind_content == NULL && cmd->bind_size != 0)
4640    {
4641      cmd->bind_content
4642	= bfd_mach_o_alloc_and_read (abfd, cmd->bind_off, cmd->bind_size);
4643      if (cmd->bind_content == NULL)
4644	return FALSE;
4645    }
4646
4647  /* Read weak bind content.  */
4648  if (cmd->weak_bind_content == NULL && cmd->weak_bind_size != 0)
4649    {
4650      cmd->weak_bind_content = bfd_mach_o_alloc_and_read
4651	(abfd, cmd->weak_bind_off, cmd->weak_bind_size);
4652      if (cmd->weak_bind_content == NULL)
4653	return FALSE;
4654    }
4655
4656  /* Read lazy bind content.  */
4657  if (cmd->lazy_bind_content == NULL && cmd->lazy_bind_size != 0)
4658    {
4659      cmd->lazy_bind_content = bfd_mach_o_alloc_and_read
4660	(abfd, cmd->lazy_bind_off, cmd->lazy_bind_size);
4661      if (cmd->lazy_bind_content == NULL)
4662	return FALSE;
4663    }
4664
4665  /* Read export content.  */
4666  if (cmd->export_content == NULL && cmd->export_size != 0)
4667    {
4668      cmd->export_content = bfd_mach_o_alloc_and_read
4669	(abfd, cmd->export_off, cmd->export_size);
4670      if (cmd->export_content == NULL)
4671	return FALSE;
4672    }
4673
4674  return TRUE;
4675}
4676
4677static bfd_boolean
4678bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
4679{
4680  bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
4681  struct mach_o_dyld_info_command_external raw;
4682
4683  if (command->len < sizeof (raw) + 8)
4684    return FALSE;
4685  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4686    return FALSE;
4687
4688  cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off);
4689  cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size);
4690  cmd->rebase_content = NULL;
4691  cmd->bind_off = bfd_get_32 (abfd, raw.bind_off);
4692  cmd->bind_size = bfd_get_32 (abfd, raw.bind_size);
4693  cmd->bind_content = NULL;
4694  cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off);
4695  cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size);
4696  cmd->weak_bind_content = NULL;
4697  cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off);
4698  cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size);
4699  cmd->lazy_bind_content = NULL;
4700  cmd->export_off = bfd_get_32 (abfd, raw.export_off);
4701  cmd->export_size = bfd_get_32 (abfd, raw.export_size);
4702  cmd->export_content = NULL;
4703  return TRUE;
4704}
4705
4706static bfd_boolean
4707bfd_mach_o_read_version_min (bfd *abfd, bfd_mach_o_load_command *command)
4708{
4709  bfd_mach_o_version_min_command *cmd = &command->command.version_min;
4710  struct mach_o_version_min_command_external raw;
4711
4712  if (command->len < sizeof (raw) + 8)
4713    return FALSE;
4714  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4715    return FALSE;
4716
4717  cmd->version = bfd_get_32 (abfd, raw.version);
4718  cmd->sdk = bfd_get_32 (abfd, raw.sdk);
4719  return TRUE;
4720}
4721
4722static bfd_boolean
4723bfd_mach_o_read_encryption_info (bfd *abfd, bfd_mach_o_load_command *command)
4724{
4725  bfd_mach_o_encryption_info_command *cmd = &command->command.encryption_info;
4726  struct mach_o_encryption_info_command_external raw;
4727
4728  if (command->len < sizeof (raw) + 8)
4729    return FALSE;
4730  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4731    return FALSE;
4732
4733  cmd->cryptoff = bfd_get_32 (abfd, raw.cryptoff);
4734  cmd->cryptsize = bfd_get_32 (abfd, raw.cryptsize);
4735  cmd->cryptid = bfd_get_32 (abfd, raw.cryptid);
4736  return TRUE;
4737}
4738
4739static bfd_boolean
4740bfd_mach_o_read_encryption_info_64 (bfd *abfd, bfd_mach_o_load_command *command)
4741{
4742  bfd_mach_o_encryption_info_command *cmd = &command->command.encryption_info;
4743  struct mach_o_encryption_info_64_command_external raw;
4744
4745  if (command->len < sizeof (raw) + 8)
4746    return FALSE;
4747  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4748    return FALSE;
4749
4750  cmd->cryptoff = bfd_get_32 (abfd, raw.cryptoff);
4751  cmd->cryptsize = bfd_get_32 (abfd, raw.cryptsize);
4752  cmd->cryptid = bfd_get_32 (abfd, raw.cryptid);
4753  return TRUE;
4754}
4755
4756static bfd_boolean
4757bfd_mach_o_read_main (bfd *abfd, bfd_mach_o_load_command *command)
4758{
4759  bfd_mach_o_main_command *cmd = &command->command.main;
4760  struct mach_o_entry_point_command_external raw;
4761
4762  if (command->len < sizeof (raw) + 8)
4763    return FALSE;
4764  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4765    return FALSE;
4766
4767  cmd->entryoff = bfd_get_64 (abfd, raw.entryoff);
4768  cmd->stacksize = bfd_get_64 (abfd, raw.stacksize);
4769  return TRUE;
4770}
4771
4772static bfd_boolean
4773bfd_mach_o_read_source_version (bfd *abfd, bfd_mach_o_load_command *command)
4774{
4775  bfd_mach_o_source_version_command *cmd = &command->command.source_version;
4776  struct mach_o_source_version_command_external raw;
4777  bfd_uint64_t ver;
4778
4779  if (command->len < sizeof (raw) + 8)
4780    return FALSE;
4781  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4782    return FALSE;
4783
4784  ver = bfd_get_64 (abfd, raw.version);
4785  /* Note: we use a serie of shift to avoid shift > 32 (for which gcc
4786     generates warnings) in case of the host doesn't support 64 bit
4787     integers.  */
4788  cmd->e = ver & 0x3ff;
4789  ver >>= 10;
4790  cmd->d = ver & 0x3ff;
4791  ver >>= 10;
4792  cmd->c = ver & 0x3ff;
4793  ver >>= 10;
4794  cmd->b = ver & 0x3ff;
4795  ver >>= 10;
4796  cmd->a = ver & 0xffffff;
4797  return TRUE;
4798}
4799
4800static bfd_boolean
4801bfd_mach_o_read_note (bfd *abfd, bfd_mach_o_load_command *command)
4802{
4803  bfd_mach_o_note_command *cmd = &command->command.note;
4804  struct mach_o_note_command_external raw;
4805
4806  if (command->len < sizeof (raw) + 8)
4807    return FALSE;
4808  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4809    return FALSE;
4810
4811  memcpy (cmd->data_owner, raw.data_owner, 16);
4812  cmd->offset = bfd_get_64 (abfd, raw.offset);
4813  cmd->size = bfd_get_64 (abfd, raw.size);
4814  return TRUE;
4815}
4816
4817static bfd_boolean
4818bfd_mach_o_read_build_version (bfd *abfd, bfd_mach_o_load_command *command)
4819{
4820  bfd_mach_o_build_version_command *cmd = &command->command.build_version;
4821  struct mach_o_build_version_command_external raw;
4822
4823  if (command->len < sizeof (raw) + 8)
4824    return FALSE;
4825  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4826    return FALSE;
4827
4828  cmd->platform = bfd_get_32 (abfd, raw.platform);
4829  cmd->minos = bfd_get_32 (abfd, raw.minos);
4830  cmd->sdk = bfd_get_32 (abfd, raw.sdk);
4831  cmd->ntools = bfd_get_32 (abfd, raw.ntools);
4832  return TRUE;
4833}
4834
4835static bfd_boolean
4836bfd_mach_o_read_segment (bfd *abfd,
4837			 bfd_mach_o_load_command *command,
4838			 unsigned int wide)
4839{
4840  bfd_mach_o_segment_command *seg = &command->command.segment;
4841  unsigned long i;
4842
4843  if (wide)
4844    {
4845      struct mach_o_segment_command_64_external raw;
4846
4847      BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
4848
4849      if (command->len < sizeof (raw) + 8)
4850	return FALSE;
4851      if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4852	return FALSE;
4853
4854      memcpy (seg->segname, raw.segname, 16);
4855      seg->segname[16] = '\0';
4856
4857      seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr);
4858      seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize);
4859      seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff);
4860      seg->filesize = bfd_h_get_64 (abfd, raw.filesize);
4861      seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
4862      seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
4863      seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
4864      seg->flags = bfd_h_get_32 (abfd, raw.flags);
4865    }
4866  else
4867    {
4868      struct mach_o_segment_command_32_external raw;
4869
4870      BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
4871
4872      if (command->len < sizeof (raw) + 8)
4873	return FALSE;
4874      if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4875	return FALSE;
4876
4877      memcpy (seg->segname, raw.segname, 16);
4878      seg->segname[16] = '\0';
4879
4880      seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr);
4881      seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize);
4882      seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff);
4883      seg->filesize = bfd_h_get_32 (abfd, raw.filesize);
4884      seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
4885      seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
4886      seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
4887      seg->flags = bfd_h_get_32 (abfd, raw.flags);
4888    }
4889  seg->sect_head = NULL;
4890  seg->sect_tail = NULL;
4891
4892  for (i = 0; i < seg->nsects; i++)
4893    {
4894      asection *sec;
4895
4896      sec = bfd_mach_o_read_section (abfd, seg->initprot, wide);
4897      if (sec == NULL)
4898	return FALSE;
4899
4900      bfd_mach_o_append_section_to_segment
4901	(seg, bfd_mach_o_get_mach_o_section (sec));
4902    }
4903
4904  return TRUE;
4905}
4906
4907static bfd_boolean
4908bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
4909{
4910  return bfd_mach_o_read_segment (abfd, command, 0);
4911}
4912
4913static bfd_boolean
4914bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
4915{
4916  return bfd_mach_o_read_segment (abfd, command, 1);
4917}
4918
4919static bfd_boolean
4920bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command,
4921			 ufile_ptr filesize)
4922{
4923  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4924  struct mach_o_load_command_external raw;
4925  unsigned int cmd;
4926
4927  /* Read command type and length.  */
4928  if (bfd_seek (abfd, mdata->hdr_offset + command->offset, SEEK_SET) != 0
4929      || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE)
4930    return FALSE;
4931
4932  cmd = bfd_h_get_32 (abfd, raw.cmd);
4933  command->type = cmd & ~BFD_MACH_O_LC_REQ_DYLD;
4934  command->type_required = cmd & BFD_MACH_O_LC_REQ_DYLD ? TRUE : FALSE;
4935  command->len = bfd_h_get_32 (abfd, raw.cmdsize);
4936  if (command->len < 8 || command->len % 4 != 0)
4937    return FALSE;
4938
4939  switch (command->type)
4940    {
4941    case BFD_MACH_O_LC_SEGMENT:
4942      if (!bfd_mach_o_read_segment_32 (abfd, command))
4943	return FALSE;
4944      break;
4945    case BFD_MACH_O_LC_SEGMENT_64:
4946      if (!bfd_mach_o_read_segment_64 (abfd, command))
4947	return FALSE;
4948      break;
4949    case BFD_MACH_O_LC_SYMTAB:
4950      if (!bfd_mach_o_read_symtab (abfd, command, filesize))
4951	return FALSE;
4952      break;
4953    case BFD_MACH_O_LC_SYMSEG:
4954      break;
4955    case BFD_MACH_O_LC_THREAD:
4956    case BFD_MACH_O_LC_UNIXTHREAD:
4957      if (!bfd_mach_o_read_thread (abfd, command))
4958	return FALSE;
4959      break;
4960    case BFD_MACH_O_LC_LOAD_DYLINKER:
4961    case BFD_MACH_O_LC_ID_DYLINKER:
4962    case BFD_MACH_O_LC_DYLD_ENVIRONMENT:
4963      if (!bfd_mach_o_read_dylinker (abfd, command))
4964	return FALSE;
4965      break;
4966    case BFD_MACH_O_LC_LOAD_DYLIB:
4967    case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
4968    case BFD_MACH_O_LC_ID_DYLIB:
4969    case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
4970    case BFD_MACH_O_LC_REEXPORT_DYLIB:
4971    case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
4972      if (!bfd_mach_o_read_dylib (abfd, command))
4973	return FALSE;
4974      break;
4975    case BFD_MACH_O_LC_PREBOUND_DYLIB:
4976      if (!bfd_mach_o_read_prebound_dylib (abfd, command))
4977	return FALSE;
4978      break;
4979    case BFD_MACH_O_LC_LOADFVMLIB:
4980    case BFD_MACH_O_LC_IDFVMLIB:
4981      if (!bfd_mach_o_read_fvmlib (abfd, command))
4982	return FALSE;
4983      break;
4984    case BFD_MACH_O_LC_IDENT:
4985    case BFD_MACH_O_LC_FVMFILE:
4986    case BFD_MACH_O_LC_PREPAGE:
4987    case BFD_MACH_O_LC_ROUTINES:
4988    case BFD_MACH_O_LC_ROUTINES_64:
4989      break;
4990    case BFD_MACH_O_LC_SUB_FRAMEWORK:
4991    case BFD_MACH_O_LC_SUB_UMBRELLA:
4992    case BFD_MACH_O_LC_SUB_LIBRARY:
4993    case BFD_MACH_O_LC_SUB_CLIENT:
4994    case BFD_MACH_O_LC_RPATH:
4995      if (!bfd_mach_o_read_str (abfd, command))
4996	return FALSE;
4997      break;
4998    case BFD_MACH_O_LC_DYSYMTAB:
4999      if (!bfd_mach_o_read_dysymtab (abfd, command, filesize))
5000	return FALSE;
5001      break;
5002    case BFD_MACH_O_LC_PREBIND_CKSUM:
5003      if (!bfd_mach_o_read_prebind_cksum (abfd, command))
5004	return FALSE;
5005      break;
5006    case BFD_MACH_O_LC_TWOLEVEL_HINTS:
5007      if (!bfd_mach_o_read_twolevel_hints (abfd, command))
5008	return FALSE;
5009      break;
5010    case BFD_MACH_O_LC_UUID:
5011      if (!bfd_mach_o_read_uuid (abfd, command))
5012	return FALSE;
5013      break;
5014    case BFD_MACH_O_LC_CODE_SIGNATURE:
5015    case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
5016    case BFD_MACH_O_LC_FUNCTION_STARTS:
5017    case BFD_MACH_O_LC_DATA_IN_CODE:
5018    case BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS:
5019    case BFD_MACH_O_LC_LINKER_OPTIMIZATION_HINT:
5020    case BFD_MACH_O_LC_DYLD_EXPORTS_TRIE:
5021    case BFD_MACH_O_LC_DYLD_CHAINED_FIXUPS:
5022      if (!bfd_mach_o_read_linkedit (abfd, command))
5023	return FALSE;
5024      break;
5025    case BFD_MACH_O_LC_ENCRYPTION_INFO:
5026      if (!bfd_mach_o_read_encryption_info (abfd, command))
5027	return FALSE;
5028      break;
5029    case BFD_MACH_O_LC_ENCRYPTION_INFO_64:
5030      if (!bfd_mach_o_read_encryption_info_64 (abfd, command))
5031	return FALSE;
5032      break;
5033    case BFD_MACH_O_LC_DYLD_INFO:
5034      if (!bfd_mach_o_read_dyld_info (abfd, command))
5035	return FALSE;
5036      break;
5037    case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
5038    case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
5039    case BFD_MACH_O_LC_VERSION_MIN_WATCHOS:
5040    case BFD_MACH_O_LC_VERSION_MIN_TVOS:
5041      if (!bfd_mach_o_read_version_min (abfd, command))
5042	return FALSE;
5043      break;
5044    case BFD_MACH_O_LC_MAIN:
5045      if (!bfd_mach_o_read_main (abfd, command))
5046	return FALSE;
5047      break;
5048    case BFD_MACH_O_LC_SOURCE_VERSION:
5049      if (!bfd_mach_o_read_source_version (abfd, command))
5050	return FALSE;
5051      break;
5052    case BFD_MACH_O_LC_LINKER_OPTIONS:
5053      break;
5054    case BFD_MACH_O_LC_NOTE:
5055      if (!bfd_mach_o_read_note (abfd, command))
5056	return FALSE;
5057      break;
5058    case BFD_MACH_O_LC_BUILD_VERSION:
5059      if (!bfd_mach_o_read_build_version (abfd, command))
5060	return FALSE;
5061      break;
5062    default:
5063      command->len = 0;
5064      _bfd_error_handler (_("%pB: unknown load command %#x"),
5065			  abfd, command->type);
5066      return FALSE;
5067    }
5068
5069  return TRUE;
5070}
5071
5072static bfd_boolean
5073bfd_mach_o_flatten_sections (bfd *abfd)
5074{
5075  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5076  bfd_mach_o_load_command *cmd;
5077  long csect = 0;
5078  size_t amt;
5079
5080  /* Count total number of sections.  */
5081  mdata->nsects = 0;
5082
5083  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5084    {
5085      if (cmd->type == BFD_MACH_O_LC_SEGMENT
5086	  || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
5087	{
5088	  bfd_mach_o_segment_command *seg = &cmd->command.segment;
5089
5090	  mdata->nsects += seg->nsects;
5091	}
5092    }
5093
5094  /* Allocate sections array.  */
5095  if (_bfd_mul_overflow (mdata->nsects, sizeof (bfd_mach_o_section *), &amt))
5096    {
5097      bfd_set_error (bfd_error_file_too_big);
5098      return FALSE;
5099    }
5100  mdata->sections = bfd_alloc (abfd, amt);
5101  if (mdata->sections == NULL && mdata->nsects != 0)
5102    return FALSE;
5103
5104  /* Fill the array.  */
5105  csect = 0;
5106
5107  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5108    {
5109      if (cmd->type == BFD_MACH_O_LC_SEGMENT
5110	  || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
5111	{
5112	  bfd_mach_o_segment_command *seg = &cmd->command.segment;
5113	  bfd_mach_o_section *sec;
5114
5115	  BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
5116
5117	  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
5118	    mdata->sections[csect++] = sec;
5119	}
5120    }
5121  return TRUE;
5122}
5123
5124static bfd_boolean
5125bfd_mach_o_scan_start_address (bfd *abfd)
5126{
5127  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5128  bfd_mach_o_thread_command *thr = NULL;
5129  bfd_mach_o_load_command *cmd;
5130  unsigned long i;
5131
5132  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5133    if (cmd->type == BFD_MACH_O_LC_THREAD
5134	|| cmd->type == BFD_MACH_O_LC_UNIXTHREAD)
5135      {
5136	thr = &cmd->command.thread;
5137	break;
5138      }
5139    else if (cmd->type == BFD_MACH_O_LC_MAIN && mdata->nsects > 1)
5140      {
5141	bfd_mach_o_main_command *main_cmd = &cmd->command.main;
5142	bfd_mach_o_section *text_sect = mdata->sections[0];
5143
5144	if (text_sect)
5145	  {
5146	    abfd->start_address = main_cmd->entryoff
5147	      + (text_sect->addr - text_sect->offset);
5148	    return TRUE;
5149	  }
5150      }
5151
5152  /* An object file has no start address, so do not fail if not found.  */
5153  if (thr == NULL)
5154    return TRUE;
5155
5156  /* FIXME: create a subtarget hook ?  */
5157  for (i = 0; i < thr->nflavours; i++)
5158    {
5159      if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
5160	  && (thr->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE32))
5161	{
5162	  unsigned char buf[4];
5163
5164	  if (bfd_seek (abfd, thr->flavours[i].offset + 40, SEEK_SET) != 0
5165	      || bfd_bread (buf, 4, abfd) != 4)
5166	    return FALSE;
5167
5168	  abfd->start_address = bfd_h_get_32 (abfd, buf);
5169	}
5170      else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
5171	       && (thr->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
5172	{
5173	  unsigned char buf[4];
5174
5175	  if (bfd_seek (abfd, thr->flavours[i].offset + 0, SEEK_SET) != 0
5176	      || bfd_bread (buf, 4, abfd) != 4)
5177	    return FALSE;
5178
5179	  abfd->start_address = bfd_h_get_32 (abfd, buf);
5180	}
5181      else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
5182	       && (thr->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64))
5183	{
5184	  unsigned char buf[8];
5185
5186	  if (bfd_seek (abfd, thr->flavours[i].offset + 0, SEEK_SET) != 0
5187	      || bfd_bread (buf, 8, abfd) != 8)
5188	    return FALSE;
5189
5190	  abfd->start_address = bfd_h_get_64 (abfd, buf);
5191	}
5192      else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
5193	       && (thr->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
5194	{
5195	  unsigned char buf[8];
5196
5197	  if (bfd_seek (abfd, thr->flavours[i].offset + (16 * 8), SEEK_SET) != 0
5198	      || bfd_bread (buf, 8, abfd) != 8)
5199	    return FALSE;
5200
5201	  abfd->start_address = bfd_h_get_64 (abfd, buf);
5202	}
5203    }
5204
5205  return TRUE;
5206}
5207
5208bfd_boolean
5209bfd_mach_o_set_arch_mach (bfd *abfd,
5210			  enum bfd_architecture arch,
5211			  unsigned long machine)
5212{
5213  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
5214
5215  /* If this isn't the right architecture for this backend, and this
5216     isn't the generic backend, fail.  */
5217  if (arch != bed->arch
5218      && arch != bfd_arch_unknown
5219      && bed->arch != bfd_arch_unknown)
5220    return FALSE;
5221
5222  return bfd_default_set_arch_mach (abfd, arch, machine);
5223}
5224
5225static bfd_boolean
5226bfd_mach_o_scan (bfd *abfd,
5227		 bfd_mach_o_header *header,
5228		 bfd_mach_o_data_struct *mdata)
5229{
5230  unsigned int i;
5231  enum bfd_architecture cpu_type;
5232  unsigned long cpu_subtype;
5233  unsigned int hdrsize;
5234
5235  hdrsize = mach_o_wide_p (header) ?
5236    BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
5237
5238  mdata->header = *header;
5239
5240  abfd->flags = abfd->flags & BFD_IN_MEMORY;
5241  switch (header->filetype)
5242    {
5243    case BFD_MACH_O_MH_OBJECT:
5244      abfd->flags |= HAS_RELOC;
5245      break;
5246    case BFD_MACH_O_MH_EXECUTE:
5247      abfd->flags |= EXEC_P;
5248      break;
5249    case BFD_MACH_O_MH_DYLIB:
5250    case BFD_MACH_O_MH_BUNDLE:
5251      abfd->flags |= DYNAMIC;
5252      break;
5253    }
5254
5255  abfd->tdata.mach_o_data = mdata;
5256
5257  bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
5258				   &cpu_type, &cpu_subtype);
5259  if (cpu_type == bfd_arch_unknown)
5260    {
5261      _bfd_error_handler
5262	/* xgettext:c-format */
5263	(_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"),
5264	 header->cputype, header->cpusubtype);
5265      return FALSE;
5266    }
5267
5268  bfd_set_arch_mach (abfd, cpu_type, cpu_subtype);
5269
5270  if (header->ncmds != 0)
5271    {
5272      bfd_mach_o_load_command *cmd;
5273      size_t amt;
5274      ufile_ptr filesize = bfd_get_file_size (abfd);
5275
5276      if (filesize == 0)
5277	filesize = (ufile_ptr) -1;
5278
5279      mdata->first_command = NULL;
5280      mdata->last_command = NULL;
5281
5282      if (header->ncmds > (filesize - hdrsize) / BFD_MACH_O_LC_SIZE)
5283	{
5284	  bfd_set_error (bfd_error_file_truncated);
5285	  return FALSE;
5286	}
5287      if (_bfd_mul_overflow (header->ncmds,
5288			     sizeof (bfd_mach_o_load_command), &amt))
5289	{
5290	  bfd_set_error (bfd_error_file_too_big);
5291	  return FALSE;
5292	}
5293      cmd = bfd_alloc (abfd, amt);
5294      if (cmd == NULL)
5295	return FALSE;
5296
5297      for (i = 0; i < header->ncmds; i++)
5298	{
5299	  bfd_mach_o_load_command *cur = &cmd[i];
5300
5301	  bfd_mach_o_append_command (abfd, cur);
5302
5303	  if (i == 0)
5304	    cur->offset = hdrsize;
5305	  else
5306	    {
5307	      bfd_mach_o_load_command *prev = &cmd[i - 1];
5308	      cur->offset = prev->offset + prev->len;
5309	    }
5310
5311	  if (!bfd_mach_o_read_command (abfd, cur, filesize))
5312	    return FALSE;
5313	}
5314    }
5315
5316  /* Sections should be flatten before scanning start address.  */
5317  if (!bfd_mach_o_flatten_sections (abfd))
5318    return FALSE;
5319  if (!bfd_mach_o_scan_start_address (abfd))
5320    return FALSE;
5321
5322  return TRUE;
5323}
5324
5325bfd_boolean
5326bfd_mach_o_mkobject_init (bfd *abfd)
5327{
5328  bfd_mach_o_data_struct *mdata = NULL;
5329
5330  mdata = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
5331  if (mdata == NULL)
5332    return FALSE;
5333  abfd->tdata.mach_o_data = mdata;
5334
5335  mdata->header.magic = 0;
5336  mdata->header.cputype = 0;
5337  mdata->header.cpusubtype = 0;
5338  mdata->header.filetype = 0;
5339  mdata->header.ncmds = 0;
5340  mdata->header.sizeofcmds = 0;
5341  mdata->header.flags = 0;
5342  mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
5343  mdata->first_command = NULL;
5344  mdata->last_command = NULL;
5345  mdata->nsects = 0;
5346  mdata->sections = NULL;
5347  mdata->dyn_reloc_cache = NULL;
5348
5349  return TRUE;
5350}
5351
5352static bfd_boolean
5353bfd_mach_o_gen_mkobject (bfd *abfd)
5354{
5355  bfd_mach_o_data_struct *mdata;
5356
5357  if (!bfd_mach_o_mkobject_init (abfd))
5358    return FALSE;
5359
5360  mdata = bfd_mach_o_get_data (abfd);
5361  mdata->header.magic = BFD_MACH_O_MH_MAGIC;
5362  mdata->header.cputype = 0;
5363  mdata->header.cpusubtype = 0;
5364  mdata->header.byteorder = abfd->xvec->byteorder;
5365  mdata->header.version = 1;
5366
5367  return TRUE;
5368}
5369
5370bfd_cleanup
5371bfd_mach_o_header_p (bfd *abfd,
5372		     file_ptr hdr_off,
5373		     bfd_mach_o_filetype file_type,
5374		     bfd_mach_o_cpu_type cpu_type)
5375{
5376  bfd_mach_o_header header;
5377  bfd_mach_o_data_struct *mdata;
5378
5379  if (!bfd_mach_o_read_header (abfd, hdr_off, &header))
5380    goto wrong;
5381
5382  if (! (header.byteorder == BFD_ENDIAN_BIG
5383	 || header.byteorder == BFD_ENDIAN_LITTLE))
5384    {
5385      _bfd_error_handler (_("unknown header byte-order value %#x"),
5386			  header.byteorder);
5387      goto wrong;
5388    }
5389
5390  if (! ((header.byteorder == BFD_ENDIAN_BIG
5391	  && abfd->xvec->byteorder == BFD_ENDIAN_BIG
5392	  && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
5393	 || (header.byteorder == BFD_ENDIAN_LITTLE
5394	     && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
5395	     && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
5396    goto wrong;
5397
5398  /* Check cputype and filetype.
5399     In case of wildcard, do not accept magics that are handled by existing
5400     targets.  */
5401  if (cpu_type)
5402    {
5403      if (header.cputype != cpu_type)
5404	goto wrong;
5405    }
5406  else
5407    {
5408#ifndef BFD64
5409      /* Do not recognize 64 architectures if not configured for 64bit targets.
5410	 This could happen only for generic targets.  */
5411      if (mach_o_wide_p (&header))
5412	 goto wrong;
5413#endif
5414    }
5415
5416  if (file_type)
5417    {
5418      if (header.filetype != file_type)
5419	goto wrong;
5420    }
5421  else
5422    {
5423      switch (header.filetype)
5424	{
5425	case BFD_MACH_O_MH_CORE:
5426	  /* Handled by core_p */
5427	  goto wrong;
5428	default:
5429	  break;
5430	}
5431    }
5432
5433  mdata = (bfd_mach_o_data_struct *) bfd_zalloc (abfd, sizeof (*mdata));
5434  if (mdata == NULL)
5435    goto fail;
5436  mdata->hdr_offset = hdr_off;
5437
5438  if (!bfd_mach_o_scan (abfd, &header, mdata))
5439    goto wrong;
5440
5441  return _bfd_no_cleanup;
5442
5443 wrong:
5444  bfd_set_error (bfd_error_wrong_format);
5445
5446 fail:
5447  return NULL;
5448}
5449
5450static bfd_cleanup
5451bfd_mach_o_gen_object_p (bfd *abfd)
5452{
5453  return bfd_mach_o_header_p (abfd, 0, 0, 0);
5454}
5455
5456static bfd_cleanup
5457bfd_mach_o_gen_core_p (bfd *abfd)
5458{
5459  return bfd_mach_o_header_p (abfd, 0, BFD_MACH_O_MH_CORE, 0);
5460}
5461
5462/* Return the base address of ABFD, ie the address at which the image is
5463   mapped.  The possible initial pagezero is ignored.  */
5464
5465bfd_vma
5466bfd_mach_o_get_base_address (bfd *abfd)
5467{
5468  bfd_mach_o_data_struct *mdata;
5469  bfd_mach_o_load_command *cmd;
5470
5471  /* Check for Mach-O.  */
5472  if (!bfd_mach_o_valid (abfd))
5473    return 0;
5474  mdata = bfd_mach_o_get_data (abfd);
5475
5476  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5477    {
5478      if ((cmd->type == BFD_MACH_O_LC_SEGMENT
5479	   || cmd->type == BFD_MACH_O_LC_SEGMENT_64))
5480	{
5481	  struct bfd_mach_o_segment_command *segcmd = &cmd->command.segment;
5482
5483	  if (segcmd->initprot != 0)
5484	    return segcmd->vmaddr;
5485	}
5486    }
5487  return 0;
5488}
5489
5490typedef struct mach_o_fat_archentry
5491{
5492  unsigned long cputype;
5493  unsigned long cpusubtype;
5494  unsigned long offset;
5495  unsigned long size;
5496  unsigned long align;
5497} mach_o_fat_archentry;
5498
5499typedef struct mach_o_fat_data_struct
5500{
5501  unsigned long magic;
5502  unsigned long nfat_arch;
5503  mach_o_fat_archentry *archentries;
5504} mach_o_fat_data_struct;
5505
5506bfd_cleanup
5507bfd_mach_o_fat_archive_p (bfd *abfd)
5508{
5509  mach_o_fat_data_struct *adata = NULL;
5510  struct mach_o_fat_header_external hdr;
5511  unsigned long i;
5512  size_t amt;
5513
5514  if (bfd_seek (abfd, 0, SEEK_SET) != 0
5515      || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
5516    goto error;
5517
5518  adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
5519  if (adata == NULL)
5520    goto error;
5521
5522  adata->magic = bfd_getb32 (hdr.magic);
5523  adata->nfat_arch = bfd_getb32 (hdr.nfat_arch);
5524  if (adata->magic != 0xcafebabe)
5525    goto error;
5526  /* Avoid matching Java bytecode files, which have the same magic number.
5527     In the Java bytecode file format this field contains the JVM version,
5528     which starts at 43.0.  */
5529  if (adata->nfat_arch > 30)
5530    goto error;
5531
5532  if (_bfd_mul_overflow (adata->nfat_arch,
5533			 sizeof (mach_o_fat_archentry), &amt))
5534    {
5535      bfd_set_error (bfd_error_file_too_big);
5536      goto error;
5537    }
5538  adata->archentries = bfd_alloc (abfd, amt);
5539  if (adata->archentries == NULL)
5540    goto error;
5541
5542  for (i = 0; i < adata->nfat_arch; i++)
5543    {
5544      struct mach_o_fat_arch_external arch;
5545      if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch))
5546	goto error;
5547      adata->archentries[i].cputype = bfd_getb32 (arch.cputype);
5548      adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype);
5549      adata->archentries[i].offset = bfd_getb32 (arch.offset);
5550      adata->archentries[i].size = bfd_getb32 (arch.size);
5551      adata->archentries[i].align = bfd_getb32 (arch.align);
5552    }
5553
5554  abfd->tdata.mach_o_fat_data = adata;
5555
5556  return _bfd_no_cleanup;
5557
5558 error:
5559  if (adata != NULL)
5560    bfd_release (abfd, adata);
5561  bfd_set_error (bfd_error_wrong_format);
5562  return NULL;
5563}
5564
5565/* Set the filename for a fat binary member ABFD, whose bfd architecture is
5566   ARCH_TYPE/ARCH_SUBTYPE and corresponding entry in header is ENTRY.
5567   Set arelt_data and origin fields too.  */
5568
5569static bfd_boolean
5570bfd_mach_o_fat_member_init (bfd *abfd,
5571			    enum bfd_architecture arch_type,
5572			    unsigned long arch_subtype,
5573			    mach_o_fat_archentry *entry)
5574{
5575  struct areltdata *areltdata;
5576  /* Create the member filename. Use ARCH_NAME.  */
5577  const bfd_arch_info_type *ap = bfd_lookup_arch (arch_type, arch_subtype);
5578  const char *filename;
5579
5580  if (ap)
5581    {
5582      /* Use the architecture name if known.  */
5583      filename = bfd_set_filename (abfd, ap->printable_name);
5584    }
5585  else
5586    {
5587      /* Forge a uniq id.  */
5588      char buf[2 + 8 + 1 + 2 + 8 + 1];
5589      snprintf (buf, sizeof (buf), "0x%lx-0x%lx",
5590		entry->cputype, entry->cpusubtype);
5591      filename = bfd_set_filename (abfd, buf);
5592    }
5593  if (!filename)
5594    return FALSE;
5595
5596  areltdata = bfd_zmalloc (sizeof (struct areltdata));
5597  if (areltdata == NULL)
5598    return FALSE;
5599  areltdata->parsed_size = entry->size;
5600  abfd->arelt_data = areltdata;
5601  abfd->iostream = NULL;
5602  abfd->origin = entry->offset;
5603  return TRUE;
5604}
5605
5606bfd *
5607bfd_mach_o_fat_openr_next_archived_file (bfd *archive, bfd *prev)
5608{
5609  mach_o_fat_data_struct *adata;
5610  mach_o_fat_archentry *entry = NULL;
5611  unsigned long i;
5612  bfd *nbfd;
5613  enum bfd_architecture arch_type;
5614  unsigned long arch_subtype;
5615
5616  adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
5617  BFD_ASSERT (adata != NULL);
5618
5619  /* Find index of previous entry.  */
5620  if (prev == NULL)
5621    {
5622      /* Start at first one.  */
5623      i = 0;
5624    }
5625  else
5626    {
5627      /* Find index of PREV.  */
5628      for (i = 0; i < adata->nfat_arch; i++)
5629	{
5630	  if (adata->archentries[i].offset == prev->origin)
5631	    break;
5632	}
5633
5634      if (i == adata->nfat_arch)
5635	{
5636	  /* Not found.  */
5637	  bfd_set_error (bfd_error_bad_value);
5638	  return NULL;
5639	}
5640
5641      /* Get next entry.  */
5642      i++;
5643    }
5644
5645  if (i >= adata->nfat_arch)
5646    {
5647      bfd_set_error (bfd_error_no_more_archived_files);
5648      return NULL;
5649    }
5650
5651  entry = &adata->archentries[i];
5652  nbfd = _bfd_new_bfd_contained_in (archive);
5653  if (nbfd == NULL)
5654    return NULL;
5655
5656  bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
5657				   &arch_type, &arch_subtype);
5658
5659  if (!bfd_mach_o_fat_member_init (nbfd, arch_type, arch_subtype, entry))
5660    {
5661      bfd_close (nbfd);
5662      return NULL;
5663    }
5664
5665  bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
5666
5667  return nbfd;
5668}
5669
5670/* Analogous to stat call.  */
5671
5672static int
5673bfd_mach_o_fat_stat_arch_elt (bfd *abfd, struct stat *buf)
5674{
5675  if (abfd->arelt_data == NULL)
5676    {
5677      bfd_set_error (bfd_error_invalid_operation);
5678      return -1;
5679    }
5680
5681  buf->st_mtime = 0;
5682  buf->st_uid = 0;
5683  buf->st_gid = 0;
5684  buf->st_mode = 0644;
5685  buf->st_size = arelt_size (abfd);
5686
5687  return 0;
5688}
5689
5690/* If ABFD format is FORMAT and architecture is ARCH, return it.
5691   If ABFD is a fat image containing a member that corresponds to FORMAT
5692   and ARCH, returns it.
5693   In other case, returns NULL.
5694   This function allows transparent uses of fat images.  */
5695
5696bfd *
5697bfd_mach_o_fat_extract (bfd *abfd,
5698			bfd_format format,
5699			const bfd_arch_info_type *arch)
5700{
5701  bfd *res;
5702  mach_o_fat_data_struct *adata;
5703  unsigned int i;
5704
5705  if (bfd_check_format (abfd, format))
5706    {
5707      if (bfd_get_arch_info (abfd) == arch)
5708	return abfd;
5709      return NULL;
5710    }
5711  if (!bfd_check_format (abfd, bfd_archive)
5712      || abfd->xvec != &mach_o_fat_vec)
5713    return NULL;
5714
5715  /* This is a Mach-O fat image.  */
5716  adata = (mach_o_fat_data_struct *) abfd->tdata.mach_o_fat_data;
5717  BFD_ASSERT (adata != NULL);
5718
5719  for (i = 0; i < adata->nfat_arch; i++)
5720    {
5721      struct mach_o_fat_archentry *e = &adata->archentries[i];
5722      enum bfd_architecture cpu_type;
5723      unsigned long cpu_subtype;
5724
5725      bfd_mach_o_convert_architecture (e->cputype, e->cpusubtype,
5726				       &cpu_type, &cpu_subtype);
5727      if (cpu_type != arch->arch || cpu_subtype != arch->mach)
5728	continue;
5729
5730      /* The architecture is found.  */
5731      res = _bfd_new_bfd_contained_in (abfd);
5732      if (res == NULL)
5733	return NULL;
5734
5735      if (bfd_mach_o_fat_member_init (res, cpu_type, cpu_subtype, e)
5736	  && bfd_check_format (res, format))
5737	{
5738	  BFD_ASSERT (bfd_get_arch_info (res) == arch);
5739	  return res;
5740	}
5741      bfd_close (res);
5742      return NULL;
5743    }
5744
5745  return NULL;
5746}
5747
5748static bfd_boolean
5749bfd_mach_o_fat_close_and_cleanup (bfd *abfd)
5750{
5751  _bfd_unlink_from_archive_parent (abfd);
5752  return TRUE;
5753}
5754
5755int
5756bfd_mach_o_lookup_command (bfd *abfd,
5757			   bfd_mach_o_load_command_type type,
5758			   bfd_mach_o_load_command **mcommand)
5759{
5760  struct mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5761  struct bfd_mach_o_load_command *cmd;
5762  unsigned int num;
5763
5764  BFD_ASSERT (mdata != NULL);
5765  BFD_ASSERT (mcommand != NULL);
5766
5767  num = 0;
5768  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5769    {
5770      if (cmd->type != type)
5771	continue;
5772
5773      if (num == 0)
5774	*mcommand = cmd;
5775      num++;
5776    }
5777
5778  return num;
5779}
5780
5781unsigned long
5782bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
5783{
5784  switch (type)
5785    {
5786    case BFD_MACH_O_CPU_TYPE_MC680x0:
5787      return 0x04000000;
5788    case BFD_MACH_O_CPU_TYPE_POWERPC:
5789      return 0xc0000000;
5790    case BFD_MACH_O_CPU_TYPE_I386:
5791      return 0xc0000000;
5792    case BFD_MACH_O_CPU_TYPE_SPARC:
5793      return 0xf0000000;
5794    case BFD_MACH_O_CPU_TYPE_HPPA:
5795      return 0xc0000000 - 0x04000000;
5796    default:
5797      return 0;
5798    }
5799}
5800
5801/* The following two tables should be kept, as far as possible, in order of
5802   most frequently used entries to optimize their use from gas.  */
5803
5804const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
5805{
5806  { "regular", BFD_MACH_O_S_REGULAR},
5807  { "coalesced", BFD_MACH_O_S_COALESCED},
5808  { "zerofill", BFD_MACH_O_S_ZEROFILL},
5809  { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS},
5810  { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
5811  { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
5812  { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
5813  { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
5814  { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
5815  { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
5816  { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL},
5817  { "interposing", BFD_MACH_O_S_INTERPOSING},
5818  { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
5819  { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
5820  { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
5821  { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
5822  { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
5823  { NULL, 0}
5824};
5825
5826const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] =
5827{
5828  { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS },
5829  { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS },
5830  { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC },
5831  { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC },
5832  { "debug", BFD_MACH_O_S_ATTR_DEBUG },
5833  { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT },
5834  { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP },
5835  { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS },
5836  { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC },
5837  { "self_modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
5838  { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
5839  { NULL, 0}
5840};
5841
5842/* Get the section type from NAME.  Return 256 if NAME is unknown.  */
5843
5844unsigned int
5845bfd_mach_o_get_section_type_from_name (bfd *abfd, const char *name)
5846{
5847  const bfd_mach_o_xlat_name *x;
5848  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
5849
5850  for (x = bfd_mach_o_section_type_name; x->name; x++)
5851    if (strcmp (x->name, name) == 0)
5852      {
5853	/* We found it... does the target support it?  */
5854	if (bed->bfd_mach_o_section_type_valid_for_target == NULL
5855	    || bed->bfd_mach_o_section_type_valid_for_target (x->val))
5856	  return x->val; /* OK.  */
5857	else
5858	  break; /* Not supported.  */
5859      }
5860  /* Maximum section ID = 0xff.  */
5861  return 256;
5862}
5863
5864/* Get the section attribute from NAME.  Return -1 if NAME is unknown.  */
5865
5866unsigned int
5867bfd_mach_o_get_section_attribute_from_name (const char *name)
5868{
5869  const bfd_mach_o_xlat_name *x;
5870
5871  for (x = bfd_mach_o_section_attribute_name; x->name; x++)
5872    if (strcmp (x->name, name) == 0)
5873      return x->val;
5874  return (unsigned int)-1;
5875}
5876
5877int
5878bfd_mach_o_core_fetch_environment (bfd *abfd,
5879				   unsigned char **rbuf,
5880				   unsigned int *rlen)
5881{
5882  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5883  unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
5884  bfd_mach_o_load_command *cmd;
5885
5886  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5887    {
5888      bfd_mach_o_segment_command *seg;
5889
5890      if (cmd->type != BFD_MACH_O_LC_SEGMENT)
5891	continue;
5892
5893      seg = &cmd->command.segment;
5894
5895      if ((seg->vmaddr + seg->vmsize) == stackaddr)
5896	{
5897	  unsigned long start = seg->fileoff;
5898	  unsigned long end = seg->fileoff + seg->filesize;
5899	  unsigned char *buf = bfd_malloc (1024);
5900	  unsigned long size = 1024;
5901
5902	  if (buf == NULL)
5903	    return -1;
5904	  for (;;)
5905	    {
5906	      bfd_size_type nread = 0;
5907	      unsigned long offset;
5908	      int found_nonnull = 0;
5909
5910	      if (size > (end - start))
5911		size = (end - start);
5912
5913	      buf = bfd_realloc_or_free (buf, size);
5914	      if (buf == NULL)
5915		return -1;
5916
5917	      if (bfd_seek (abfd, end - size, SEEK_SET) != 0)
5918		{
5919		  free (buf);
5920		  return -1;
5921		}
5922
5923	      nread = bfd_bread (buf, size, abfd);
5924
5925	      if (nread != size)
5926		{
5927		  free (buf);
5928		  return -1;
5929		}
5930
5931	      for (offset = 4; offset <= size; offset += 4)
5932		{
5933		  unsigned long val;
5934
5935		  val = *((unsigned long *) (buf + size - offset));
5936		  if (! found_nonnull)
5937		    {
5938		      if (val != 0)
5939			found_nonnull = 1;
5940		    }
5941		  else if (val == 0x0)
5942		    {
5943		      unsigned long bottom;
5944		      unsigned long top;
5945
5946		      bottom = seg->fileoff + seg->filesize - offset;
5947		      top = seg->fileoff + seg->filesize - 4;
5948		      *rbuf = bfd_malloc (top - bottom);
5949		      if (*rbuf == NULL)
5950			return -1;
5951		      *rlen = top - bottom;
5952
5953		      memcpy (*rbuf, buf + size - *rlen, *rlen);
5954		      free (buf);
5955		      return 0;
5956		    }
5957		}
5958
5959	      if (size == (end - start))
5960		break;
5961
5962	      size *= 2;
5963	    }
5964
5965	  free (buf);
5966	}
5967    }
5968
5969  return -1;
5970}
5971
5972char *
5973bfd_mach_o_core_file_failing_command (bfd *abfd)
5974{
5975  unsigned char *buf = NULL;
5976  unsigned int len = 0;
5977  int ret;
5978
5979  ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
5980  if (ret < 0)
5981    return NULL;
5982
5983  return (char *) buf;
5984}
5985
5986int
5987bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
5988{
5989  return 0;
5990}
5991
5992static bfd_mach_o_uuid_command *
5993bfd_mach_o_lookup_uuid_command (bfd *abfd)
5994{
5995  bfd_mach_o_load_command *uuid_cmd = NULL;
5996  int ncmd = bfd_mach_o_lookup_command (abfd, BFD_MACH_O_LC_UUID, &uuid_cmd);
5997  if (ncmd != 1 || uuid_cmd == NULL)
5998    return FALSE;
5999  return &uuid_cmd->command.uuid;
6000}
6001
6002/* Return true if ABFD is a dSYM file and its UUID matches UUID_CMD. */
6003
6004static bfd_boolean
6005bfd_mach_o_dsym_for_uuid_p (bfd *abfd, const bfd_mach_o_uuid_command *uuid_cmd)
6006{
6007  bfd_mach_o_uuid_command *dsym_uuid_cmd;
6008
6009  BFD_ASSERT (abfd);
6010  BFD_ASSERT (uuid_cmd);
6011
6012  if (!bfd_check_format (abfd, bfd_object))
6013    return FALSE;
6014
6015  if (bfd_get_flavour (abfd) != bfd_target_mach_o_flavour
6016      || bfd_mach_o_get_data (abfd) == NULL
6017      || bfd_mach_o_get_data (abfd)->header.filetype != BFD_MACH_O_MH_DSYM)
6018    return FALSE;
6019
6020  dsym_uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd);
6021  if (dsym_uuid_cmd == NULL)
6022    return FALSE;
6023
6024  if (memcmp (uuid_cmd->uuid, dsym_uuid_cmd->uuid,
6025	      sizeof (uuid_cmd->uuid)) != 0)
6026    return FALSE;
6027
6028  return TRUE;
6029}
6030
6031/* Find a BFD in DSYM_FILENAME which matches ARCH and UUID_CMD.
6032   The caller is responsible for closing the returned BFD object and
6033   its my_archive if the returned BFD is in a fat dSYM. */
6034
6035static bfd *
6036bfd_mach_o_find_dsym (const char *dsym_filename,
6037		      const bfd_mach_o_uuid_command *uuid_cmd,
6038		      const bfd_arch_info_type *arch)
6039{
6040  bfd *base_dsym_bfd, *dsym_bfd;
6041
6042  BFD_ASSERT (uuid_cmd);
6043
6044  base_dsym_bfd = bfd_openr (dsym_filename, NULL);
6045  if (base_dsym_bfd == NULL)
6046    return NULL;
6047
6048  dsym_bfd = bfd_mach_o_fat_extract (base_dsym_bfd, bfd_object, arch);
6049  if (bfd_mach_o_dsym_for_uuid_p (dsym_bfd, uuid_cmd))
6050    return dsym_bfd;
6051
6052  bfd_close (dsym_bfd);
6053  if (base_dsym_bfd != dsym_bfd)
6054    bfd_close (base_dsym_bfd);
6055
6056  return NULL;
6057}
6058
6059/* Return a BFD created from a dSYM file for ABFD.
6060   The caller is responsible for closing the returned BFD object, its
6061   filename, and its my_archive if the returned BFD is in a fat dSYM. */
6062
6063static bfd *
6064bfd_mach_o_follow_dsym (bfd *abfd)
6065{
6066  char *dsym_filename;
6067  bfd_mach_o_uuid_command *uuid_cmd;
6068  bfd *dsym_bfd, *base_bfd = abfd;
6069  const char *base_basename;
6070
6071  if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_mach_o_flavour)
6072    return NULL;
6073
6074  if (abfd->my_archive && !bfd_is_thin_archive (abfd->my_archive))
6075    base_bfd = abfd->my_archive;
6076  /* BFD may have been opened from a stream. */
6077  if (bfd_get_filename (base_bfd) == NULL)
6078    {
6079      bfd_set_error (bfd_error_invalid_operation);
6080      return NULL;
6081    }
6082  base_basename = lbasename (bfd_get_filename (base_bfd));
6083
6084  uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd);
6085  if (uuid_cmd == NULL)
6086    return NULL;
6087
6088  /* TODO: We assume the DWARF file has the same as the binary's.
6089     It seems apple's GDB checks all files in the dSYM bundle directory.
6090     http://opensource.apple.com/source/gdb/gdb-1708/src/gdb/macosx/macosx-tdep.c
6091  */
6092  dsym_filename = (char *)bfd_malloc (strlen (bfd_get_filename (base_bfd))
6093				       + strlen (dsym_subdir) + 1
6094				       + strlen (base_basename) + 1);
6095  if (dsym_filename == NULL)
6096    return NULL;
6097
6098  sprintf (dsym_filename, "%s%s/%s",
6099	   bfd_get_filename (base_bfd), dsym_subdir, base_basename);
6100
6101  dsym_bfd = bfd_mach_o_find_dsym (dsym_filename, uuid_cmd,
6102				   bfd_get_arch_info (abfd));
6103  if (dsym_bfd == NULL)
6104    free (dsym_filename);
6105
6106  return dsym_bfd;
6107}
6108
6109bfd_boolean
6110bfd_mach_o_find_nearest_line (bfd *abfd,
6111			      asymbol **symbols,
6112			      asection *section,
6113			      bfd_vma offset,
6114			      const char **filename_ptr,
6115			      const char **functionname_ptr,
6116			      unsigned int *line_ptr,
6117			      unsigned int *discriminator_ptr)
6118{
6119  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
6120  if (mdata == NULL)
6121    return FALSE;
6122  switch (mdata->header.filetype)
6123    {
6124    case BFD_MACH_O_MH_OBJECT:
6125      break;
6126    case BFD_MACH_O_MH_EXECUTE:
6127    case BFD_MACH_O_MH_DYLIB:
6128    case BFD_MACH_O_MH_BUNDLE:
6129    case BFD_MACH_O_MH_KEXT_BUNDLE:
6130      if (mdata->dwarf2_find_line_info == NULL)
6131	{
6132	  mdata->dsym_bfd = bfd_mach_o_follow_dsym (abfd);
6133	  /* When we couldn't find dSYM for this binary, we look for
6134	     the debug information in the binary itself. In this way,
6135	     we won't try finding separated dSYM again because
6136	     mdata->dwarf2_find_line_info will be filled. */
6137	  if (! mdata->dsym_bfd)
6138	    break;
6139	  if (! _bfd_dwarf2_slurp_debug_info (abfd, mdata->dsym_bfd,
6140					      dwarf_debug_sections, symbols,
6141					      &mdata->dwarf2_find_line_info,
6142					      FALSE))
6143	    return FALSE;
6144	}
6145      break;
6146    default:
6147      return FALSE;
6148    }
6149  return _bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
6150					filename_ptr, functionname_ptr,
6151					line_ptr, discriminator_ptr,
6152					dwarf_debug_sections,
6153					&mdata->dwarf2_find_line_info);
6154}
6155
6156bfd_boolean
6157bfd_mach_o_close_and_cleanup (bfd *abfd)
6158{
6159  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
6160  if (bfd_get_format (abfd) == bfd_object && mdata != NULL)
6161    {
6162      _bfd_dwarf2_cleanup_debug_info (abfd, &mdata->dwarf2_find_line_info);
6163      bfd_mach_o_free_cached_info (abfd);
6164      if (mdata->dsym_bfd != NULL)
6165	{
6166	  bfd *fat_bfd = mdata->dsym_bfd->my_archive;
6167#if 0
6168	  /* FIXME: PR 19435: This calculation to find the memory allocated by
6169	     bfd_mach_o_follow_dsym for the filename does not always end up
6170	     selecting the correct pointer.  Unfortunately this problem is
6171	     very hard to reproduce on a non Mach-O native system, so until it
6172	     can be traced and fixed on such a system, this code will remain
6173	     commented out.  This does mean that there will be a memory leak,
6174	     but it is small, and happens when we are closing down, so it
6175	     should not matter too much.  */
6176	  char *dsym_filename = (char *)(fat_bfd
6177					 ? bfd_get_filename (fat_bfd)
6178					 : bfd_get_filename (mdata->dsym_bfd));
6179#endif
6180	  bfd_close (mdata->dsym_bfd);
6181	  mdata->dsym_bfd = NULL;
6182	  if (fat_bfd)
6183	    bfd_close (fat_bfd);
6184#if 0
6185	  free (dsym_filename);
6186#endif
6187	}
6188    }
6189
6190  return _bfd_generic_close_and_cleanup (abfd);
6191}
6192
6193bfd_boolean
6194bfd_mach_o_free_cached_info (bfd *abfd)
6195{
6196  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
6197  asection *asect;
6198  free (mdata->dyn_reloc_cache);
6199  mdata->dyn_reloc_cache = NULL;
6200  for (asect = abfd->sections; asect != NULL; asect = asect->next)
6201    {
6202      free (asect->relocation);
6203      asect->relocation = NULL;
6204    }
6205
6206  return TRUE;
6207}
6208
6209#define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
6210#define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
6211
6212#define bfd_mach_o_canonicalize_one_reloc NULL
6213#define bfd_mach_o_swap_reloc_out NULL
6214#define bfd_mach_o_print_thread NULL
6215#define bfd_mach_o_tgt_seg_table NULL
6216#define bfd_mach_o_section_type_valid_for_tgt NULL
6217
6218#define TARGET_NAME		mach_o_be_vec
6219#define TARGET_STRING		"mach-o-be"
6220#define TARGET_ARCHITECTURE	bfd_arch_unknown
6221#define TARGET_PAGESIZE		1
6222#define TARGET_BIG_ENDIAN	1
6223#define TARGET_ARCHIVE		0
6224#define TARGET_PRIORITY		1
6225#include "mach-o-target.c"
6226
6227#undef TARGET_NAME
6228#undef TARGET_STRING
6229#undef TARGET_ARCHITECTURE
6230#undef TARGET_PAGESIZE
6231#undef TARGET_BIG_ENDIAN
6232#undef TARGET_ARCHIVE
6233#undef TARGET_PRIORITY
6234
6235#define TARGET_NAME		mach_o_le_vec
6236#define TARGET_STRING		"mach-o-le"
6237#define TARGET_ARCHITECTURE	bfd_arch_unknown
6238#define TARGET_PAGESIZE		1
6239#define TARGET_BIG_ENDIAN	0
6240#define TARGET_ARCHIVE		0
6241#define TARGET_PRIORITY		1
6242
6243#include "mach-o-target.c"
6244
6245#undef TARGET_NAME
6246#undef TARGET_STRING
6247#undef TARGET_ARCHITECTURE
6248#undef TARGET_PAGESIZE
6249#undef TARGET_BIG_ENDIAN
6250#undef TARGET_ARCHIVE
6251#undef TARGET_PRIORITY
6252
6253/* Not yet handled: creating an archive.  */
6254#define bfd_mach_o_mkarchive			  _bfd_noarchive_mkarchive
6255
6256#define bfd_mach_o_close_and_cleanup		  bfd_mach_o_fat_close_and_cleanup
6257
6258/* Not used.  */
6259#define bfd_mach_o_generic_stat_arch_elt	  bfd_mach_o_fat_stat_arch_elt
6260#define bfd_mach_o_openr_next_archived_file	  bfd_mach_o_fat_openr_next_archived_file
6261#define bfd_mach_o_archive_p	bfd_mach_o_fat_archive_p
6262
6263#define TARGET_NAME		mach_o_fat_vec
6264#define TARGET_STRING		"mach-o-fat"
6265#define TARGET_ARCHITECTURE	bfd_arch_unknown
6266#define TARGET_PAGESIZE		1
6267#define TARGET_BIG_ENDIAN	1
6268#define TARGET_ARCHIVE		1
6269#define TARGET_PRIORITY		0
6270
6271#include "mach-o-target.c"
6272
6273#undef TARGET_NAME
6274#undef TARGET_STRING
6275#undef TARGET_ARCHITECTURE
6276#undef TARGET_PAGESIZE
6277#undef TARGET_BIG_ENDIAN
6278#undef TARGET_ARCHIVE
6279#undef TARGET_PRIORITY
6280