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