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
bfd_mach_o_version(bfd * abfd)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
bfd_mach_o_valid(bfd * abfd)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
mach_o_wide_p(bfd_mach_o_header * header)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
bfd_mach_o_wide_p(bfd * abfd)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 *
bfd_mach_o_section_data_for_mach_sect(bfd * abfd,const char * segname,const char * sectname)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 *
bfd_mach_o_section_data_for_bfd_name(bfd * abfd,const char * bfd_name,const char ** segname)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
bfd_mach_o_convert_section_name_to_bfd(bfd * abfd,const char * segname,const char * secname,const char ** name,flagword * flags)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 *
bfd_mach_o_convert_section_name_to_mach_o(bfd * abfd ATTRIBUTE_UNUSED,asection * sect,bfd_mach_o_section * section)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
bfd_mach_o_section_get_entry_size(bfd * abfd,bfd_mach_o_section * sec)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
bfd_mach_o_section_get_nbr_indirect(bfd * abfd,bfd_mach_o_section * sec)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
bfd_mach_o_append_command(bfd * abfd,bfd_mach_o_load_command * cmd)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
bfd_mach_o_bfd_copy_private_symbol_data(bfd * ibfd ATTRIBUTE_UNUSED,asymbol * isymbol,bfd * obfd ATTRIBUTE_UNUSED,asymbol * osymbol)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
bfd_mach_o_bfd_copy_private_section_data(bfd * ibfd,asection * isection,bfd * obfd,asection * osection)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
bfd_mach_o_bfd_copy_private_header_data(bfd * ibfd,bfd * obfd)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
bfd_mach_o_bfd_set_private_flags(bfd * abfd,flagword flags)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
bfd_mach_o_count_symbols(bfd * abfd)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
bfd_mach_o_get_symtab_upper_bound(bfd * abfd)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
bfd_mach_o_canonicalize_symtab(bfd * abfd,asymbol ** alocation)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
bfd_mach_o_get_synthetic_symtab(bfd * abfd,long symcount ATTRIBUTE_UNUSED,asymbol ** syms ATTRIBUTE_UNUSED,long dynsymcount ATTRIBUTE_UNUSED,asymbol ** dynsyms ATTRIBUTE_UNUSED,asymbol ** ret)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
bfd_mach_o_get_symbol_info(bfd * abfd ATTRIBUTE_UNUSED,asymbol * symbol,symbol_info * ret)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
bfd_mach_o_print_symbol(bfd * abfd,void * afile,asymbol * symbol,bfd_print_symbol_type how)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
bfd_mach_o_convert_architecture(bfd_mach_o_cpu_type mtype,bfd_mach_o_cpu_subtype msubtype,enum bfd_architecture * type,unsigned long * subtype)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
bfd_mach_o_pad4(bfd * abfd,unsigned int len)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
bfd_mach_o_pad_command(bfd * abfd,unsigned int len)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
bfd_mach_o_write_header(bfd * abfd,bfd_mach_o_header * header)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
bfd_mach_o_write_thread(bfd * abfd,bfd_mach_o_load_command * command)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
bfd_mach_o_write_dylinker(bfd * abfd,bfd_mach_o_load_command * command)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
bfd_mach_o_write_dylib(bfd * abfd,bfd_mach_o_load_command * command)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
bfd_mach_o_write_main(bfd * abfd,bfd_mach_o_load_command * command)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
bfd_mach_o_write_dyld_info(bfd * abfd,bfd_mach_o_load_command * command)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
bfd_mach_o_get_reloc_upper_bound(bfd * abfd ATTRIBUTE_UNUSED,asection * asect)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
bfd_mach_o_swap_in_non_scattered_reloc(bfd * abfd,bfd_mach_o_reloc_info * rel,unsigned char * fields)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
bfd_mach_o_canonicalize_one_reloc(bfd * abfd,struct mach_o_reloc_info_external * raw,arelent * res,asymbol ** syms)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
bfd_mach_o_canonicalize_relocs(bfd * abfd,unsigned long filepos,unsigned long count,arelent * res,asymbol ** syms)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
bfd_mach_o_canonicalize_reloc(bfd * abfd,asection * asect,arelent ** rels,asymbol ** syms)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
bfd_mach_o_get_dynamic_reloc_upper_bound(bfd * abfd)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
bfd_mach_o_canonicalize_dynamic_reloc(bfd * abfd,arelent ** rels,struct bfd_symbol ** syms)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
bfd_mach_o_swap_out_non_scattered_reloc(bfd * abfd,unsigned char * fields,bfd_mach_o_reloc_info * rel)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
bfd_mach_o_write_relocs(bfd * abfd,bfd_mach_o_section * section)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
bfd_mach_o_write_section_32(bfd * abfd,bfd_mach_o_section * section)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
bfd_mach_o_write_section_64(bfd * abfd,bfd_mach_o_section * section)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
bfd_mach_o_write_segment_32(bfd * abfd,bfd_mach_o_load_command * command)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
bfd_mach_o_write_segment_64(bfd * abfd,bfd_mach_o_load_command * command)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
bfd_mach_o_write_symtab_content(bfd * abfd,bfd_mach_o_symtab_command * sym)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
bfd_mach_o_write_symtab(bfd * abfd,bfd_mach_o_load_command * command)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
bfd_mach_o_count_indirect_symbols(bfd * abfd,bfd_mach_o_data_struct * mdata)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
bfd_mach_o_build_dysymtab(bfd * abfd,bfd_mach_o_dysymtab_command * cmd)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
bfd_mach_o_write_dysymtab(bfd * abfd,bfd_mach_o_load_command * command)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
bfd_mach_o_primary_symbol_sort_key(bfd_mach_o_asymbol * s)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
bfd_mach_o_cf_symbols(const void * a,const void * b)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
bfd_mach_o_mangle_symbols(bfd * abfd)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
bfd_mach_o_mangle_sections(bfd * abfd,bfd_mach_o_data_struct * mdata)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
bfd_mach_o_write_contents(bfd * abfd)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
bfd_mach_o_append_section_to_segment(bfd_mach_o_segment_command * seg,bfd_mach_o_section * s)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
bfd_mach_o_set_section_flags_from_bfd(bfd * abfd ATTRIBUTE_UNUSED,asection * sec)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
bfd_mach_o_build_obj_seg_command(bfd * abfd,bfd_mach_o_segment_command * seg)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
bfd_mach_o_build_exec_seg_command(bfd * abfd,bfd_mach_o_segment_command * seg)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
bfd_mach_o_layout_commands(bfd_mach_o_data_struct * mdata)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
bfd_mach_o_init_segment(bfd_mach_o_data_struct * mdata,bfd_mach_o_load_command * cmd,const char * segname,unsigned int nbr_sect)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
bfd_mach_o_build_commands(bfd * abfd)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
bfd_mach_o_set_section_contents(bfd * abfd,asection * section,const void * location,file_ptr offset,bfd_size_type count)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
bfd_mach_o_sizeof_headers(bfd * a ATTRIBUTE_UNUSED,struct bfd_link_info * info ATTRIBUTE_UNUSED)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 *
bfd_mach_o_make_empty_symbol(bfd * abfd)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
bfd_mach_o_read_header(bfd * abfd,bfd_mach_o_header * header)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
bfd_mach_o_new_section_hook(bfd * abfd,asection * sec)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
bfd_mach_o_init_section_from_mach_o(bfd * abfd,asection * sec,unsigned long prot)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 *
bfd_mach_o_make_bfd_section(bfd * abfd,const unsigned char * segname,const unsigned char * sectname)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 *
bfd_mach_o_read_section_32(bfd * abfd,unsigned int offset,unsigned long prot)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 *
bfd_mach_o_read_section_64(bfd * abfd,unsigned int offset,unsigned long prot)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 *
bfd_mach_o_read_section(bfd * abfd,unsigned int offset,unsigned long prot,unsigned int wide)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
bfd_mach_o_read_symtab_symbol(bfd * abfd,bfd_mach_o_symtab_command * sym,bfd_mach_o_asymbol * s,unsigned long i)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
bfd_mach_o_read_symtab_strtab(bfd * abfd)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
bfd_mach_o_read_symtab_symbols(bfd * abfd)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 *
bfd_mach_o_i386_flavour_string(unsigned int flavour)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 *
bfd_mach_o_ppc_flavour_string(unsigned int flavour)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
bfd_mach_o_read_dylinker(bfd * abfd,bfd_mach_o_load_command * command)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 (cmd->name_str, namelen, abfd) != namelen)
3747     return FALSE;
3748   return TRUE;
3749 }
3750 
3751 static bfd_boolean
bfd_mach_o_read_dylib(bfd * abfd,bfd_mach_o_load_command * command)3752 bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
3753 {
3754   bfd_mach_o_dylib_command *cmd = &command->command.dylib;
3755   struct mach_o_dylib_command_external raw;
3756   unsigned int nameoff;
3757   unsigned int namelen;
3758 
3759   switch (command->type)
3760     {
3761     case BFD_MACH_O_LC_LOAD_DYLIB:
3762     case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
3763     case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
3764     case BFD_MACH_O_LC_ID_DYLIB:
3765     case BFD_MACH_O_LC_REEXPORT_DYLIB:
3766     case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
3767       break;
3768     default:
3769       BFD_FAIL ();
3770       return FALSE;
3771     }
3772 
3773   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3774       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3775     return FALSE;
3776 
3777   nameoff = bfd_h_get_32 (abfd, raw.name);
3778   cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp);
3779   cmd->current_version = bfd_h_get_32 (abfd, raw.current_version);
3780   cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version);
3781 
3782   cmd->name_offset = command->offset + nameoff;
3783   namelen = command->len - nameoff;
3784   cmd->name_str = bfd_alloc (abfd, namelen);
3785   if (cmd->name_str == NULL)
3786     return FALSE;
3787   if (bfd_seek (abfd, cmd->name_offset, SEEK_SET) != 0
3788       || bfd_bread (cmd->name_str, namelen, abfd) != namelen)
3789     return FALSE;
3790   return TRUE;
3791 }
3792 
3793 static bfd_boolean
bfd_mach_o_read_prebound_dylib(bfd * abfd,bfd_mach_o_load_command * command)3794 bfd_mach_o_read_prebound_dylib (bfd *abfd,
3795                                 bfd_mach_o_load_command *command)
3796 {
3797   bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib;
3798   struct mach_o_prebound_dylib_command_external raw;
3799   unsigned int nameoff;
3800   unsigned int modoff;
3801   unsigned int str_len;
3802   unsigned char *str;
3803 
3804   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3805       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3806     return FALSE;
3807 
3808   nameoff = bfd_h_get_32 (abfd, raw.name);
3809   modoff = bfd_h_get_32 (abfd, raw.linked_modules);
3810   if (nameoff > command->len || modoff > command->len)
3811     return FALSE;
3812 
3813   str_len = command->len - sizeof (raw);
3814   str = bfd_alloc (abfd, str_len);
3815   if (str == NULL)
3816     return FALSE;
3817   if (bfd_bread (str, str_len, abfd) != str_len)
3818     return FALSE;
3819 
3820   cmd->name_offset = command->offset + nameoff;
3821   cmd->nmodules = bfd_h_get_32 (abfd, raw.nmodules);
3822   cmd->linked_modules_offset = command->offset + modoff;
3823 
3824   cmd->name_str = (char *)str + nameoff - (sizeof (raw) + BFD_MACH_O_LC_SIZE);
3825   cmd->linked_modules = str + modoff - (sizeof (raw) + BFD_MACH_O_LC_SIZE);
3826   return TRUE;
3827 }
3828 
3829 static bfd_boolean
bfd_mach_o_read_prebind_cksum(bfd * abfd,bfd_mach_o_load_command * command)3830 bfd_mach_o_read_prebind_cksum (bfd *abfd,
3831 			       bfd_mach_o_load_command *command)
3832 {
3833   bfd_mach_o_prebind_cksum_command *cmd = &command->command.prebind_cksum;
3834   struct mach_o_prebind_cksum_command_external raw;
3835 
3836   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3837       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3838     return FALSE;
3839 
3840   cmd->cksum = bfd_get_32 (abfd, raw.cksum);
3841   return TRUE;
3842 }
3843 
3844 static bfd_boolean
bfd_mach_o_read_twolevel_hints(bfd * abfd,bfd_mach_o_load_command * command)3845 bfd_mach_o_read_twolevel_hints (bfd *abfd,
3846 				bfd_mach_o_load_command *command)
3847 {
3848   bfd_mach_o_twolevel_hints_command *cmd = &command->command.twolevel_hints;
3849   struct mach_o_twolevel_hints_command_external raw;
3850 
3851   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3852       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3853     return FALSE;
3854 
3855   cmd->offset = bfd_get_32 (abfd, raw.offset);
3856   cmd->nhints = bfd_get_32 (abfd, raw.nhints);
3857   return TRUE;
3858 }
3859 
3860 static bfd_boolean
bfd_mach_o_read_fvmlib(bfd * abfd,bfd_mach_o_load_command * command)3861 bfd_mach_o_read_fvmlib (bfd *abfd, bfd_mach_o_load_command *command)
3862 {
3863   bfd_mach_o_fvmlib_command *fvm = &command->command.fvmlib;
3864   struct mach_o_fvmlib_command_external raw;
3865   unsigned int nameoff;
3866   unsigned int namelen;
3867 
3868   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
3869       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3870     return FALSE;
3871 
3872   nameoff = bfd_h_get_32 (abfd, raw.name);
3873   fvm->minor_version = bfd_h_get_32 (abfd, raw.minor_version);
3874   fvm->header_addr = bfd_h_get_32 (abfd, raw.header_addr);
3875 
3876   fvm->name_offset = command->offset + nameoff;
3877   namelen = command->len - nameoff;
3878   fvm->name_str = bfd_alloc (abfd, namelen);
3879   if (fvm->name_str == NULL)
3880     return FALSE;
3881   if (bfd_seek (abfd, fvm->name_offset, SEEK_SET) != 0
3882       || bfd_bread (fvm->name_str, namelen, abfd) != namelen)
3883     return FALSE;
3884   return TRUE;
3885 }
3886 
3887 static bfd_boolean
bfd_mach_o_read_thread(bfd * abfd,bfd_mach_o_load_command * command)3888 bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
3889 {
3890   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3891   bfd_mach_o_thread_command *cmd = &command->command.thread;
3892   unsigned int offset;
3893   unsigned int nflavours;
3894   unsigned int i;
3895 
3896   BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
3897 	      || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
3898 
3899   /* Count the number of threads.  */
3900   offset = 8;
3901   nflavours = 0;
3902   while (offset != command->len)
3903     {
3904       struct mach_o_thread_command_external raw;
3905 
3906       if (offset >= command->len)
3907 	return FALSE;
3908 
3909       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
3910           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3911 	return FALSE;
3912 
3913       offset += sizeof (raw) + bfd_h_get_32 (abfd, raw.count) * 4;
3914       nflavours++;
3915     }
3916 
3917   /* Allocate threads.  */
3918   cmd->flavours = bfd_alloc
3919     (abfd, nflavours * sizeof (bfd_mach_o_thread_flavour));
3920   if (cmd->flavours == NULL)
3921     return FALSE;
3922   cmd->nflavours = nflavours;
3923 
3924   offset = 8;
3925   nflavours = 0;
3926   while (offset != command->len)
3927     {
3928       struct mach_o_thread_command_external raw;
3929 
3930       if (offset >= command->len)
3931 	return FALSE;
3932 
3933       if (nflavours >= cmd->nflavours)
3934 	return FALSE;
3935 
3936       if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
3937           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
3938 	return FALSE;
3939 
3940       cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour);
3941       cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw);
3942       cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4;
3943       offset += cmd->flavours[nflavours].size + sizeof (raw);
3944       nflavours++;
3945     }
3946 
3947   for (i = 0; i < nflavours; i++)
3948     {
3949       asection *bfdsec;
3950       unsigned int snamelen;
3951       char *sname;
3952       const char *flavourstr;
3953       const char *prefix = "LC_THREAD";
3954       unsigned int j = 0;
3955 
3956       switch (mdata->header.cputype)
3957 	{
3958 	case BFD_MACH_O_CPU_TYPE_POWERPC:
3959 	case BFD_MACH_O_CPU_TYPE_POWERPC_64:
3960 	  flavourstr =
3961 	    bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
3962 	  break;
3963 	case BFD_MACH_O_CPU_TYPE_I386:
3964 	case BFD_MACH_O_CPU_TYPE_X86_64:
3965 	  flavourstr =
3966 	    bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
3967 	  break;
3968 	default:
3969 	  flavourstr = "UNKNOWN_ARCHITECTURE";
3970 	  break;
3971 	}
3972 
3973       snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
3974       sname = bfd_alloc (abfd, snamelen);
3975       if (sname == NULL)
3976 	return FALSE;
3977 
3978       for (;;)
3979 	{
3980 	  sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
3981 	  if (bfd_get_section_by_name (abfd, sname) == NULL)
3982 	    break;
3983 	  j++;
3984 	}
3985 
3986       bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
3987 
3988       bfdsec->vma = 0;
3989       bfdsec->lma = 0;
3990       bfdsec->size = cmd->flavours[i].size;
3991       bfdsec->filepos = cmd->flavours[i].offset;
3992       bfdsec->alignment_power = 0x0;
3993 
3994       cmd->section = bfdsec;
3995     }
3996 
3997   return TRUE;
3998 }
3999 
4000 static bfd_boolean
bfd_mach_o_read_dysymtab(bfd * abfd,bfd_mach_o_load_command * command)4001 bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
4002 {
4003   bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
4004   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4005 
4006   BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
4007 
4008   {
4009     struct mach_o_dysymtab_command_external raw;
4010 
4011     if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4012         || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4013       return FALSE;
4014 
4015     cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym);
4016     cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym);
4017     cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym);
4018     cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym);
4019     cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym);
4020     cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym);
4021     cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff);
4022     cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc);
4023     cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff);
4024     cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab);
4025     cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff);
4026     cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms);
4027     cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff);
4028     cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms);
4029     cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff);
4030     cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel);
4031     cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff);
4032     cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel);
4033   }
4034 
4035   if (cmd->nmodtab != 0)
4036     {
4037       unsigned int i;
4038       int wide = bfd_mach_o_wide_p (abfd);
4039       unsigned int module_len = wide ? 56 : 52;
4040 
4041       cmd->dylib_module =
4042         bfd_alloc (abfd, cmd->nmodtab * sizeof (bfd_mach_o_dylib_module));
4043       if (cmd->dylib_module == NULL)
4044         return FALSE;
4045 
4046       if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
4047         return FALSE;
4048 
4049       for (i = 0; i < cmd->nmodtab; i++)
4050         {
4051           bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
4052           unsigned long v;
4053           unsigned char buf[56];
4054 
4055           if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
4056             return FALSE;
4057 
4058           module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
4059           module->iextdefsym = bfd_h_get_32 (abfd, buf + 4);
4060           module->nextdefsym = bfd_h_get_32 (abfd, buf + 8);
4061           module->irefsym = bfd_h_get_32 (abfd, buf + 12);
4062           module->nrefsym = bfd_h_get_32 (abfd, buf + 16);
4063           module->ilocalsym = bfd_h_get_32 (abfd, buf + 20);
4064           module->nlocalsym = bfd_h_get_32 (abfd, buf + 24);
4065           module->iextrel = bfd_h_get_32 (abfd, buf + 28);
4066           module->nextrel = bfd_h_get_32 (abfd, buf + 32);
4067           v = bfd_h_get_32 (abfd, buf +36);
4068           module->iinit = v & 0xffff;
4069           module->iterm = (v >> 16) & 0xffff;
4070           v = bfd_h_get_32 (abfd, buf + 40);
4071           module->ninit = v & 0xffff;
4072           module->nterm = (v >> 16) & 0xffff;
4073           if (wide)
4074             {
4075               module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44);
4076               module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48);
4077             }
4078           else
4079             {
4080               module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44);
4081               module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48);
4082             }
4083         }
4084     }
4085 
4086   if (cmd->ntoc != 0)
4087     {
4088       unsigned int i;
4089 
4090       cmd->dylib_toc = bfd_alloc
4091         (abfd, cmd->ntoc * sizeof (bfd_mach_o_dylib_table_of_content));
4092       if (cmd->dylib_toc == NULL)
4093         return FALSE;
4094 
4095       if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
4096         return FALSE;
4097 
4098       for (i = 0; i < cmd->ntoc; i++)
4099         {
4100           struct mach_o_dylib_table_of_contents_external raw;
4101           bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
4102 
4103           if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4104             return FALSE;
4105 
4106           toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index);
4107           toc->module_index = bfd_h_get_32 (abfd, raw.module_index);
4108         }
4109     }
4110 
4111   if (cmd->nindirectsyms != 0)
4112     {
4113       unsigned int i;
4114 
4115       cmd->indirect_syms = bfd_alloc
4116         (abfd, cmd->nindirectsyms * sizeof (unsigned int));
4117       if (cmd->indirect_syms == NULL)
4118         return FALSE;
4119 
4120       if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
4121         return FALSE;
4122 
4123       for (i = 0; i < cmd->nindirectsyms; i++)
4124         {
4125           unsigned char raw[4];
4126           unsigned int *is = &cmd->indirect_syms[i];
4127 
4128           if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
4129             return FALSE;
4130 
4131           *is = bfd_h_get_32 (abfd, raw);
4132         }
4133     }
4134 
4135   if (cmd->nextrefsyms != 0)
4136     {
4137       unsigned long v;
4138       unsigned int i;
4139 
4140       cmd->ext_refs = bfd_alloc
4141         (abfd, cmd->nextrefsyms * sizeof (bfd_mach_o_dylib_reference));
4142       if (cmd->ext_refs == NULL)
4143         return FALSE;
4144 
4145       if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
4146         return FALSE;
4147 
4148       for (i = 0; i < cmd->nextrefsyms; i++)
4149         {
4150           unsigned char raw[4];
4151           bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
4152 
4153           if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
4154             return FALSE;
4155 
4156           /* Fields isym and flags are written as bit-fields, thus we need
4157              a specific processing for endianness.  */
4158           v = bfd_h_get_32 (abfd, raw);
4159           if (bfd_big_endian (abfd))
4160             {
4161               ref->isym = (v >> 8) & 0xffffff;
4162               ref->flags = v & 0xff;
4163             }
4164           else
4165             {
4166               ref->isym = v & 0xffffff;
4167               ref->flags = (v >> 24) & 0xff;
4168             }
4169         }
4170     }
4171 
4172   if (mdata->dysymtab)
4173     return FALSE;
4174   mdata->dysymtab = cmd;
4175 
4176   return TRUE;
4177 }
4178 
4179 static bfd_boolean
bfd_mach_o_read_symtab(bfd * abfd,bfd_mach_o_load_command * command)4180 bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command)
4181 {
4182   bfd_mach_o_symtab_command *symtab = &command->command.symtab;
4183   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4184   struct mach_o_symtab_command_external raw;
4185 
4186   BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
4187 
4188   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4189       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4190     return FALSE;
4191 
4192   symtab->symoff = bfd_h_get_32 (abfd, raw.symoff);
4193   symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms);
4194   symtab->stroff = bfd_h_get_32 (abfd, raw.stroff);
4195   symtab->strsize = bfd_h_get_32 (abfd, raw.strsize);
4196   symtab->symbols = NULL;
4197   symtab->strtab = NULL;
4198 
4199   if (symtab->nsyms != 0)
4200     abfd->flags |= HAS_SYMS;
4201 
4202   if (mdata->symtab)
4203     return FALSE;
4204   mdata->symtab = symtab;
4205   return TRUE;
4206 }
4207 
4208 static bfd_boolean
bfd_mach_o_read_uuid(bfd * abfd,bfd_mach_o_load_command * command)4209 bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
4210 {
4211   bfd_mach_o_uuid_command *cmd = &command->command.uuid;
4212 
4213   BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
4214 
4215   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4216       || bfd_bread (cmd->uuid, 16, abfd) != 16)
4217     return FALSE;
4218 
4219   return TRUE;
4220 }
4221 
4222 static bfd_boolean
bfd_mach_o_read_linkedit(bfd * abfd,bfd_mach_o_load_command * command)4223 bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
4224 {
4225   bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
4226   struct mach_o_linkedit_data_command_external raw;
4227 
4228   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4229       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4230     return FALSE;
4231 
4232   cmd->dataoff = bfd_get_32 (abfd, raw.dataoff);
4233   cmd->datasize = bfd_get_32 (abfd, raw.datasize);
4234   return TRUE;
4235 }
4236 
4237 static bfd_boolean
bfd_mach_o_read_str(bfd * abfd,bfd_mach_o_load_command * command)4238 bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
4239 {
4240   bfd_mach_o_str_command *cmd = &command->command.str;
4241   struct mach_o_str_command_external raw;
4242   unsigned long off;
4243 
4244   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4245       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4246     return FALSE;
4247 
4248   off = bfd_get_32 (abfd, raw.str);
4249   cmd->stroff = command->offset + off;
4250   cmd->str_len = command->len - off;
4251   cmd->str = bfd_alloc (abfd, cmd->str_len);
4252   if (cmd->str == NULL)
4253     return FALSE;
4254   if (bfd_seek (abfd, cmd->stroff, SEEK_SET) != 0
4255       || bfd_bread ((void *) cmd->str, cmd->str_len, abfd) != cmd->str_len)
4256     return FALSE;
4257   return TRUE;
4258 }
4259 
4260 static unsigned char *
bfd_mach_o_alloc_and_read(bfd * abfd,unsigned int off,unsigned int size)4261 bfd_mach_o_alloc_and_read (bfd *abfd, unsigned int off, unsigned int size)
4262 {
4263   unsigned char *buf;
4264 
4265   buf = bfd_alloc (abfd, size);
4266   if (buf == NULL)
4267     return NULL;
4268   if (bfd_seek (abfd, off, SEEK_SET) != 0
4269       || bfd_bread (buf, size, abfd) != size)
4270     return NULL;
4271   return buf;
4272 }
4273 
4274 static bfd_boolean
bfd_mach_o_read_dyld_content(bfd * abfd,bfd_mach_o_dyld_info_command * cmd)4275 bfd_mach_o_read_dyld_content (bfd *abfd, bfd_mach_o_dyld_info_command *cmd)
4276 {
4277   /* Read rebase content.  */
4278   if (cmd->rebase_content == NULL && cmd->rebase_size != 0)
4279     {
4280       cmd->rebase_content =
4281 	bfd_mach_o_alloc_and_read (abfd, cmd->rebase_off, cmd->rebase_size);
4282       if (cmd->rebase_content == NULL)
4283 	return FALSE;
4284     }
4285 
4286   /* Read bind content.  */
4287   if (cmd->bind_content == NULL && cmd->bind_size != 0)
4288     {
4289       cmd->bind_content =
4290 	bfd_mach_o_alloc_and_read (abfd, cmd->bind_off, cmd->bind_size);
4291       if (cmd->bind_content == NULL)
4292 	return FALSE;
4293     }
4294 
4295   /* Read weak bind content.  */
4296   if (cmd->weak_bind_content == NULL && cmd->weak_bind_size != 0)
4297     {
4298       cmd->weak_bind_content = bfd_mach_o_alloc_and_read
4299 	(abfd, cmd->weak_bind_off, cmd->weak_bind_size);
4300       if (cmd->weak_bind_content == NULL)
4301 	return FALSE;
4302     }
4303 
4304   /* Read lazy bind content.  */
4305   if (cmd->lazy_bind_content == NULL && cmd->lazy_bind_size != 0)
4306     {
4307       cmd->lazy_bind_content = bfd_mach_o_alloc_and_read
4308 	(abfd, cmd->lazy_bind_off, cmd->lazy_bind_size);
4309       if (cmd->lazy_bind_content == NULL)
4310 	return FALSE;
4311     }
4312 
4313   /* Read export content.  */
4314   if (cmd->export_content == NULL && cmd->export_size != 0)
4315     {
4316       cmd->export_content = bfd_mach_o_alloc_and_read
4317 	(abfd, cmd->export_off, cmd->export_size);
4318       if (cmd->export_content == NULL)
4319 	return FALSE;
4320     }
4321 
4322   return TRUE;
4323 }
4324 
4325 static bfd_boolean
bfd_mach_o_read_dyld_info(bfd * abfd,bfd_mach_o_load_command * command)4326 bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
4327 {
4328   bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
4329   struct mach_o_dyld_info_command_external raw;
4330 
4331   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4332       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4333     return FALSE;
4334 
4335   cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off);
4336   cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size);
4337   cmd->rebase_content = NULL;
4338   cmd->bind_off = bfd_get_32 (abfd, raw.bind_off);
4339   cmd->bind_size = bfd_get_32 (abfd, raw.bind_size);
4340   cmd->bind_content = NULL;
4341   cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off);
4342   cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size);
4343   cmd->weak_bind_content = NULL;
4344   cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off);
4345   cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size);
4346   cmd->lazy_bind_content = NULL;
4347   cmd->export_off = bfd_get_32 (abfd, raw.export_off);
4348   cmd->export_size = bfd_get_32 (abfd, raw.export_size);
4349   cmd->export_content = NULL;
4350   return TRUE;
4351 }
4352 
4353 static bfd_boolean
bfd_mach_o_read_version_min(bfd * abfd,bfd_mach_o_load_command * command)4354 bfd_mach_o_read_version_min (bfd *abfd, bfd_mach_o_load_command *command)
4355 {
4356   bfd_mach_o_version_min_command *cmd = &command->command.version_min;
4357   struct mach_o_version_min_command_external raw;
4358   unsigned int ver;
4359 
4360   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4361       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4362     return FALSE;
4363 
4364   ver = bfd_get_32 (abfd, raw.version);
4365   cmd->rel = ver >> 16;
4366   cmd->maj = ver >> 8;
4367   cmd->min = ver;
4368   cmd->reserved = bfd_get_32 (abfd, raw.reserved);
4369   return TRUE;
4370 }
4371 
4372 static bfd_boolean
bfd_mach_o_read_encryption_info(bfd * abfd,bfd_mach_o_load_command * command)4373 bfd_mach_o_read_encryption_info (bfd *abfd, bfd_mach_o_load_command *command)
4374 {
4375   bfd_mach_o_encryption_info_command *cmd = &command->command.encryption_info;
4376   struct mach_o_encryption_info_command_external raw;
4377 
4378   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4379       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4380     return FALSE;
4381 
4382   cmd->cryptoff = bfd_get_32 (abfd, raw.cryptoff);
4383   cmd->cryptsize = bfd_get_32 (abfd, raw.cryptsize);
4384   cmd->cryptid = bfd_get_32 (abfd, raw.cryptid);
4385   return TRUE;
4386 }
4387 
4388 static bfd_boolean
bfd_mach_o_read_main(bfd * abfd,bfd_mach_o_load_command * command)4389 bfd_mach_o_read_main (bfd *abfd, bfd_mach_o_load_command *command)
4390 {
4391   bfd_mach_o_main_command *cmd = &command->command.main;
4392   struct mach_o_entry_point_command_external raw;
4393 
4394   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4395       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4396     return FALSE;
4397 
4398   cmd->entryoff = bfd_get_64 (abfd, raw.entryoff);
4399   cmd->stacksize = bfd_get_64 (abfd, raw.stacksize);
4400   return TRUE;
4401 }
4402 
4403 static bfd_boolean
bfd_mach_o_read_source_version(bfd * abfd,bfd_mach_o_load_command * command)4404 bfd_mach_o_read_source_version (bfd *abfd, bfd_mach_o_load_command *command)
4405 {
4406   bfd_mach_o_source_version_command *cmd = &command->command.source_version;
4407   struct mach_o_source_version_command_external raw;
4408   bfd_uint64_t ver;
4409 
4410   if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4411       || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4412     return FALSE;
4413 
4414   ver = bfd_get_64 (abfd, raw.version);
4415   /* Note: we use a serie of shift to avoid shift > 32 (for which gcc
4416      generates warnings) in case of the host doesn't support 64 bit
4417      integers.  */
4418   cmd->e = ver & 0x3ff;
4419   ver >>= 10;
4420   cmd->d = ver & 0x3ff;
4421   ver >>= 10;
4422   cmd->c = ver & 0x3ff;
4423   ver >>= 10;
4424   cmd->b = ver & 0x3ff;
4425   ver >>= 10;
4426   cmd->a = ver & 0xffffff;
4427   return TRUE;
4428 }
4429 
4430 static bfd_boolean
bfd_mach_o_read_segment(bfd * abfd,bfd_mach_o_load_command * command,unsigned int wide)4431 bfd_mach_o_read_segment (bfd *abfd,
4432                          bfd_mach_o_load_command *command,
4433                          unsigned int wide)
4434 {
4435   bfd_mach_o_segment_command *seg = &command->command.segment;
4436   unsigned long i;
4437 
4438   if (wide)
4439     {
4440       struct mach_o_segment_command_64_external raw;
4441 
4442       BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
4443 
4444       if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4445           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4446         return FALSE;
4447 
4448       memcpy (seg->segname, raw.segname, 16);
4449       seg->segname[16] = '\0';
4450 
4451       seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr);
4452       seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize);
4453       seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff);
4454       seg->filesize = bfd_h_get_64 (abfd, raw.filesize);
4455       seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
4456       seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
4457       seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
4458       seg->flags = bfd_h_get_32 (abfd, raw.flags);
4459     }
4460   else
4461     {
4462       struct mach_o_segment_command_32_external raw;
4463 
4464       BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
4465 
4466       if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
4467           || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4468         return FALSE;
4469 
4470       memcpy (seg->segname, raw.segname, 16);
4471       seg->segname[16] = '\0';
4472 
4473       seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr);
4474       seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize);
4475       seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff);
4476       seg->filesize = bfd_h_get_32 (abfd, raw.filesize);
4477       seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
4478       seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
4479       seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
4480       seg->flags = bfd_h_get_32 (abfd, raw.flags);
4481     }
4482   seg->sect_head = NULL;
4483   seg->sect_tail = NULL;
4484 
4485   for (i = 0; i < seg->nsects; i++)
4486     {
4487       bfd_vma segoff;
4488       asection *sec;
4489 
4490       if (wide)
4491         segoff = command->offset + BFD_MACH_O_LC_SEGMENT_64_SIZE
4492           + (i * BFD_MACH_O_SECTION_64_SIZE);
4493       else
4494         segoff = command->offset + BFD_MACH_O_LC_SEGMENT_SIZE
4495           + (i * BFD_MACH_O_SECTION_SIZE);
4496 
4497       sec = bfd_mach_o_read_section (abfd, segoff, seg->initprot, wide);
4498       if (sec == NULL)
4499         return FALSE;
4500 
4501       bfd_mach_o_append_section_to_segment
4502 	(seg, bfd_mach_o_get_mach_o_section (sec));
4503     }
4504 
4505   return TRUE;
4506 }
4507 
4508 static bfd_boolean
bfd_mach_o_read_segment_32(bfd * abfd,bfd_mach_o_load_command * command)4509 bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
4510 {
4511   return bfd_mach_o_read_segment (abfd, command, 0);
4512 }
4513 
4514 static bfd_boolean
bfd_mach_o_read_segment_64(bfd * abfd,bfd_mach_o_load_command * command)4515 bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
4516 {
4517   return bfd_mach_o_read_segment (abfd, command, 1);
4518 }
4519 
4520 static bfd_boolean
bfd_mach_o_read_command(bfd * abfd,bfd_mach_o_load_command * command)4521 bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command)
4522 {
4523   struct mach_o_load_command_external raw;
4524   unsigned int cmd;
4525 
4526   /* Read command type and length.  */
4527   if (bfd_seek (abfd, command->offset, SEEK_SET) != 0
4528       || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE)
4529     return FALSE;
4530 
4531   cmd = bfd_h_get_32 (abfd, raw.cmd);
4532   command->type =  cmd & ~BFD_MACH_O_LC_REQ_DYLD;
4533   command->type_required = cmd & BFD_MACH_O_LC_REQ_DYLD ? TRUE : FALSE;
4534   command->len = bfd_h_get_32 (abfd, raw.cmdsize);
4535 
4536   switch (command->type)
4537     {
4538     case BFD_MACH_O_LC_SEGMENT:
4539       if (!bfd_mach_o_read_segment_32 (abfd, command))
4540 	return FALSE;
4541       break;
4542     case BFD_MACH_O_LC_SEGMENT_64:
4543       if (!bfd_mach_o_read_segment_64 (abfd, command))
4544 	return FALSE;
4545       break;
4546     case BFD_MACH_O_LC_SYMTAB:
4547       if (!bfd_mach_o_read_symtab (abfd, command))
4548 	return FALSE;
4549       break;
4550     case BFD_MACH_O_LC_SYMSEG:
4551       break;
4552     case BFD_MACH_O_LC_THREAD:
4553     case BFD_MACH_O_LC_UNIXTHREAD:
4554       if (!bfd_mach_o_read_thread (abfd, command))
4555 	return FALSE;
4556       break;
4557     case BFD_MACH_O_LC_LOAD_DYLINKER:
4558     case BFD_MACH_O_LC_ID_DYLINKER:
4559     case BFD_MACH_O_LC_DYLD_ENVIRONMENT:
4560       if (!bfd_mach_o_read_dylinker (abfd, command))
4561 	return FALSE;
4562       break;
4563     case BFD_MACH_O_LC_LOAD_DYLIB:
4564     case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
4565     case BFD_MACH_O_LC_ID_DYLIB:
4566     case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
4567     case BFD_MACH_O_LC_REEXPORT_DYLIB:
4568     case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
4569       if (!bfd_mach_o_read_dylib (abfd, command))
4570 	return FALSE;
4571       break;
4572     case BFD_MACH_O_LC_PREBOUND_DYLIB:
4573       if (!bfd_mach_o_read_prebound_dylib (abfd, command))
4574 	return FALSE;
4575       break;
4576     case BFD_MACH_O_LC_LOADFVMLIB:
4577     case BFD_MACH_O_LC_IDFVMLIB:
4578       if (!bfd_mach_o_read_fvmlib (abfd, command))
4579 	return FALSE;
4580       break;
4581     case BFD_MACH_O_LC_IDENT:
4582     case BFD_MACH_O_LC_FVMFILE:
4583     case BFD_MACH_O_LC_PREPAGE:
4584     case BFD_MACH_O_LC_ROUTINES:
4585     case BFD_MACH_O_LC_ROUTINES_64:
4586       break;
4587     case BFD_MACH_O_LC_SUB_FRAMEWORK:
4588     case BFD_MACH_O_LC_SUB_UMBRELLA:
4589     case BFD_MACH_O_LC_SUB_LIBRARY:
4590     case BFD_MACH_O_LC_SUB_CLIENT:
4591     case BFD_MACH_O_LC_RPATH:
4592       if (!bfd_mach_o_read_str (abfd, command))
4593         return FALSE;
4594       break;
4595     case BFD_MACH_O_LC_DYSYMTAB:
4596       if (!bfd_mach_o_read_dysymtab (abfd, command))
4597 	return FALSE;
4598       break;
4599     case BFD_MACH_O_LC_PREBIND_CKSUM:
4600       if (!bfd_mach_o_read_prebind_cksum (abfd, command))
4601 	return FALSE;
4602       break;
4603     case BFD_MACH_O_LC_TWOLEVEL_HINTS:
4604       if (!bfd_mach_o_read_twolevel_hints (abfd, command))
4605 	return FALSE;
4606       break;
4607     case BFD_MACH_O_LC_UUID:
4608       if (!bfd_mach_o_read_uuid (abfd, command))
4609 	return FALSE;
4610       break;
4611     case BFD_MACH_O_LC_CODE_SIGNATURE:
4612     case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
4613     case BFD_MACH_O_LC_FUNCTION_STARTS:
4614     case BFD_MACH_O_LC_DATA_IN_CODE:
4615     case BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS:
4616       if (!bfd_mach_o_read_linkedit (abfd, command))
4617 	return FALSE;
4618       break;
4619     case BFD_MACH_O_LC_ENCRYPTION_INFO:
4620       if (!bfd_mach_o_read_encryption_info (abfd, command))
4621 	return FALSE;
4622       break;
4623     case BFD_MACH_O_LC_DYLD_INFO:
4624       if (!bfd_mach_o_read_dyld_info (abfd, command))
4625 	return FALSE;
4626       break;
4627     case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
4628     case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
4629       if (!bfd_mach_o_read_version_min (abfd, command))
4630 	return FALSE;
4631       break;
4632     case BFD_MACH_O_LC_MAIN:
4633       if (!bfd_mach_o_read_main (abfd, command))
4634 	return FALSE;
4635       break;
4636     case BFD_MACH_O_LC_SOURCE_VERSION:
4637       if (!bfd_mach_o_read_source_version (abfd, command))
4638 	return FALSE;
4639       break;
4640     default:
4641       (*_bfd_error_handler)(_("%B: unknown load command 0x%lx"),
4642          abfd, (unsigned long) command->type);
4643       break;
4644     }
4645 
4646   return TRUE;
4647 }
4648 
4649 static void
bfd_mach_o_flatten_sections(bfd * abfd)4650 bfd_mach_o_flatten_sections (bfd *abfd)
4651 {
4652   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4653   bfd_mach_o_load_command *cmd;
4654   long csect = 0;
4655 
4656   /* Count total number of sections.  */
4657   mdata->nsects = 0;
4658 
4659   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
4660     {
4661       if (cmd->type == BFD_MACH_O_LC_SEGMENT
4662 	  || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
4663 	{
4664 	  bfd_mach_o_segment_command *seg = &cmd->command.segment;
4665 
4666 	  mdata->nsects += seg->nsects;
4667 	}
4668     }
4669 
4670   /* Allocate sections array.  */
4671   mdata->sections = bfd_alloc (abfd,
4672 			       mdata->nsects * sizeof (bfd_mach_o_section *));
4673 
4674   /* Fill the array.  */
4675   csect = 0;
4676 
4677   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
4678     {
4679       if (cmd->type == BFD_MACH_O_LC_SEGMENT
4680 	  || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
4681 	{
4682 	  bfd_mach_o_segment_command *seg = &cmd->command.segment;
4683           bfd_mach_o_section *sec;
4684 
4685 	  BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
4686 
4687           for (sec = seg->sect_head; sec != NULL; sec = sec->next)
4688 	    mdata->sections[csect++] = sec;
4689 	}
4690     }
4691 }
4692 
4693 static bfd_boolean
bfd_mach_o_scan_start_address(bfd * abfd)4694 bfd_mach_o_scan_start_address (bfd *abfd)
4695 {
4696   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4697   bfd_mach_o_thread_command *thr = NULL;
4698   bfd_mach_o_load_command *cmd;
4699   unsigned long i;
4700 
4701   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
4702     if (cmd->type == BFD_MACH_O_LC_THREAD
4703 	|| cmd->type == BFD_MACH_O_LC_UNIXTHREAD)
4704       {
4705         thr = &cmd->command.thread;
4706         break;
4707       }
4708     else if (cmd->type == BFD_MACH_O_LC_MAIN && mdata->nsects > 1)
4709       {
4710 	bfd_mach_o_main_command *main_cmd = &cmd->command.main;
4711 	bfd_mach_o_section *text_sect = mdata->sections[0];
4712 
4713 	if (text_sect)
4714 	  {
4715 	    abfd->start_address = main_cmd->entryoff
4716 	      + (text_sect->addr - text_sect->offset);
4717 	    return TRUE;
4718 	  }
4719       }
4720 
4721   /* An object file has no start address, so do not fail if not found.  */
4722   if (thr == NULL)
4723     return TRUE;
4724 
4725   /* FIXME: create a subtarget hook ?  */
4726   for (i = 0; i < thr->nflavours; i++)
4727     {
4728       if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
4729 	  && (thr->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE32))
4730 	{
4731 	  unsigned char buf[4];
4732 
4733 	  if (bfd_seek (abfd, thr->flavours[i].offset + 40, SEEK_SET) != 0
4734               || bfd_bread (buf, 4, abfd) != 4)
4735 	    return FALSE;
4736 
4737 	  abfd->start_address = bfd_h_get_32 (abfd, buf);
4738 	}
4739       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
4740 	       && (thr->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
4741 	{
4742 	  unsigned char buf[4];
4743 
4744 	  if (bfd_seek (abfd, thr->flavours[i].offset + 0, SEEK_SET) != 0
4745               || bfd_bread (buf, 4, abfd) != 4)
4746 	    return FALSE;
4747 
4748 	  abfd->start_address = bfd_h_get_32 (abfd, buf);
4749 	}
4750       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
4751                && (thr->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64))
4752         {
4753           unsigned char buf[8];
4754 
4755           if (bfd_seek (abfd, thr->flavours[i].offset + 0, SEEK_SET) != 0
4756               || bfd_bread (buf, 8, abfd) != 8)
4757             return FALSE;
4758 
4759           abfd->start_address = bfd_h_get_64 (abfd, buf);
4760         }
4761       else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
4762                && (thr->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
4763         {
4764           unsigned char buf[8];
4765 
4766           if (bfd_seek (abfd, thr->flavours[i].offset + (16 * 8), SEEK_SET) != 0
4767               || bfd_bread (buf, 8, abfd) != 8)
4768             return FALSE;
4769 
4770           abfd->start_address = bfd_h_get_64 (abfd, buf);
4771         }
4772     }
4773 
4774   return TRUE;
4775 }
4776 
4777 bfd_boolean
bfd_mach_o_set_arch_mach(bfd * abfd,enum bfd_architecture arch,unsigned long machine)4778 bfd_mach_o_set_arch_mach (bfd *abfd,
4779                           enum bfd_architecture arch,
4780                           unsigned long machine)
4781 {
4782   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
4783 
4784   /* If this isn't the right architecture for this backend, and this
4785      isn't the generic backend, fail.  */
4786   if (arch != bed->arch
4787       && arch != bfd_arch_unknown
4788       && bed->arch != bfd_arch_unknown)
4789     return FALSE;
4790 
4791   return bfd_default_set_arch_mach (abfd, arch, machine);
4792 }
4793 
4794 static bfd_boolean
bfd_mach_o_scan(bfd * abfd,bfd_mach_o_header * header,bfd_mach_o_data_struct * mdata)4795 bfd_mach_o_scan (bfd *abfd,
4796 		 bfd_mach_o_header *header,
4797 		 bfd_mach_o_data_struct *mdata)
4798 {
4799   unsigned int i;
4800   enum bfd_architecture cputype;
4801   unsigned long cpusubtype;
4802   unsigned int hdrsize;
4803 
4804   hdrsize = mach_o_wide_p (header) ?
4805     BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
4806 
4807   mdata->header = *header;
4808 
4809   abfd->flags = abfd->flags & BFD_IN_MEMORY;
4810   switch (header->filetype)
4811     {
4812     case BFD_MACH_O_MH_OBJECT:
4813       abfd->flags |= HAS_RELOC;
4814       break;
4815     case BFD_MACH_O_MH_EXECUTE:
4816       abfd->flags |= EXEC_P;
4817       break;
4818     case BFD_MACH_O_MH_DYLIB:
4819     case BFD_MACH_O_MH_BUNDLE:
4820       abfd->flags |= DYNAMIC;
4821       break;
4822     }
4823 
4824   abfd->tdata.mach_o_data = mdata;
4825 
4826   bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
4827 				   &cputype, &cpusubtype);
4828   if (cputype == bfd_arch_unknown)
4829     {
4830       (*_bfd_error_handler)
4831         (_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"),
4832          header->cputype, header->cpusubtype);
4833       return FALSE;
4834     }
4835 
4836   bfd_set_arch_mach (abfd, cputype, cpusubtype);
4837 
4838   if (header->ncmds != 0)
4839     {
4840       bfd_mach_o_load_command *cmd;
4841 
4842       mdata->first_command = NULL;
4843       mdata->last_command = NULL;
4844       cmd = bfd_alloc (abfd, header->ncmds * sizeof (bfd_mach_o_load_command));
4845       if (cmd == NULL)
4846 	return FALSE;
4847 
4848       for (i = 0; i < header->ncmds; i++)
4849 	{
4850 	  bfd_mach_o_load_command *cur = &cmd[i];
4851 
4852 	  bfd_mach_o_append_command (abfd, cur);
4853 
4854 	  if (i == 0)
4855 	    cur->offset = hdrsize;
4856 	  else
4857 	    {
4858 	      bfd_mach_o_load_command *prev = &cmd[i - 1];
4859 	      cur->offset = prev->offset + prev->len;
4860 	    }
4861 
4862 	  if (!bfd_mach_o_read_command (abfd, cur))
4863 	    return FALSE;
4864 	}
4865     }
4866 
4867   /* Sections should be flatten before scanning start address.  */
4868   bfd_mach_o_flatten_sections (abfd);
4869   if (!bfd_mach_o_scan_start_address (abfd))
4870     return FALSE;
4871 
4872   return TRUE;
4873 }
4874 
4875 bfd_boolean
bfd_mach_o_mkobject_init(bfd * abfd)4876 bfd_mach_o_mkobject_init (bfd *abfd)
4877 {
4878   bfd_mach_o_data_struct *mdata = NULL;
4879 
4880   mdata = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
4881   if (mdata == NULL)
4882     return FALSE;
4883   abfd->tdata.mach_o_data = mdata;
4884 
4885   mdata->header.magic = 0;
4886   mdata->header.cputype = 0;
4887   mdata->header.cpusubtype = 0;
4888   mdata->header.filetype = 0;
4889   mdata->header.ncmds = 0;
4890   mdata->header.sizeofcmds = 0;
4891   mdata->header.flags = 0;
4892   mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
4893   mdata->first_command = NULL;
4894   mdata->last_command = NULL;
4895   mdata->nsects = 0;
4896   mdata->sections = NULL;
4897   mdata->dyn_reloc_cache = NULL;
4898 
4899   return TRUE;
4900 }
4901 
4902 static bfd_boolean
bfd_mach_o_gen_mkobject(bfd * abfd)4903 bfd_mach_o_gen_mkobject (bfd *abfd)
4904 {
4905   bfd_mach_o_data_struct *mdata;
4906 
4907   if (!bfd_mach_o_mkobject_init (abfd))
4908     return FALSE;
4909 
4910   mdata = bfd_mach_o_get_data (abfd);
4911   mdata->header.magic = BFD_MACH_O_MH_MAGIC;
4912   mdata->header.cputype = 0;
4913   mdata->header.cpusubtype = 0;
4914   mdata->header.byteorder = abfd->xvec->byteorder;
4915   mdata->header.version = 1;
4916 
4917   return TRUE;
4918 }
4919 
4920 const bfd_target *
bfd_mach_o_header_p(bfd * abfd,bfd_mach_o_filetype filetype,bfd_mach_o_cpu_type cputype)4921 bfd_mach_o_header_p (bfd *abfd,
4922                      bfd_mach_o_filetype filetype,
4923                      bfd_mach_o_cpu_type cputype)
4924 {
4925   bfd_mach_o_header header;
4926   bfd_mach_o_data_struct *mdata;
4927 
4928   if (!bfd_mach_o_read_header (abfd, &header))
4929     goto wrong;
4930 
4931   if (! (header.byteorder == BFD_ENDIAN_BIG
4932 	 || header.byteorder == BFD_ENDIAN_LITTLE))
4933     {
4934       (*_bfd_error_handler) (_("unknown header byte-order value 0x%lx"),
4935 			     (unsigned long) header.byteorder);
4936       goto wrong;
4937     }
4938 
4939   if (! ((header.byteorder == BFD_ENDIAN_BIG
4940 	  && abfd->xvec->byteorder == BFD_ENDIAN_BIG
4941 	  && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
4942 	 || (header.byteorder == BFD_ENDIAN_LITTLE
4943 	     && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
4944 	     && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
4945     goto wrong;
4946 
4947   /* Check cputype and filetype.
4948      In case of wildcard, do not accept magics that are handled by existing
4949      targets.  */
4950   if (cputype)
4951     {
4952       if (header.cputype != cputype)
4953         goto wrong;
4954     }
4955   else
4956     {
4957 #ifndef BFD64
4958       /* Do not recognize 64 architectures if not configured for 64bit targets.
4959 	 This could happen only for generic targets.  */
4960       if (mach_o_wide_p (&header))
4961 	 goto wrong;
4962 #endif
4963     }
4964 
4965   if (filetype)
4966     {
4967       if (header.filetype != filetype)
4968         goto wrong;
4969     }
4970   else
4971     {
4972       switch (header.filetype)
4973         {
4974         case BFD_MACH_O_MH_CORE:
4975           /* Handled by core_p */
4976           goto wrong;
4977         default:
4978           break;
4979         }
4980     }
4981 
4982   mdata = (bfd_mach_o_data_struct *) bfd_zalloc (abfd, sizeof (*mdata));
4983   if (mdata == NULL)
4984     goto fail;
4985 
4986   if (!bfd_mach_o_scan (abfd, &header, mdata))
4987     goto wrong;
4988 
4989   return abfd->xvec;
4990 
4991  wrong:
4992   bfd_set_error (bfd_error_wrong_format);
4993 
4994  fail:
4995   return NULL;
4996 }
4997 
4998 static const bfd_target *
bfd_mach_o_gen_object_p(bfd * abfd)4999 bfd_mach_o_gen_object_p (bfd *abfd)
5000 {
5001   return bfd_mach_o_header_p (abfd, 0, 0);
5002 }
5003 
5004 static const bfd_target *
bfd_mach_o_gen_core_p(bfd * abfd)5005 bfd_mach_o_gen_core_p (bfd *abfd)
5006 {
5007   return bfd_mach_o_header_p (abfd, BFD_MACH_O_MH_CORE, 0);
5008 }
5009 
5010 /* Return the base address of ABFD, ie the address at which the image is
5011    mapped.  The possible initial pagezero is ignored.  */
5012 
5013 bfd_vma
bfd_mach_o_get_base_address(bfd * abfd)5014 bfd_mach_o_get_base_address (bfd *abfd)
5015 {
5016   bfd_mach_o_data_struct *mdata;
5017   bfd_mach_o_load_command *cmd;
5018 
5019   /* Check for Mach-O.  */
5020   if (!bfd_mach_o_valid (abfd))
5021     return 0;
5022   mdata = bfd_mach_o_get_data (abfd);
5023 
5024   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5025     {
5026       if ((cmd->type == BFD_MACH_O_LC_SEGMENT
5027 	   || cmd->type == BFD_MACH_O_LC_SEGMENT_64))
5028 	{
5029 	  struct bfd_mach_o_segment_command *segcmd = &cmd->command.segment;
5030 
5031 	  if (segcmd->initprot != 0)
5032 	    return segcmd->vmaddr;
5033 	}
5034     }
5035   return 0;
5036 }
5037 
5038 typedef struct mach_o_fat_archentry
5039 {
5040   unsigned long cputype;
5041   unsigned long cpusubtype;
5042   unsigned long offset;
5043   unsigned long size;
5044   unsigned long align;
5045 } mach_o_fat_archentry;
5046 
5047 typedef struct mach_o_fat_data_struct
5048 {
5049   unsigned long magic;
5050   unsigned long nfat_arch;
5051   mach_o_fat_archentry *archentries;
5052 } mach_o_fat_data_struct;
5053 
5054 const bfd_target *
bfd_mach_o_archive_p(bfd * abfd)5055 bfd_mach_o_archive_p (bfd *abfd)
5056 {
5057   mach_o_fat_data_struct *adata = NULL;
5058   struct mach_o_fat_header_external hdr;
5059   unsigned long i;
5060 
5061   if (bfd_seek (abfd, 0, SEEK_SET) != 0
5062       || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
5063     goto error;
5064 
5065   adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
5066   if (adata == NULL)
5067     goto error;
5068 
5069   adata->magic = bfd_getb32 (hdr.magic);
5070   adata->nfat_arch = bfd_getb32 (hdr.nfat_arch);
5071   if (adata->magic != 0xcafebabe)
5072     goto error;
5073   /* Avoid matching Java bytecode files, which have the same magic number.
5074      In the Java bytecode file format this field contains the JVM version,
5075      which starts at 43.0.  */
5076   if (adata->nfat_arch > 30)
5077     goto error;
5078 
5079   adata->archentries =
5080     bfd_alloc (abfd, adata->nfat_arch * sizeof (mach_o_fat_archentry));
5081   if (adata->archentries == NULL)
5082     goto error;
5083 
5084   for (i = 0; i < adata->nfat_arch; i++)
5085     {
5086       struct mach_o_fat_arch_external arch;
5087       if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch))
5088 	goto error;
5089       adata->archentries[i].cputype = bfd_getb32 (arch.cputype);
5090       adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype);
5091       adata->archentries[i].offset = bfd_getb32 (arch.offset);
5092       adata->archentries[i].size = bfd_getb32 (arch.size);
5093       adata->archentries[i].align = bfd_getb32 (arch.align);
5094     }
5095 
5096   abfd->tdata.mach_o_fat_data = adata;
5097   return abfd->xvec;
5098 
5099  error:
5100   if (adata != NULL)
5101     bfd_release (abfd, adata);
5102   bfd_set_error (bfd_error_wrong_format);
5103   return NULL;
5104 }
5105 
5106 /* Set the filename for a fat binary member ABFD, whose bfd architecture is
5107    ARCH_TYPE/ARCH_SUBTYPE and corresponding entry in header is ENTRY.
5108    Set arelt_data and origin fields too.  */
5109 
5110 static void
bfd_mach_o_fat_member_init(bfd * abfd,enum bfd_architecture arch_type,unsigned long arch_subtype,mach_o_fat_archentry * entry)5111 bfd_mach_o_fat_member_init (bfd *abfd,
5112                             enum bfd_architecture arch_type,
5113                             unsigned long arch_subtype,
5114                             mach_o_fat_archentry *entry)
5115 {
5116   struct areltdata *areltdata;
5117   /* Create the member filename. Use ARCH_NAME.  */
5118   const bfd_arch_info_type *ap = bfd_lookup_arch (arch_type, arch_subtype);
5119 
5120   if (ap)
5121     {
5122       /* Use the architecture name if known.  */
5123       abfd->filename = xstrdup (ap->printable_name);
5124     }
5125   else
5126     {
5127       /* Forge a uniq id.  */
5128       const size_t namelen = 2 + 8 + 1 + 2 + 8 + 1;
5129       char *name = xmalloc (namelen);
5130       snprintf (name, namelen, "0x%lx-0x%lx",
5131                 entry->cputype, entry->cpusubtype);
5132       abfd->filename = name;
5133     }
5134 
5135   areltdata = bfd_zmalloc (sizeof (struct areltdata));
5136   areltdata->parsed_size = entry->size;
5137   abfd->arelt_data = areltdata;
5138   abfd->iostream = NULL;
5139   abfd->origin = entry->offset;
5140 }
5141 
5142 bfd *
bfd_mach_o_openr_next_archived_file(bfd * archive,bfd * prev)5143 bfd_mach_o_openr_next_archived_file (bfd *archive, bfd *prev)
5144 {
5145   mach_o_fat_data_struct *adata;
5146   mach_o_fat_archentry *entry = NULL;
5147   unsigned long i;
5148   bfd *nbfd;
5149   enum bfd_architecture arch_type;
5150   unsigned long arch_subtype;
5151 
5152   adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
5153   BFD_ASSERT (adata != NULL);
5154 
5155   /* Find index of previous entry.  */
5156   if (prev == NULL)
5157     {
5158       /* Start at first one.  */
5159       i = 0;
5160     }
5161   else
5162     {
5163       /* Find index of PREV.  */
5164       for (i = 0; i < adata->nfat_arch; i++)
5165 	{
5166 	  if (adata->archentries[i].offset == prev->origin)
5167 	    break;
5168 	}
5169 
5170       if (i == adata->nfat_arch)
5171 	{
5172 	  /* Not found.  */
5173 	  bfd_set_error (bfd_error_bad_value);
5174 	  return NULL;
5175 	}
5176 
5177       /* Get next entry.  */
5178       i++;
5179     }
5180 
5181   if (i >= adata->nfat_arch)
5182     {
5183       bfd_set_error (bfd_error_no_more_archived_files);
5184       return NULL;
5185     }
5186 
5187   entry = &adata->archentries[i];
5188   nbfd = _bfd_new_bfd_contained_in (archive);
5189   if (nbfd == NULL)
5190     return NULL;
5191 
5192   bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
5193 				   &arch_type, &arch_subtype);
5194 
5195   bfd_mach_o_fat_member_init (nbfd, arch_type, arch_subtype, entry);
5196 
5197   bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
5198 
5199   return nbfd;
5200 }
5201 
5202 /* Analogous to stat call.  */
5203 
5204 static int
bfd_mach_o_fat_stat_arch_elt(bfd * abfd,struct stat * buf)5205 bfd_mach_o_fat_stat_arch_elt (bfd *abfd, struct stat *buf)
5206 {
5207   if (abfd->arelt_data == NULL)
5208     {
5209       bfd_set_error (bfd_error_invalid_operation);
5210       return -1;
5211     }
5212 
5213   buf->st_mtime = 0;
5214   buf->st_uid = 0;
5215   buf->st_gid = 0;
5216   buf->st_mode = 0644;
5217   buf->st_size = arelt_size (abfd);
5218 
5219   return 0;
5220 }
5221 
5222 /* If ABFD format is FORMAT and architecture is ARCH, return it.
5223    If ABFD is a fat image containing a member that corresponds to FORMAT
5224    and ARCH, returns it.
5225    In other case, returns NULL.
5226    This function allows transparent uses of fat images.  */
5227 
5228 bfd *
bfd_mach_o_fat_extract(bfd * abfd,bfd_format format,const bfd_arch_info_type * arch)5229 bfd_mach_o_fat_extract (bfd *abfd,
5230 			bfd_format format,
5231 			const bfd_arch_info_type *arch)
5232 {
5233   bfd *res;
5234   mach_o_fat_data_struct *adata;
5235   unsigned int i;
5236 
5237   if (bfd_check_format (abfd, format))
5238     {
5239       if (bfd_get_arch_info (abfd) == arch)
5240 	return abfd;
5241       return NULL;
5242     }
5243   if (!bfd_check_format (abfd, bfd_archive)
5244       || abfd->xvec != &mach_o_fat_vec)
5245     return NULL;
5246 
5247   /* This is a Mach-O fat image.  */
5248   adata = (mach_o_fat_data_struct *) abfd->tdata.mach_o_fat_data;
5249   BFD_ASSERT (adata != NULL);
5250 
5251   for (i = 0; i < adata->nfat_arch; i++)
5252     {
5253       struct mach_o_fat_archentry *e = &adata->archentries[i];
5254       enum bfd_architecture cpu_type;
5255       unsigned long cpu_subtype;
5256 
5257       bfd_mach_o_convert_architecture (e->cputype, e->cpusubtype,
5258 				       &cpu_type, &cpu_subtype);
5259       if (cpu_type != arch->arch || cpu_subtype != arch->mach)
5260 	continue;
5261 
5262       /* The architecture is found.  */
5263       res = _bfd_new_bfd_contained_in (abfd);
5264       if (res == NULL)
5265 	return NULL;
5266 
5267       bfd_mach_o_fat_member_init (res, cpu_type, cpu_subtype, e);
5268 
5269       if (bfd_check_format (res, format))
5270 	{
5271 	  BFD_ASSERT (bfd_get_arch_info (res) == arch);
5272 	  return res;
5273 	}
5274       bfd_close (res);
5275       return NULL;
5276     }
5277 
5278   return NULL;
5279 }
5280 
5281 int
bfd_mach_o_lookup_command(bfd * abfd,bfd_mach_o_load_command_type type,bfd_mach_o_load_command ** mcommand)5282 bfd_mach_o_lookup_command (bfd *abfd,
5283 			   bfd_mach_o_load_command_type type,
5284 			   bfd_mach_o_load_command **mcommand)
5285 {
5286   struct mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5287   struct bfd_mach_o_load_command *cmd;
5288   unsigned int num;
5289 
5290   BFD_ASSERT (mdata != NULL);
5291   BFD_ASSERT (mcommand != NULL);
5292 
5293   num = 0;
5294   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5295     {
5296       if (cmd->type != type)
5297 	continue;
5298 
5299       if (num == 0)
5300 	*mcommand = cmd;
5301       num++;
5302     }
5303 
5304   return num;
5305 }
5306 
5307 unsigned long
bfd_mach_o_stack_addr(enum bfd_mach_o_cpu_type type)5308 bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type type)
5309 {
5310   switch (type)
5311     {
5312     case BFD_MACH_O_CPU_TYPE_MC680x0:
5313       return 0x04000000;
5314     case BFD_MACH_O_CPU_TYPE_MC88000:
5315       return 0xffffe000;
5316     case BFD_MACH_O_CPU_TYPE_POWERPC:
5317       return 0xc0000000;
5318     case BFD_MACH_O_CPU_TYPE_I386:
5319       return 0xc0000000;
5320     case BFD_MACH_O_CPU_TYPE_SPARC:
5321       return 0xf0000000;
5322     case BFD_MACH_O_CPU_TYPE_I860:
5323       return 0;
5324     case BFD_MACH_O_CPU_TYPE_HPPA:
5325       return 0xc0000000 - 0x04000000;
5326     default:
5327       return 0;
5328     }
5329 }
5330 
5331 /* The following two tables should be kept, as far as possible, in order of
5332    most frequently used entries to optimize their use from gas.  */
5333 
5334 const bfd_mach_o_xlat_name bfd_mach_o_section_type_name[] =
5335 {
5336   { "regular", BFD_MACH_O_S_REGULAR},
5337   { "coalesced", BFD_MACH_O_S_COALESCED},
5338   { "zerofill", BFD_MACH_O_S_ZEROFILL},
5339   { "cstring_literals", BFD_MACH_O_S_CSTRING_LITERALS},
5340   { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
5341   { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
5342   { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
5343   { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
5344   { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
5345   { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
5346   { "gb_zerofill", BFD_MACH_O_S_GB_ZEROFILL},
5347   { "interposing", BFD_MACH_O_S_INTERPOSING},
5348   { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
5349   { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
5350   { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
5351   { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
5352   { "lazy_dylib_symbol_pointers", BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
5353   { NULL, 0}
5354 };
5355 
5356 const bfd_mach_o_xlat_name bfd_mach_o_section_attribute_name[] =
5357 {
5358   { "pure_instructions", BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS },
5359   { "some_instructions", BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS },
5360   { "loc_reloc", BFD_MACH_O_S_ATTR_LOC_RELOC },
5361   { "ext_reloc", BFD_MACH_O_S_ATTR_EXT_RELOC },
5362   { "debug", BFD_MACH_O_S_ATTR_DEBUG },
5363   { "live_support", BFD_MACH_O_S_ATTR_LIVE_SUPPORT },
5364   { "no_dead_strip", BFD_MACH_O_S_ATTR_NO_DEAD_STRIP },
5365   { "strip_static_syms", BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS },
5366   { "no_toc", BFD_MACH_O_S_ATTR_NO_TOC },
5367   { "self_modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
5368   { "modifying_code", BFD_MACH_O_S_SELF_MODIFYING_CODE },
5369   { NULL, 0}
5370 };
5371 
5372 /* Get the section type from NAME.  Return 256 if NAME is unknown.  */
5373 
5374 unsigned int
bfd_mach_o_get_section_type_from_name(bfd * abfd,const char * name)5375 bfd_mach_o_get_section_type_from_name (bfd *abfd, const char *name)
5376 {
5377   const bfd_mach_o_xlat_name *x;
5378   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
5379 
5380   for (x = bfd_mach_o_section_type_name; x->name; x++)
5381     if (strcmp (x->name, name) == 0)
5382       {
5383 	/* We found it... does the target support it?  */
5384 	if (bed->bfd_mach_o_section_type_valid_for_target == NULL
5385 	    || bed->bfd_mach_o_section_type_valid_for_target (x->val))
5386 	  return x->val; /* OK.  */
5387 	else
5388 	  break; /* Not supported.  */
5389       }
5390   /* Maximum section ID = 0xff.  */
5391   return 256;
5392 }
5393 
5394 /* Get the section attribute from NAME.  Return -1 if NAME is unknown.  */
5395 
5396 unsigned int
bfd_mach_o_get_section_attribute_from_name(const char * name)5397 bfd_mach_o_get_section_attribute_from_name (const char *name)
5398 {
5399   const bfd_mach_o_xlat_name *x;
5400 
5401   for (x = bfd_mach_o_section_attribute_name; x->name; x++)
5402     if (strcmp (x->name, name) == 0)
5403       return x->val;
5404   return (unsigned int)-1;
5405 }
5406 
5407 int
bfd_mach_o_core_fetch_environment(bfd * abfd,unsigned char ** rbuf,unsigned int * rlen)5408 bfd_mach_o_core_fetch_environment (bfd *abfd,
5409 				   unsigned char **rbuf,
5410 				   unsigned int *rlen)
5411 {
5412   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5413   unsigned long stackaddr = bfd_mach_o_stack_addr (mdata->header.cputype);
5414   bfd_mach_o_load_command *cmd;
5415 
5416   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5417     {
5418       bfd_mach_o_segment_command *seg;
5419 
5420       if (cmd->type != BFD_MACH_O_LC_SEGMENT)
5421 	continue;
5422 
5423       seg = &cmd->command.segment;
5424 
5425       if ((seg->vmaddr + seg->vmsize) == stackaddr)
5426 	{
5427 	  unsigned long start = seg->fileoff;
5428 	  unsigned long end = seg->fileoff + seg->filesize;
5429 	  unsigned char *buf = bfd_malloc (1024);
5430 	  unsigned long size = 1024;
5431 
5432 	  for (;;)
5433 	    {
5434 	      bfd_size_type nread = 0;
5435 	      unsigned long offset;
5436 	      int found_nonnull = 0;
5437 
5438 	      if (size > (end - start))
5439 		size = (end - start);
5440 
5441 	      buf = bfd_realloc_or_free (buf, size);
5442 	      if (buf == NULL)
5443 		return -1;
5444 
5445 	      if (bfd_seek (abfd, end - size, SEEK_SET) != 0)
5446                 {
5447                   free (buf);
5448                   return -1;
5449                 }
5450 
5451 	      nread = bfd_bread (buf, size, abfd);
5452 
5453 	      if (nread != size)
5454 		{
5455 		  free (buf);
5456 		  return -1;
5457 		}
5458 
5459 	      for (offset = 4; offset <= size; offset += 4)
5460 		{
5461 		  unsigned long val;
5462 
5463 		  val = *((unsigned long *) (buf + size - offset));
5464 		  if (! found_nonnull)
5465 		    {
5466 		      if (val != 0)
5467 			found_nonnull = 1;
5468 		    }
5469 		  else if (val == 0x0)
5470 		    {
5471 		      unsigned long bottom;
5472 		      unsigned long top;
5473 
5474 		      bottom = seg->fileoff + seg->filesize - offset;
5475 		      top = seg->fileoff + seg->filesize - 4;
5476 		      *rbuf = bfd_malloc (top - bottom);
5477 		      *rlen = top - bottom;
5478 
5479 		      memcpy (*rbuf, buf + size - *rlen, *rlen);
5480 		      free (buf);
5481 		      return 0;
5482 		    }
5483 		}
5484 
5485 	      if (size == (end - start))
5486 		break;
5487 
5488 	      size *= 2;
5489 	    }
5490 
5491 	  free (buf);
5492 	}
5493     }
5494 
5495   return -1;
5496 }
5497 
5498 char *
bfd_mach_o_core_file_failing_command(bfd * abfd)5499 bfd_mach_o_core_file_failing_command (bfd *abfd)
5500 {
5501   unsigned char *buf = NULL;
5502   unsigned int len = 0;
5503   int ret;
5504 
5505   ret = bfd_mach_o_core_fetch_environment (abfd, &buf, &len);
5506   if (ret < 0)
5507     return NULL;
5508 
5509   return (char *) buf;
5510 }
5511 
5512 int
bfd_mach_o_core_file_failing_signal(bfd * abfd ATTRIBUTE_UNUSED)5513 bfd_mach_o_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
5514 {
5515   return 0;
5516 }
5517 
5518 static bfd_mach_o_uuid_command *
bfd_mach_o_lookup_uuid_command(bfd * abfd)5519 bfd_mach_o_lookup_uuid_command (bfd *abfd)
5520 {
5521   bfd_mach_o_load_command *uuid_cmd;
5522   int ncmd = bfd_mach_o_lookup_command (abfd, BFD_MACH_O_LC_UUID, &uuid_cmd);
5523   if (ncmd != 1)
5524     return FALSE;
5525   return &uuid_cmd->command.uuid;
5526 }
5527 
5528 /* Return true if ABFD is a dSYM file and its UUID matches UUID_CMD. */
5529 
5530 static bfd_boolean
bfd_mach_o_dsym_for_uuid_p(bfd * abfd,const bfd_mach_o_uuid_command * uuid_cmd)5531 bfd_mach_o_dsym_for_uuid_p (bfd *abfd, const bfd_mach_o_uuid_command *uuid_cmd)
5532 {
5533   bfd_mach_o_uuid_command *dsym_uuid_cmd;
5534 
5535   BFD_ASSERT (abfd);
5536   BFD_ASSERT (uuid_cmd);
5537 
5538   if (!bfd_check_format (abfd, bfd_object))
5539     return FALSE;
5540 
5541   if (bfd_get_flavour (abfd) != bfd_target_mach_o_flavour
5542       || bfd_mach_o_get_data (abfd) == NULL
5543       || bfd_mach_o_get_data (abfd)->header.filetype != BFD_MACH_O_MH_DSYM)
5544     return FALSE;
5545 
5546   dsym_uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd);
5547   if (dsym_uuid_cmd == NULL)
5548     return FALSE;
5549 
5550   if (memcmp (uuid_cmd->uuid, dsym_uuid_cmd->uuid,
5551               sizeof (uuid_cmd->uuid)) != 0)
5552     return FALSE;
5553 
5554   return TRUE;
5555 }
5556 
5557 /* Find a BFD in DSYM_FILENAME which matches ARCH and UUID_CMD.
5558    The caller is responsible for closing the returned BFD object and
5559    its my_archive if the returned BFD is in a fat dSYM. */
5560 
5561 static bfd *
bfd_mach_o_find_dsym(const char * dsym_filename,const bfd_mach_o_uuid_command * uuid_cmd,const bfd_arch_info_type * arch)5562 bfd_mach_o_find_dsym (const char *dsym_filename,
5563                       const bfd_mach_o_uuid_command *uuid_cmd,
5564                       const bfd_arch_info_type *arch)
5565 {
5566   bfd *base_dsym_bfd, *dsym_bfd;
5567 
5568   BFD_ASSERT (uuid_cmd);
5569 
5570   base_dsym_bfd = bfd_openr (dsym_filename, NULL);
5571   if (base_dsym_bfd == NULL)
5572     return NULL;
5573 
5574   dsym_bfd = bfd_mach_o_fat_extract (base_dsym_bfd, bfd_object, arch);
5575   if (bfd_mach_o_dsym_for_uuid_p (dsym_bfd, uuid_cmd))
5576     return dsym_bfd;
5577 
5578   bfd_close (dsym_bfd);
5579   if (base_dsym_bfd != dsym_bfd)
5580     bfd_close (base_dsym_bfd);
5581 
5582   return NULL;
5583 }
5584 
5585 /* Return a BFD created from a dSYM file for ABFD.
5586    The caller is responsible for closing the returned BFD object, its
5587    filename, and its my_archive if the returned BFD is in a fat dSYM. */
5588 
5589 static bfd *
bfd_mach_o_follow_dsym(bfd * abfd)5590 bfd_mach_o_follow_dsym (bfd *abfd)
5591 {
5592   char *dsym_filename;
5593   bfd_mach_o_uuid_command *uuid_cmd;
5594   bfd *dsym_bfd, *base_bfd = abfd;
5595   const char *base_basename;
5596 
5597   if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_mach_o_flavour)
5598     return NULL;
5599 
5600   if (abfd->my_archive)
5601     base_bfd = abfd->my_archive;
5602   /* BFD may have been opened from a stream. */
5603   if (base_bfd->filename == NULL)
5604     {
5605       bfd_set_error (bfd_error_invalid_operation);
5606       return NULL;
5607     }
5608   base_basename = lbasename (base_bfd->filename);
5609 
5610   uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd);
5611   if (uuid_cmd == NULL)
5612     return NULL;
5613 
5614   /* TODO: We assume the DWARF file has the same as the binary's.
5615      It seems apple's GDB checks all files in the dSYM bundle directory.
5616      http://opensource.apple.com/source/gdb/gdb-1708/src/gdb/macosx/macosx-tdep.c
5617   */
5618   dsym_filename = (char *)bfd_malloc (strlen (base_bfd->filename)
5619                                        + strlen (dsym_subdir) + 1
5620                                        + strlen (base_basename) + 1);
5621   sprintf (dsym_filename, "%s%s/%s",
5622            base_bfd->filename, dsym_subdir, base_basename);
5623 
5624   dsym_bfd = bfd_mach_o_find_dsym (dsym_filename, uuid_cmd,
5625                                    bfd_get_arch_info (abfd));
5626   if (dsym_bfd == NULL)
5627     free (dsym_filename);
5628 
5629   return dsym_bfd;
5630 }
5631 
5632 bfd_boolean
bfd_mach_o_find_nearest_line(bfd * abfd,asymbol ** symbols,asection * section,bfd_vma offset,const char ** filename_ptr,const char ** functionname_ptr,unsigned int * line_ptr,unsigned int * discriminator_ptr)5633 bfd_mach_o_find_nearest_line (bfd *abfd,
5634 			      asymbol **symbols,
5635 			      asection *section,
5636 			      bfd_vma offset,
5637 			      const char **filename_ptr,
5638 			      const char **functionname_ptr,
5639 			      unsigned int *line_ptr,
5640 			      unsigned int *discriminator_ptr)
5641 {
5642   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5643   if (mdata == NULL)
5644     return FALSE;
5645   switch (mdata->header.filetype)
5646     {
5647     case BFD_MACH_O_MH_OBJECT:
5648       break;
5649     case BFD_MACH_O_MH_EXECUTE:
5650     case BFD_MACH_O_MH_DYLIB:
5651     case BFD_MACH_O_MH_BUNDLE:
5652     case BFD_MACH_O_MH_KEXT_BUNDLE:
5653       if (mdata->dwarf2_find_line_info == NULL)
5654         {
5655           mdata->dsym_bfd = bfd_mach_o_follow_dsym (abfd);
5656           /* When we couldn't find dSYM for this binary, we look for
5657              the debug information in the binary itself. In this way,
5658              we won't try finding separated dSYM again because
5659              mdata->dwarf2_find_line_info will be filled. */
5660           if (! mdata->dsym_bfd)
5661             break;
5662           if (! _bfd_dwarf2_slurp_debug_info (abfd, mdata->dsym_bfd,
5663                                               dwarf_debug_sections, symbols,
5664                                               &mdata->dwarf2_find_line_info,
5665 					      FALSE))
5666             return FALSE;
5667         }
5668       break;
5669     default:
5670       return FALSE;
5671     }
5672   return _bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
5673 					filename_ptr, functionname_ptr,
5674 					line_ptr, discriminator_ptr,
5675 					dwarf_debug_sections, 0,
5676 					&mdata->dwarf2_find_line_info);
5677 }
5678 
5679 bfd_boolean
bfd_mach_o_close_and_cleanup(bfd * abfd)5680 bfd_mach_o_close_and_cleanup (bfd *abfd)
5681 {
5682   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5683   if (bfd_get_format (abfd) == bfd_object && mdata != NULL)
5684     {
5685       _bfd_dwarf2_cleanup_debug_info (abfd, &mdata->dwarf2_find_line_info);
5686       bfd_mach_o_free_cached_info (abfd);
5687       if (mdata->dsym_bfd != NULL)
5688         {
5689           bfd *fat_bfd = mdata->dsym_bfd->my_archive;
5690           char *dsym_filename = (char *)(fat_bfd
5691                                          ? fat_bfd->filename
5692                                          : mdata->dsym_bfd->filename);
5693           bfd_close (mdata->dsym_bfd);
5694           mdata->dsym_bfd = NULL;
5695           if (fat_bfd)
5696             bfd_close (fat_bfd);
5697           free (dsym_filename);
5698         }
5699     }
5700 
5701   if (bfd_get_format (abfd) == bfd_archive
5702       && abfd->xvec == &mach_o_fat_vec)
5703     return TRUE;
5704   return _bfd_generic_close_and_cleanup (abfd);
5705 }
5706 
bfd_mach_o_free_cached_info(bfd * abfd)5707 bfd_boolean bfd_mach_o_free_cached_info (bfd *abfd)
5708 {
5709   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5710   asection *asect;
5711   free (mdata->dyn_reloc_cache);
5712   mdata->dyn_reloc_cache = NULL;
5713   for (asect = abfd->sections; asect != NULL; asect = asect->next)
5714     {
5715       free (asect->relocation);
5716       asect->relocation = NULL;
5717     }
5718 
5719   return TRUE;
5720 }
5721 
5722 #define bfd_mach_o_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
5723 #define bfd_mach_o_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
5724 
5725 #define bfd_mach_o_swap_reloc_in NULL
5726 #define bfd_mach_o_swap_reloc_out NULL
5727 #define bfd_mach_o_print_thread NULL
5728 #define bfd_mach_o_tgt_seg_table NULL
5729 #define bfd_mach_o_section_type_valid_for_tgt NULL
5730 
5731 #define TARGET_NAME 		mach_o_be_vec
5732 #define TARGET_STRING     	"mach-o-be"
5733 #define TARGET_ARCHITECTURE	bfd_arch_unknown
5734 #define TARGET_PAGESIZE		1
5735 #define TARGET_BIG_ENDIAN 	1
5736 #define TARGET_ARCHIVE 		0
5737 #define TARGET_PRIORITY		1
5738 #include "mach-o-target.c"
5739 
5740 #undef TARGET_NAME
5741 #undef TARGET_STRING
5742 #undef TARGET_ARCHITECTURE
5743 #undef TARGET_PAGESIZE
5744 #undef TARGET_BIG_ENDIAN
5745 #undef TARGET_ARCHIVE
5746 #undef TARGET_PRIORITY
5747 
5748 #define TARGET_NAME 		mach_o_le_vec
5749 #define TARGET_STRING 		"mach-o-le"
5750 #define TARGET_ARCHITECTURE	bfd_arch_unknown
5751 #define TARGET_PAGESIZE		1
5752 #define TARGET_BIG_ENDIAN 	0
5753 #define TARGET_ARCHIVE 		0
5754 #define TARGET_PRIORITY		1
5755 
5756 #include "mach-o-target.c"
5757 
5758 #undef TARGET_NAME
5759 #undef TARGET_STRING
5760 #undef TARGET_ARCHITECTURE
5761 #undef TARGET_PAGESIZE
5762 #undef TARGET_BIG_ENDIAN
5763 #undef TARGET_ARCHIVE
5764 #undef TARGET_PRIORITY
5765 
5766 /* Not yet handled: creating an archive.  */
5767 #define bfd_mach_o_mkarchive                      _bfd_noarchive_mkarchive
5768 
5769 /* Not used.  */
5770 #define bfd_mach_o_read_ar_hdr                    _bfd_noarchive_read_ar_hdr
5771 #define bfd_mach_o_write_ar_hdr                   _bfd_noarchive_write_ar_hdr
5772 #define bfd_mach_o_slurp_armap                    _bfd_noarchive_slurp_armap
5773 #define bfd_mach_o_slurp_extended_name_table      _bfd_noarchive_slurp_extended_name_table
5774 #define bfd_mach_o_construct_extended_name_table  _bfd_noarchive_construct_extended_name_table
5775 #define bfd_mach_o_truncate_arname                _bfd_noarchive_truncate_arname
5776 #define bfd_mach_o_write_armap                    _bfd_noarchive_write_armap
5777 #define bfd_mach_o_get_elt_at_index               _bfd_noarchive_get_elt_at_index
5778 #define bfd_mach_o_generic_stat_arch_elt          bfd_mach_o_fat_stat_arch_elt
5779 #define bfd_mach_o_update_armap_timestamp         _bfd_noarchive_update_armap_timestamp
5780 
5781 #define TARGET_NAME 		mach_o_fat_vec
5782 #define TARGET_STRING 		"mach-o-fat"
5783 #define TARGET_ARCHITECTURE	bfd_arch_unknown
5784 #define TARGET_PAGESIZE		1
5785 #define TARGET_BIG_ENDIAN 	1
5786 #define TARGET_ARCHIVE 		1
5787 #define TARGET_PRIORITY		0
5788 
5789 #include "mach-o-target.c"
5790 
5791 #undef TARGET_NAME
5792 #undef TARGET_STRING
5793 #undef TARGET_ARCHITECTURE
5794 #undef TARGET_PAGESIZE
5795 #undef TARGET_BIG_ENDIAN
5796 #undef TARGET_ARCHIVE
5797 #undef TARGET_PRIORITY
5798