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