Coverage Report

Created: 2023-08-28 06:26

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