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