Home | History | Annotate | Download | only in bfd
      1 /* Mach-O support for BFD.
      2    Copyright (C) 1999-2014 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 "mach-o.h"
     23 #include "bfd.h"
     24 #include "libbfd.h"
     25 #include "libiberty.h"
     26 #include "aout/stab_gnu.h"
     27 #include "mach-o/reloc.h"
     28 #include "mach-o/external.h"
     29 #include <ctype.h>
     30 #include <stdlib.h>
     31 #include <string.h>
     32 
     33 #define bfd_mach_o_object_p bfd_mach_o_gen_object_p
     34 #define bfd_mach_o_core_p bfd_mach_o_gen_core_p
     35 #define bfd_mach_o_mkobject bfd_mach_o_gen_mkobject
     36 
     37 #define FILE_ALIGN(off, algn) \
     38   (((off) + ((file_ptr) 1 << (algn)) - 1) & ((file_ptr) -1 << (algn)))
     39 
     40 static bfd_boolean
     41 bfd_mach_o_read_dyld_content (bfd *abfd, bfd_mach_o_dyld_info_command *cmd);
     42 
     43 unsigned int
     44 bfd_mach_o_version (bfd *abfd)
     45 {
     46   bfd_mach_o_data_struct *mdata = NULL;
     47 
     48   BFD_ASSERT (bfd_mach_o_valid (abfd));
     49   mdata = bfd_mach_o_get_data (abfd);
     50 
     51   return mdata->header.version;
     52 }
     53 
     54 bfd_boolean
     55 bfd_mach_o_valid (bfd *abfd)
     56 {
     57   if (abfd == NULL || abfd->xvec == NULL)
     58     return FALSE;
     59 
     60   if (abfd->xvec->flavour != bfd_target_mach_o_flavour)
     61     return FALSE;
     62 
     63   if (bfd_mach_o_get_data (abfd) == NULL)
     64     return FALSE;
     65   return TRUE;
     66 }
     67 
     68 static INLINE bfd_boolean
     69 mach_o_wide_p (bfd_mach_o_header *header)
     70 {
     71   switch (header->version)
     72     {
     73     case 1:
     74       return FALSE;
     75     case 2:
     76       return TRUE;
     77     default:
     78       BFD_FAIL ();
     79       return FALSE;
     80     }
     81 }
     82 
     83 static INLINE bfd_boolean
     84 bfd_mach_o_wide_p (bfd *abfd)
     85 {
     86   return mach_o_wide_p (&bfd_mach_o_get_data (abfd)->header);
     87 }
     88 
     89 /* Tables to translate well known Mach-O segment/section names to bfd
     90    names.  Use of canonical names (such as .text or .debug_frame) is required
     91    by gdb.  */
     92 
     93 /* __TEXT Segment.  */
     94 static const mach_o_section_name_xlat text_section_names_xlat[] =
     95   {
     96     {	".text",				"__text",
     97 	SEC_CODE | SEC_LOAD,			BFD_MACH_O_S_REGULAR,
     98 	BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS,	0},
     99     {	".const",				"__const",
    100 	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_REGULAR,
    101 	BFD_MACH_O_S_ATTR_NONE,			0},
    102     {	".static_const",			"__static_const",
    103 	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_REGULAR,
    104 	BFD_MACH_O_S_ATTR_NONE,			0},
    105     {	".cstring",				"__cstring",
    106 	SEC_READONLY | SEC_DATA | SEC_LOAD | SEC_MERGE | SEC_STRINGS,
    107 						BFD_MACH_O_S_CSTRING_LITERALS,
    108 	BFD_MACH_O_S_ATTR_NONE,			0},
    109     {	".literal4",				"__literal4",
    110 	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_4BYTE_LITERALS,
    111 	BFD_MACH_O_S_ATTR_NONE,			2},
    112     {	".literal8",				"__literal8",
    113 	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_8BYTE_LITERALS,
    114 	BFD_MACH_O_S_ATTR_NONE,			3},
    115     {	".literal16",				"__literal16",
    116 	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_16BYTE_LITERALS,
    117 	BFD_MACH_O_S_ATTR_NONE,			4},
    118     {	".constructor",				"__constructor",
    119 	SEC_CODE | SEC_LOAD,			BFD_MACH_O_S_REGULAR,
    120 	BFD_MACH_O_S_ATTR_NONE,			0},
    121     {	".destructor",				"__destructor",
    122 	SEC_CODE | SEC_LOAD,			BFD_MACH_O_S_REGULAR,
    123 	BFD_MACH_O_S_ATTR_NONE,			0},
    124     {	".eh_frame",				"__eh_frame",
    125 	SEC_READONLY | SEC_DATA | SEC_LOAD,	BFD_MACH_O_S_COALESCED,
    126 	BFD_MACH_O_S_ATTR_LIVE_SUPPORT
    127 	| BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS
    128 	| BFD_MACH_O_S_ATTR_NO_TOC,		2},
    129     { NULL, NULL, 0, 0, 0, 0}
    130   };
    131 
    132 /* __DATA Segment.  */
    133 static const mach_o_section_name_xlat data_section_names_xlat[] =
    134   {
    135     {	".data",			"__data",
    136 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    137 	BFD_MACH_O_S_ATTR_NONE,		0},
    138     {	".bss",				"__bss",
    139 	SEC_NO_FLAGS,			BFD_MACH_O_S_ZEROFILL,
    140 	BFD_MACH_O_S_ATTR_NONE,		0},
    141     {	".const_data",			"__const",
    142 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    143 	BFD_MACH_O_S_ATTR_NONE,		0},
    144     {	".static_data",			"__static_data",
    145 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    146 	BFD_MACH_O_S_ATTR_NONE,		0},
    147     {	".mod_init_func",		"__mod_init_func",
    148 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS,
    149 	BFD_MACH_O_S_ATTR_NONE,		2},
    150     {	".mod_term_func",		"__mod_term_func",
    151 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS,
    152 	BFD_MACH_O_S_ATTR_NONE,		2},
    153     {	".dyld",			"__dyld",
    154 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    155 	BFD_MACH_O_S_ATTR_NONE,		0},
    156     {	".cfstring",			"__cfstring",
    157 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    158 	BFD_MACH_O_S_ATTR_NONE,		2},
    159     { NULL, NULL, 0, 0, 0, 0}
    160   };
    161 
    162 /* __DWARF Segment.  */
    163 static const mach_o_section_name_xlat dwarf_section_names_xlat[] =
    164   {
    165     {	".debug_frame",			"__debug_frame",
    166 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    167 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    168     {	".debug_info",			"__debug_info",
    169 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    170 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    171     {	".debug_abbrev",		"__debug_abbrev",
    172 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    173 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    174     {	".debug_aranges",		"__debug_aranges",
    175 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    176 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    177     {	".debug_macinfo",		"__debug_macinfo",
    178 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    179 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    180     {	".debug_line",			"__debug_line",
    181 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    182 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    183     {	".debug_loc",			"__debug_loc",
    184 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    185 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    186     {	".debug_pubnames",		"__debug_pubnames",
    187 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    188 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    189     {	".debug_pubtypes",		"__debug_pubtypes",
    190 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    191 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    192     {	".debug_str",			"__debug_str",
    193 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    194 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    195     {	".debug_ranges",		"__debug_ranges",
    196 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    197 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    198     {	".debug_macro",			"__debug_macro",
    199 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    200 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    201     {	".debug_gdb_scripts",		"__debug_gdb_scri",
    202 	SEC_DEBUGGING,			BFD_MACH_O_S_REGULAR,
    203 	BFD_MACH_O_S_ATTR_DEBUG,	0},
    204     { NULL, NULL, 0, 0, 0, 0}
    205   };
    206 
    207 /* __OBJC Segment.  */
    208 static const mach_o_section_name_xlat objc_section_names_xlat[] =
    209   {
    210     {	".objc_class",			"__class",
    211 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    212 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    213     {	".objc_meta_class",		"__meta_class",
    214 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    215 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    216     {	".objc_cat_cls_meth",		"__cat_cls_meth",
    217 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    218 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    219     {	".objc_cat_inst_meth",		"__cat_inst_meth",
    220 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    221 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    222     {	".objc_protocol",		"__protocol",
    223 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    224 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    225     {	".objc_string_object",		"__string_object",
    226 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    227 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    228     {	".objc_cls_meth",		"__cls_meth",
    229 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    230 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    231     {	".objc_inst_meth",		"__inst_meth",
    232 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    233 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    234     {	".objc_cls_refs",		"__cls_refs",
    235 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_LITERAL_POINTERS,
    236 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    237     {	".objc_message_refs",		"__message_refs",
    238 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_LITERAL_POINTERS,
    239 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    240     {	".objc_symbols",		"__symbols",
    241 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    242 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    243     {	".objc_category",		"__category",
    244 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    245 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    246     {	".objc_class_vars",		"__class_vars",
    247 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    248 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    249     {	".objc_instance_vars",		"__instance_vars",
    250 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    251 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    252     {	".objc_module_info",		"__module_info",
    253 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    254 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    255     {	".objc_selector_strs",		"__selector_strs",
    256 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_CSTRING_LITERALS,
    257 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    258     {	".objc_image_info",		"__image_info",
    259 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    260 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    261     {	".objc_selector_fixup",		"__sel_fixup",
    262 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    263 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    264     /* Objc V1 */
    265     {	".objc1_class_ext",		"__class_ext",
    266 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    267 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    268     {	".objc1_property_list",		"__property",
    269 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    270 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    271     {	".objc1_protocol_ext",		"__protocol_ext",
    272 	SEC_DATA | SEC_LOAD,		BFD_MACH_O_S_REGULAR,
    273 	BFD_MACH_O_S_ATTR_NO_DEAD_STRIP, 0},
    274     { NULL, NULL, 0, 0, 0, 0}
    275   };
    276 
    277 static const mach_o_segment_name_xlat segsec_names_xlat[] =
    278   {
    279     { "__TEXT", text_section_names_xlat },
    280     { "__DATA", data_section_names_xlat },
    281     { "__DWARF", dwarf_section_names_xlat },
    282     { "__OBJC", objc_section_names_xlat },
    283     { NULL, NULL }
    284   };
    285 
    286 static const char dsym_subdir[] = ".dSYM/Contents/Resources/DWARF";
    287 
    288 /* For both cases bfd-name => mach-o name and vice versa, the specific target
    289    is checked before the generic.  This allows a target (e.g. ppc for cstring)
    290    to override the generic definition with a more specific one.  */
    291 
    292 /* Fetch the translation from a Mach-O section designation (segment, section)
    293    as a bfd short name, if one exists.  Otherwise return NULL.
    294 
    295    Allow the segment and section names to be unterminated 16 byte arrays.  */
    296 
    297 const mach_o_section_name_xlat *
    298 bfd_mach_o_section_data_for_mach_sect (bfd *abfd, const char *segname,
    299 				       const char *sectname)
    300 {
    301   const struct mach_o_segment_name_xlat *seg;
    302   const mach_o_section_name_xlat *sec;
    303   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
    304 
    305   /* First try any target-specific translations defined...  */
    306   if (bed->segsec_names_xlat)
    307     for (seg = bed->segsec_names_xlat; seg->segname; seg++)
    308       if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
    309 	for (sec = seg->sections; sec->mach_o_name; sec++)
    310 	  if (strncmp (sec->mach_o_name, sectname,
    311 		       BFD_MACH_O_SECTNAME_SIZE) == 0)
    312 	    return sec;
    313 
    314   /* ... and then the Mach-O generic ones.  */
    315   for (seg = segsec_names_xlat; seg->segname; seg++)
    316     if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
    317       for (sec = seg->sections; sec->mach_o_name; sec++)
    318         if (strncmp (sec->mach_o_name, sectname,
    319 		     BFD_MACH_O_SECTNAME_SIZE) == 0)
    320           return sec;
    321 
    322   return NULL;
    323 }
    324 
    325 /* If the bfd_name for this section is a 'canonical' form for which we
    326    know the Mach-O data, return the segment name and the data for the
    327    Mach-O equivalent.  Otherwise return NULL.  */
    328 
    329 const mach_o_section_name_xlat *
    330 bfd_mach_o_section_data_for_bfd_name (bfd *abfd, const char *bfd_name,
    331 				      const char **segname)
    332 {
    333   const struct mach_o_segment_name_xlat *seg;
    334   const mach_o_section_name_xlat *sec;
    335   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
    336   *segname = NULL;
    337 
    338   if (bfd_name[0] != '.')
    339     return NULL;
    340 
    341   /* First try any target-specific translations defined...  */
    342   if (bed->segsec_names_xlat)
    343     for (seg = bed->segsec_names_xlat; seg->segname; seg++)
    344       for (sec = seg->sections; sec->bfd_name; sec++)
    345 	if (strcmp (bfd_name, sec->bfd_name) == 0)
    346 	  {
    347 	    *segname = seg->segname;
    348 	    return sec;
    349 	  }
    350 
    351   /* ... and then the Mach-O generic ones.  */
    352   for (seg = segsec_names_xlat; seg->segname; seg++)
    353     for (sec = seg->sections; sec->bfd_name; sec++)
    354       if (strcmp (bfd_name, sec->bfd_name) == 0)
    355 	{
    356 	  *segname = seg->segname;
    357 	  return sec;
    358 	}
    359 
    360   return NULL;
    361 }
    362 
    363 /* Convert Mach-O section name to BFD.
    364 
    365    Try to use standard/canonical names, for which we have tables including
    366    default flag settings - which are returned.  Otherwise forge a new name
    367    in the form "<segmentname>.<sectionname>" this will be prefixed with
    368    LC_SEGMENT. if the segment name does not begin with an underscore.
    369 
    370    SEGNAME and SECTNAME are 16 byte arrays (they do not need to be NUL-
    371    terminated if the name length is exactly 16 bytes - but must be if the name
    372    length is less than 16 characters).  */
    373 
    374 void
    375 bfd_mach_o_convert_section_name_to_bfd (bfd *abfd, const char *segname,
    376 					const char *secname, const char **name,
    377 					flagword *flags)
    378 {
    379   const mach_o_section_name_xlat *xlat;
    380   char *res;
    381   unsigned int len;
    382   const char *pfx = "";
    383 
    384   *name = NULL;
    385   *flags = SEC_NO_FLAGS;
    386 
    387   /* First search for a canonical name...
    388      xlat will be non-null if there is an entry for segname, secname.  */
    389   xlat = bfd_mach_o_section_data_for_mach_sect (abfd, segname, secname);
    390   if (xlat)
    391     {
    392       len = strlen (xlat->bfd_name);
    393       res = bfd_alloc (abfd, len+1);
    394       if (res == NULL)
    395 	return;
    396       memcpy (res, xlat->bfd_name, len+1);
    397       *name = res;
    398       *flags = xlat->bfd_flags;
    399       return;
    400     }
    401 
    402   /* ... else we make up a bfd name from the segment concatenated with the
    403      section.  */
    404 
    405   len = 16 + 1 + 16 + 1;
    406 
    407   /* Put "LC_SEGMENT." prefix if the segment name is weird (ie doesn't start
    408      with an underscore.  */
    409   if (segname[0] != '_')
    410     {
    411       static const char seg_pfx[] = "LC_SEGMENT.";
    412 
    413       pfx = seg_pfx;
    414       len += sizeof (seg_pfx) - 1;
    415     }
    416 
    417   res = bfd_alloc (abfd, len);
    418   if (res == NULL)
    419     return;
    420   snprintf (res, len, "%s%.16s.%.16s", pfx, segname, secname);
    421   *name = res;
    422 }
    423 
    424 /* Convert a bfd section name to a Mach-O segment + section name.
    425 
    426    If the name is a canonical one for which we have a Darwin match
    427    return the translation table - which contains defaults for flags,
    428    type, attribute and default alignment data.
    429 
    430    Otherwise, expand the bfd_name (assumed to be in the form
    431    "[LC_SEGMENT.]<segmentname>.<sectionname>") and return NULL.  */
    432 
    433 static const mach_o_section_name_xlat *
    434 bfd_mach_o_convert_section_name_to_mach_o (bfd *abfd ATTRIBUTE_UNUSED,
    435                                            asection *sect,
    436                                            bfd_mach_o_section *section)
    437 {
    438   const mach_o_section_name_xlat *xlat;
    439   const char *name = bfd_get_section_name (abfd, sect);
    440   const char *segname;
    441   const char *dot;
    442   unsigned int len;
    443   unsigned int seglen;
    444   unsigned int seclen;
    445 
    446   memset (section->segname, 0, BFD_MACH_O_SEGNAME_SIZE + 1);
    447   memset (section->sectname, 0, BFD_MACH_O_SECTNAME_SIZE + 1);
    448 
    449   /* See if is a canonical name ... */
    450   xlat = bfd_mach_o_section_data_for_bfd_name (abfd, name, &segname);
    451   if (xlat)
    452     {
    453       strcpy (section->segname, segname);
    454       strcpy (section->sectname, xlat->mach_o_name);
    455       return xlat;
    456     }
    457 
    458   /* .. else we convert our constructed one back to Mach-O.
    459      Strip LC_SEGMENT. prefix, if present.  */
    460   if (strncmp (name, "LC_SEGMENT.", 11) == 0)
    461     name += 11;
    462 
    463   /* Find a dot.  */
    464   dot = strchr (name, '.');
    465   len = strlen (name);
    466 
    467   /* Try to split name into segment and section names.  */
    468   if (dot && dot != name)
    469     {
    470       seglen = dot - name;
    471       seclen = len - (dot + 1 - name);
    472 
    473       if (seglen <= BFD_MACH_O_SEGNAME_SIZE
    474 	  && seclen <= BFD_MACH_O_SECTNAME_SIZE)
    475         {
    476           memcpy (section->segname, name, seglen);
    477           section->segname[seglen] = 0;
    478           memcpy (section->sectname, dot + 1, seclen);
    479           section->sectname[seclen] = 0;
    480           return NULL;
    481         }
    482     }
    483 
    484   /* The segment and section names are both missing - don't make them
    485      into dots.  */
    486   if (dot && dot == name)
    487     return NULL;
    488 
    489   /* Just duplicate the name into both segment and section.  */
    490   if (len > 16)
    491     len = 16;
    492   memcpy (section->segname, name, len);
    493   section->segname[len] = 0;
    494   memcpy (section->sectname, name, len);
    495   section->sectname[len] = 0;
    496   return NULL;
    497 }
    498 
    499 /* Return the size of an entry for section SEC.
    500    Must be called only for symbol pointer section and symbol stubs
    501    sections.  */
    502 
    503 unsigned int
    504 bfd_mach_o_section_get_entry_size (bfd *abfd, bfd_mach_o_section *sec)
    505 {
    506   switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
    507     {
    508     case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
    509     case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
    510       return bfd_mach_o_wide_p (abfd) ? 8 : 4;
    511     case BFD_MACH_O_S_SYMBOL_STUBS:
    512       return sec->reserved2;
    513     default:
    514       BFD_FAIL ();
    515       return 0;
    516     }
    517 }
    518 
    519 /* Return the number of indirect symbols for a section.
    520    Must be called only for symbol pointer section and symbol stubs
    521    sections.  */
    522 
    523 unsigned int
    524 bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section *sec)
    525 {
    526   unsigned int elsz;
    527 
    528   elsz = bfd_mach_o_section_get_entry_size (abfd, sec);
    529   if (elsz == 0)
    530     return 0;
    531   else
    532     return sec->size / elsz;
    533 }
    534 
    535 /* Append command CMD to ABFD.  Note that header.ncmds is not updated.  */
    536 
    537 static void
    538 bfd_mach_o_append_command (bfd *abfd, bfd_mach_o_load_command *cmd)
    539 {
    540   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
    541 
    542   if (mdata->last_command != NULL)
    543     mdata->last_command->next = cmd;
    544   else
    545     mdata->first_command = cmd;
    546   mdata->last_command = cmd;
    547   cmd->next = NULL;
    548 }
    549 
    550 /* Copy any private info we understand from the input symbol
    551    to the output symbol.  */
    552 
    553 bfd_boolean
    554 bfd_mach_o_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
    555 					 asymbol *isymbol,
    556 					 bfd *obfd ATTRIBUTE_UNUSED,
    557 					 asymbol *osymbol)
    558 {
    559   bfd_mach_o_asymbol *os, *is;
    560 
    561   os = (bfd_mach_o_asymbol *)osymbol;
    562   is = (bfd_mach_o_asymbol *)isymbol;
    563   os->n_type = is->n_type;
    564   os->n_sect = is->n_sect;
    565   os->n_desc = is->n_desc;
    566   os->symbol.udata.i = is->symbol.udata.i;
    567 
    568   return TRUE;
    569 }
    570 
    571 /* Copy any private info we understand from the input section
    572    to the output section.  */
    573 
    574 bfd_boolean
    575 bfd_mach_o_bfd_copy_private_section_data (bfd *ibfd, asection *isection,
    576 					  bfd *obfd, asection *osection)
    577 {
    578   bfd_mach_o_section *os = bfd_mach_o_get_mach_o_section (osection);
    579   bfd_mach_o_section *is = bfd_mach_o_get_mach_o_section (isection);
    580 
    581   if (ibfd->xvec->flavour != bfd_target_mach_o_flavour
    582       || obfd->xvec->flavour != bfd_target_mach_o_flavour)
    583     return TRUE;
    584 
    585   BFD_ASSERT (is != NULL && os != NULL);
    586 
    587   os->flags = is->flags;
    588   os->reserved1 = is->reserved1;
    589   os->reserved2 = is->reserved2;
    590   os->reserved3 = is->reserved3;
    591 
    592   return TRUE;
    593 }
    594 
    595 /* Copy any private info we understand from the input bfd
    596    to the output bfd.  */
    597 
    598 bfd_boolean
    599 bfd_mach_o_bfd_copy_private_header_data (bfd *ibfd, bfd *obfd)
    600 {
    601   bfd_mach_o_data_struct *imdata;
    602   bfd_mach_o_data_struct *omdata;
    603   bfd_mach_o_load_command *icmd;
    604 
    605   if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour
    606       || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour)
    607     return TRUE;
    608 
    609   BFD_ASSERT (bfd_mach_o_valid (ibfd));
    610   BFD_ASSERT (bfd_mach_o_valid (obfd));
    611 
    612   imdata = bfd_mach_o_get_data (ibfd);
    613   omdata = bfd_mach_o_get_data (obfd);
    614 
    615   /* Copy header flags.  */
    616   omdata->header.flags = imdata->header.flags;
    617 
    618   /* Copy commands.  */
    619   for (icmd = imdata->first_command; icmd != NULL; icmd = icmd->next)
    620     {
    621       bfd_mach_o_load_command *ocmd;
    622 
    623       switch (icmd->type)
    624 	{
    625 	case BFD_MACH_O_LC_LOAD_DYLIB:
    626 	case BFD_MACH_O_LC_LOAD_DYLINKER:
    627 	case BFD_MACH_O_LC_DYLD_INFO:
    628 	  /* Command is copied.  */
    629 	  ocmd = bfd_alloc (obfd, sizeof (bfd_mach_o_load_command));
    630 	  if (ocmd == NULL)
    631 	    return FALSE;
    632 
    633 	  /* Copy common fields.  */
    634 	  ocmd->type = icmd->type;
    635 	  ocmd->type_required = icmd->type_required;
    636 	  ocmd->offset = 0;
    637 	  ocmd->len = icmd->len;
    638 	  break;
    639 
    640 	default:
    641 	  /* Command is not copied.  */
    642 	  continue;
    643 	  break;
    644 	}
    645 
    646       switch (icmd->type)
    647 	{
    648 	case BFD_MACH_O_LC_LOAD_DYLIB:
    649 	  {
    650 	    bfd_mach_o_dylib_command *idy = &icmd->command.dylib;
    651 	    bfd_mach_o_dylib_command *ody = &ocmd->command.dylib;
    652 
    653 	    ody->name_offset = idy->name_offset;
    654 	    ody->timestamp = idy->timestamp;
    655 	    ody->current_version = idy->current_version;
    656 	    ody->compatibility_version = idy->compatibility_version;
    657 	    ody->name_str = idy->name_str;
    658 	  }
    659 	  break;
    660 
    661 	case BFD_MACH_O_LC_LOAD_DYLINKER:
    662 	  {
    663 	    bfd_mach_o_dylinker_command *idy = &icmd->command.dylinker;
    664 	    bfd_mach_o_dylinker_command *ody = &ocmd->command.dylinker;
    665 
    666 	    ody->name_offset = idy->name_offset;
    667 	    ody->name_str = idy->name_str;
    668 	  }
    669 	  break;
    670 
    671 	case BFD_MACH_O_LC_DYLD_INFO:
    672 	  {
    673 	    bfd_mach_o_dyld_info_command *idy = &icmd->command.dyld_info;
    674 	    bfd_mach_o_dyld_info_command *ody = &ocmd->command.dyld_info;
    675 
    676 	    if (bfd_mach_o_read_dyld_content (ibfd, idy))
    677 	      {
    678 		ody->rebase_size = idy->rebase_size;
    679 		ody->rebase_content = idy->rebase_content;
    680 
    681 		ody->bind_size = idy->bind_size;
    682 		ody->bind_content = idy->bind_content;
    683 
    684 		ody->weak_bind_size = idy->weak_bind_size;
    685 		ody->weak_bind_content = idy->weak_bind_content;
    686 
    687 		ody->lazy_bind_size = idy->lazy_bind_size;
    688 		ody->lazy_bind_content = idy->lazy_bind_content;
    689 
    690 		ody->export_size = idy->export_size;
    691 		ody->export_content = idy->export_content;
    692 	      }
    693 	  }
    694 	  break;
    695 
    696 	default:
    697 	  /* That command should be handled.  */
    698 	  abort ();
    699 	}
    700 
    701       /* Insert command.  */
    702       bfd_mach_o_append_command (obfd, ocmd);
    703     }
    704 
    705   return TRUE;
    706 }
    707 
    708 /* This allows us to set up to 32 bits of flags (unless we invent some
    709    fiendish scheme to subdivide).  For now, we'll just set the file flags
    710    without error checking - just overwrite.  */
    711 
    712 bfd_boolean
    713 bfd_mach_o_bfd_set_private_flags (bfd *abfd, flagword flags)
    714 {
    715   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
    716 
    717   if (!mdata)
    718     return FALSE;
    719 
    720   mdata->header.flags = flags;
    721   return TRUE;
    722 }
    723 
    724 /* Count the total number of symbols.  */
    725 
    726 static long
    727 bfd_mach_o_count_symbols (bfd *abfd)
    728 {
    729   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
    730 
    731   if (mdata->symtab == NULL)
    732     return 0;
    733   return mdata->symtab->nsyms;
    734 }
    735 
    736 long
    737 bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
    738 {
    739   long nsyms = bfd_mach_o_count_symbols (abfd);
    740 
    741   return ((nsyms + 1) * sizeof (asymbol *));
    742 }
    743 
    744 long
    745 bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
    746 {
    747   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
    748   long nsyms = bfd_mach_o_count_symbols (abfd);
    749   bfd_mach_o_symtab_command *sym = mdata->symtab;
    750   unsigned long j;
    751 
    752   if (nsyms < 0)
    753     return nsyms;
    754 
    755   if (nsyms == 0)
    756     {
    757       /* Do not try to read symbols if there are none.  */
    758       alocation[0] = NULL;
    759       return 0;
    760     }
    761 
    762   if (!bfd_mach_o_read_symtab_symbols (abfd))
    763     {
    764       (*_bfd_error_handler)
    765         (_("bfd_mach_o_canonicalize_symtab: unable to load symbols"));
    766       return 0;
    767     }
    768 
    769   BFD_ASSERT (sym->symbols != NULL);
    770 
    771   for (j = 0; j < sym->nsyms; j++)
    772     alocation[j] = &sym->symbols[j].symbol;
    773 
    774   alocation[j] = NULL;
    775 
    776   return nsyms;
    777 }
    778 
    779 /* Create synthetic symbols for indirect symbols.  */
    780 
    781 long
    782 bfd_mach_o_get_synthetic_symtab (bfd *abfd,
    783                                  long symcount ATTRIBUTE_UNUSED,
    784                                  asymbol **syms ATTRIBUTE_UNUSED,
    785                                  long dynsymcount ATTRIBUTE_UNUSED,
    786                                  asymbol **dynsyms ATTRIBUTE_UNUSED,
    787                                  asymbol **ret)
    788 {
    789   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
    790   bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
    791   bfd_mach_o_symtab_command *symtab = mdata->symtab;
    792   asymbol *s;
    793   unsigned long count, i, j, n;
    794   size_t size;
    795   char *names;
    796   char *nul_name;
    797 
    798   *ret = NULL;
    799 
    800   /* Stop now if no symbols or no indirect symbols.  */
    801   if (dysymtab == NULL || symtab == NULL || symtab->symbols == NULL)
    802     return 0;
    803 
    804   if (dysymtab->nindirectsyms == 0)
    805     return 0;
    806 
    807   /* We need to allocate a bfd symbol for every indirect symbol and to
    808      allocate the memory for its name.  */
    809   count = dysymtab->nindirectsyms;
    810   size = count * sizeof (asymbol) + 1;
    811 
    812   for (j = 0; j < count; j++)
    813     {
    814       unsigned int isym = dysymtab->indirect_syms[j];
    815 
    816       /* Some indirect symbols are anonymous.  */
    817       if (isym < symtab->nsyms && symtab->symbols[isym].symbol.name)
    818         size += strlen (symtab->symbols[isym].symbol.name) + sizeof ("$stub");
    819     }
    820 
    821   s = *ret = (asymbol *) bfd_malloc (size);
    822   if (s == NULL)
    823     return -1;
    824   names = (char *) (s + count);
    825   nul_name = names;
    826   *names++ = 0;
    827 
    828   n = 0;
    829   for (i = 0; i < mdata->nsects; i++)
    830     {
    831       bfd_mach_o_section *sec = mdata->sections[i];
    832       unsigned int first, last;
    833       bfd_vma addr;
    834       bfd_vma entry_size;
    835 
    836       switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
    837         {
    838         case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
    839         case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
    840         case BFD_MACH_O_S_SYMBOL_STUBS:
    841           /* Only these sections have indirect symbols.  */
    842           first = sec->reserved1;
    843           last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
    844           addr = sec->addr;
    845           entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
    846           for (j = first; j < last; j++)
    847             {
    848               unsigned int isym = dysymtab->indirect_syms[j];
    849 
    850               s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
    851               s->section = sec->bfdsection;
    852               s->value = addr - sec->addr;
    853               s->udata.p = NULL;
    854 
    855               if (isym < symtab->nsyms
    856                   && symtab->symbols[isym].symbol.name)
    857                 {
    858                   const char *sym = symtab->symbols[isym].symbol.name;
    859                   size_t len;
    860 
    861                   s->name = names;
    862                   len = strlen (sym);
    863                   memcpy (names, sym, len);
    864                   names += len;
    865                   memcpy (names, "$stub", sizeof ("$stub"));
    866                   names += sizeof ("$stub");
    867                 }
    868               else
    869                 s->name = nul_name;
    870 
    871               addr += entry_size;
    872               s++;
    873               n++;
    874             }
    875           break;
    876         default:
    877           break;
    878         }
    879     }
    880 
    881   return n;
    882 }
    883 
    884 void
    885 bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
    886 			    asymbol *symbol,
    887 			    symbol_info *ret)
    888 {
    889   bfd_symbol_info (symbol, ret);
    890 }
    891 
    892 void
    893 bfd_mach_o_print_symbol (bfd *abfd,
    894 			 void * afile,
    895 			 asymbol *symbol,
    896 			 bfd_print_symbol_type how)
    897 {
    898   FILE *file = (FILE *) afile;
    899   const char *name;
    900   bfd_mach_o_asymbol *asym = (bfd_mach_o_asymbol *)symbol;
    901 
    902   switch (how)
    903     {
    904     case bfd_print_symbol_name:
    905       fprintf (file, "%s", symbol->name);
    906       break;
    907     default:
    908       bfd_print_symbol_vandf (abfd, (void *) file, symbol);
    909       if (asym->n_type & BFD_MACH_O_N_STAB)
    910 	name = bfd_get_stab_name (asym->n_type);
    911       else
    912 	switch (asym->n_type & BFD_MACH_O_N_TYPE)
    913 	  {
    914 	  case BFD_MACH_O_N_UNDF:
    915             if (symbol->value == 0)
    916               name = "UND";
    917             else
    918               name = "COM";
    919 	    break;
    920 	  case BFD_MACH_O_N_ABS:
    921 	    name = "ABS";
    922 	    break;
    923 	  case BFD_MACH_O_N_INDR:
    924 	    name = "INDR";
    925 	    break;
    926 	  case BFD_MACH_O_N_PBUD:
    927 	    name = "PBUD";
    928 	    break;
    929 	  case BFD_MACH_O_N_SECT:
    930 	    name = "SECT";
    931 	    break;
    932 	  default:
    933 	    name = "???";
    934 	    break;
    935 	  }
    936       if (name == NULL)
    937 	name = "";
    938       fprintf (file, " %02x %-6s %02x %04x",
    939                asym->n_type, name, asym->n_sect, asym->n_desc);
    940       if ((asym->n_type & BFD_MACH_O_N_STAB) == 0
    941 	  && (asym->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_SECT)
    942 	fprintf (file, " [%s]", symbol->section->name);
    943       fprintf (file, " %s", symbol->name);
    944     }
    945 }
    946 
    947 static void
    948 bfd_mach_o_convert_architecture (bfd_mach_o_cpu_type mtype,
    949 				 bfd_mach_o_cpu_subtype msubtype,
    950 				 enum bfd_architecture *type,
    951 				 unsigned long *subtype)
    952 {
    953   *subtype = bfd_arch_unknown;
    954 
    955   switch (mtype)
    956     {
    957     case BFD_MACH_O_CPU_TYPE_VAX:
    958       *type = bfd_arch_vax;
    959       break;
    960     case BFD_MACH_O_CPU_TYPE_MC680x0:
    961       *type = bfd_arch_m68k;
    962       break;
    963     case BFD_MACH_O_CPU_TYPE_I386:
    964       *type = bfd_arch_i386;
    965       *subtype = bfd_mach_i386_i386;
    966       break;
    967     case BFD_MACH_O_CPU_TYPE_X86_64:
    968       *type = bfd_arch_i386;
    969       *subtype = bfd_mach_x86_64;
    970       break;
    971     case BFD_MACH_O_CPU_TYPE_MIPS:
    972       *type = bfd_arch_mips;
    973       break;
    974     case BFD_MACH_O_CPU_TYPE_MC98000:
    975       *type = bfd_arch_m98k;
    976       break;
    977     case BFD_MACH_O_CPU_TYPE_HPPA:
    978       *type = bfd_arch_hppa;
    979       break;
    980     case BFD_MACH_O_CPU_TYPE_ARM:
    981       *type = bfd_arch_arm;
    982       switch (msubtype)
    983         {
    984         case BFD_MACH_O_CPU_SUBTYPE_ARM_V4T:
    985           *subtype = bfd_mach_arm_4T;
    986           break;
    987         case BFD_MACH_O_CPU_SUBTYPE_ARM_V6:
    988           *subtype = bfd_mach_arm_4T;	/* Best fit ?  */
    989           break;
    990         case BFD_MACH_O_CPU_SUBTYPE_ARM_V5TEJ:
    991           *subtype = bfd_mach_arm_5TE;
    992           break;
    993         case BFD_MACH_O_CPU_SUBTYPE_ARM_XSCALE:
    994           *subtype = bfd_mach_arm_XScale;
    995           break;
    996         case BFD_MACH_O_CPU_SUBTYPE_ARM_V7:
    997           *subtype = bfd_mach_arm_5TE;	/* Best fit ?  */
    998           break;
    999         case BFD_MACH_O_CPU_SUBTYPE_ARM_ALL:
   1000         default:
   1001           break;
   1002         }
   1003       break;
   1004     case BFD_MACH_O_CPU_TYPE_MC88000:
   1005       *type = bfd_arch_m88k;
   1006       break;
   1007     case BFD_MACH_O_CPU_TYPE_SPARC:
   1008       *type = bfd_arch_sparc;
   1009       *subtype = bfd_mach_sparc;
   1010       break;
   1011     case BFD_MACH_O_CPU_TYPE_I860:
   1012       *type = bfd_arch_i860;
   1013       break;
   1014     case BFD_MACH_O_CPU_TYPE_ALPHA:
   1015       *type = bfd_arch_alpha;
   1016       break;
   1017     case BFD_MACH_O_CPU_TYPE_POWERPC:
   1018       *type = bfd_arch_powerpc;
   1019       *subtype = bfd_mach_ppc;
   1020       break;
   1021     case BFD_MACH_O_CPU_TYPE_POWERPC_64:
   1022       *type = bfd_arch_powerpc;
   1023       *subtype = bfd_mach_ppc64;
   1024       break;
   1025     case BFD_MACH_O_CPU_TYPE_ARM64:
   1026       *type = bfd_arch_aarch64;
   1027       *subtype = bfd_mach_aarch64;
   1028       break;
   1029     default:
   1030       *type = bfd_arch_unknown;
   1031       break;
   1032     }
   1033 }
   1034 
   1035 /* Write n NUL bytes to ABFD so that LEN + n is a multiple of 4.  Return the
   1036    number of bytes written or -1 in case of error.  */
   1037 
   1038 static int
   1039 bfd_mach_o_pad4 (bfd *abfd, unsigned int len)
   1040 {
   1041   if (len % 4 != 0)
   1042     {
   1043       char pad[4] = {0,0,0,0};
   1044       unsigned int padlen = 4 - (len % 4);
   1045 
   1046       if (bfd_bwrite (pad, padlen, abfd) != padlen)
   1047 	return -1;
   1048 
   1049       return padlen;
   1050     }
   1051   else
   1052     return 0;
   1053 }
   1054 
   1055 /* Likewise, but for a command.  */
   1056 
   1057 static int
   1058 bfd_mach_o_pad_command (bfd *abfd, unsigned int len)
   1059 {
   1060   unsigned int align = bfd_mach_o_wide_p (abfd) ? 8 : 4;
   1061 
   1062   if (len % align != 0)
   1063     {
   1064       char pad[8] = {0};
   1065       unsigned int padlen = align - (len % align);
   1066 
   1067       if (bfd_bwrite (pad, padlen, abfd) != padlen)
   1068 	return -1;
   1069 
   1070       return padlen;
   1071     }
   1072   else
   1073     return 0;
   1074 }
   1075 
   1076 static bfd_boolean
   1077 bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
   1078 {
   1079   struct mach_o_header_external raw;
   1080   unsigned int size;
   1081 
   1082   size = mach_o_wide_p (header) ?
   1083     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
   1084 
   1085   bfd_h_put_32 (abfd, header->magic, raw.magic);
   1086   bfd_h_put_32 (abfd, header->cputype, raw.cputype);
   1087   bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype);
   1088   bfd_h_put_32 (abfd, header->filetype, raw.filetype);
   1089   bfd_h_put_32 (abfd, header->ncmds, raw.ncmds);
   1090   bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds);
   1091   bfd_h_put_32 (abfd, header->flags, raw.flags);
   1092 
   1093   if (mach_o_wide_p (header))
   1094     bfd_h_put_32 (abfd, header->reserved, raw.reserved);
   1095 
   1096   if (bfd_seek (abfd, 0, SEEK_SET) != 0
   1097       || bfd_bwrite (&raw, size, abfd) != size)
   1098     return FALSE;
   1099 
   1100   return TRUE;
   1101 }
   1102 
   1103 static bfd_boolean
   1104 bfd_mach_o_write_thread (bfd *abfd, bfd_mach_o_load_command *command)
   1105 {
   1106   bfd_mach_o_thread_command *cmd = &command->command.thread;
   1107   unsigned int i;
   1108   struct mach_o_thread_command_external raw;
   1109   unsigned int offset;
   1110 
   1111   BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
   1112 	      || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
   1113 
   1114   offset = BFD_MACH_O_LC_SIZE;
   1115   for (i = 0; i < cmd->nflavours; i++)
   1116     {
   1117       BFD_ASSERT ((cmd->flavours[i].size % 4) == 0);
   1118       BFD_ASSERT (cmd->flavours[i].offset ==
   1119                   (command->offset + offset + BFD_MACH_O_LC_SIZE));
   1120 
   1121       bfd_h_put_32 (abfd, cmd->flavours[i].flavour, raw.flavour);
   1122       bfd_h_put_32 (abfd, (cmd->flavours[i].size / 4), raw.count);
   1123 
   1124       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
   1125           || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   1126 	return FALSE;
   1127 
   1128       offset += cmd->flavours[i].size + sizeof (raw);
   1129     }
   1130 
   1131   return TRUE;
   1132 }
   1133 
   1134 static bfd_boolean
   1135 bfd_mach_o_write_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
   1136 {
   1137   bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
   1138   struct mach_o_str_command_external raw;
   1139   unsigned int namelen;
   1140 
   1141   bfd_h_put_32 (abfd, cmd->name_offset, raw.str);
   1142 
   1143   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
   1144       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   1145     return FALSE;
   1146 
   1147   namelen = strlen (cmd->name_str) + 1;
   1148   if (bfd_bwrite (cmd->name_str, namelen, abfd) != namelen)
   1149     return FALSE;
   1150 
   1151   if (bfd_mach_o_pad_command (abfd, namelen) < 0)
   1152     return FALSE;
   1153 
   1154   return TRUE;
   1155 }
   1156 
   1157 static bfd_boolean
   1158 bfd_mach_o_write_dylib (bfd *abfd, bfd_mach_o_load_command *command)
   1159 {
   1160   bfd_mach_o_dylib_command *cmd = &command->command.dylib;
   1161   struct mach_o_dylib_command_external raw;
   1162   unsigned int namelen;
   1163 
   1164   bfd_h_put_32 (abfd, cmd->name_offset, raw.name);
   1165   bfd_h_put_32 (abfd, cmd->timestamp, raw.timestamp);
   1166   bfd_h_put_32 (abfd, cmd->current_version, raw.current_version);
   1167   bfd_h_put_32 (abfd, cmd->compatibility_version, raw.compatibility_version);
   1168 
   1169   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
   1170       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   1171     return FALSE;
   1172 
   1173   namelen = strlen (cmd->name_str) + 1;
   1174   if (bfd_bwrite (cmd->name_str, namelen, abfd) != namelen)
   1175     return FALSE;
   1176 
   1177   if (bfd_mach_o_pad_command (abfd, namelen) < 0)
   1178     return FALSE;
   1179 
   1180   return TRUE;
   1181 }
   1182 
   1183 static bfd_boolean
   1184 bfd_mach_o_write_main (bfd *abfd, bfd_mach_o_load_command *command)
   1185 {
   1186   bfd_mach_o_main_command *cmd = &command->command.main;
   1187   struct mach_o_entry_point_command_external raw;
   1188 
   1189   bfd_h_put_64 (abfd, cmd->entryoff, raw.entryoff);
   1190   bfd_h_put_64 (abfd, cmd->stacksize, raw.stacksize);
   1191 
   1192   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
   1193       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   1194     return FALSE;
   1195 
   1196   return TRUE;
   1197 }
   1198 
   1199 static bfd_boolean
   1200 bfd_mach_o_write_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
   1201 {
   1202   bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
   1203   struct mach_o_dyld_info_command_external raw;
   1204 
   1205   bfd_h_put_32 (abfd, cmd->rebase_off, raw.rebase_off);
   1206   bfd_h_put_32 (abfd, cmd->rebase_size, raw.rebase_size);
   1207   bfd_h_put_32 (abfd, cmd->bind_off, raw.bind_off);
   1208   bfd_h_put_32 (abfd, cmd->bind_size, raw.bind_size);
   1209   bfd_h_put_32 (abfd, cmd->weak_bind_off, raw.weak_bind_off);
   1210   bfd_h_put_32 (abfd, cmd->weak_bind_size, raw.weak_bind_size);
   1211   bfd_h_put_32 (abfd, cmd->lazy_bind_off, raw.lazy_bind_off);
   1212   bfd_h_put_32 (abfd, cmd->lazy_bind_size, raw.lazy_bind_size);
   1213   bfd_h_put_32 (abfd, cmd->export_off, raw.export_off);
   1214   bfd_h_put_32 (abfd, cmd->export_size, raw.export_size);
   1215 
   1216   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
   1217       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   1218     return FALSE;
   1219 
   1220   if (cmd->rebase_size != 0)
   1221     if (bfd_seek (abfd, cmd->rebase_off, SEEK_SET) != 0
   1222 	|| (bfd_bwrite (cmd->rebase_content, cmd->rebase_size, abfd) !=
   1223 	    cmd->rebase_size))
   1224       return FALSE;
   1225 
   1226   if (cmd->bind_size != 0)
   1227     if (bfd_seek (abfd, cmd->bind_off, SEEK_SET) != 0
   1228 	|| (bfd_bwrite (cmd->bind_content, cmd->bind_size, abfd) !=
   1229 	    cmd->bind_size))
   1230       return FALSE;
   1231 
   1232   if (cmd->weak_bind_size != 0)
   1233     if (bfd_seek (abfd, cmd->weak_bind_off, SEEK_SET) != 0
   1234 	|| (bfd_bwrite (cmd->weak_bind_content, cmd->weak_bind_size, abfd) !=
   1235 	    cmd->weak_bind_size))
   1236       return FALSE;
   1237 
   1238   if (cmd->lazy_bind_size != 0)
   1239     if (bfd_seek (abfd, cmd->lazy_bind_off, SEEK_SET) != 0
   1240 	|| (bfd_bwrite (cmd->lazy_bind_content, cmd->lazy_bind_size, abfd) !=
   1241 	    cmd->lazy_bind_size))
   1242       return FALSE;
   1243 
   1244   if (cmd->export_size != 0)
   1245     if (bfd_seek (abfd, cmd->export_off, SEEK_SET) != 0
   1246 	|| (bfd_bwrite (cmd->export_content, cmd->export_size, abfd) !=
   1247 	    cmd->export_size))
   1248       return FALSE;
   1249 
   1250   return TRUE;
   1251 }
   1252 
   1253 long
   1254 bfd_mach_o_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED,
   1255                                   asection *asect)
   1256 {
   1257   return (asect->reloc_count + 1) * sizeof (arelent *);
   1258 }
   1259 
   1260 /* In addition to the need to byte-swap the symbol number, the bit positions
   1261    of the fields in the relocation information vary per target endian-ness.  */
   1262 
   1263 static void
   1264 bfd_mach_o_swap_in_non_scattered_reloc (bfd *abfd, bfd_mach_o_reloc_info *rel,
   1265 				       unsigned char *fields)
   1266 {
   1267   unsigned char info = fields[3];
   1268 
   1269   if (bfd_big_endian (abfd))
   1270     {
   1271       rel->r_value = (fields[0] << 16) | (fields[1] << 8) | fields[2];
   1272       rel->r_type = (info >> BFD_MACH_O_BE_TYPE_SHIFT) & BFD_MACH_O_TYPE_MASK;
   1273       rel->r_pcrel = (info & BFD_MACH_O_BE_PCREL) ? 1 : 0;
   1274       rel->r_length = (info >> BFD_MACH_O_BE_LENGTH_SHIFT)
   1275 		      & BFD_MACH_O_LENGTH_MASK;
   1276       rel->r_extern = (info & BFD_MACH_O_BE_EXTERN) ? 1 : 0;
   1277     }
   1278   else
   1279     {
   1280       rel->r_value = (fields[2] << 16) | (fields[1] << 8) | fields[0];
   1281       rel->r_type = (info >> BFD_MACH_O_LE_TYPE_SHIFT) & BFD_MACH_O_TYPE_MASK;
   1282       rel->r_pcrel = (info & BFD_MACH_O_LE_PCREL) ? 1 : 0;
   1283       rel->r_length = (info >> BFD_MACH_O_LE_LENGTH_SHIFT)
   1284 		      & BFD_MACH_O_LENGTH_MASK;
   1285       rel->r_extern = (info & BFD_MACH_O_LE_EXTERN) ? 1 : 0;
   1286     }
   1287 }
   1288 
   1289 static int
   1290 bfd_mach_o_canonicalize_one_reloc (bfd *abfd,
   1291                                    struct mach_o_reloc_info_external *raw,
   1292                                    arelent *res, asymbol **syms)
   1293 {
   1294   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   1295   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
   1296   bfd_mach_o_reloc_info reloc;
   1297   bfd_vma addr;
   1298   asymbol **sym;
   1299 
   1300   addr = bfd_get_32 (abfd, raw->r_address);
   1301   res->sym_ptr_ptr = NULL;
   1302   res->addend = 0;
   1303 
   1304   if (addr & BFD_MACH_O_SR_SCATTERED)
   1305     {
   1306       unsigned int j;
   1307       bfd_vma symnum = bfd_get_32 (abfd, raw->r_symbolnum);
   1308 
   1309       /* Scattered relocation, can't be extern. */
   1310       reloc.r_scattered = 1;
   1311       reloc.r_extern = 0;
   1312 
   1313       /*   Extract section and offset from r_value (symnum).  */
   1314       reloc.r_value = symnum;
   1315       /* FIXME: This breaks when a symbol in a reloc exactly follows the
   1316 	 end of the data for the section (e.g. in a calculation of section
   1317 	 data length).  At present, the symbol will end up associated with
   1318 	 the following section or, if it falls within alignment padding, as
   1319 	 null - which will assert later.  */
   1320       for (j = 0; j < mdata->nsects; j++)
   1321         {
   1322           bfd_mach_o_section *sect = mdata->sections[j];
   1323           if (symnum >= sect->addr && symnum < sect->addr + sect->size)
   1324             {
   1325               res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr;
   1326               res->addend = symnum - sect->addr;
   1327               break;
   1328             }
   1329         }
   1330 
   1331       /* Extract the info and address fields from r_address.  */
   1332       reloc.r_type = BFD_MACH_O_GET_SR_TYPE (addr);
   1333       reloc.r_length = BFD_MACH_O_GET_SR_LENGTH (addr);
   1334       reloc.r_pcrel = addr & BFD_MACH_O_SR_PCREL;
   1335       reloc.r_address = BFD_MACH_O_GET_SR_TYPE (addr);
   1336       res->address = BFD_MACH_O_GET_SR_ADDRESS (addr);
   1337     }
   1338   else
   1339     {
   1340       unsigned int num;
   1341 
   1342       /* Non-scattered relocation.  */
   1343       reloc.r_scattered = 0;
   1344 
   1345       /* The value and info fields have to be extracted dependent on target
   1346          endian-ness.  */
   1347       bfd_mach_o_swap_in_non_scattered_reloc (abfd, &reloc, raw->r_symbolnum);
   1348       num = reloc.r_value;
   1349 
   1350       if (reloc.r_extern)
   1351 	{
   1352 	  /* An external symbol number.  */
   1353 	  sym = syms + num;
   1354 	}
   1355       else if (num == 0x00ffffff || num == 0)
   1356 	{
   1357 	  /* The 'symnum' in a non-scattered PAIR is 0x00ffffff.  But as this
   1358 	     is generic code, we don't know wether this is really a PAIR.
   1359 	     This value is almost certainly not a valid section number, hence
   1360 	     this specific case to avoid an assertion failure.
   1361 	     Target specific swap_reloc_in routine should adjust that.  */
   1362 	  sym = bfd_abs_section_ptr->symbol_ptr_ptr;
   1363 	}
   1364       else
   1365         {
   1366 	  /* A section number.  */
   1367           BFD_ASSERT (num <= mdata->nsects);
   1368 
   1369           sym = mdata->sections[num - 1]->bfdsection->symbol_ptr_ptr;
   1370           /* For a symbol defined in section S, the addend (stored in the
   1371              binary) contains the address of the section.  To comply with
   1372              bfd convention, subtract the section address.
   1373              Use the address from the header, so that the user can modify
   1374              the vma of the section.  */
   1375           res->addend = -mdata->sections[num - 1]->addr;
   1376         }
   1377       /* Note: Pairs for PPC LO/HI/HA are not scattered, but contain the offset
   1378 	 in the lower 16bits of the address value.  So we have to find the
   1379 	 'symbol' from the preceding reloc.  We do this even though the
   1380 	 section symbol is probably not needed here, because NULL symbol
   1381 	 values cause an assert in generic BFD code.  This must be done in
   1382 	 the PPC swap_reloc_in routine.  */
   1383       res->sym_ptr_ptr = sym;
   1384 
   1385       /* The 'address' is just r_address.
   1386          ??? maybe this should be masked with  0xffffff for safety.  */
   1387       res->address = addr;
   1388       reloc.r_address = addr;
   1389     }
   1390 
   1391   /* We have set up a reloc with all the information present, so the swapper
   1392      can modify address, value and addend fields, if necessary, to convey
   1393      information in the generic BFD reloc that is mach-o specific.  */
   1394 
   1395   if (!(*bed->_bfd_mach_o_swap_reloc_in)(res, &reloc))
   1396     return -1;
   1397   return 0;
   1398 }
   1399 
   1400 static int
   1401 bfd_mach_o_canonicalize_relocs (bfd *abfd, unsigned long filepos,
   1402                                 unsigned long count,
   1403                                 arelent *res, asymbol **syms)
   1404 {
   1405   unsigned long i;
   1406   struct mach_o_reloc_info_external *native_relocs;
   1407   bfd_size_type native_size;
   1408 
   1409   /* Allocate and read relocs.  */
   1410   native_size = count * BFD_MACH_O_RELENT_SIZE;
   1411   native_relocs =
   1412     (struct mach_o_reloc_info_external *) bfd_malloc (native_size);
   1413   if (native_relocs == NULL)
   1414     return -1;
   1415 
   1416   if (bfd_seek (abfd, filepos, SEEK_SET) != 0
   1417       || bfd_bread (native_relocs, native_size, abfd) != native_size)
   1418     goto err;
   1419 
   1420   for (i = 0; i < count; i++)
   1421     {
   1422       if (bfd_mach_o_canonicalize_one_reloc (abfd, &native_relocs[i],
   1423                                              &res[i], syms) < 0)
   1424         goto err;
   1425     }
   1426   free (native_relocs);
   1427   return i;
   1428  err:
   1429   free (native_relocs);
   1430   return -1;
   1431 }
   1432 
   1433 long
   1434 bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect,
   1435                                arelent **rels, asymbol **syms)
   1436 {
   1437   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
   1438   unsigned long i;
   1439   arelent *res;
   1440 
   1441   if (asect->reloc_count == 0)
   1442     return 0;
   1443 
   1444   /* No need to go further if we don't know how to read relocs.  */
   1445   if (bed->_bfd_mach_o_swap_reloc_in == NULL)
   1446     return 0;
   1447 
   1448   if (asect->relocation == NULL)
   1449     {
   1450       res = bfd_malloc (asect->reloc_count * sizeof (arelent));
   1451       if (res == NULL)
   1452         return -1;
   1453 
   1454       if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos,
   1455                                           asect->reloc_count, res, syms) < 0)
   1456         {
   1457           free (res);
   1458           return -1;
   1459         }
   1460       asect->relocation = res;
   1461     }
   1462 
   1463   res = asect->relocation;
   1464   for (i = 0; i < asect->reloc_count; i++)
   1465     rels[i] = &res[i];
   1466   rels[i] = NULL;
   1467 
   1468   return i;
   1469 }
   1470 
   1471 long
   1472 bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd)
   1473 {
   1474   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   1475 
   1476   if (mdata->dysymtab == NULL)
   1477     return 1;
   1478   return (mdata->dysymtab->nextrel + mdata->dysymtab->nlocrel + 1)
   1479     * sizeof (arelent *);
   1480 }
   1481 
   1482 long
   1483 bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
   1484                                        struct bfd_symbol **syms)
   1485 {
   1486   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   1487   bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
   1488   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
   1489   unsigned long i;
   1490   arelent *res;
   1491 
   1492   if (dysymtab == NULL)
   1493     return 0;
   1494   if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0)
   1495     return 0;
   1496 
   1497   /* No need to go further if we don't know how to read relocs.  */
   1498   if (bed->_bfd_mach_o_swap_reloc_in == NULL)
   1499     return 0;
   1500 
   1501   if (mdata->dyn_reloc_cache == NULL)
   1502     {
   1503       res = bfd_malloc ((dysymtab->nextrel + dysymtab->nlocrel)
   1504                         * sizeof (arelent));
   1505       if (res == NULL)
   1506         return -1;
   1507 
   1508       if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff,
   1509                                           dysymtab->nextrel, res, syms) < 0)
   1510         {
   1511           free (res);
   1512           return -1;
   1513         }
   1514 
   1515       if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff,
   1516                                           dysymtab->nlocrel,
   1517                                           res + dysymtab->nextrel, syms) < 0)
   1518         {
   1519           free (res);
   1520           return -1;
   1521         }
   1522 
   1523       mdata->dyn_reloc_cache = res;
   1524     }
   1525 
   1526   res = mdata->dyn_reloc_cache;
   1527   for (i = 0; i < dysymtab->nextrel + dysymtab->nlocrel; i++)
   1528     rels[i] = &res[i];
   1529   rels[i] = NULL;
   1530   return i;
   1531 }
   1532 
   1533 /* In addition to the need to byte-swap the symbol number, the bit positions
   1534    of the fields in the relocation information vary per target endian-ness.  */
   1535 
   1536 static void
   1537 bfd_mach_o_swap_out_non_scattered_reloc (bfd *abfd, unsigned char *fields,
   1538 				       bfd_mach_o_reloc_info *rel)
   1539 {
   1540   unsigned char info = 0;
   1541 
   1542   BFD_ASSERT (rel->r_type <= 15);
   1543   BFD_ASSERT (rel->r_length <= 3);
   1544 
   1545   if (bfd_big_endian (abfd))
   1546     {
   1547       fields[0] = (rel->r_value >> 16) & 0xff;
   1548       fields[1] = (rel->r_value >> 8) & 0xff;
   1549       fields[2] = rel->r_value & 0xff;
   1550       info |= rel->r_type << BFD_MACH_O_BE_TYPE_SHIFT;
   1551       info |= rel->r_pcrel ? BFD_MACH_O_BE_PCREL : 0;
   1552       info |= rel->r_length << BFD_MACH_O_BE_LENGTH_SHIFT;
   1553       info |= rel->r_extern ? BFD_MACH_O_BE_EXTERN : 0;
   1554     }
   1555   else
   1556     {
   1557       fields[2] = (rel->r_value >> 16) & 0xff;
   1558       fields[1] = (rel->r_value >> 8) & 0xff;
   1559       fields[0] = rel->r_value & 0xff;
   1560       info |= rel->r_type << BFD_MACH_O_LE_TYPE_SHIFT;
   1561       info |= rel->r_pcrel ? BFD_MACH_O_LE_PCREL : 0;
   1562       info |= rel->r_length << BFD_MACH_O_LE_LENGTH_SHIFT;
   1563       info |= rel->r_extern ? BFD_MACH_O_LE_EXTERN : 0;
   1564     }
   1565   fields[3] = info;
   1566 }
   1567 
   1568 static bfd_boolean
   1569 bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
   1570 {
   1571   unsigned int i;
   1572   arelent **entries;
   1573   asection *sec;
   1574   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
   1575 
   1576   sec = section->bfdsection;
   1577   if (sec->reloc_count == 0)
   1578     return TRUE;
   1579 
   1580   if (bed->_bfd_mach_o_swap_reloc_out == NULL)
   1581     return TRUE;
   1582 
   1583   if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0)
   1584     return FALSE;
   1585 
   1586   /* Convert and write.  */
   1587   entries = section->bfdsection->orelocation;
   1588   for (i = 0; i < section->nreloc; i++)
   1589     {
   1590       arelent *rel = entries[i];
   1591       struct mach_o_reloc_info_external raw;
   1592       bfd_mach_o_reloc_info info, *pinfo = &info;
   1593 
   1594       /* Convert relocation to an intermediate representation.  */
   1595       if (!(*bed->_bfd_mach_o_swap_reloc_out) (rel, pinfo))
   1596         return FALSE;
   1597 
   1598       /* Lower the relocation info.  */
   1599       if (pinfo->r_scattered)
   1600         {
   1601           unsigned long v;
   1602 
   1603           v = BFD_MACH_O_SR_SCATTERED
   1604             | (pinfo->r_pcrel ? BFD_MACH_O_SR_PCREL : 0)
   1605             | BFD_MACH_O_SET_SR_LENGTH (pinfo->r_length)
   1606             | BFD_MACH_O_SET_SR_TYPE (pinfo->r_type)
   1607             | BFD_MACH_O_SET_SR_ADDRESS (pinfo->r_address);
   1608           /* Note: scattered relocs have field in reverse order...  */
   1609           bfd_put_32 (abfd, v, raw.r_address);
   1610           bfd_put_32 (abfd, pinfo->r_value, raw.r_symbolnum);
   1611         }
   1612       else
   1613         {
   1614           bfd_put_32 (abfd, pinfo->r_address, raw.r_address);
   1615           bfd_mach_o_swap_out_non_scattered_reloc (abfd, raw.r_symbolnum,
   1616 						   pinfo);
   1617         }
   1618 
   1619       if (bfd_bwrite (&raw, BFD_MACH_O_RELENT_SIZE, abfd)
   1620           != BFD_MACH_O_RELENT_SIZE)
   1621         return FALSE;
   1622     }
   1623   return TRUE;
   1624 }
   1625 
   1626 static bfd_boolean
   1627 bfd_mach_o_write_section_32 (bfd *abfd, bfd_mach_o_section *section)
   1628 {
   1629   struct mach_o_section_32_external raw;
   1630 
   1631   memcpy (raw.sectname, section->sectname, 16);
   1632   memcpy (raw.segname, section->segname, 16);
   1633   bfd_h_put_32 (abfd, section->addr, raw.addr);
   1634   bfd_h_put_32 (abfd, section->size, raw.size);
   1635   bfd_h_put_32 (abfd, section->offset, raw.offset);
   1636   bfd_h_put_32 (abfd, section->align, raw.align);
   1637   bfd_h_put_32 (abfd, section->reloff, raw.reloff);
   1638   bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
   1639   bfd_h_put_32 (abfd, section->flags, raw.flags);
   1640   bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
   1641   bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
   1642 
   1643   if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
   1644       != BFD_MACH_O_SECTION_SIZE)
   1645     return FALSE;
   1646 
   1647   return TRUE;
   1648 }
   1649 
   1650 static bfd_boolean
   1651 bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
   1652 {
   1653   struct mach_o_section_64_external raw;
   1654 
   1655   memcpy (raw.sectname, section->sectname, 16);
   1656   memcpy (raw.segname, section->segname, 16);
   1657   bfd_h_put_64 (abfd, section->addr, raw.addr);
   1658   bfd_h_put_64 (abfd, section->size, raw.size);
   1659   bfd_h_put_32 (abfd, section->offset, raw.offset);
   1660   bfd_h_put_32 (abfd, section->align, raw.align);
   1661   bfd_h_put_32 (abfd, section->reloff, raw.reloff);
   1662   bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
   1663   bfd_h_put_32 (abfd, section->flags, raw.flags);
   1664   bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
   1665   bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
   1666   bfd_h_put_32 (abfd, section->reserved3, raw.reserved3);
   1667 
   1668   if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
   1669       != BFD_MACH_O_SECTION_64_SIZE)
   1670     return FALSE;
   1671 
   1672   return TRUE;
   1673 }
   1674 
   1675 static bfd_boolean
   1676 bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
   1677 {
   1678   struct mach_o_segment_command_32_external raw;
   1679   bfd_mach_o_segment_command *seg = &command->command.segment;
   1680   bfd_mach_o_section *sec;
   1681 
   1682   BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
   1683 
   1684   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
   1685     if (!bfd_mach_o_write_relocs (abfd, sec))
   1686       return FALSE;
   1687 
   1688   memcpy (raw.segname, seg->segname, 16);
   1689   bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr);
   1690   bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize);
   1691   bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff);
   1692   bfd_h_put_32 (abfd, seg->filesize, raw.filesize);
   1693   bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
   1694   bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
   1695   bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
   1696   bfd_h_put_32 (abfd, seg->flags, raw.flags);
   1697 
   1698   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
   1699       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   1700     return FALSE;
   1701 
   1702   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
   1703     if (!bfd_mach_o_write_section_32 (abfd, sec))
   1704       return FALSE;
   1705 
   1706   return TRUE;
   1707 }
   1708 
   1709 static bfd_boolean
   1710 bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
   1711 {
   1712   struct mach_o_segment_command_64_external raw;
   1713   bfd_mach_o_segment_command *seg = &command->command.segment;
   1714   bfd_mach_o_section *sec;
   1715 
   1716   BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
   1717 
   1718   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
   1719     if (!bfd_mach_o_write_relocs (abfd, sec))
   1720       return FALSE;
   1721 
   1722   memcpy (raw.segname, seg->segname, 16);
   1723   bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr);
   1724   bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize);
   1725   bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff);
   1726   bfd_h_put_64 (abfd, seg->filesize, raw.filesize);
   1727   bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
   1728   bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
   1729   bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
   1730   bfd_h_put_32 (abfd, seg->flags, raw.flags);
   1731 
   1732   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
   1733       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   1734     return FALSE;
   1735 
   1736   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
   1737     if (!bfd_mach_o_write_section_64 (abfd, sec))
   1738       return FALSE;
   1739 
   1740   return TRUE;
   1741 }
   1742 
   1743 static bfd_boolean
   1744 bfd_mach_o_write_symtab_content (bfd *abfd, bfd_mach_o_symtab_command *sym)
   1745 {
   1746   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   1747   unsigned long i;
   1748   unsigned int wide = bfd_mach_o_wide_p (abfd);
   1749   struct bfd_strtab_hash *strtab;
   1750   asymbol **symbols = bfd_get_outsymbols (abfd);
   1751   int padlen;
   1752 
   1753   /* Write the symbols first.  */
   1754   if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0)
   1755     return FALSE;
   1756 
   1757   strtab = _bfd_stringtab_init ();
   1758   if (strtab == NULL)
   1759     return FALSE;
   1760 
   1761   if (sym->nsyms > 0)
   1762     /* Although we don't strictly need to do this, for compatibility with
   1763        Darwin system tools, actually output an empty string for the index
   1764        0 entry.  */
   1765     _bfd_stringtab_add (strtab, "", TRUE, FALSE);
   1766 
   1767   for (i = 0; i < sym->nsyms; i++)
   1768     {
   1769       bfd_size_type str_index;
   1770       bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
   1771 
   1772       if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
   1773 	/* An index of 0 always means the empty string.  */
   1774         str_index = 0;
   1775       else
   1776         {
   1777           str_index = _bfd_stringtab_add (strtab, s->symbol.name, TRUE, FALSE);
   1778 
   1779           if (str_index == (bfd_size_type) -1)
   1780             goto err;
   1781         }
   1782 
   1783       if (wide)
   1784         {
   1785           struct mach_o_nlist_64_external raw;
   1786 
   1787           bfd_h_put_32 (abfd, str_index, raw.n_strx);
   1788           bfd_h_put_8 (abfd, s->n_type, raw.n_type);
   1789           bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
   1790           bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
   1791           bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value,
   1792                         raw.n_value);
   1793 
   1794           if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   1795             goto err;
   1796         }
   1797       else
   1798         {
   1799           struct mach_o_nlist_external raw;
   1800 
   1801           bfd_h_put_32 (abfd, str_index, raw.n_strx);
   1802           bfd_h_put_8 (abfd, s->n_type, raw.n_type);
   1803           bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
   1804           bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
   1805           bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value,
   1806                         raw.n_value);
   1807 
   1808           if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   1809             goto err;
   1810         }
   1811     }
   1812   sym->strsize = _bfd_stringtab_size (strtab);
   1813   sym->stroff = mdata->filelen;
   1814   mdata->filelen += sym->strsize;
   1815 
   1816   if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0)
   1817     return FALSE;
   1818 
   1819   if (_bfd_stringtab_emit (abfd, strtab) != TRUE)
   1820     goto err;
   1821   _bfd_stringtab_free (strtab);
   1822 
   1823   /* Pad string table.  */
   1824   padlen = bfd_mach_o_pad4 (abfd, sym->strsize);
   1825   if (padlen < 0)
   1826     return FALSE;
   1827   mdata->filelen += padlen;
   1828   sym->strsize += padlen;
   1829 
   1830   return TRUE;
   1831 
   1832  err:
   1833   _bfd_stringtab_free (strtab);
   1834   return FALSE;
   1835 }
   1836 
   1837 static bfd_boolean
   1838 bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
   1839 {
   1840   bfd_mach_o_symtab_command *sym = &command->command.symtab;
   1841   struct mach_o_symtab_command_external raw;
   1842 
   1843   BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
   1844 
   1845   /* The command.  */
   1846   bfd_h_put_32 (abfd, sym->symoff, raw.symoff);
   1847   bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms);
   1848   bfd_h_put_32 (abfd, sym->stroff, raw.stroff);
   1849   bfd_h_put_32 (abfd, sym->strsize, raw.strsize);
   1850 
   1851   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
   1852       || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   1853     return FALSE;
   1854 
   1855   return TRUE;
   1856 }
   1857 
   1858 /* Count the number of indirect symbols in the image.
   1859    Requires that the sections are in their final order.  */
   1860 
   1861 static unsigned int
   1862 bfd_mach_o_count_indirect_symbols (bfd *abfd, bfd_mach_o_data_struct *mdata)
   1863 {
   1864   unsigned int i;
   1865   unsigned int nisyms = 0;
   1866 
   1867   for (i = 0; i < mdata->nsects; ++i)
   1868     {
   1869       bfd_mach_o_section *sec = mdata->sections[i];
   1870 
   1871       switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
   1872 	{
   1873 	  case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
   1874 	  case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
   1875 	  case BFD_MACH_O_S_SYMBOL_STUBS:
   1876 	    nisyms += bfd_mach_o_section_get_nbr_indirect (abfd, sec);
   1877 	    break;
   1878 	  default:
   1879 	    break;
   1880 	}
   1881     }
   1882   return nisyms;
   1883 }
   1884 
   1885 /* Create the dysymtab.  */
   1886 
   1887 static bfd_boolean
   1888 bfd_mach_o_build_dysymtab (bfd *abfd, bfd_mach_o_dysymtab_command *cmd)
   1889 {
   1890   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   1891 
   1892   /* TODO:
   1893      We are not going to try and fill these in yet and, moreover, we are
   1894      going to bail if they are already set.  */
   1895   if (cmd->nmodtab != 0
   1896       || cmd->ntoc != 0
   1897       || cmd->nextrefsyms != 0)
   1898     {
   1899       (*_bfd_error_handler) (_("sorry: modtab, toc and extrefsyms are not yet"
   1900 				" implemented for dysymtab commands."));
   1901       return FALSE;
   1902     }
   1903 
   1904   cmd->ilocalsym = 0;
   1905 
   1906   if (bfd_get_symcount (abfd) > 0)
   1907     {
   1908       asymbol **symbols = bfd_get_outsymbols (abfd);
   1909       unsigned long i;
   1910 
   1911        /* Count the number of each kind of symbol.  */
   1912       for (i = 0; i < bfd_get_symcount (abfd); ++i)
   1913 	{
   1914 	  bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
   1915 	  if (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT))
   1916 	    break;
   1917 	}
   1918       cmd->nlocalsym = i;
   1919       cmd->iextdefsym = i;
   1920       for (; i < bfd_get_symcount (abfd); ++i)
   1921 	{
   1922 	  bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
   1923 	  if ((s->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF)
   1924 	    break;
   1925 	}
   1926       cmd->nextdefsym = i - cmd->nlocalsym;
   1927       cmd->iundefsym = cmd->nextdefsym + cmd->iextdefsym;
   1928       cmd->nundefsym = bfd_get_symcount (abfd)
   1929 			- cmd->nlocalsym
   1930 			- cmd->nextdefsym;
   1931     }
   1932   else
   1933     {
   1934       cmd->nlocalsym = 0;
   1935       cmd->iextdefsym = 0;
   1936       cmd->nextdefsym = 0;
   1937       cmd->iundefsym = 0;
   1938       cmd->nundefsym = 0;
   1939     }
   1940 
   1941   cmd->nindirectsyms = bfd_mach_o_count_indirect_symbols (abfd, mdata);
   1942   if (cmd->nindirectsyms > 0)
   1943     {
   1944       unsigned i;
   1945       unsigned n;
   1946 
   1947       mdata->filelen = FILE_ALIGN (mdata->filelen, 2);
   1948       cmd->indirectsymoff = mdata->filelen;
   1949       mdata->filelen += cmd->nindirectsyms * 4;
   1950 
   1951       cmd->indirect_syms = bfd_zalloc (abfd, cmd->nindirectsyms * 4);
   1952       if (cmd->indirect_syms == NULL)
   1953         return FALSE;
   1954 
   1955       n = 0;
   1956       for (i = 0; i < mdata->nsects; ++i)
   1957 	{
   1958 	  bfd_mach_o_section *sec = mdata->sections[i];
   1959 
   1960 	  switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
   1961 	    {
   1962 	      case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
   1963 	      case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
   1964 	      case BFD_MACH_O_S_SYMBOL_STUBS:
   1965 		{
   1966 		  unsigned j, num;
   1967 		  bfd_mach_o_asymbol **isyms = sec->indirect_syms;
   1968 
   1969 		  num = bfd_mach_o_section_get_nbr_indirect (abfd, sec);
   1970 		  if (isyms == NULL || num == 0)
   1971 		    break;
   1972 		  /* Record the starting index in the reserved1 field.  */
   1973 		  sec->reserved1 = n;
   1974 		  for (j = 0; j < num; j++, n++)
   1975 		    {
   1976 		      if (isyms[j] == NULL)
   1977 		        cmd->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL;
   1978 		      else if (isyms[j]->symbol.section == bfd_abs_section_ptr
   1979 			       && ! (isyms[j]->n_type & BFD_MACH_O_N_EXT))
   1980 		        cmd->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL
   1981 						 | BFD_MACH_O_INDIRECT_SYM_ABS;
   1982 		      else
   1983 		        cmd->indirect_syms[n] = isyms[j]->symbol.udata.i;
   1984 		    }
   1985 		}
   1986 		break;
   1987 	      default:
   1988 		break;
   1989 	    }
   1990 	}
   1991     }
   1992 
   1993   return TRUE;
   1994 }
   1995 
   1996 /* Write a dysymtab command.
   1997    TODO: Possibly coalesce writes of smaller objects.  */
   1998 
   1999 static bfd_boolean
   2000 bfd_mach_o_write_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
   2001 {
   2002   bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
   2003 
   2004   BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
   2005 
   2006   if (cmd->nmodtab != 0)
   2007     {
   2008       unsigned int i;
   2009 
   2010       if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
   2011 	return FALSE;
   2012 
   2013       for (i = 0; i < cmd->nmodtab; i++)
   2014 	{
   2015 	  bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
   2016 	  unsigned int iinit;
   2017 	  unsigned int ninit;
   2018 
   2019 	  iinit = module->iinit & 0xffff;
   2020 	  iinit |= ((module->iterm & 0xffff) << 16);
   2021 
   2022 	  ninit = module->ninit & 0xffff;
   2023 	  ninit |= ((module->nterm & 0xffff) << 16);
   2024 
   2025 	  if (bfd_mach_o_wide_p (abfd))
   2026 	    {
   2027 	      struct mach_o_dylib_module_64_external w;
   2028 
   2029 	      bfd_h_put_32 (abfd, module->module_name_idx, &w.module_name);
   2030 	      bfd_h_put_32 (abfd, module->iextdefsym, &w.iextdefsym);
   2031 	      bfd_h_put_32 (abfd, module->nextdefsym, &w.nextdefsym);
   2032 	      bfd_h_put_32 (abfd, module->irefsym, &w.irefsym);
   2033 	      bfd_h_put_32 (abfd, module->nrefsym, &w.nrefsym);
   2034 	      bfd_h_put_32 (abfd, module->ilocalsym, &w.ilocalsym);
   2035 	      bfd_h_put_32 (abfd, module->nlocalsym, &w.nlocalsym);
   2036 	      bfd_h_put_32 (abfd, module->iextrel, &w.iextrel);
   2037 	      bfd_h_put_32 (abfd, module->nextrel, &w.nextrel);
   2038 	      bfd_h_put_32 (abfd, iinit, &w.iinit_iterm);
   2039 	      bfd_h_put_32 (abfd, ninit, &w.ninit_nterm);
   2040 	      bfd_h_put_64 (abfd, module->objc_module_info_addr,
   2041 			    &w.objc_module_info_addr);
   2042 	      bfd_h_put_32 (abfd, module->objc_module_info_size,
   2043 			    &w.objc_module_info_size);
   2044 
   2045 	      if (bfd_bwrite ((void *) &w, sizeof (w), abfd) != sizeof (w))
   2046 		return FALSE;
   2047 	    }
   2048 	  else
   2049 	    {
   2050 	      struct mach_o_dylib_module_external n;
   2051 
   2052 	      bfd_h_put_32 (abfd, module->module_name_idx, &n.module_name);
   2053 	      bfd_h_put_32 (abfd, module->iextdefsym, &n.iextdefsym);
   2054 	      bfd_h_put_32 (abfd, module->nextdefsym, &n.nextdefsym);
   2055 	      bfd_h_put_32 (abfd, module->irefsym, &n.irefsym);
   2056 	      bfd_h_put_32 (abfd, module->nrefsym, &n.nrefsym);
   2057 	      bfd_h_put_32 (abfd, module->ilocalsym, &n.ilocalsym);
   2058 	      bfd_h_put_32 (abfd, module->nlocalsym, &n.nlocalsym);
   2059 	      bfd_h_put_32 (abfd, module->iextrel, &n.iextrel);
   2060 	      bfd_h_put_32 (abfd, module->nextrel, &n.nextrel);
   2061 	      bfd_h_put_32 (abfd, iinit, &n.iinit_iterm);
   2062 	      bfd_h_put_32 (abfd, ninit, &n.ninit_nterm);
   2063 	      bfd_h_put_32 (abfd, module->objc_module_info_addr,
   2064 			    &n.objc_module_info_addr);
   2065 	      bfd_h_put_32 (abfd, module->objc_module_info_size,
   2066 			    &n.objc_module_info_size);
   2067 
   2068 	      if (bfd_bwrite ((void *) &n, sizeof (n), abfd) != sizeof (n))
   2069 		return FALSE;
   2070 	    }
   2071 	}
   2072     }
   2073 
   2074   if (cmd->ntoc != 0)
   2075     {
   2076       unsigned int i;
   2077 
   2078       if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
   2079 	return FALSE;
   2080 
   2081       for (i = 0; i < cmd->ntoc; i++)
   2082 	{
   2083 	  struct mach_o_dylib_table_of_contents_external raw;
   2084 	  bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
   2085 
   2086 	  bfd_h_put_32 (abfd, toc->symbol_index, &raw.symbol_index);
   2087 	  bfd_h_put_32 (abfd, toc->module_index, &raw.module_index);
   2088 
   2089 	  if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   2090 	    return FALSE;
   2091 	}
   2092     }
   2093 
   2094   if (cmd->nindirectsyms > 0)
   2095     {
   2096       unsigned int i;
   2097 
   2098       if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
   2099 	return FALSE;
   2100 
   2101       for (i = 0; i < cmd->nindirectsyms; ++i)
   2102 	{
   2103 	  unsigned char raw[4];
   2104 
   2105 	  bfd_h_put_32 (abfd, cmd->indirect_syms[i], &raw);
   2106 	  if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
   2107 	    return FALSE;
   2108 	}
   2109     }
   2110 
   2111   if (cmd->nextrefsyms != 0)
   2112     {
   2113       unsigned int i;
   2114 
   2115       if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
   2116 	return FALSE;
   2117 
   2118       for (i = 0; i < cmd->nextrefsyms; i++)
   2119 	{
   2120 	  unsigned long v;
   2121 	  unsigned char raw[4];
   2122 	  bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
   2123 
   2124 	  /* Fields isym and flags are written as bit-fields, thus we need
   2125 	     a specific processing for endianness.  */
   2126 
   2127 	  if (bfd_big_endian (abfd))
   2128 	    {
   2129 	      v = ((ref->isym & 0xffffff) << 8);
   2130 	      v |= ref->flags & 0xff;
   2131 	    }
   2132 	  else
   2133 	    {
   2134 	      v = ref->isym  & 0xffffff;
   2135 	      v |= ((ref->flags & 0xff) << 24);
   2136 	    }
   2137 
   2138 	  bfd_h_put_32 (abfd, v, raw);
   2139 	  if (bfd_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
   2140 	    return FALSE;
   2141 	}
   2142     }
   2143 
   2144   /* The command.  */
   2145   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0)
   2146     return FALSE;
   2147   else
   2148     {
   2149       struct mach_o_dysymtab_command_external raw;
   2150 
   2151       bfd_h_put_32 (abfd, cmd->ilocalsym, &raw.ilocalsym);
   2152       bfd_h_put_32 (abfd, cmd->nlocalsym, &raw.nlocalsym);
   2153       bfd_h_put_32 (abfd, cmd->iextdefsym, &raw.iextdefsym);
   2154       bfd_h_put_32 (abfd, cmd->nextdefsym, &raw.nextdefsym);
   2155       bfd_h_put_32 (abfd, cmd->iundefsym, &raw.iundefsym);
   2156       bfd_h_put_32 (abfd, cmd->nundefsym, &raw.nundefsym);
   2157       bfd_h_put_32 (abfd, cmd->tocoff, &raw.tocoff);
   2158       bfd_h_put_32 (abfd, cmd->ntoc, &raw.ntoc);
   2159       bfd_h_put_32 (abfd, cmd->modtaboff, &raw.modtaboff);
   2160       bfd_h_put_32 (abfd, cmd->nmodtab, &raw.nmodtab);
   2161       bfd_h_put_32 (abfd, cmd->extrefsymoff, &raw.extrefsymoff);
   2162       bfd_h_put_32 (abfd, cmd->nextrefsyms, &raw.nextrefsyms);
   2163       bfd_h_put_32 (abfd, cmd->indirectsymoff, &raw.indirectsymoff);
   2164       bfd_h_put_32 (abfd, cmd->nindirectsyms, &raw.nindirectsyms);
   2165       bfd_h_put_32 (abfd, cmd->extreloff, &raw.extreloff);
   2166       bfd_h_put_32 (abfd, cmd->nextrel, &raw.nextrel);
   2167       bfd_h_put_32 (abfd, cmd->locreloff, &raw.locreloff);
   2168       bfd_h_put_32 (abfd, cmd->nlocrel, &raw.nlocrel);
   2169 
   2170       if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
   2171 	return FALSE;
   2172     }
   2173 
   2174   return TRUE;
   2175 }
   2176 
   2177 static unsigned
   2178 bfd_mach_o_primary_symbol_sort_key (bfd_mach_o_asymbol *s)
   2179 {
   2180   unsigned mtyp = s->n_type & BFD_MACH_O_N_TYPE;
   2181 
   2182   /* Just leave debug symbols where they are (pretend they are local, and
   2183      then they will just be sorted on position).  */
   2184   if (s->n_type & BFD_MACH_O_N_STAB)
   2185     return 0;
   2186 
   2187   /* Local (we should never see an undefined local AFAICT).  */
   2188   if (! (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT)))
   2189     return 0;
   2190 
   2191   /* Common symbols look like undefined externs.  */
   2192   if (mtyp == BFD_MACH_O_N_UNDF)
   2193     return 2;
   2194 
   2195   /* A defined non-local, non-debug symbol.  */
   2196   return 1;
   2197 }
   2198 
   2199 static int
   2200 bfd_mach_o_cf_symbols (const void *a, const void *b)
   2201 {
   2202   bfd_mach_o_asymbol *sa = *(bfd_mach_o_asymbol **) a;
   2203   bfd_mach_o_asymbol *sb = *(bfd_mach_o_asymbol **) b;
   2204   unsigned int soa, sob;
   2205 
   2206   soa = bfd_mach_o_primary_symbol_sort_key (sa);
   2207   sob = bfd_mach_o_primary_symbol_sort_key (sb);
   2208   if (soa < sob)
   2209     return -1;
   2210 
   2211   if (soa > sob)
   2212     return 1;
   2213 
   2214   /* If it's local or stab, just preserve the input order.  */
   2215   if (soa == 0)
   2216     {
   2217       if (sa->symbol.udata.i < sb->symbol.udata.i)
   2218         return -1;
   2219       if (sa->symbol.udata.i > sb->symbol.udata.i)
   2220         return  1;
   2221 
   2222       /* This is probably an error.  */
   2223       return 0;
   2224     }
   2225 
   2226   /* The second sort key is name.  */
   2227   return strcmp (sa->symbol.name, sb->symbol.name);
   2228 }
   2229 
   2230 /* Process the symbols.
   2231 
   2232    This should be OK for single-module files - but it is not likely to work
   2233    for multi-module shared libraries.
   2234 
   2235    (a) If the application has not filled in the relevant mach-o fields, make
   2236        an estimate.
   2237 
   2238    (b) Order them, like this:
   2239 	(  i) local.
   2240 		(unsorted)
   2241 	( ii) external defined
   2242 		(by name)
   2243 	(iii) external undefined/common
   2244 		(by name)
   2245 	( iv) common
   2246 		(by name)
   2247 */
   2248 
   2249 static bfd_boolean
   2250 bfd_mach_o_mangle_symbols (bfd *abfd)
   2251 {
   2252   unsigned long i;
   2253   asymbol **symbols = bfd_get_outsymbols (abfd);
   2254 
   2255   if (symbols == NULL || bfd_get_symcount (abfd) == 0)
   2256     return TRUE;
   2257 
   2258   for (i = 0; i < bfd_get_symcount (abfd); i++)
   2259     {
   2260       bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
   2261 
   2262       /* We use this value, which is out-of-range as a symbol index, to signal
   2263 	 that the mach-o-specific data are not filled in and need to be created
   2264 	 from the bfd values.  It is much preferable for the application to do
   2265 	 this, since more meaningful diagnostics can be made that way.  */
   2266 
   2267       if (s->symbol.udata.i == SYM_MACHO_FIELDS_UNSET)
   2268         {
   2269           /* No symbol information has been set - therefore determine
   2270              it from the bfd symbol flags/info.  */
   2271           if (s->symbol.section == bfd_abs_section_ptr)
   2272             s->n_type = BFD_MACH_O_N_ABS;
   2273           else if (s->symbol.section == bfd_und_section_ptr)
   2274             {
   2275               s->n_type = BFD_MACH_O_N_UNDF;
   2276               if (s->symbol.flags & BSF_WEAK)
   2277                 s->n_desc |= BFD_MACH_O_N_WEAK_REF;
   2278               /* mach-o automatically makes undefined symbols extern.  */
   2279 	      s->n_type |= BFD_MACH_O_N_EXT;
   2280 	      s->symbol.flags |= BSF_GLOBAL;
   2281             }
   2282           else if (s->symbol.section == bfd_com_section_ptr)
   2283 	    {
   2284               s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
   2285               s->symbol.flags |= BSF_GLOBAL;
   2286             }
   2287           else
   2288             s->n_type = BFD_MACH_O_N_SECT;
   2289 
   2290           if (s->symbol.flags & BSF_GLOBAL)
   2291             s->n_type |= BFD_MACH_O_N_EXT;
   2292         }
   2293 
   2294       /* Put the section index in, where required.  */
   2295       if ((s->symbol.section != bfd_abs_section_ptr
   2296           && s->symbol.section != bfd_und_section_ptr
   2297           && s->symbol.section != bfd_com_section_ptr)
   2298           || ((s->n_type & BFD_MACH_O_N_STAB) != 0
   2299                && s->symbol.name == NULL))
   2300 	s->n_sect = s->symbol.section->output_section->target_index;
   2301 
   2302       /* Number to preserve order for local and debug syms.  */
   2303       s->symbol.udata.i = i;
   2304     }
   2305 
   2306   /* Sort the symbols.  */
   2307   qsort ((void *) symbols, (size_t) bfd_get_symcount (abfd),
   2308 	 sizeof (asymbol *), bfd_mach_o_cf_symbols);
   2309 
   2310   for (i = 0; i < bfd_get_symcount (abfd); ++i)
   2311     {
   2312       bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
   2313       s->symbol.udata.i = i;  /* renumber.  */
   2314     }
   2315 
   2316   return TRUE;
   2317 }
   2318 
   2319 /* We build a flat table of sections, which can be re-ordered if necessary.
   2320    Fill in the section number and other mach-o-specific data.  */
   2321 
   2322 static bfd_boolean
   2323 bfd_mach_o_mangle_sections (bfd *abfd, bfd_mach_o_data_struct *mdata)
   2324 {
   2325   asection *sec;
   2326   unsigned target_index;
   2327   unsigned nsect;
   2328 
   2329   nsect = bfd_count_sections (abfd);
   2330 
   2331   /* Don't do it if it's already set - assume the application knows what it's
   2332      doing.  */
   2333   if (mdata->nsects == nsect
   2334       && (mdata->nsects == 0 || mdata->sections != NULL))
   2335     return TRUE;
   2336 
   2337   mdata->nsects = nsect;
   2338   mdata->sections = bfd_alloc (abfd,
   2339 			       mdata->nsects * sizeof (bfd_mach_o_section *));
   2340   if (mdata->sections == NULL)
   2341     return FALSE;
   2342 
   2343   /* We need to check that this can be done...  */
   2344   if (nsect > 255)
   2345     (*_bfd_error_handler) (_("mach-o: there are too many sections (%d)"
   2346 			     " maximum is 255,\n"), nsect);
   2347 
   2348   /* Create Mach-O sections.
   2349      Section type, attribute and align should have been set when the
   2350      section was created - either read in or specified.  */
   2351   target_index = 0;
   2352   for (sec = abfd->sections; sec; sec = sec->next)
   2353     {
   2354       unsigned bfd_align = bfd_get_section_alignment (abfd, sec);
   2355       bfd_mach_o_section *msect = bfd_mach_o_get_mach_o_section (sec);
   2356 
   2357       mdata->sections[target_index] = msect;
   2358 
   2359       msect->addr = bfd_get_section_vma (abfd, sec);
   2360       msect->size = bfd_get_section_size (sec);
   2361 
   2362       /* Use the largest alignment set, in case it was bumped after the
   2363 	 section was created.  */
   2364       msect->align = msect->align > bfd_align ? msect->align : bfd_align;
   2365 
   2366       msect->offset = 0;
   2367       sec->target_index = ++target_index;
   2368     }
   2369 
   2370   return TRUE;
   2371 }
   2372 
   2373 bfd_boolean
   2374 bfd_mach_o_write_contents (bfd *abfd)
   2375 {
   2376   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   2377   bfd_mach_o_load_command *cmd;
   2378   bfd_mach_o_symtab_command *symtab = NULL;
   2379   bfd_mach_o_dysymtab_command *dysymtab = NULL;
   2380   bfd_mach_o_segment_command *linkedit = NULL;
   2381 
   2382   /* Make the commands, if not already present.  */
   2383   if (!abfd->output_has_begun && !bfd_mach_o_build_commands (abfd))
   2384     return FALSE;
   2385   abfd->output_has_begun = TRUE;
   2386 
   2387   /* Write the header.  */
   2388   if (!bfd_mach_o_write_header (abfd, &mdata->header))
   2389     return FALSE;
   2390 
   2391   /* First pass: allocate the linkedit segment.  */
   2392   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
   2393     switch (cmd->type)
   2394       {
   2395       case BFD_MACH_O_LC_SEGMENT_64:
   2396       case BFD_MACH_O_LC_SEGMENT:
   2397 	if (strcmp (cmd->command.segment.segname, "__LINKEDIT") == 0)
   2398 	  linkedit = &cmd->command.segment;
   2399 	break;
   2400       case BFD_MACH_O_LC_SYMTAB:
   2401 	symtab = &cmd->command.symtab;
   2402 	break;
   2403       case BFD_MACH_O_LC_DYSYMTAB:
   2404 	dysymtab = &cmd->command.dysymtab;
   2405 	break;
   2406       case BFD_MACH_O_LC_DYLD_INFO:
   2407 	{
   2408 	  bfd_mach_o_dyld_info_command *di = &cmd->command.dyld_info;
   2409 
   2410 	  if (di->rebase_size != 0)
   2411 	    {
   2412 	      di->rebase_off = mdata->filelen;
   2413 	      mdata->filelen += di->rebase_size;
   2414 	    }
   2415 	  if (di->bind_size != 0)
   2416 	    {
   2417 	      di->bind_off = mdata->filelen;
   2418 	      mdata->filelen += di->bind_size;
   2419 	    }
   2420 	  if (di->weak_bind_size != 0)
   2421 	    {
   2422 	      di->weak_bind_off = mdata->filelen;
   2423 	      mdata->filelen += di->weak_bind_size;
   2424 	    }
   2425 	  if (di->lazy_bind_size != 0)
   2426 	    {
   2427 	      di->lazy_bind_off = mdata->filelen;
   2428 	      mdata->filelen += di->lazy_bind_size;
   2429 	    }
   2430 	  if (di->export_size != 0)
   2431 	    {
   2432 	      di->export_off = mdata->filelen;
   2433 	      mdata->filelen += di->export_size;
   2434 	    }
   2435 	}
   2436 	break;
   2437       case BFD_MACH_O_LC_LOAD_DYLIB:
   2438       case BFD_MACH_O_LC_LOAD_DYLINKER:
   2439       case BFD_MACH_O_LC_MAIN:
   2440 	/* Nothing to do.  */
   2441 	break;
   2442       default:
   2443 	(*_bfd_error_handler)
   2444 	  (_("unable to allocate data for load command 0x%lx"),
   2445 	   (unsigned long) cmd->type);
   2446 	break;
   2447       }
   2448 
   2449   /* Specially handle symtab and dysymtab.  */
   2450 
   2451   /* Pre-allocate the symbol table (but not the string table).  The reason
   2452      is that the dysymtab is after the symbol table but before the string
   2453      table (required by the native strip tool).  */
   2454   if (symtab != NULL)
   2455     {
   2456       unsigned int symlen;
   2457       unsigned int wide = bfd_mach_o_wide_p (abfd);
   2458 
   2459       symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
   2460 
   2461       /* Align for symbols.  */
   2462       mdata->filelen = FILE_ALIGN (mdata->filelen, wide ? 3 : 2);
   2463       symtab->symoff = mdata->filelen;
   2464 
   2465       symtab->nsyms = bfd_get_symcount (abfd);
   2466       mdata->filelen += symtab->nsyms * symlen;
   2467     }
   2468 
   2469   /* Build the dysymtab.  */
   2470   if (dysymtab != NULL)
   2471     if (!bfd_mach_o_build_dysymtab (abfd, dysymtab))
   2472       return FALSE;
   2473 
   2474   /* Write symtab and strtab.  */
   2475   if (symtab != NULL)
   2476     if (!bfd_mach_o_write_symtab_content (abfd, symtab))
   2477       return FALSE;
   2478 
   2479   /* Adjust linkedit size.  */
   2480   if (linkedit != NULL)
   2481     {
   2482       /* bfd_vma pagemask = bfd_mach_o_get_backend_data (abfd)->page_size - 1; */
   2483 
   2484       linkedit->vmsize = mdata->filelen - linkedit->fileoff;
   2485       /* linkedit->vmsize = (linkedit->vmsize + pagemask) & ~pagemask; */
   2486       linkedit->filesize = mdata->filelen - linkedit->fileoff;
   2487 
   2488       linkedit->initprot = BFD_MACH_O_PROT_READ;
   2489       linkedit->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
   2490 	| BFD_MACH_O_PROT_EXECUTE;
   2491     }
   2492 
   2493   /* Second pass: write commands.  */
   2494   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
   2495     {
   2496       struct mach_o_load_command_external raw;
   2497       unsigned long typeflag;
   2498 
   2499       typeflag = cmd->type | (cmd->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
   2500 
   2501       bfd_h_put_32 (abfd, typeflag, raw.cmd);
   2502       bfd_h_put_32 (abfd, cmd->len, raw.cmdsize);
   2503 
   2504       if (bfd_seek (abfd, cmd->offset, SEEK_SET) != 0
   2505           || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8)
   2506 	return FALSE;
   2507 
   2508       switch (cmd->type)
   2509 	{
   2510 	case BFD_MACH_O_LC_SEGMENT:
   2511 	  if (!bfd_mach_o_write_segment_32 (abfd, cmd))
   2512 	    return FALSE;
   2513 	  break;
   2514 	case BFD_MACH_O_LC_SEGMENT_64:
   2515 	  if (!bfd_mach_o_write_segment_64 (abfd, cmd))
   2516 	    return FALSE;
   2517 	  break;
   2518 	case BFD_MACH_O_LC_SYMTAB:
   2519 	  if (!bfd_mach_o_write_symtab (abfd, cmd))
   2520 	    return FALSE;
   2521 	  break;
   2522 	case BFD_MACH_O_LC_DYSYMTAB:
   2523 	  if (!bfd_mach_o_write_dysymtab (abfd, cmd))
   2524 	    return FALSE;
   2525 	  break;
   2526 	case BFD_MACH_O_LC_THREAD:
   2527 	case BFD_MACH_O_LC_UNIXTHREAD:
   2528 	  if (!bfd_mach_o_write_thread (abfd, cmd))
   2529 	    return FALSE;
   2530 	  break;
   2531 	case BFD_MACH_O_LC_LOAD_DYLIB:
   2532 	  if (!bfd_mach_o_write_dylib (abfd, cmd))
   2533 	    return FALSE;
   2534 	  break;
   2535 	case BFD_MACH_O_LC_LOAD_DYLINKER:
   2536 	  if (!bfd_mach_o_write_dylinker (abfd, cmd))
   2537 	    return FALSE;
   2538 	  break;
   2539 	case BFD_MACH_O_LC_MAIN:
   2540 	  if (!bfd_mach_o_write_main (abfd, cmd))
   2541 	    return FALSE;
   2542 	  break;
   2543 	case BFD_MACH_O_LC_DYLD_INFO:
   2544 	  if (!bfd_mach_o_write_dyld_info (abfd, cmd))
   2545 	    return FALSE;
   2546 	  break;
   2547 	default:
   2548 	  (*_bfd_error_handler)
   2549 	    (_("unable to write unknown load command 0x%lx"),
   2550 	     (unsigned long) cmd->type);
   2551 	  return FALSE;
   2552 	}
   2553     }
   2554 
   2555   return TRUE;
   2556 }
   2557 
   2558 static void
   2559 bfd_mach_o_append_section_to_segment (bfd_mach_o_segment_command *seg,
   2560                                       bfd_mach_o_section *s)
   2561 {
   2562   if (seg->sect_head == NULL)
   2563     seg->sect_head = s;
   2564   else
   2565     seg->sect_tail->next = s;
   2566   seg->sect_tail = s;
   2567 }
   2568 
   2569 /* Create section Mach-O flags from BFD flags.  */
   2570 
   2571 static void
   2572 bfd_mach_o_set_section_flags_from_bfd (bfd *abfd ATTRIBUTE_UNUSED,
   2573 				       asection *sec)
   2574 {
   2575   flagword bfd_flags;
   2576   bfd_mach_o_section *s = bfd_mach_o_get_mach_o_section (sec);
   2577 
   2578   /* Create default flags.  */
   2579   bfd_flags = bfd_get_section_flags (abfd, sec);
   2580   if ((bfd_flags & SEC_CODE) == SEC_CODE)
   2581     s->flags = BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS
   2582       | BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS
   2583       | BFD_MACH_O_S_REGULAR;
   2584   else if ((bfd_flags & (SEC_ALLOC | SEC_LOAD)) == SEC_ALLOC)
   2585     s->flags = BFD_MACH_O_S_ZEROFILL;
   2586   else if (bfd_flags & SEC_DEBUGGING)
   2587     s->flags = BFD_MACH_O_S_REGULAR |  BFD_MACH_O_S_ATTR_DEBUG;
   2588   else
   2589     s->flags = BFD_MACH_O_S_REGULAR;
   2590 }
   2591 
   2592 static bfd_boolean
   2593 bfd_mach_o_build_obj_seg_command (bfd *abfd, bfd_mach_o_segment_command *seg)
   2594 {
   2595   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   2596   unsigned int i, j;
   2597 
   2598   seg->vmaddr = 0;
   2599   seg->fileoff = mdata->filelen;
   2600   seg->initprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
   2601     | BFD_MACH_O_PROT_EXECUTE;
   2602   seg->maxprot = seg->initprot;
   2603 
   2604   /*  Append sections to the segment.
   2605 
   2606       This is a little tedious, we have to honor the need to account zerofill
   2607       sections after all the rest.  This forces us to do the calculation of
   2608       total vmsize in three passes so that any alignment increments are
   2609       properly accounted.  */
   2610   for (i = 0; i < mdata->nsects; ++i)
   2611     {
   2612       bfd_mach_o_section *s = mdata->sections[i];
   2613       asection *sec = s->bfdsection;
   2614 
   2615       /* Although we account for zerofill section sizes in vm order, they are
   2616 	 placed in the file in source sequence.  */
   2617       bfd_mach_o_append_section_to_segment (seg, s);
   2618       s->offset = 0;
   2619 
   2620       /* Zerofill sections have zero file size & offset, the only content
   2621 	 written to the file is the symbols.  */
   2622       if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) == BFD_MACH_O_S_ZEROFILL
   2623           || ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK)
   2624 	      == BFD_MACH_O_S_GB_ZEROFILL))
   2625         continue;
   2626 
   2627       /* The Darwin system tools (in MH_OBJECT files, at least) always account
   2628 	 sections, even those with zero size.  */
   2629       if (s->size > 0)
   2630 	{
   2631 	  seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
   2632 	  seg->vmsize += s->size;
   2633 
   2634 	  /* MH_OBJECT files have unaligned content.  */
   2635 	  if (1)
   2636 	    {
   2637 	      seg->filesize = FILE_ALIGN (seg->filesize, s->align);
   2638               mdata->filelen = FILE_ALIGN (mdata->filelen, s->align);
   2639             }
   2640 	  seg->filesize += s->size;
   2641 
   2642 	  /* The system tools write even zero-sized sections with an offset
   2643 	     field set to the current file position.  */
   2644           s->offset = mdata->filelen;
   2645 	}
   2646 
   2647       sec->filepos = s->offset;
   2648       mdata->filelen += s->size;
   2649     }
   2650 
   2651   /* Now pass through again, for zerofill, only now we just update the
   2652      vmsize, and then for zerofill_GB.  */
   2653   for (j = 0; j < 2; j++)
   2654     {
   2655       unsigned int stype;
   2656 
   2657       if (j == 0)
   2658 	stype = BFD_MACH_O_S_ZEROFILL;
   2659       else
   2660 	stype = BFD_MACH_O_S_GB_ZEROFILL;
   2661 
   2662       for (i = 0; i < mdata->nsects; ++i)
   2663 	{
   2664 	  bfd_mach_o_section *s = mdata->sections[i];
   2665 
   2666 	  if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) != stype)
   2667 	    continue;
   2668 
   2669 	  if (s->size > 0)
   2670 	    {
   2671 	      seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
   2672 	      seg->vmsize += s->size;
   2673 	    }
   2674 	}
   2675     }
   2676 
   2677   /* Allocate space for the relocations.  */
   2678   mdata->filelen = FILE_ALIGN (mdata->filelen, 2);
   2679 
   2680   for (i = 0; i < mdata->nsects; ++i)
   2681     {
   2682       bfd_mach_o_section *ms = mdata->sections[i];
   2683       asection *sec = ms->bfdsection;
   2684 
   2685       ms->nreloc = sec->reloc_count;
   2686       if (ms->nreloc == 0)
   2687         {
   2688 	  /* Clear nreloc and reloff if there is no relocs.  */
   2689 	  ms->reloff = 0;
   2690 	  continue;
   2691         }
   2692       sec->rel_filepos = mdata->filelen;
   2693       ms->reloff = sec->rel_filepos;
   2694       mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
   2695     }
   2696 
   2697   return TRUE;
   2698 }
   2699 
   2700 static bfd_boolean
   2701 bfd_mach_o_build_exec_seg_command (bfd *abfd, bfd_mach_o_segment_command *seg)
   2702 {
   2703   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   2704   unsigned int i;
   2705   bfd_vma pagemask = bfd_mach_o_get_backend_data (abfd)->page_size - 1;
   2706   bfd_vma vma;
   2707   bfd_mach_o_section *s;
   2708 
   2709   seg->vmsize = 0;
   2710 
   2711   seg->fileoff = mdata->filelen;
   2712   seg->maxprot = 0;
   2713   seg->initprot = 0;
   2714   seg->flags = 0;
   2715 
   2716   /*  Append sections to the segment.  We assume they are properly ordered
   2717       by vma (but we check that).  */
   2718   vma = 0;
   2719   for (i = 0; i < mdata->nsects; ++i)
   2720     {
   2721       s = mdata->sections[i];
   2722 
   2723       /* Consider only sections for this segment.  */
   2724       if (strcmp (seg->segname, s->segname) != 0)
   2725 	continue;
   2726 
   2727       bfd_mach_o_append_section_to_segment (seg, s);
   2728 
   2729       BFD_ASSERT (s->addr >= vma);
   2730       vma = s->addr + s->size;
   2731     }
   2732 
   2733   /* Set segment file offset: make it page aligned.  */
   2734   vma = seg->sect_head->addr;
   2735   seg->vmaddr = vma & ~pagemask;
   2736   if ((mdata->filelen & pagemask) > (vma & pagemask))
   2737     mdata->filelen += pagemask + 1;
   2738   seg->fileoff = mdata->filelen & ~pagemask;
   2739   mdata->filelen = seg->fileoff + (vma & pagemask);
   2740 
   2741   /* Set section file offset.  */
   2742   for (s = seg->sect_head; s != NULL; s = s->next)
   2743     {
   2744       asection *sec = s->bfdsection;
   2745       flagword flags = bfd_get_section_flags (abfd, sec);
   2746 
   2747       /* Adjust segment size.  */
   2748       seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
   2749       seg->vmsize += s->size;
   2750 
   2751       /* File offset and length.  */
   2752       seg->filesize = FILE_ALIGN (seg->filesize, s->align);
   2753 
   2754       if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) != BFD_MACH_O_S_ZEROFILL
   2755           && ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK)
   2756 	      != BFD_MACH_O_S_GB_ZEROFILL))
   2757 	{
   2758 	  mdata->filelen = FILE_ALIGN (mdata->filelen, s->align);
   2759 
   2760 	  s->offset = mdata->filelen;
   2761 	  s->bfdsection->filepos = s->offset;
   2762 
   2763 	  seg->filesize += s->size;
   2764 	  mdata->filelen += s->size;
   2765 	}
   2766       else
   2767 	{
   2768 	  s->offset = 0;
   2769 	  s->bfdsection->filepos = 0;
   2770 	}
   2771 
   2772       /* Set protection.  */
   2773       if (flags & SEC_LOAD)
   2774 	{
   2775 	  if (flags & SEC_CODE)
   2776 	    seg->initprot |= BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_EXECUTE;
   2777 	  if ((flags & (SEC_DATA | SEC_READONLY)) == SEC_DATA)
   2778 	    seg->initprot |= BFD_MACH_O_PROT_WRITE | BFD_MACH_O_PROT_READ;
   2779 	}
   2780 
   2781       /* Relocs shouldn't appear in non-object files.  */
   2782       if (s->bfdsection->reloc_count != 0)
   2783 	return FALSE;
   2784     }
   2785 
   2786   /* Set maxprot.  */
   2787   if (seg->initprot != 0)
   2788     seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
   2789 		 | BFD_MACH_O_PROT_EXECUTE;
   2790   else
   2791     seg->maxprot = 0;
   2792 
   2793   /* Round segment size (and file size).  */
   2794   seg->vmsize = (seg->vmsize + pagemask) & ~pagemask;
   2795   seg->filesize = (seg->filesize + pagemask) & ~pagemask;
   2796   mdata->filelen = (mdata->filelen + pagemask) & ~pagemask;
   2797 
   2798   return TRUE;
   2799 }
   2800 
   2801 /* Layout the commands: set commands size and offset, set ncmds and sizeofcmds
   2802    fields in header.  */
   2803 
   2804 static void
   2805 bfd_mach_o_layout_commands (bfd_mach_o_data_struct *mdata)
   2806 {
   2807   unsigned wide = mach_o_wide_p (&mdata->header);
   2808   unsigned int hdrlen;
   2809   ufile_ptr offset;
   2810   bfd_mach_o_load_command *cmd;
   2811   unsigned int align;
   2812 
   2813   hdrlen = wide ? BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
   2814   align = wide ? 8 - 1 : 4 - 1;
   2815   offset = hdrlen;
   2816   mdata->header.ncmds = 0;
   2817 
   2818   for (cmd = mdata->first_command; cmd; cmd = cmd->next)
   2819     {
   2820       mdata->header.ncmds++;
   2821       cmd->offset = offset;
   2822 
   2823       switch (cmd->type)
   2824 	{
   2825 	case BFD_MACH_O_LC_SEGMENT_64:
   2826 	  cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE
   2827 	    + BFD_MACH_O_SECTION_64_SIZE * cmd->command.segment.nsects;
   2828 	  break;
   2829 	case BFD_MACH_O_LC_SEGMENT:
   2830 	  cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE
   2831 	    + BFD_MACH_O_SECTION_SIZE * cmd->command.segment.nsects;
   2832 	  break;
   2833 	case BFD_MACH_O_LC_SYMTAB:
   2834 	  cmd->len = sizeof (struct mach_o_symtab_command_external)
   2835 	    + BFD_MACH_O_LC_SIZE;
   2836 	  break;
   2837 	case BFD_MACH_O_LC_DYSYMTAB:
   2838 	  cmd->len = sizeof (struct mach_o_dysymtab_command_external)
   2839 		 + BFD_MACH_O_LC_SIZE;
   2840 	  break;
   2841 	case BFD_MACH_O_LC_LOAD_DYLIB:
   2842 	  cmd->len = sizeof (struct mach_o_dylib_command_external)
   2843 		 + BFD_MACH_O_LC_SIZE;
   2844 	  cmd->command.dylib.name_offset = cmd->len;
   2845 	  cmd->len += strlen (cmd->command.dylib.name_str);
   2846 	  cmd->len = (cmd->len + align) & ~align;
   2847 	  break;
   2848 	case BFD_MACH_O_LC_LOAD_DYLINKER:
   2849 	  cmd->len = sizeof (struct mach_o_str_command_external)
   2850 		 + BFD_MACH_O_LC_SIZE;
   2851 	  cmd->command.dylinker.name_offset = cmd->len;
   2852 	  cmd->len += strlen (cmd->command.dylinker.name_str);
   2853 	  cmd->len = (cmd->len + align) & ~align;
   2854 	  break;
   2855 	case BFD_MACH_O_LC_MAIN:
   2856 	  cmd->len = sizeof (struct mach_o_entry_point_command_external)
   2857 		 + BFD_MACH_O_LC_SIZE;
   2858 	  break;
   2859 	case BFD_MACH_O_LC_DYLD_INFO:
   2860 	  cmd->len = sizeof (struct mach_o_dyld_info_command_external)
   2861 		 + BFD_MACH_O_LC_SIZE;
   2862 	  break;
   2863 	default:
   2864 	  (*_bfd_error_handler)
   2865 	    (_("unable to layout unknown load command 0x%lx"),
   2866 	     (unsigned long) cmd->type);
   2867 	  break;
   2868 	}
   2869 
   2870       BFD_ASSERT (cmd->len % (align + 1) == 0);
   2871       offset += cmd->len;
   2872     }
   2873   mdata->header.sizeofcmds = offset - hdrlen;
   2874   mdata->filelen = offset;
   2875 }
   2876 
   2877 /* Subroutine of bfd_mach_o_build_commands: set type, name and nsects of a
   2878    segment.  */
   2879 
   2880 static void
   2881 bfd_mach_o_init_segment (bfd_mach_o_data_struct *mdata,
   2882 			 bfd_mach_o_load_command *cmd,
   2883 			 const char *segname, unsigned int nbr_sect)
   2884 {
   2885   bfd_mach_o_segment_command *seg = &cmd->command.segment;
   2886   unsigned wide = mach_o_wide_p (&mdata->header);
   2887 
   2888   /* Init segment command.  */
   2889   cmd->type = wide ? BFD_MACH_O_LC_SEGMENT_64 : BFD_MACH_O_LC_SEGMENT;
   2890   cmd->type_required = FALSE;
   2891 
   2892   strcpy (seg->segname, segname);
   2893   seg->nsects = nbr_sect;
   2894 
   2895   seg->vmaddr = 0;
   2896   seg->vmsize = 0;
   2897 
   2898   seg->fileoff = 0;
   2899   seg->filesize = 0;
   2900   seg->maxprot = 0;
   2901   seg->initprot = 0;
   2902   seg->flags = 0;
   2903   seg->sect_head = NULL;
   2904   seg->sect_tail = NULL;
   2905 }
   2906 
   2907 /* Build Mach-O load commands (currently assuming an MH_OBJECT file).
   2908    TODO: Other file formats, rebuilding symtab/dysymtab commands for strip
   2909    and copy functionality.  */
   2910 
   2911 bfd_boolean
   2912 bfd_mach_o_build_commands (bfd *abfd)
   2913 {
   2914   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   2915   unsigned wide = mach_o_wide_p (&mdata->header);
   2916   unsigned int nbr_segcmd = 0;
   2917   bfd_mach_o_load_command *commands;
   2918   unsigned int nbr_commands;
   2919   int symtab_idx = -1;
   2920   int dysymtab_idx = -1;
   2921   int main_idx = -1;
   2922   unsigned int i;
   2923 
   2924   /* Return now if already built.  */
   2925   if (mdata->header.ncmds != 0)
   2926     return TRUE;
   2927 
   2928   /* Fill in the file type, if not already set.  */
   2929   if (mdata->header.filetype == 0)
   2930     {
   2931       if (abfd->flags & EXEC_P)
   2932         mdata->header.filetype = BFD_MACH_O_MH_EXECUTE;
   2933       else if (abfd->flags & DYNAMIC)
   2934         mdata->header.filetype = BFD_MACH_O_MH_DYLIB;
   2935       else
   2936         mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
   2937     }
   2938 
   2939   /* If hasn't already been done, flatten sections list, and sort
   2940      if/when required.  Must be done before the symbol table is adjusted,
   2941      since that depends on properly numbered sections.  */
   2942   if (mdata->nsects == 0 || mdata->sections == NULL)
   2943     if (! bfd_mach_o_mangle_sections (abfd, mdata))
   2944       return FALSE;
   2945 
   2946   /* Order the symbol table, fill-in/check mach-o specific fields and
   2947      partition out any indirect symbols.  */
   2948   if (!bfd_mach_o_mangle_symbols (abfd))
   2949     return FALSE;
   2950 
   2951   /* Segment commands.  */
   2952   if (mdata->header.filetype == BFD_MACH_O_MH_OBJECT)
   2953     {
   2954       /* Only one segment for all the sections.  But the segment is
   2955 	 optional if there is no sections.  */
   2956       nbr_segcmd = (mdata->nsects > 0) ? 1 : 0;
   2957     }
   2958   else
   2959     {
   2960       bfd_mach_o_section *prev_sect = NULL;
   2961 
   2962       /* One pagezero segment and one linkedit segment.  */
   2963       nbr_segcmd = 2;
   2964 
   2965       /* Create one segment for associated segment name in sections.
   2966 	 Assume that sections with the same segment name are consecutive.  */
   2967       for (i = 0; i < mdata->nsects; i++)
   2968 	{
   2969 	  bfd_mach_o_section *this_sect = mdata->sections[i];
   2970 
   2971 	  if (prev_sect == NULL
   2972 	      || strcmp (prev_sect->segname, this_sect->segname) != 0)
   2973 	    {
   2974 	      nbr_segcmd++;
   2975 	      prev_sect = this_sect;
   2976 	    }
   2977 	}
   2978     }
   2979 
   2980   nbr_commands = nbr_segcmd;
   2981 
   2982   /* One command for the symbol table (only if there are symbols.  */
   2983   if (bfd_get_symcount (abfd) > 0)
   2984     symtab_idx = nbr_commands++;
   2985 
   2986   /* FIXME:
   2987      This is a rather crude test for whether we should build a dysymtab.  */
   2988   if (bfd_mach_o_should_emit_dysymtab ()
   2989       && bfd_get_symcount (abfd))
   2990     {
   2991       /* If there should be a case where a dysymtab could be emitted without
   2992 	 a symtab (seems improbable), this would need amending.  */
   2993       dysymtab_idx = nbr_commands++;
   2994     }
   2995 
   2996   /* Add an entry point command.  */
   2997   if (mdata->header.filetype == BFD_MACH_O_MH_EXECUTE
   2998       && bfd_get_start_address (abfd) != 0)
   2999     main_idx = nbr_commands++;
   3000 
   3001   /* Well, we must have a header, at least.  */
   3002   mdata->filelen = wide ? BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
   3003 
   3004   /* A bit unusual, but no content is valid;
   3005      as -n empty.s -o empty.o  */
   3006   if (nbr_commands == 0)
   3007     {
   3008       /* Layout commands (well none...) and set headers command fields.  */
   3009       bfd_mach_o_layout_commands (mdata);
   3010       return TRUE;
   3011     }
   3012 
   3013   /* Create commands for segments (and symtabs), prepend them.  */
   3014   commands = bfd_zalloc (abfd, nbr_commands * sizeof (bfd_mach_o_load_command));
   3015   if (commands == NULL)
   3016     return FALSE;
   3017   for (i = 0; i < nbr_commands - 1; i++)
   3018     commands[i].next = &commands[i + 1];
   3019   commands[nbr_commands - 1].next = mdata->first_command;
   3020   if (mdata->first_command == NULL)
   3021     mdata->last_command = &commands[nbr_commands - 1];
   3022   mdata->first_command = &commands[0];
   3023 
   3024   if (mdata->header.filetype == BFD_MACH_O_MH_OBJECT && nbr_segcmd != 0)
   3025     {
   3026       /* For object file, there is only one segment.  */
   3027       bfd_mach_o_init_segment (mdata, &commands[0], "", mdata->nsects);
   3028     }
   3029   else if (nbr_segcmd != 0)
   3030     {
   3031       bfd_mach_o_load_command *cmd;
   3032 
   3033       BFD_ASSERT (nbr_segcmd >= 2);
   3034 
   3035       /* The pagezero.  */
   3036       cmd = &commands[0];
   3037       bfd_mach_o_init_segment (mdata, cmd, "__PAGEZERO", 0);
   3038 
   3039       /* Segments from sections.  */
   3040       cmd++;
   3041       for (i = 0; i < mdata->nsects;)
   3042 	{
   3043 	  const char *segname = mdata->sections[i]->segname;
   3044 	  unsigned int nbr_sect = 1;
   3045 
   3046 	  /* Count number of sections for this segment.  */
   3047 	  for (i++; i < mdata->nsects; i++)
   3048 	    if (strcmp (mdata->sections[i]->segname, segname) == 0)
   3049 	      nbr_sect++;
   3050 	    else
   3051 	      break;
   3052 
   3053 	  bfd_mach_o_init_segment (mdata, cmd, segname, nbr_sect);
   3054 	  cmd++;
   3055 	}
   3056 
   3057       /* The linkedit.  */
   3058       bfd_mach_o_init_segment (mdata, cmd, "__LINKEDIT", 0);
   3059     }
   3060 
   3061   if (symtab_idx >= 0)
   3062     {
   3063       /* Init symtab command.  */
   3064       bfd_mach_o_load_command *cmd = &commands[symtab_idx];
   3065 
   3066       cmd->type = BFD_MACH_O_LC_SYMTAB;
   3067       cmd->type_required = FALSE;
   3068     }
   3069 
   3070   /* If required, setup symtab command, see comment above about the quality
   3071      of this test.  */
   3072   if (dysymtab_idx >= 0)
   3073     {
   3074       bfd_mach_o_load_command *cmd = &commands[dysymtab_idx];
   3075 
   3076       cmd->type = BFD_MACH_O_LC_DYSYMTAB;
   3077       cmd->type_required = FALSE;
   3078     }
   3079 
   3080   /* Create the main command.  */
   3081   if (main_idx >= 0)
   3082     {
   3083       bfd_mach_o_load_command *cmd = &commands[main_idx];
   3084 
   3085       cmd->type = BFD_MACH_O_LC_MAIN;
   3086       cmd->type_required = TRUE;
   3087 
   3088       cmd->command.main.entryoff = 0;
   3089       cmd->command.main.stacksize = 0;
   3090     }
   3091 
   3092   /* Layout commands.  */
   3093   bfd_mach_o_layout_commands (mdata);
   3094 
   3095   /* So, now we have sized the commands and the filelen set to that.
   3096      Now we can build the segment command and set the section file offsets.  */
   3097   if (mdata->header.filetype == BFD_MACH_O_MH_OBJECT)
   3098     {
   3099       for (i = 0; i < nbr_segcmd; i++)
   3100 	if (!bfd_mach_o_build_obj_seg_command
   3101 	    (abfd, &commands[i].command.segment))
   3102 	  return FALSE;
   3103     }
   3104   else
   3105     {
   3106       bfd_vma maxvma = 0;
   3107 
   3108       /* Skip pagezero and linkedit segments.  */
   3109       for (i = 1; i < nbr_segcmd - 1; i++)
   3110 	{
   3111 	  bfd_mach_o_segment_command *seg = &commands[i].command.segment;
   3112 
   3113 	  if (!bfd_mach_o_build_exec_seg_command (abfd, seg))
   3114 	    return FALSE;
   3115 
   3116 	  if (seg->vmaddr + seg->vmsize > maxvma)
   3117 	    maxvma = seg->vmaddr + seg->vmsize;
   3118 	}
   3119 
   3120       /* Set the size of __PAGEZERO.  */
   3121       commands[0].command.segment.vmsize =
   3122 	commands[1].command.segment.vmaddr;
   3123 
   3124       /* Set the vma and fileoff of __LINKEDIT.  */
   3125       commands[nbr_segcmd - 1].command.segment.vmaddr = maxvma;
   3126       commands[nbr_segcmd - 1].command.segment.fileoff = mdata->filelen;
   3127 
   3128       /* Set entry point (once segments have been laid out).  */
   3129       if (main_idx >= 0)
   3130 	commands[main_idx].command.main.entryoff =
   3131 	  bfd_get_start_address (abfd) - commands[1].command.segment.vmaddr;
   3132     }
   3133 
   3134   return TRUE;
   3135 }
   3136 
   3137 /* Set the contents of a section.  */
   3138 
   3139 bfd_boolean
   3140 bfd_mach_o_set_section_contents (bfd *abfd,
   3141 				 asection *section,
   3142 				 const void * location,
   3143 				 file_ptr offset,
   3144 				 bfd_size_type count)
   3145 {
   3146   file_ptr pos;
   3147 
   3148   /* Trying to write the first section contents will trigger the creation of
   3149      the load commands if they are not already present.  */
   3150   if (!abfd->output_has_begun && !bfd_mach_o_build_commands (abfd))
   3151     return FALSE;
   3152 
   3153   if (count == 0)
   3154     return TRUE;
   3155 
   3156   pos = section->filepos + offset;
   3157   if (bfd_seek (abfd, pos, SEEK_SET) != 0
   3158       || bfd_bwrite (location, count, abfd) != count)
   3159     return FALSE;
   3160 
   3161   return TRUE;
   3162 }
   3163 
   3164 int
   3165 bfd_mach_o_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
   3166 			   struct bfd_link_info *info ATTRIBUTE_UNUSED)
   3167 {
   3168   return 0;
   3169 }
   3170 
   3171 /* Make an empty symbol.  This is required only because
   3172    bfd_make_section_anyway wants to create a symbol for the section.  */
   3173 
   3174 asymbol *
   3175 bfd_mach_o_make_empty_symbol (bfd *abfd)
   3176 {
   3177   asymbol *new_symbol;
   3178 
   3179   new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol));
   3180   if (new_symbol == NULL)
   3181     return new_symbol;
   3182   new_symbol->the_bfd = abfd;
   3183   new_symbol->udata.i = SYM_MACHO_FIELDS_UNSET;
   3184   return new_symbol;
   3185 }
   3186 
   3187 static bfd_boolean
   3188 bfd_mach_o_read_header (bfd *abfd, bfd_mach_o_header *header)
   3189 {
   3190   struct mach_o_header_external raw;
   3191   unsigned int size;
   3192   bfd_vma (*get32) (const void *) = NULL;
   3193 
   3194   /* Just read the magic number.  */
   3195   if (bfd_seek (abfd, 0, SEEK_SET) != 0
   3196       || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4)
   3197     return FALSE;
   3198 
   3199   if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
   3200     {
   3201       header->byteorder = BFD_ENDIAN_BIG;
   3202       header->magic = BFD_MACH_O_MH_MAGIC;
   3203       header->version = 1;
   3204       get32 = bfd_getb32;
   3205     }
   3206   else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
   3207     {
   3208       header->byteorder = BFD_ENDIAN_LITTLE;
   3209       header->magic = BFD_MACH_O_MH_MAGIC;
   3210       header->version = 1;
   3211       get32 = bfd_getl32;
   3212     }
   3213   else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
   3214     {
   3215       header->byteorder = BFD_ENDIAN_BIG;
   3216       header->magic = BFD_MACH_O_MH_MAGIC_64;
   3217       header->version = 2;
   3218       get32 = bfd_getb32;
   3219     }
   3220   else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
   3221     {
   3222       header->byteorder = BFD_ENDIAN_LITTLE;
   3223       header->magic = BFD_MACH_O_MH_MAGIC_64;
   3224       header->version = 2;
   3225       get32 = bfd_getl32;
   3226     }
   3227   else
   3228     {
   3229       header->byteorder = BFD_ENDIAN_UNKNOWN;
   3230       return FALSE;
   3231     }
   3232 
   3233   /* Once the size of the header is known, read the full header.  */
   3234   size = mach_o_wide_p (header) ?
   3235     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
   3236 
   3237   if (bfd_seek (abfd, 0, SEEK_SET) != 0
   3238       || bfd_bread (&raw, size, abfd) != size)
   3239     return FALSE;
   3240 
   3241   header->cputype = (*get32) (raw.cputype);
   3242   header->cpusubtype = (*get32) (raw.cpusubtype);
   3243   header->filetype = (*get32) (raw.filetype);
   3244   header->ncmds = (*get32) (raw.ncmds);
   3245   header->sizeofcmds = (*get32) (raw.sizeofcmds);
   3246   header->flags = (*get32) (raw.flags);
   3247 
   3248   if (mach_o_wide_p (header))
   3249     header->reserved = (*get32) (raw.reserved);
   3250   else
   3251     header->reserved = 0;
   3252 
   3253   return TRUE;
   3254 }
   3255 
   3256 bfd_boolean
   3257 bfd_mach_o_new_section_hook (bfd *abfd, asection *sec)
   3258 {
   3259   bfd_mach_o_section *s;
   3260   unsigned bfdalign = bfd_get_section_alignment (abfd, sec);
   3261 
   3262   s = bfd_mach_o_get_mach_o_section (sec);
   3263   if (s == NULL)
   3264     {
   3265       flagword bfd_flags;
   3266       static const mach_o_section_name_xlat * xlat;
   3267 
   3268       s = (bfd_mach_o_section *) bfd_zalloc (abfd, sizeof (*s));
   3269       if (s == NULL)
   3270 	return FALSE;
   3271       sec->used_by_bfd = s;
   3272       s->bfdsection = sec;
   3273 
   3274       /* Create the Darwin seg/sect name pair from the bfd name.
   3275 	 If this is a canonical name for which a specific paiting exists
   3276 	 there will also be defined flags, type, attribute and alignment
   3277 	 values.  */
   3278       xlat = bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, s);
   3279       if (xlat != NULL)
   3280 	{
   3281 	  s->flags = xlat->macho_sectype | xlat->macho_secattr;
   3282 	  s->align = xlat->sectalign > bfdalign ? xlat->sectalign
   3283 						: bfdalign;
   3284 	  (void) bfd_set_section_alignment (abfd, sec, s->align);
   3285 	  bfd_flags = bfd_get_section_flags (abfd, sec);
   3286 	  if (bfd_flags == SEC_NO_FLAGS)
   3287 	    bfd_set_section_flags (abfd, sec, xlat->bfd_flags);
   3288 	}
   3289       else
   3290 	/* Create default flags.  */
   3291 	bfd_mach_o_set_section_flags_from_bfd (abfd, sec);
   3292     }
   3293 
   3294   return _bfd_generic_new_section_hook (abfd, sec);
   3295 }
   3296 
   3297 static void
   3298 bfd_mach_o_init_section_from_mach_o (bfd *abfd, asection *sec,
   3299                                      unsigned long prot)
   3300 {
   3301   flagword flags;
   3302   bfd_mach_o_section *section;
   3303 
   3304   flags = bfd_get_section_flags (abfd, sec);
   3305   section = bfd_mach_o_get_mach_o_section (sec);
   3306 
   3307   /* TODO: see if we should use the xlat system for doing this by
   3308      preference and fall back to this for unknown sections.  */
   3309 
   3310   if (flags == SEC_NO_FLAGS)
   3311     {
   3312       /* Try to guess flags.  */
   3313       if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
   3314         flags = SEC_DEBUGGING;
   3315       else
   3316         {
   3317           flags = SEC_ALLOC;
   3318           if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
   3319               != BFD_MACH_O_S_ZEROFILL)
   3320             {
   3321               flags |= SEC_LOAD;
   3322               if (prot & BFD_MACH_O_PROT_EXECUTE)
   3323                 flags |= SEC_CODE;
   3324               if (prot & BFD_MACH_O_PROT_WRITE)
   3325                 flags |= SEC_DATA;
   3326               else if (prot & BFD_MACH_O_PROT_READ)
   3327                 flags |= SEC_READONLY;
   3328             }
   3329         }
   3330     }
   3331   else
   3332     {
   3333       if ((flags & SEC_DEBUGGING) == 0)
   3334         flags |= SEC_ALLOC;
   3335     }
   3336 
   3337   if (section->offset != 0)
   3338     flags |= SEC_HAS_CONTENTS;
   3339   if (section->nreloc != 0)
   3340     flags |= SEC_RELOC;
   3341 
   3342   bfd_set_section_flags (abfd, sec, flags);
   3343 
   3344   sec->vma = section->addr;
   3345   sec->lma = section->addr;
   3346   sec->size = section->size;
   3347   sec->filepos = section->offset;
   3348   sec->alignment_power = section->align;
   3349   sec->segment_mark = 0;
   3350   sec->reloc_count = section->nreloc;
   3351   sec->rel_filepos = section->reloff;
   3352 }
   3353 
   3354 static asection *
   3355 bfd_mach_o_make_bfd_section (bfd *abfd,
   3356                              const unsigned char *segname,
   3357                              const unsigned char *sectname)
   3358 {
   3359   const char *sname;
   3360   flagword flags;
   3361 
   3362   bfd_mach_o_convert_section_name_to_bfd
   3363     (abfd, (const char *)segname, (const char *)sectname, &sname, &flags);
   3364   if (sname == NULL)
   3365     return NULL;
   3366 
   3367   return bfd_make_section_anyway_with_flags (abfd, sname, flags);
   3368 }
   3369 
   3370 static asection *
   3371 bfd_mach_o_read_section_32 (bfd *abfd,
   3372                             unsigned int offset,
   3373                             unsigned long prot)
   3374 {
   3375   struct mach_o_section_32_external raw;
   3376   asection *sec;
   3377   bfd_mach_o_section *section;
   3378 
   3379   if (bfd_seek (abfd, offset, SEEK_SET) != 0
   3380       || (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
   3381           != BFD_MACH_O_SECTION_SIZE))
   3382     return NULL;
   3383 
   3384   sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
   3385   if (sec == NULL)
   3386     return NULL;
   3387 
   3388   section = bfd_mach_o_get_mach_o_section (sec);
   3389   memcpy (section->segname, raw.segname, sizeof (raw.segname));
   3390   section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
   3391   memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
   3392   section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
   3393   section->addr = bfd_h_get_32 (abfd, raw.addr);
   3394   section->size = bfd_h_get_32 (abfd, raw.size);
   3395   section->offset = bfd_h_get_32 (abfd, raw.offset);
   3396   section->align = bfd_h_get_32 (abfd, raw.align);
   3397   section->reloff = bfd_h_get_32 (abfd, raw.reloff);
   3398   section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
   3399   section->flags = bfd_h_get_32 (abfd, raw.flags);
   3400   section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
   3401   section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
   3402   section->reserved3 = 0;
   3403 
   3404   bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
   3405 
   3406   return sec;
   3407 }
   3408 
   3409 static asection *
   3410 bfd_mach_o_read_section_64 (bfd *abfd,
   3411                             unsigned int offset,
   3412                             unsigned long prot)
   3413 {
   3414   struct mach_o_section_64_external raw;
   3415   asection *sec;
   3416   bfd_mach_o_section *section;
   3417 
   3418   if (bfd_seek (abfd, offset, SEEK_SET) != 0
   3419       || (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
   3420           != BFD_MACH_O_SECTION_64_SIZE))
   3421     return NULL;
   3422 
   3423   sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
   3424   if (sec == NULL)
   3425     return NULL;
   3426 
   3427   section = bfd_mach_o_get_mach_o_section (sec);
   3428   memcpy (section->segname, raw.segname, sizeof (raw.segname));
   3429   section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
   3430   memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
   3431   section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
   3432   section->addr = bfd_h_get_64 (abfd, raw.addr);
   3433   section->size = bfd_h_get_64 (abfd, raw.size);
   3434   section->offset = bfd_h_get_32 (abfd, raw.offset);
   3435   section->align = bfd_h_get_32 (abfd, raw.align);
   3436   section->reloff = bfd_h_get_32 (abfd, raw.reloff);
   3437   section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
   3438   section->flags = bfd_h_get_32 (abfd, raw.flags);
   3439   section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
   3440   section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
   3441   section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3);
   3442 
   3443   bfd_mach_o_init_section_from_mach_o (abfd, sec, prot);
   3444 
   3445   return sec;
   3446 }
   3447 
   3448 static asection *
   3449 bfd_mach_o_read_section (bfd *abfd,
   3450                          unsigned int offset,
   3451                          unsigned long prot,
   3452                          unsigned int wide)
   3453 {
   3454   if (wide)
   3455     return bfd_mach_o_read_section_64 (abfd, offset, prot);
   3456   else
   3457     return bfd_mach_o_read_section_32 (abfd, offset, prot);
   3458 }
   3459 
   3460 static bfd_boolean
   3461 bfd_mach_o_read_symtab_symbol (bfd *abfd,
   3462                                bfd_mach_o_symtab_command *sym,
   3463                                bfd_mach_o_asymbol *s,
   3464                                unsigned long i)
   3465 {
   3466   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   3467   unsigned int wide = mach_o_wide_p (&mdata->header);
   3468   unsigned int symwidth =
   3469     wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
   3470   unsigned int symoff = sym->symoff + (i * symwidth);
   3471   struct mach_o_nlist_64_external raw;
   3472   unsigned char type = -1;
   3473   unsigned char section = -1;
   3474   short desc = -1;
   3475   symvalue value = -1;
   3476   unsigned long stroff = -1;
   3477   unsigned int symtype = -1;
   3478 
   3479   BFD_ASSERT (sym->strtab != NULL);
   3480 
   3481   if (bfd_seek (abfd, symoff, SEEK_SET) != 0
   3482       || bfd_bread (&raw, symwidth, abfd) != symwidth)
   3483     {
   3484       (*_bfd_error_handler)
   3485         (_("bfd_mach_o_read_symtab_symbol: unable to read %d bytes at %lu"),
   3486          symwidth, (unsigned long) symoff);
   3487       return FALSE;
   3488     }
   3489 
   3490   stroff = bfd_h_get_32 (abfd, raw.n_strx);
   3491   type = bfd_h_get_8 (abfd, raw.n_type);
   3492   symtype = type & BFD_MACH_O_N_TYPE;
   3493   section = bfd_h_get_8 (abfd, raw.n_sect);
   3494   desc = bfd_h_get_16 (abfd, raw.n_desc);
   3495   if (wide)
   3496     value = bfd_h_get_64 (abfd, raw.n_value);
   3497   else
   3498     value = bfd_h_get_32 (abfd, raw.n_value);
   3499 
   3500   if (stroff >= sym->strsize)
   3501     {
   3502       (*_bfd_error_handler)
   3503         (_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %lu)"),
   3504          (unsigned long) stroff,
   3505          (unsigned long) sym->strsize);
   3506       return FALSE;
   3507     }
   3508 
   3509   s->symbol.the_bfd = abfd;
   3510   s->symbol.name = sym->strtab + stroff;
   3511   s->symbol.value = value;
   3512   s->symbol.flags = 0x0;
   3513   s->symbol.udata.i = i;
   3514   s->n_type = type;
   3515   s->n_sect = section;
   3516   s->n_desc = desc;
   3517 
   3518   if (type & BFD_MACH_O_N_STAB)
   3519     {
   3520       s->symbol.flags |= BSF_DEBUGGING;
   3521       s->symbol.section = bfd_und_section_ptr;
   3522       switch (type)
   3523 	{
   3524 	case N_FUN:
   3525 	case N_STSYM:
   3526 	case N_LCSYM:
   3527 	case N_BNSYM:
   3528 	case N_SLINE:
   3529 	case N_ENSYM:
   3530 	case N_ECOMM:
   3531 	case N_ECOML:
   3532 	case N_GSYM:
   3533 	  if ((section > 0) && (section <= mdata->nsects))
   3534 	    {
   3535 	      s->symbol.section = mdata->sections[section - 1]->bfdsection;
   3536 	      s->symbol.value =
   3537                 s->symbol.value - mdata->sections[section - 1]->addr;
   3538 	    }
   3539 	  break;
   3540 	}
   3541     }
   3542   else
   3543     {
   3544       if (type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT))
   3545 	s->symbol.flags |= BSF_GLOBAL;
   3546       else
   3547 	s->symbol.flags |= BSF_LOCAL;
   3548 
   3549       switch (symtype)
   3550 	{
   3551 	case BFD_MACH_O_N_UNDF:
   3552           if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT)
   3553               && s->symbol.value != 0)
   3554             {
   3555               /* A common symbol.  */
   3556               s->symbol.section = bfd_com_section_ptr;
   3557               s->symbol.flags = BSF_NO_FLAGS;
   3558             }
   3559           else
   3560             {
   3561               s->symbol.section = bfd_und_section_ptr;
   3562               if (s->n_desc & BFD_MACH_O_N_WEAK_REF)
   3563                 s->symbol.flags |= BSF_WEAK;
   3564             }
   3565 	  break;
   3566 	case BFD_MACH_O_N_PBUD:
   3567 	  s->symbol.section = bfd_und_section_ptr;
   3568 	  break;
   3569 	case BFD_MACH_O_N_ABS:
   3570 	  s->symbol.section = bfd_abs_section_ptr;
   3571 	  break;
   3572 	case BFD_MACH_O_N_SECT:
   3573 	  if ((section > 0) && (section <= mdata->nsects))
   3574 	    {
   3575 	      s->symbol.section = mdata->sections[section - 1]->bfdsection;
   3576 	      s->symbol.value =
   3577                 s->symbol.value - mdata->sections[section - 1]->addr;
   3578 	    }
   3579 	  else
   3580 	    {
   3581 	      /* Mach-O uses 0 to mean "no section"; not an error.  */
   3582 	      if (section != 0)
   3583 		{
   3584 		  (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
   3585 					   "symbol \"%s\" specified invalid section %d (max %lu): setting to undefined"),
   3586 					 s->symbol.name, section, mdata->nsects);
   3587 		}
   3588 	      s->symbol.section = bfd_und_section_ptr;
   3589 	    }
   3590 	  break;
   3591 	case BFD_MACH_O_N_INDR:
   3592 	  /* FIXME: we don't follow the BFD convention as this indirect symbol
   3593 	     won't be followed by the referenced one.  This looks harmless
   3594 	     unless we start using the linker.	*/
   3595 	  s->symbol.flags |= BSF_INDIRECT;
   3596 	  s->symbol.section = bfd_ind_section_ptr;
   3597 	  s->symbol.value = 0;
   3598 	  break;
   3599 	default:
   3600 	  (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbol: "
   3601 				   "symbol \"%s\" specified invalid type field 0x%x: setting to undefined"),
   3602 				 s->symbol.name, symtype);
   3603 	  s->symbol.section = bfd_und_section_ptr;
   3604 	  break;
   3605 	}
   3606     }
   3607 
   3608   return TRUE;
   3609 }
   3610 
   3611 bfd_boolean
   3612 bfd_mach_o_read_symtab_strtab (bfd *abfd)
   3613 {
   3614   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   3615   bfd_mach_o_symtab_command *sym = mdata->symtab;
   3616 
   3617   /* Fail if there is no symtab.  */
   3618   if (sym == NULL)
   3619     return FALSE;
   3620 
   3621   /* Success if already loaded.  */
   3622   if (sym->strtab)
   3623     return TRUE;
   3624 
   3625   if (abfd->flags & BFD_IN_MEMORY)
   3626     {
   3627       struct bfd_in_memory *b;
   3628 
   3629       b = (struct bfd_in_memory *) abfd->iostream;
   3630 
   3631       if ((sym->stroff + sym->strsize) > b->size)
   3632 	{
   3633 	  bfd_set_error (bfd_error_file_truncated);
   3634 	  return FALSE;
   3635 	}
   3636       sym->strtab = (char *) b->buffer + sym->stroff;
   3637     }
   3638   else
   3639     {
   3640       sym->strtab = bfd_alloc (abfd, sym->strsize);
   3641       if (sym->strtab == NULL)
   3642         return FALSE;
   3643 
   3644       if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0
   3645           || bfd_bread (sym->strtab, sym->strsize, abfd) != sym->strsize)
   3646         {
   3647           bfd_set_error (bfd_error_file_truncated);
   3648           return FALSE;
   3649         }
   3650     }
   3651 
   3652   return TRUE;
   3653 }
   3654 
   3655 bfd_boolean
   3656 bfd_mach_o_read_symtab_symbols (bfd *abfd)
   3657 {
   3658   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
   3659   bfd_mach_o_symtab_command *sym = mdata->symtab;
   3660   unsigned long i;
   3661 
   3662   if (sym == NULL || sym->symbols)
   3663     {
   3664       /* Return now if there are no symbols or if already loaded.  */
   3665       return TRUE;
   3666     }
   3667 
   3668   sym->symbols = bfd_alloc (abfd, sym->nsyms * sizeof (bfd_mach_o_asymbol));
   3669 
   3670   if (sym->symbols == NULL)
   3671     {
   3672       (*_bfd_error_handler) (_("bfd_mach_o_read_symtab_symbols: unable to allocate memory for symbols"));
   3673       return FALSE;
   3674     }
   3675 
   3676   if (!bfd_mach_o_read_symtab_strtab (abfd))
   3677     return FALSE;
   3678 
   3679   for (i = 0; i < sym->nsyms; i++)
   3680     {
   3681       if (!bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i))
   3682 	return FALSE;
   3683     }
   3684 
   3685   return TRUE;
   3686 }
   3687 
   3688 static const char *
   3689 bfd_mach_o_i386_flavour_string (unsigned int flavour)
   3690 {
   3691   switch ((int) flavour)
   3692     {
   3693     case BFD_MACH_O_x86_THREAD_STATE32:    return "x86_THREAD_STATE32";
   3694     case BFD_MACH_O_x86_FLOAT_STATE32:     return "x86_FLOAT_STATE32";
   3695     case BFD_MACH_O_x86_EXCEPTION_STATE32: return "x86_EXCEPTION_STATE32";
   3696     case BFD_MACH_O_x86_THREAD_STATE64:    return "x86_THREAD_STATE64";
   3697     case BFD_MACH_O_x86_FLOAT_STATE64:     return "x86_FLOAT_STATE64";
   3698     case BFD_MACH_O_x86_EXCEPTION_STATE64: return "x86_EXCEPTION_STATE64";
   3699     case BFD_MACH_O_x86_THREAD_STATE:      return "x86_THREAD_STATE";
   3700     case BFD_MACH_O_x86_FLOAT_STATE:       return "x86_FLOAT_STATE";
   3701     case BFD_MACH_O_x86_EXCEPTION_STATE:   return "x86_EXCEPTION_STATE";
   3702     case BFD_MACH_O_x86_DEBUG_STATE32:     return "x86_DEBUG_STATE32";
   3703     case BFD_MACH_O_x86_DEBUG_STATE64:     return "x86_DEBUG_STATE64";
   3704     case BFD_MACH_O_x86_DEBUG_STATE:       return "x86_DEBUG_STATE";
   3705     case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE";
   3706     default: return "UNKNOWN";
   3707     }
   3708 }
   3709 
   3710 static const char *
   3711 bfd_mach_o_ppc_flavour_string (unsigned int flavour)
   3712 {
   3713   switch ((int) flavour)
   3714     {
   3715     case BFD_MACH_O_PPC_THREAD_STATE:      return "PPC_THREAD_STATE";
   3716     case BFD_MACH_O_PPC_FLOAT_STATE:       return "PPC_FLOAT_STATE";
   3717     case BFD_MACH_O_PPC_EXCEPTION_STATE:   return "PPC_EXCEPTION_STATE";
   3718     case BFD_MACH_O_PPC_VECTOR_STATE:      return "PPC_VECTOR_STATE";
   3719     case BFD_MACH_O_PPC_THREAD_STATE64:    return "PPC_THREAD_STATE64";
   3720     case BFD_MACH_O_PPC_EXCEPTION_STATE64: return "PPC_EXCEPTION_STATE64";
   3721     default: return "UNKNOWN";
   3722     }
   3723 }
   3724 
   3725 static bfd_boolean
   3726 bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
   3727 {
   3728   bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
   3729   struct mach_o_str_command_external raw;
   3730   unsigned int nameoff;
   3731   unsigned int namelen;
   3732 
   3733   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
   3734       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
   3735     return FALSE;
   3736 
   3737   nameoff = bfd_h_get_32 (abfd, raw.str);
   3738 
   3739   cmd->name_offset = nameoff;
   3740   namelen = command->len - nameoff;
   3741   nameoff += command->offset;
   3742   cmd->name_str = bfd_alloc (abfd, namelen);
   3743   if (cmd->name_str == NULL)
   3744     return FALSE;
   3745   if (bfd_seek (abfd, nameoff, SEEK_SET) != 0
   3746       || bfd_bread (