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