Coverage Report

Created: 2023-06-29 07:13

/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
1.35k
  (((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
80
{
58
80
  if (abfd == NULL || abfd->xvec == NULL)
59
0
    return false;
60
61
80
  if (abfd->xvec->flavour != bfd_target_mach_o_flavour)
62
0
    return false;
63
64
80
  if (bfd_mach_o_get_data (abfd) == NULL)
65
0
    return false;
66
80
  return true;
67
80
}
68
69
static inline bool
70
mach_o_wide_p (bfd_mach_o_header *header)
71
1.42M
{
72
1.42M
  switch (header->version)
73
1.42M
    {
74
554k
    case 1:
75
554k
      return false;
76
874k
    case 2:
77
874k
      return true;
78
0
    default:
79
0
      BFD_FAIL ();
80
0
      return false;
81
1.42M
    }
82
1.42M
}
83
84
static inline bool
85
bfd_mach_o_wide_p (bfd *abfd)
86
11.4k
{
87
11.4k
  return mach_o_wide_p (&bfd_mach_o_get_data (abfd)->header);
88
11.4k
}
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
6.23M
{
302
6.23M
  const struct mach_o_segment_name_xlat *seg;
303
6.23M
  const mach_o_section_name_xlat *sec;
304
6.23M
  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
305
306
  /* First try any target-specific translations defined...  */
307
6.23M
  if (bed->segsec_names_xlat)
308
7.52M
    for (seg = bed->segsec_names_xlat; seg->segname; seg++)
309
4.71M
      if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
310
90.6k
  for (sec = seg->sections; sec->mach_o_name; sec++)
311
57.9k
    if (strncmp (sec->mach_o_name, sectname,
312
57.9k
           BFD_MACH_O_SECTNAME_SIZE) == 0)
313
6.26k
      return sec;
314
315
  /* ... and then the Mach-O generic ones.  */
316
31.0M
  for (seg = segsec_names_xlat; seg->segname; seg++)
317
24.8M
    if (strncmp (seg->segname, segname, BFD_MACH_O_SEGNAME_SIZE) == 0)
318
787k
      for (sec = seg->sections; sec->mach_o_name; sec++)
319
723k
  if (strncmp (sec->mach_o_name, sectname,
320
723k
         BFD_MACH_O_SECTNAME_SIZE) == 0)
321
30.6k
    return sec;
322
323
6.20M
  return NULL;
324
6.23M
}
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
6.31M
{
334
6.31M
  const struct mach_o_segment_name_xlat *seg;
335
6.31M
  const mach_o_section_name_xlat *sec;
336
6.31M
  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
337
6.31M
  *segname = NULL;
338
339
6.31M
  if (bfd_name[0] != '.')
340
6.27M
    return NULL;
341
342
  /* First try any target-specific translations defined...  */
343
37.1k
  if (bed->segsec_names_xlat)
344
45.5k
    for (seg = bed->segsec_names_xlat; seg->segname; seg++)
345
80.3k
      for (sec = seg->sections; sec->bfd_name; sec++)
346
55.5k
  if (strcmp (bfd_name, sec->bfd_name) == 0)
347
6.30k
    {
348
6.30k
      *segname = seg->segname;
349
6.30k
      return sec;
350
6.30k
    }
351
352
  /* ... and then the Mach-O generic ones.  */
353
45.5k
  for (seg = segsec_names_xlat; seg->segname; seg++)
354
277k
    for (sec = seg->sections; sec->bfd_name; sec++)
355
263k
      if (strcmp (bfd_name, sec->bfd_name) == 0)
356
30.8k
  {
357
30.8k
    *segname = seg->segname;
358
30.8k
    return sec;
359
30.8k
  }
360
361
0
  return NULL;
362
30.8k
}
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
6.23M
{
380
6.23M
  const mach_o_section_name_xlat *xlat;
381
6.23M
  char *res;
382
6.23M
  size_t len;
383
6.23M
  const char *pfx = "";
384
385
6.23M
  *name = NULL;
386
6.23M
  *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
6.23M
  xlat = bfd_mach_o_section_data_for_mach_sect (abfd, segname, secname);
391
6.23M
  if (xlat)
392
36.9k
    {
393
36.9k
      len = strlen (xlat->bfd_name);
394
36.9k
      res = bfd_alloc (abfd, len + 1);
395
36.9k
      if (res == NULL)
396
0
  return;
397
36.9k
      memcpy (res, xlat->bfd_name, len + 1);
398
36.9k
      *name = res;
399
36.9k
      *flags = xlat->bfd_flags;
400
36.9k
      return;
401
36.9k
    }
402
403
  /* ... else we make up a bfd name from the segment concatenated with the
404
     section.  */
405
406
6.20M
  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
6.20M
  if (segname[0] != '_')
411
6.08M
    {
412
6.08M
      static const char seg_pfx[] = "LC_SEGMENT.";
413
414
6.08M
      pfx = seg_pfx;
415
6.08M
      len += sizeof (seg_pfx) - 1;
416
6.08M
    }
417
418
6.20M
  res = bfd_alloc (abfd, len);
419
6.20M
  if (res == NULL)
420
0
    return;
421
6.20M
  snprintf (res, len, "%s%.16s.%.16s", pfx, segname, secname);
422
6.20M
  *name = res;
423
6.20M
}
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
6.31M
{
439
6.31M
  const mach_o_section_name_xlat *xlat;
440
6.31M
  const char *name = bfd_section_name (sect);
441
6.31M
  const char *segname;
442
6.31M
  const char *dot;
443
6.31M
  size_t len;
444
6.31M
  size_t seglen;
445
6.31M
  size_t seclen;
446
447
6.31M
  memset (section->segname, 0, BFD_MACH_O_SEGNAME_SIZE + 1);
448
6.31M
  memset (section->sectname, 0, BFD_MACH_O_SECTNAME_SIZE + 1);
449
450
  /* See if is a canonical name ... */
451
6.31M
  xlat = bfd_mach_o_section_data_for_bfd_name (abfd, name, &segname);
452
6.31M
  if (xlat)
453
37.1k
    {
454
37.1k
      strcpy (section->segname, segname);
455
37.1k
      strcpy (section->sectname, xlat->mach_o_name);
456
37.1k
      return xlat;
457
37.1k
    }
458
459
  /* .. else we convert our constructed one back to Mach-O.
460
     Strip LC_SEGMENT. prefix, if present.  */
461
6.27M
  if (strncmp (name, "LC_SEGMENT.", 11) == 0)
462
6.08M
    name += 11;
463
464
  /* Find a dot.  */
465
6.27M
  dot = strchr (name, '.');
466
6.27M
  len = strlen (name);
467
468
  /* Try to split name into segment and section names.  */
469
6.27M
  if (dot && dot != name)
470
3.65M
    {
471
3.65M
      seglen = dot - name;
472
3.65M
      seclen = len - (dot + 1 - name);
473
474
3.65M
      if (seglen <= BFD_MACH_O_SEGNAME_SIZE
475
3.65M
    && seclen <= BFD_MACH_O_SECTNAME_SIZE)
476
3.59M
  {
477
3.59M
    memcpy (section->segname, name, seglen);
478
3.59M
    section->segname[seglen] = 0;
479
3.59M
    memcpy (section->sectname, dot + 1, seclen);
480
3.59M
    section->sectname[seclen] = 0;
481
3.59M
    return NULL;
482
3.59M
  }
483
3.65M
    }
484
485
  /* The segment and section names are both missing - don't make them
486
     into dots.  */
487
2.68M
  if (dot && dot == name)
488
2.62M
    return NULL;
489
490
  /* Just duplicate the name into both segment and section.  */
491
63.7k
  if (len > 16)
492
63.7k
    len = 16;
493
63.7k
  memcpy (section->segname, name, len);
494
63.7k
  section->segname[len] = 0;
495
63.7k
  memcpy (section->sectname, name, len);
496
63.7k
  section->sectname[len] = 0;
497
63.7k
  return NULL;
498
2.68M
}
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
84
{
507
84
  switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
508
84
    {
509
35
    case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
510
59
    case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
511
59
      return bfd_mach_o_wide_p (abfd) ? 8 : 4;
512
25
    case BFD_MACH_O_S_SYMBOL_STUBS:
513
25
      return sec->reserved2;
514
0
    default:
515
0
      BFD_FAIL ();
516
0
      return 0;
517
84
    }
518
84
}
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
163
{
527
163
  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
163
  if (sec->indirect_syms == NULL)
536
163
    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
259k
{
550
259k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
551
552
259k
  if (mdata->last_command != NULL)
553
126k
    mdata->last_command->next = cmd;
554
132k
  else
555
132k
    mdata->first_command = cmd;
556
259k
  mdata->last_command = cmd;
557
259k
  cmd->next = NULL;
558
259k
}
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
5.05k
{
588
5.05k
  bfd_mach_o_section *os = bfd_mach_o_get_mach_o_section (osection);
589
5.05k
  bfd_mach_o_section *is = bfd_mach_o_get_mach_o_section (isection);
590
591
5.05k
  if (ibfd->xvec->flavour != bfd_target_mach_o_flavour
592
5.05k
      || obfd->xvec->flavour != bfd_target_mach_o_flavour)
593
0
    return true;
594
595
5.05k
  BFD_ASSERT (is != NULL && os != NULL);
596
597
5.05k
  os->flags = is->flags;
598
5.05k
  os->reserved1 = is->reserved1;
599
5.05k
  os->reserved2 = is->reserved2;
600
5.05k
  os->reserved3 = is->reserved3;
601
602
5.05k
  return true;
603
5.05k
}
604
605
static const char *
606
cputype (unsigned long value)
607
1.41k
{
608
1.41k
  switch (value)
609
1.41k
    {
610
17
    case BFD_MACH_O_CPU_TYPE_VAX: return "VAX";
611
8
    case BFD_MACH_O_CPU_TYPE_MC680x0: return "MC68k";
612
135
    case BFD_MACH_O_CPU_TYPE_I386: return "I386";
613
8
    case BFD_MACH_O_CPU_TYPE_MIPS: return "MIPS";
614
11
    case BFD_MACH_O_CPU_TYPE_MC98000: return "MC98k";
615
7
    case BFD_MACH_O_CPU_TYPE_HPPA: return "HPPA";
616
290
    case BFD_MACH_O_CPU_TYPE_ARM: return "ARM";
617
0
    case BFD_MACH_O_CPU_TYPE_MC88000: return "MC88K";
618
6
    case BFD_MACH_O_CPU_TYPE_SPARC: return "SPARC";
619
0
    case BFD_MACH_O_CPU_TYPE_I860: return "I860";
620
4
    case BFD_MACH_O_CPU_TYPE_ALPHA: return "ALPHA";
621
23
    case BFD_MACH_O_CPU_TYPE_POWERPC: return "PPC";
622
12
    case BFD_MACH_O_CPU_TYPE_POWERPC_64: return "PPC64";
623
690
    case BFD_MACH_O_CPU_TYPE_X86_64: return "X86_64";
624
202
    case BFD_MACH_O_CPU_TYPE_ARM64: return "ARM64";
625
0
    default: return _("<unknown>");
626
1.41k
    }
627
1.41k
}
628
629
static const char *
630
cpusubtype (unsigned long cpu_type, unsigned long cpu_subtype, char *buffer)
631
1.41k
{
632
1.41k
  buffer[0] = 0;
633
1.41k
  switch (cpu_subtype & BFD_MACH_O_CPU_SUBTYPE_MASK)
634
1.41k
    {
635
178
    case 0:
636
178
      break;
637
1.11k
    case BFD_MACH_O_CPU_SUBTYPE_LIB64:
638
1.11k
      sprintf (buffer, " (LIB64)"); break;
639
121
    default:
640
121
      sprintf (buffer, _("<unknown mask flags>")); break;
641
1.41k
    }
642
643
1.41k
  cpu_subtype &= ~ BFD_MACH_O_CPU_SUBTYPE_MASK;
644
645
1.41k
  switch (cpu_type)
646
1.41k
    {
647
690
    case BFD_MACH_O_CPU_TYPE_X86_64:
648
825
    case BFD_MACH_O_CPU_TYPE_I386:
649
825
      switch (cpu_subtype)
650
825
  {
651
504
  case BFD_MACH_O_CPU_SUBTYPE_X86_ALL:
652
504
    return strcat (buffer, " (X86_ALL)");
653
321
  default:
654
321
    break;
655
825
  }
656
321
      break;
657
658
321
    case BFD_MACH_O_CPU_TYPE_ARM:
659
290
      switch (cpu_subtype)
660
290
  {
661
41
  case BFD_MACH_O_CPU_SUBTYPE_ARM_ALL:
662
41
    return strcat (buffer, " (ARM_ALL)");
663
2
  case BFD_MACH_O_CPU_SUBTYPE_ARM_V4T:
664
2
    return strcat (buffer, " (ARM_V4T)");
665
0
  case BFD_MACH_O_CPU_SUBTYPE_ARM_V6:
666
0
    return strcat (buffer, " (ARM_V6)");
667
1
  case BFD_MACH_O_CPU_SUBTYPE_ARM_V5TEJ:
668
1
    return strcat (buffer, " (ARM_V5TEJ)");
669
1
  case BFD_MACH_O_CPU_SUBTYPE_ARM_XSCALE:
670
1
    return strcat (buffer, " (ARM_XSCALE)");
671
14
  case BFD_MACH_O_CPU_SUBTYPE_ARM_V7:
672
14
    return strcat (buffer, " (ARM_V7)");
673
231
  default:
674
231
    break;
675
290
  }
676
231
      break;
677
678
231
    case BFD_MACH_O_CPU_TYPE_ARM64:
679
202
      switch (cpu_subtype)
680
202
  {
681
4
  case BFD_MACH_O_CPU_SUBTYPE_ARM64_ALL:
682
4
    return strcat (buffer, " (ARM64_ALL)");
683
1
  case BFD_MACH_O_CPU_SUBTYPE_ARM64_V8:
684
1
    return strcat (buffer, " (ARM64_V8)");
685
197
  default:
686
197
    break;
687
202
  }
688
197
      break;
689
690
197
    default:
691
96
      break;
692
1.41k
    }
693
694
845
  if (cpu_subtype != 0)
695
810
    return strcat (buffer, _(" (<unknown>)"));
696
697
35
  return buffer;
698
845
}
699
700
bool
701
bfd_mach_o_bfd_print_private_bfd_data (bfd *abfd, void *ptr)
702
1.41k
{
703
1.41k
  FILE * file = (FILE *) ptr;
704
1.41k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
705
1.41k
  char buff[128];
706
707
1.41k
  fprintf (file, _(" MACH-O header:\n"));
708
1.41k
  fprintf (file, _("   magic:      %#lx\n"), (long) mdata->header.magic);
709
1.41k
  fprintf (file, _("   cputype:    %#lx (%s)\n"), (long) mdata->header.cputype,
710
1.41k
     cputype (mdata->header.cputype));
711
1.41k
  fprintf (file, _("   cpusubtype: %#lx%s\n"), (long) mdata->header.cpusubtype,
712
1.41k
     cpusubtype (mdata->header.cputype, mdata->header.cpusubtype, buff));
713
1.41k
  fprintf (file, _("   filetype:   %#lx\n"), (long) mdata->header.filetype);
714
1.41k
  fprintf (file, _("   ncmds:      %#lx\n"), (long) mdata->header.ncmds);
715
1.41k
  fprintf (file, _("   sizeocmds:  %#lx\n"), (long) mdata->header.sizeofcmds);
716
1.41k
  fprintf (file, _("   flags:      %#lx\n"), (long) mdata->header.flags);
717
1.41k
  fprintf (file, _("   version:    %x\n"), mdata->header.version);
718
719
1.41k
  return true;
720
1.41k
}
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
40
{
728
40
  bfd_mach_o_data_struct *imdata;
729
40
  bfd_mach_o_data_struct *omdata;
730
40
  bfd_mach_o_load_command *icmd;
731
732
40
  if (bfd_get_flavour (ibfd) != bfd_target_mach_o_flavour
733
40
      || bfd_get_flavour (obfd) != bfd_target_mach_o_flavour)
734
0
    return true;
735
736
40
  BFD_ASSERT (bfd_mach_o_valid (ibfd));
737
40
  BFD_ASSERT (bfd_mach_o_valid (obfd));
738
739
40
  imdata = bfd_mach_o_get_data (ibfd);
740
40
  omdata = bfd_mach_o_get_data (obfd);
741
742
  /* Copy header flags.  */
743
40
  omdata->header.flags = imdata->header.flags;
744
745
  /* PR 23299.  Copy the cputype.  */
746
40
  if (imdata->header.cputype != omdata->header.cputype)
747
2
    {
748
2
      if (omdata->header.cputype == 0)
749
2
  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
2
    }
756
757
  /* Copy the cpusubtype.  */
758
40
  omdata->header.cpusubtype = imdata->header.cpusubtype;
759
760
  /* Copy commands.  */
761
862
  for (icmd = imdata->first_command; icmd != NULL; icmd = icmd->next)
762
822
    {
763
822
      bfd_mach_o_load_command *ocmd;
764
765
822
      switch (icmd->type)
766
822
  {
767
140
  case BFD_MACH_O_LC_LOAD_DYLIB:
768
188
  case BFD_MACH_O_LC_LOAD_DYLINKER:
769
224
  case BFD_MACH_O_LC_DYLD_INFO:
770
    /* Command is copied.  */
771
224
    ocmd = bfd_alloc (obfd, sizeof (bfd_mach_o_load_command));
772
224
    if (ocmd == NULL)
773
0
      return false;
774
775
    /* Copy common fields.  */
776
224
    ocmd->type = icmd->type;
777
224
    ocmd->type_required = icmd->type_required;
778
224
    ocmd->offset = 0;
779
224
    ocmd->len = icmd->len;
780
224
    break;
781
782
598
  default:
783
    /* Command is not copied.  */
784
598
    continue;
785
598
    break;
786
822
  }
787
788
224
      switch (icmd->type)
789
224
  {
790
140
  case BFD_MACH_O_LC_LOAD_DYLIB:
791
140
    {
792
140
      bfd_mach_o_dylib_command *idy = &icmd->command.dylib;
793
140
      bfd_mach_o_dylib_command *ody = &ocmd->command.dylib;
794
795
140
      ody->name_offset = idy->name_offset;
796
140
      ody->timestamp = idy->timestamp;
797
140
      ody->current_version = idy->current_version;
798
140
      ody->compatibility_version = idy->compatibility_version;
799
140
      ody->name_str = idy->name_str;
800
140
    }
801
140
    break;
802
803
48
  case BFD_MACH_O_LC_LOAD_DYLINKER:
804
48
    {
805
48
      bfd_mach_o_dylinker_command *idy = &icmd->command.dylinker;
806
48
      bfd_mach_o_dylinker_command *ody = &ocmd->command.dylinker;
807
808
48
      ody->name_offset = idy->name_offset;
809
48
      ody->name_str = idy->name_str;
810
48
    }
811
48
    break;
812
813
36
  case BFD_MACH_O_LC_DYLD_INFO:
814
36
    {
815
36
      bfd_mach_o_dyld_info_command *idy = &icmd->command.dyld_info;
816
36
      bfd_mach_o_dyld_info_command *ody = &ocmd->command.dyld_info;
817
818
36
      if (bfd_mach_o_read_dyld_content (ibfd, idy))
819
36
        {
820
36
    ody->rebase_size = idy->rebase_size;
821
36
    ody->rebase_content = idy->rebase_content;
822
823
36
    ody->bind_size = idy->bind_size;
824
36
    ody->bind_content = idy->bind_content;
825
826
36
    ody->weak_bind_size = idy->weak_bind_size;
827
36
    ody->weak_bind_content = idy->weak_bind_content;
828
829
36
    ody->lazy_bind_size = idy->lazy_bind_size;
830
36
    ody->lazy_bind_content = idy->lazy_bind_content;
831
832
36
    ody->export_size = idy->export_size;
833
36
    ody->export_content = idy->export_content;
834
36
        }
835
      /* PR 17512L: file: 730e492d.  */
836
0
      else
837
0
        {
838
0
    ody->rebase_size =
839
0
      ody->bind_size =
840
0
      ody->weak_bind_size =
841
0
      ody->lazy_bind_size =
842
0
      ody->export_size = 0;
843
0
    ody->rebase_content =
844
0
      ody->bind_content =
845
0
      ody->weak_bind_content =
846
0
      ody->lazy_bind_content =
847
0
      ody->export_content = NULL;
848
0
        }
849
36
    }
850
36
    break;
851
852
0
  default:
853
    /* That command should be handled.  */
854
0
    abort ();
855
224
  }
856
857
      /* Insert command.  */
858
224
      bfd_mach_o_append_command (obfd, ocmd);
859
224
    }
860
861
40
  return true;
862
40
}
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
14.7M
{
885
14.7M
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
886
887
14.7M
  if (mdata->symtab == NULL)
888
4.37k
    return 0;
889
14.7M
  return mdata->symtab->nsyms;
890
14.7M
}
891
892
long
893
bfd_mach_o_get_symtab_upper_bound (bfd *abfd)
894
2.93k
{
895
2.93k
  long nsyms = bfd_mach_o_count_symbols (abfd);
896
897
2.93k
  return ((nsyms + 1) * sizeof (asymbol *));
898
2.93k
}
899
900
long
901
bfd_mach_o_canonicalize_symtab (bfd *abfd, asymbol **alocation)
902
2.59k
{
903
2.59k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
904
2.59k
  long nsyms = bfd_mach_o_count_symbols (abfd);
905
2.59k
  bfd_mach_o_symtab_command *sym = mdata->symtab;
906
2.59k
  unsigned long j;
907
908
2.59k
  if (nsyms < 0)
909
0
    return nsyms;
910
911
2.59k
  if (nsyms == 0)
912
319
    {
913
      /* Do not try to read symbols if there are none.  */
914
319
      alocation[0] = NULL;
915
319
      return 0;
916
319
    }
917
918
2.27k
  if (!bfd_mach_o_read_symtab_symbols (abfd))
919
575
    {
920
575
      _bfd_error_handler
921
575
  (_("bfd_mach_o_canonicalize_symtab: unable to load symbols"));
922
575
      return -1;
923
575
    }
924
925
1.70k
  BFD_ASSERT (sym->symbols != NULL);
926
927
72.8k
  for (j = 0; j < sym->nsyms; j++)
928
71.1k
    alocation[j] = &sym->symbols[j].symbol;
929
930
1.70k
  alocation[j] = NULL;
931
932
1.70k
  return nsyms;
933
2.27k
}
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
333
{
945
333
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
946
333
  bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
947
333
  bfd_mach_o_symtab_command *symtab = mdata->symtab;
948
333
  asymbol *s;
949
333
  char * s_start;
950
333
  unsigned long count, i, j, n;
951
333
  size_t size;
952
333
  char *names;
953
333
  const char stub [] = "$stub";
954
955
333
  *ret = NULL;
956
957
  /* Stop now if no symbols or no indirect symbols.  */
958
333
  if (dysymtab == NULL || dysymtab->nindirectsyms == 0
959
333
      || symtab == NULL || symtab->symbols == NULL)
960
310
    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
23
  count = dysymtab->nindirectsyms;
965
23
  size = 0;
966
5.65k
  for (j = 0; j < count; j++)
967
5.63k
    {
968
5.63k
      unsigned int isym = dysymtab->indirect_syms[j];
969
5.63k
      const char *str;
970
971
      /* Some indirect symbols are anonymous.  */
972
5.63k
      if (isym < symtab->nsyms
973
5.63k
    && (str = symtab->symbols[isym].symbol.name) != NULL)
974
5.05k
  {
975
    /* PR 17512: file: f5b8eeba.  */
976
5.05k
    size += strnlen (str, symtab->strsize - (str - symtab->strtab));
977
5.05k
    size += sizeof (stub);
978
5.05k
  }
979
5.63k
    }
980
981
23
  s_start = bfd_malloc (size + count * sizeof (asymbol));
982
23
  s = *ret = (asymbol *) s_start;
983
23
  if (s == NULL)
984
0
    return -1;
985
23
  names = (char *) (s + count);
986
987
23
  n = 0;
988
864
  for (i = 0; i < mdata->nsects; i++)
989
845
    {
990
845
      bfd_mach_o_section *sec = mdata->sections[i];
991
845
      unsigned int first, last;
992
845
      bfd_vma addr;
993
845
      unsigned int entry_size;
994
995
845
      switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
996
845
  {
997
35
  case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
998
59
  case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
999
84
  case BFD_MACH_O_S_SYMBOL_STUBS:
1000
    /* Only these sections have indirect symbols.  */
1001
84
    first = sec->reserved1;
1002
84
    last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
1003
84
    addr = sec->addr;
1004
84
    entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
1005
1006
    /* PR 17512: file: 08e15eec.  */
1007
84
    if (first >= count || last > count || first > last)
1008
4
      goto fail;
1009
1010
80
    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
80
    break;
1042
761
  default:
1043
761
    break;
1044
845
  }
1045
845
    }
1046
1047
19
  return n;
1048
1049
4
 fail:
1050
4
  free (s_start);
1051
4
  * ret = NULL;
1052
4
  return -1;
1053
23
}
1054
1055
void
1056
bfd_mach_o_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
1057
          asymbol *symbol,
1058
          symbol_info *ret)
1059
8.45k
{
1060
8.45k
  bfd_symbol_info (symbol, ret);
1061
8.45k
}
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
151k
{
1124
151k
  *subtype = bfd_arch_unknown;
1125
1126
151k
  switch (mtype)
1127
151k
    {
1128
4.22k
    case BFD_MACH_O_CPU_TYPE_VAX:
1129
4.22k
      *type = bfd_arch_vax;
1130
4.22k
      break;
1131
20.5k
    case BFD_MACH_O_CPU_TYPE_MC680x0:
1132
20.5k
      *type = bfd_arch_m68k;
1133
20.5k
      break;
1134
48.5k
    case BFD_MACH_O_CPU_TYPE_I386:
1135
48.5k
      *type = bfd_arch_i386;
1136
48.5k
      *subtype = bfd_mach_i386_i386;
1137
48.5k
      break;
1138
33.3k
    case BFD_MACH_O_CPU_TYPE_X86_64:
1139
33.3k
      *type = bfd_arch_i386;
1140
33.3k
      *subtype = bfd_mach_x86_64;
1141
33.3k
      break;
1142
7.43k
    case BFD_MACH_O_CPU_TYPE_MIPS:
1143
7.43k
      *type = bfd_arch_mips;
1144
7.43k
      break;
1145
2.88k
    case BFD_MACH_O_CPU_TYPE_MC98000:
1146
2.88k
      *type = bfd_arch_m98k;
1147
2.88k
      break;
1148
1.81k
    case BFD_MACH_O_CPU_TYPE_HPPA:
1149
1.81k
      *type = bfd_arch_hppa;
1150
1.81k
      break;
1151
16.4k
    case BFD_MACH_O_CPU_TYPE_ARM:
1152
16.4k
      *type = bfd_arch_arm;
1153
16.4k
      switch (msubtype)
1154
16.4k
  {
1155
17
  case BFD_MACH_O_CPU_SUBTYPE_ARM_V4T:
1156
17
    *subtype = bfd_mach_arm_4T;
1157
17
    break;
1158
12
  case BFD_MACH_O_CPU_SUBTYPE_ARM_V6:
1159
12
    *subtype = bfd_mach_arm_4T; /* Best fit ?  */
1160
12
    break;
1161
492
  case BFD_MACH_O_CPU_SUBTYPE_ARM_V5TEJ:
1162
492
    *subtype = bfd_mach_arm_5TE;
1163
492
    break;
1164
903
  case BFD_MACH_O_CPU_SUBTYPE_ARM_XSCALE:
1165
903
    *subtype = bfd_mach_arm_XScale;
1166
903
    break;
1167
1.00k
  case BFD_MACH_O_CPU_SUBTYPE_ARM_V7:
1168
1.00k
    *subtype = bfd_mach_arm_5TE; /* Best fit ?  */
1169
1.00k
    break;
1170
884
  case BFD_MACH_O_CPU_SUBTYPE_ARM_ALL:
1171
14.0k
  default:
1172
14.0k
    break;
1173
16.4k
  }
1174
16.4k
      break;
1175
16.4k
    case BFD_MACH_O_CPU_TYPE_SPARC:
1176
4.82k
      *type = bfd_arch_sparc;
1177
4.82k
      *subtype = bfd_mach_sparc;
1178
4.82k
      break;
1179
2.81k
    case BFD_MACH_O_CPU_TYPE_ALPHA:
1180
2.81k
      *type = bfd_arch_alpha;
1181
2.81k
      break;
1182
2.08k
    case BFD_MACH_O_CPU_TYPE_POWERPC:
1183
2.08k
      *type = bfd_arch_powerpc;
1184
2.08k
      *subtype = bfd_mach_ppc;
1185
2.08k
      break;
1186
1.42k
    case BFD_MACH_O_CPU_TYPE_POWERPC_64:
1187
1.42k
      *type = bfd_arch_powerpc;
1188
1.42k
      *subtype = bfd_mach_ppc64;
1189
1.42k
      break;
1190
2.29k
    case BFD_MACH_O_CPU_TYPE_ARM64:
1191
2.29k
      *type = bfd_arch_aarch64;
1192
2.29k
      *subtype = bfd_mach_aarch64;
1193
2.29k
      break;
1194
2.45k
    default:
1195
2.45k
      *type = bfd_arch_unknown;
1196
2.45k
      break;
1197
151k
    }
1198
151k
}
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
26
{
1206
26
  if (len % 4 != 0)
1207
19
    {
1208
19
      char pad[4] = {0,0,0,0};
1209
19
      unsigned int padlen = 4 - (len % 4);
1210
1211
19
      if (bfd_bwrite (pad, padlen, abfd) != padlen)
1212
0
  return -1;
1213
1214
19
      return padlen;
1215
19
    }
1216
7
  else
1217
7
    return 0;
1218
26
}
1219
1220
/* Likewise, but for a command.  */
1221
1222
static int
1223
bfd_mach_o_pad_command (bfd *abfd, size_t len)
1224
136
{
1225
136
  size_t align = bfd_mach_o_wide_p (abfd) ? 8 : 4;
1226
1227
136
  if (len % align != 0)
1228
133
    {
1229
133
      char pad[8] = {0};
1230
133
      size_t padlen = align - (len % align);
1231
1232
133
      if (bfd_bwrite (pad, padlen, abfd) != padlen)
1233
0
  return -1;
1234
1235
133
      return padlen;
1236
133
    }
1237
3
  else
1238
3
    return 0;
1239
136
}
1240
1241
static bool
1242
bfd_mach_o_write_header (bfd *abfd, bfd_mach_o_header *header)
1243
50
{
1244
50
  struct mach_o_header_external raw;
1245
50
  size_t size;
1246
1247
50
  size = mach_o_wide_p (header) ?
1248
44
    BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
1249
1250
50
  bfd_h_put_32 (abfd, header->magic, raw.magic);
1251
50
  bfd_h_put_32 (abfd, header->cputype, raw.cputype);
1252
50
  bfd_h_put_32 (abfd, header->cpusubtype, raw.cpusubtype);
1253
50
  bfd_h_put_32 (abfd, header->filetype, raw.filetype);
1254
50
  bfd_h_put_32 (abfd, header->ncmds, raw.ncmds);
1255
50
  bfd_h_put_32 (abfd, header->sizeofcmds, raw.sizeofcmds);
1256
50
  bfd_h_put_32 (abfd, header->flags, raw.flags);
1257
1258
50
  if (mach_o_wide_p (header))
1259
50
    bfd_h_put_32 (abfd, header->reserved, raw.reserved);
1260
1261
50
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1262
50
      || bfd_bwrite (&raw, size, abfd) != size)
1263
0
    return false;
1264
1265
50
  return true;
1266
50
}
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_bwrite (&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
22
{
1302
22
  bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
1303
22
  struct mach_o_str_command_external raw;
1304
22
  size_t namelen;
1305
1306
22
  bfd_h_put_32 (abfd, cmd->name_offset, raw.str);
1307
1308
22
  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1309
22
      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1310
0
    return false;
1311
1312
22
  namelen = strlen (cmd->name_str) + 1;
1313
22
  if (bfd_bwrite (cmd->name_str, namelen, abfd) != namelen)
1314
0
    return false;
1315
1316
22
  if (bfd_mach_o_pad_command (abfd, namelen) < 0)
1317
0
    return false;
1318
1319
22
  return true;
1320
22
}
1321
1322
static bool
1323
bfd_mach_o_write_dylib (bfd *abfd, bfd_mach_o_load_command *command)
1324
114
{
1325
114
  bfd_mach_o_dylib_command *cmd = &command->command.dylib;
1326
114
  struct mach_o_dylib_command_external raw;
1327
114
  size_t namelen;
1328
1329
114
  bfd_h_put_32 (abfd, cmd->name_offset, raw.name);
1330
114
  bfd_h_put_32 (abfd, cmd->timestamp, raw.timestamp);
1331
114
  bfd_h_put_32 (abfd, cmd->current_version, raw.current_version);
1332
114
  bfd_h_put_32 (abfd, cmd->compatibility_version, raw.compatibility_version);
1333
1334
114
  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1335
114
      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1336
0
    return false;
1337
1338
114
  namelen = strlen (cmd->name_str) + 1;
1339
114
  if (bfd_bwrite (cmd->name_str, namelen, abfd) != namelen)
1340
0
    return false;
1341
1342
114
  if (bfd_mach_o_pad_command (abfd, namelen) < 0)
1343
0
    return false;
1344
1345
114
  return true;
1346
114
}
1347
1348
static bool
1349
bfd_mach_o_write_main (bfd *abfd, bfd_mach_o_load_command *command)
1350
21
{
1351
21
  bfd_mach_o_main_command *cmd = &command->command.main;
1352
21
  struct mach_o_entry_point_command_external raw;
1353
1354
21
  bfd_h_put_64 (abfd, cmd->entryoff, raw.entryoff);
1355
21
  bfd_h_put_64 (abfd, cmd->stacksize, raw.stacksize);
1356
1357
21
  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1358
21
      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1359
0
    return false;
1360
1361
21
  return true;
1362
21
}
1363
1364
static bool
1365
bfd_mach_o_write_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
1366
23
{
1367
23
  bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
1368
23
  struct mach_o_dyld_info_command_external raw;
1369
1370
23
  bfd_h_put_32 (abfd, cmd->rebase_off, raw.rebase_off);
1371
23
  bfd_h_put_32 (abfd, cmd->rebase_size, raw.rebase_size);
1372
23
  bfd_h_put_32 (abfd, cmd->bind_off, raw.bind_off);
1373
23
  bfd_h_put_32 (abfd, cmd->bind_size, raw.bind_size);
1374
23
  bfd_h_put_32 (abfd, cmd->weak_bind_off, raw.weak_bind_off);
1375
23
  bfd_h_put_32 (abfd, cmd->weak_bind_size, raw.weak_bind_size);
1376
23
  bfd_h_put_32 (abfd, cmd->lazy_bind_off, raw.lazy_bind_off);
1377
23
  bfd_h_put_32 (abfd, cmd->lazy_bind_size, raw.lazy_bind_size);
1378
23
  bfd_h_put_32 (abfd, cmd->export_off, raw.export_off);
1379
23
  bfd_h_put_32 (abfd, cmd->export_size, raw.export_size);
1380
1381
23
  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1382
23
      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1383
0
    return false;
1384
1385
23
  if (cmd->rebase_size != 0)
1386
21
    if (bfd_seek (abfd, cmd->rebase_off, SEEK_SET) != 0
1387
21
  || (bfd_bwrite (cmd->rebase_content, cmd->rebase_size, abfd) !=
1388
21
      cmd->rebase_size))
1389
0
      return false;
1390
1391
23
  if (cmd->bind_size != 0)
1392
23
    if (bfd_seek (abfd, cmd->bind_off, SEEK_SET) != 0
1393
23
  || (bfd_bwrite (cmd->bind_content, cmd->bind_size, abfd) !=
1394
23
      cmd->bind_size))
1395
0
      return false;
1396
1397
23
  if (cmd->weak_bind_size != 0)
1398
1
    if (bfd_seek (abfd, cmd->weak_bind_off, SEEK_SET) != 0
1399
1
  || (bfd_bwrite (cmd->weak_bind_content, cmd->weak_bind_size, abfd) !=
1400
1
      cmd->weak_bind_size))
1401
0
      return false;
1402
1403
23
  if (cmd->lazy_bind_size != 0)
1404
23
    if (bfd_seek (abfd, cmd->lazy_bind_off, SEEK_SET) != 0
1405
23
  || (bfd_bwrite (cmd->lazy_bind_content, cmd->lazy_bind_size, abfd) !=
1406
23
      cmd->lazy_bind_size))
1407
0
      return false;
1408
1409
23
  if (cmd->export_size != 0)
1410
23
    if (bfd_seek (abfd, cmd->export_off, SEEK_SET) != 0
1411
23
  || (bfd_bwrite (cmd->export_content, cmd->export_size, abfd) !=
1412
23
      cmd->export_size))
1413
0
      return false;
1414
1415
23
  return true;
1416
23
}
1417
1418
long
1419
bfd_mach_o_get_reloc_upper_bound (bfd *abfd, asection *asect)
1420
1.12M
{
1421
1.12M
  size_t count, raw;
1422
1423
1.12M
  count = asect->reloc_count;
1424
1.12M
  if (count >= LONG_MAX / sizeof (arelent *)
1425
1.12M
      || _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
1.12M
  if (!bfd_write_p (abfd))
1431
1.12M
    {
1432
1.12M
      ufile_ptr filesize = bfd_get_file_size (abfd);
1433
1.12M
      if (filesize != 0 && raw > filesize)
1434
931k
  {
1435
931k
    bfd_set_error (bfd_error_file_truncated);
1436
931k
    return -1;
1437
931k
  }
1438
1.12M
    }
1439
188k
  return (count + 1) * sizeof (arelent *);
1440
1.12M
}
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
26.0M
{
1449
26.0M
  unsigned char info = fields[3];
1450
1451
26.0M
  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
26.0M
  else
1461
26.0M
    {
1462
26.0M
      rel->r_value = (fields[2] << 16) | (fields[1] << 8) | fields[0];
1463
26.0M
      rel->r_type = (info >> BFD_MACH_O_LE_TYPE_SHIFT) & BFD_MACH_O_TYPE_MASK;
1464
26.0M
      rel->r_pcrel = (info & BFD_MACH_O_LE_PCREL) ? 1 : 0;
1465
26.0M
      rel->r_length = (info >> BFD_MACH_O_LE_LENGTH_SHIFT)
1466
26.0M
          & BFD_MACH_O_LENGTH_MASK;
1467
26.0M
      rel->r_extern = (info & BFD_MACH_O_LE_EXTERN) ? 1 : 0;
1468
26.0M
    }
1469
26.0M
}
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
26.0M
{
1478
26.0M
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1479
26.0M
  unsigned int num;
1480
26.0M
  asymbol **sym;
1481
1482
  /* Non-scattered relocation.  */
1483
26.0M
  reloc->r_scattered = 0;
1484
26.0M
  res->addend = 0;
1485
1486
26.0M
  num = reloc->r_value;
1487
1488
26.0M
  if (reloc->r_extern)
1489
14.7M
    {
1490
      /* PR 17512: file: 8396-1185-0.004.  */
1491
14.7M
      if (num >= (unsigned) bfd_mach_o_count_symbols (abfd))
1492
14.7M
  sym = bfd_und_section_ptr->symbol_ptr_ptr;
1493
4.97k
      else if (syms == NULL)
1494
0
  sym = bfd_und_section_ptr->symbol_ptr_ptr;
1495
4.97k
      else
1496
  /* An external symbol number.  */
1497
4.97k
  sym = syms + num;
1498
14.7M
    }
1499
11.2M
  else if (num == 0x00ffffff || num == 0)
1500
11.0M
    {
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
11.0M
      sym = bfd_abs_section_ptr->symbol_ptr_ptr;
1507
11.0M
    }
1508
132k
  else
1509
132k
    {
1510
      /* PR 17512: file: 006-2964-0.004.  */
1511
132k
      if (num > mdata->nsects)
1512
40.9k
  {
1513
40.9k
    _bfd_error_handler (_("\
1514
40.9k
malformed mach-o reloc: section index is greater than the number of sections"));
1515
40.9k
    return false;
1516
40.9k
  }
1517
1518
      /* A section number.  */
1519
91.4k
      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
91.4k
      res->addend = -mdata->sections[num - 1]->addr;
1526
91.4k
    }
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
25.9M
  res->sym_ptr_ptr = sym;
1535
1536
25.9M
  return true;
1537
26.0M
}
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
24.1M
{
1553
24.1M
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1554
24.1M
  bfd_vma addr;
1555
1556
24.1M
  addr = bfd_get_32 (abfd, raw->r_address);
1557
24.1M
  res->sym_ptr_ptr = bfd_und_section_ptr->symbol_ptr_ptr;
1558
24.1M
  res->addend = 0;
1559
1560
24.1M
  if (addr & BFD_MACH_O_SR_SCATTERED)
1561
2.64M
    {
1562
2.64M
      unsigned int j;
1563
2.64M
      bfd_vma symnum = bfd_get_32 (abfd, raw->r_symbolnum);
1564
1565
      /* Scattered relocation, can't be extern. */
1566
2.64M
      reloc->r_scattered = 1;
1567
2.64M
      reloc->r_extern = 0;
1568
1569
      /*   Extract section and offset from r_value (symnum).  */
1570
2.64M
      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
7.21M
      for (j = 0; j < mdata->nsects; j++)
1577
7.21M
  {
1578
7.21M
    bfd_mach_o_section *sect = mdata->sections[j];
1579
7.21M
    if (symnum >= sect->addr && symnum < sect->addr + sect->size)
1580
2.64M
      {
1581
2.64M
        res->sym_ptr_ptr = sect->bfdsection->symbol_ptr_ptr;
1582
2.64M
        res->addend = symnum - sect->addr;
1583
2.64M
        break;
1584
2.64M
      }
1585
7.21M
  }
1586
1587
      /* Extract the info and address fields from r_address.  */
1588
2.64M
      reloc->r_type = BFD_MACH_O_GET_SR_TYPE (addr);
1589
2.64M
      reloc->r_length = BFD_MACH_O_GET_SR_LENGTH (addr);
1590
2.64M
      reloc->r_pcrel = addr & BFD_MACH_O_SR_PCREL;
1591
2.64M
      reloc->r_address = BFD_MACH_O_GET_SR_TYPE (addr);
1592
2.64M
      res->address = BFD_MACH_O_GET_SR_ADDRESS (addr);
1593
2.64M
    }
1594
21.4M
  else
1595
21.4M
    {
1596
      /* Non-scattered relocation.  */
1597
21.4M
      reloc->r_scattered = 0;
1598
21.4M
      reloc->r_address = addr;
1599
21.4M
      res->address = addr;
1600
1601
      /* The value and info fields have to be extracted dependent on target
1602
   endian-ness.  */
1603
21.4M
      bfd_mach_o_swap_in_non_scattered_reloc (abfd, reloc, raw->r_symbolnum);
1604
1605
21.4M
      if (!bfd_mach_o_canonicalize_non_scattered_reloc (abfd, reloc,
1606
21.4M
              res, syms))
1607
30.5k
  return false;
1608
21.4M
    }
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
24.0M
  return true;
1615
24.1M
}
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
188k
{
1622
188k
  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1623
188k
  unsigned long i;
1624
188k
  struct mach_o_reloc_info_external *native_relocs = NULL;
1625
188k
  size_t native_size;
1626
1627
  /* Allocate and read relocs.  */
1628
188k
  if (_bfd_mul_overflow (count, BFD_MACH_O_RELENT_SIZE, &native_size))
1629
    /* PR 17512: file: 09477b57.  */
1630
0
    goto err;
1631
1632
188k
  if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
1633
0
    return -1;
1634
188k
  native_relocs = (struct mach_o_reloc_info_external *)
1635
188k
    _bfd_malloc_and_read (abfd, native_size, native_size);
1636
188k
  if (native_relocs == NULL)
1637
46.9k
    return -1;
1638
1639
28.6M
  for (i = 0; i < count; i++)
1640
28.6M
    {
1641
28.6M
      if (!(*bed->_bfd_mach_o_canonicalize_one_reloc)(abfd, &native_relocs[i],
1642
28.6M
                  &res[i], syms, res))
1643
139k
  goto err;
1644
28.6M
    }
1645
1.80k
  free (native_relocs);
1646
1.80k
  return i;
1647
1648
139k
 err:
1649
139k
  free (native_relocs);
1650
139k
  if (bfd_get_error () == bfd_error_no_error)
1651
0
    bfd_set_error (bfd_error_invalid_operation);
1652
139k
  return -1;
1653
141k
}
1654
1655
long
1656
bfd_mach_o_canonicalize_reloc (bfd *abfd, asection *asect,
1657
             arelent **rels, asymbol **syms)
1658
188k
{
1659
188k
  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1660
188k
  unsigned long i;
1661
188k
  arelent *res;
1662
1663
188k
  if (asect->reloc_count == 0)
1664
619
    return 0;
1665
1666
  /* No need to go further if we don't know how to read relocs.  */
1667
188k
  if (bed->_bfd_mach_o_canonicalize_one_reloc == NULL)
1668
48
    return 0;
1669
1670
188k
  if (asect->relocation == NULL)
1671
188k
    {
1672
188k
      size_t amt;
1673
1674
188k
      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
188k
      res = bfd_malloc (amt);
1680
188k
      if (res == NULL)
1681
0
  return -1;
1682
1683
188k
      if (bfd_mach_o_canonicalize_relocs (abfd, asect->rel_filepos,
1684
188k
            asect->reloc_count, res, syms) < 0)
1685
186k
  {
1686
186k
    free (res);
1687
186k
    return -1;
1688
186k
  }
1689
1.80k
      asect->relocation = res;
1690
1.80k
    }
1691
1692
1.80k
  res = asect->relocation;
1693
728k
  for (i = 0; i < asect->reloc_count; i++)
1694
726k
    rels[i] = &res[i];
1695
1.80k
  rels[i] = NULL;
1696
1697
1.80k
  return i;
1698
188k
}
1699
1700
long
1701
bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *abfd)
1702
331
{
1703
331
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1704
331
  bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
1705
1706
331
  if (dysymtab == NULL)
1707
73
    return 1;
1708
1709
258
  ufile_ptr filesize = bfd_get_file_size (abfd);
1710
258
  size_t amt;
1711
1712
258
  if (filesize != 0)
1713
258
    {
1714
258
      if (dysymtab->extreloff > filesize
1715
258
    || dysymtab->nextrel > ((filesize - dysymtab->extreloff)
1716
253
          / BFD_MACH_O_RELENT_SIZE)
1717
258
    || dysymtab->locreloff > filesize
1718
258
    || dysymtab->nlocrel > ((filesize - dysymtab->locreloff)
1719
243
          / BFD_MACH_O_RELENT_SIZE))
1720
15
  {
1721
15
    bfd_set_error (bfd_error_file_truncated);
1722
15
    return -1;
1723
15
  }
1724
258
    }
1725
243
  if (dysymtab->nextrel + dysymtab->nlocrel < dysymtab->nextrel
1726
243
      || _bfd_mul_overflow (dysymtab->nextrel + dysymtab->nlocrel,
1727
243
          sizeof (arelent), &amt))
1728
0
    {
1729
0
      bfd_set_error (bfd_error_file_too_big);
1730
0
      return -1;
1731
0
    }
1732
1733
243
  return (dysymtab->nextrel + dysymtab->nlocrel + 1) * sizeof (arelent *);
1734
243
}
1735
1736
long
1737
bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
1738
               struct bfd_symbol **syms)
1739
316
{
1740
316
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1741
316
  bfd_mach_o_dysymtab_command *dysymtab = mdata->dysymtab;
1742
316
  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1743
316
  unsigned long i;
1744
316
  arelent *res;
1745
1746
316
  if (dysymtab == NULL)
1747
73
    return 0;
1748
243
  if (dysymtab->nextrel == 0 && dysymtab->nlocrel == 0)
1749
240
    return 0;
1750
1751
  /* No need to go further if we don't know how to read relocs.  */
1752
3
  if (bed->_bfd_mach_o_canonicalize_one_reloc == NULL)
1753
1
    return 0;
1754
1755
2
  if (mdata->dyn_reloc_cache == NULL)
1756
2
    {
1757
2
      size_t amt = (dysymtab->nextrel + dysymtab->nlocrel) * sizeof (arelent);
1758
2
      res = bfd_malloc (amt);
1759
2
      if (res == NULL)
1760
0
  return -1;
1761
1762
2
      if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->extreloff,
1763
2
            dysymtab->nextrel, res, syms) < 0)
1764
0
  {
1765
0
    free (res);
1766
0
    return -1;
1767
0
  }
1768
1769
2
      if (bfd_mach_o_canonicalize_relocs (abfd, dysymtab->locreloff,
1770
2
            dysymtab->nlocrel,
1771
2
            res + dysymtab->nextrel, syms) < 0)
1772
2
  {
1773
2
    free (res);
1774
2
    return -1;
1775
2
  }
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
2
}
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
451
{
1825
451
  unsigned int i;
1826
451
  arelent **entries;
1827
451
  asection *sec;
1828
451
  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1829
1830
451
  sec = section->bfdsection;
1831
451
  if (sec->reloc_count == 0)
1832
451
    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_bwrite (&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
388
{
1883
388
  struct mach_o_section_32_external raw;
1884
1885
388
  memcpy (raw.sectname, section->sectname, 16);
1886
388
  memcpy (raw.segname, section->segname, 16);
1887
388
  bfd_h_put_32 (abfd, section->addr, raw.addr);
1888
388
  bfd_h_put_32 (abfd, section->size, raw.size);
1889
388
  bfd_h_put_32 (abfd, section->offset, raw.offset);
1890
388
  bfd_h_put_32 (abfd, section->align, raw.align);
1891
388
  bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1892
388
  bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1893
388
  bfd_h_put_32 (abfd, section->flags, raw.flags);
1894
388
  bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1895
388
  bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1896
1897
388
  if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
1898
388
      != BFD_MACH_O_SECTION_SIZE)
1899
0
    return false;
1900
1901
388
  return true;
1902
388
}
1903
1904
static bool
1905
bfd_mach_o_write_section_64 (bfd *abfd, bfd_mach_o_section *section)
1906
63
{
1907
63
  struct mach_o_section_64_external raw;
1908
1909
63
  memcpy (raw.sectname, section->sectname, 16);
1910
63
  memcpy (raw.segname, section->segname, 16);
1911
63
  bfd_h_put_64 (abfd, section->addr, raw.addr);
1912
63
  bfd_h_put_64 (abfd, section->size, raw.size);
1913
63
  bfd_h_put_32 (abfd, section->offset, raw.offset);
1914
63
  bfd_h_put_32 (abfd, section->align, raw.align);
1915
63
  bfd_h_put_32 (abfd, section->reloff, raw.reloff);
1916
63
  bfd_h_put_32 (abfd, section->nreloc, raw.nreloc);
1917
63
  bfd_h_put_32 (abfd, section->flags, raw.flags);
1918
63
  bfd_h_put_32 (abfd, section->reserved1, raw.reserved1);
1919
63
  bfd_h_put_32 (abfd, section->reserved2, raw.reserved2);
1920
63
  bfd_h_put_32 (abfd, section->reserved3, raw.reserved3);
1921
1922
63
  if (bfd_bwrite (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
1923
63
      != BFD_MACH_O_SECTION_64_SIZE)
1924
0
    return false;
1925
1926
63
  return true;
1927
63
}
1928
1929
static bool
1930
bfd_mach_o_write_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
1931
147
{
1932
147
  struct mach_o_segment_command_32_external raw;
1933
147
  bfd_mach_o_segment_command *seg = &command->command.segment;
1934
147
  bfd_mach_o_section *sec;
1935
1936
147
  BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
1937
1938
535
  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1939
388
    if (!bfd_mach_o_write_relocs (abfd, sec))
1940
0
      return false;
1941
1942
147
  memcpy (raw.segname, seg->segname, 16);
1943
147
  bfd_h_put_32 (abfd, seg->vmaddr, raw.vmaddr);
1944
147
  bfd_h_put_32 (abfd, seg->vmsize, raw.vmsize);
1945
147
  bfd_h_put_32 (abfd, seg->fileoff, raw.fileoff);
1946
147
  bfd_h_put_32 (abfd, seg->filesize, raw.filesize);
1947
147
  bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1948
147
  bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1949
147
  bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1950
147
  bfd_h_put_32 (abfd, seg->flags, raw.flags);
1951
1952
147
  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1953
147
      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1954
0
    return false;
1955
1956
535
  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1957
388
    if (!bfd_mach_o_write_section_32 (abfd, sec))
1958
0
      return false;
1959
1960
147
  return true;
1961
147
}
1962
1963
static bool
1964
bfd_mach_o_write_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
1965
24
{
1966
24
  struct mach_o_segment_command_64_external raw;
1967
24
  bfd_mach_o_segment_command *seg = &command->command.segment;
1968
24
  bfd_mach_o_section *sec;
1969
1970
24
  BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
1971
1972
87
  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1973
63
    if (!bfd_mach_o_write_relocs (abfd, sec))
1974
0
      return false;
1975
1976
24
  memcpy (raw.segname, seg->segname, 16);
1977
24
  bfd_h_put_64 (abfd, seg->vmaddr, raw.vmaddr);
1978
24
  bfd_h_put_64 (abfd, seg->vmsize, raw.vmsize);
1979
24
  bfd_h_put_64 (abfd, seg->fileoff, raw.fileoff);
1980
24
  bfd_h_put_64 (abfd, seg->filesize, raw.filesize);
1981
24
  bfd_h_put_32 (abfd, seg->maxprot, raw.maxprot);
1982
24
  bfd_h_put_32 (abfd, seg->initprot, raw.initprot);
1983
24
  bfd_h_put_32 (abfd, seg->nsects, raw.nsects);
1984
24
  bfd_h_put_32 (abfd, seg->flags, raw.flags);
1985
1986
24
  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
1987
24
      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
1988
0
    return false;
1989
1990
87
  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1991
63
    if (!bfd_mach_o_write_section_64 (abfd, sec))
1992
0
      return false;
1993
1994
24
  return true;
1995
24
}
1996
1997
static bool
1998
bfd_mach_o_write_symtab_content (bfd *abfd, bfd_mach_o_symtab_command *sym)
1999
26
{
2000
26
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2001
26
  unsigned long i;
2002
26
  unsigned int wide = bfd_mach_o_wide_p (abfd);
2003
26
  struct bfd_strtab_hash *strtab;
2004
26
  asymbol **symbols = bfd_get_outsymbols (abfd);
2005
26
  int padlen;
2006
2007
  /* Write the symbols first.  */
2008
26
  if (bfd_seek (abfd, sym->symoff, SEEK_SET) != 0)
2009
0
    return false;
2010
2011
26
  strtab = _bfd_stringtab_init ();
2012
26
  if (strtab == NULL)
2013
0
    return false;
2014
2015
26
  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
26
    _bfd_stringtab_add (strtab, "", true, false);
2020
2021
10.4k
  for (i = 0; i < sym->nsyms; i++)
2022
10.4k
    {
2023
10.4k
      bfd_size_type str_index;
2024
10.4k
      bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2025
2026
10.4k
      if (s->symbol.name == 0 || s->symbol.name[0] == '\0')
2027
  /* An index of 0 always means the empty string.  */
2028
1.95k
  str_index = 0;
2029
8.48k
      else
2030
8.48k
  {
2031
8.48k
    str_index = _bfd_stringtab_add (strtab, s->symbol.name, true, false);
2032
2033
8.48k
    if (str_index == (bfd_size_type) -1)
2034
0
      goto err;
2035
8.48k
  }
2036
2037
10.4k
      if (wide)
2038
461
  {
2039
461
    struct mach_o_nlist_64_external raw;
2040
2041
461
    bfd_h_put_32 (abfd, str_index, raw.n_strx);
2042
461
    bfd_h_put_8 (abfd, s->n_type, raw.n_type);
2043
461
    bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
2044
461
    bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
2045
461
    bfd_h_put_64 (abfd, s->symbol.section->vma + s->symbol.value,
2046
461
      raw.n_value);
2047
2048
461
    if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2049
0
      goto err;
2050
461
  }
2051
9.97k
      else
2052
9.97k
  {
2053
9.97k
    struct mach_o_nlist_external raw;
2054
2055
9.97k
    bfd_h_put_32 (abfd, str_index, raw.n_strx);
2056
9.97k
    bfd_h_put_8 (abfd, s->n_type, raw.n_type);
2057
9.97k
    bfd_h_put_8 (abfd, s->n_sect, raw.n_sect);
2058
9.97k
    bfd_h_put_16 (abfd, s->n_desc, raw.n_desc);
2059
9.97k
    bfd_h_put_32 (abfd, s->symbol.section->vma + s->symbol.value,
2060
9.97k
      raw.n_value);
2061
2062
9.97k
    if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2063
0
      goto err;
2064
9.97k
  }
2065
10.4k
    }
2066
26
  sym->strsize = _bfd_stringtab_size (strtab);
2067
26
  sym->stroff = mdata->filelen;
2068
26
  mdata->filelen += sym->strsize;
2069
2070
26
  if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0)
2071
0
    goto err;
2072
2073
26
  if (!_bfd_stringtab_emit (abfd, strtab))
2074
0
    goto err;
2075
2076
26
  _bfd_stringtab_free (strtab);
2077
2078
  /* Pad string table.  */
2079
26
  padlen = bfd_mach_o_pad4 (abfd, sym->strsize);
2080
26
  if (padlen < 0)
2081
0
    return false;
2082
26
  mdata->filelen += padlen;
2083
26
  sym->strsize += padlen;
2084
2085
26
  return true;
2086
2087
0
 err:
2088
0
  _bfd_stringtab_free (strtab);
2089
0
  sym->strsize = 0;
2090
0
  return false;
2091
26
}
2092
2093
static bool
2094
bfd_mach_o_write_symtab (bfd *abfd, bfd_mach_o_load_command *command)
2095
26
{
2096
26
  bfd_mach_o_symtab_command *sym = &command->command.symtab;
2097
26
  struct mach_o_symtab_command_external raw;
2098
2099
26
  BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
2100
2101
  /* The command.  */
2102
26
  bfd_h_put_32 (abfd, sym->symoff, raw.symoff);
2103
26
  bfd_h_put_32 (abfd, sym->nsyms, raw.nsyms);
2104
26
  bfd_h_put_32 (abfd, sym->stroff, raw.stroff);
2105
26
  bfd_h_put_32 (abfd, sym->strsize, raw.strsize);
2106
2107
26
  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0
2108
26
      || bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2109
0
    return false;
2110
2111
26
  return true;
2112
26
}
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
26
{
2120
26
  unsigned int i;
2121
26
  unsigned int nisyms = 0;
2122
2123
441
  for (i = 0; i < mdata->nsects; ++i)
2124
415
    {
2125
415
      bfd_mach_o_section *sec = mdata->sections[i];
2126
2127
415
      switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
2128
415
  {
2129
27
    case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
2130
53
    case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
2131
79
    case BFD_MACH_O_S_SYMBOL_STUBS:
2132
79
      nisyms += bfd_mach_o_section_get_nbr_indirect (abfd, sec);
2133
79
      break;
2134
336
    default:
2135
336
      break;
2136
415
  }
2137
415
    }
2138
26
  return nisyms;
2139
26
}
2140
2141
/* Create the dysymtab.  */
2142
2143
static bool
2144
bfd_mach_o_build_dysymtab (bfd *abfd, bfd_mach_o_dysymtab_command *cmd)
2145
26
{
2146
26
  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
26
  if (cmd->nmodtab != 0
2152
26
      || cmd->ntoc != 0
2153
26
      || 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
26
  cmd->ilocalsym = 0;
2161
2162
26
  if (bfd_get_symcount (abfd) > 0)
2163
26
    {
2164
26
      asymbol **symbols = bfd_get_outsymbols (abfd);
2165
26
      unsigned long i;
2166
2167
       /* Count the number of each kind of symbol.  */
2168
4.60k
      for (i = 0; i < bfd_get_symcount (abfd); ++i)
2169
4.60k
  {
2170
4.60k
    bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2171
4.60k
    if (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT))
2172
23
      break;
2173
4.60k
  }
2174
26
      cmd->nlocalsym = i;
2175
26
      cmd->iextdefsym = i;
2176
1.67k
      for (; i < bfd_get_symcount (abfd); ++i)
2177
1.67k
  {
2178
1.67k
    bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2179
1.67k
    if ((s->n_type & BFD_MACH_O_N_TYPE) == BFD_MACH_O_N_UNDF)
2180
22
      break;
2181
1.67k
  }
2182
26
      cmd->nextdefsym = i - cmd->nlocalsym;
2183
26
      cmd->iundefsym = cmd->nextdefsym + cmd->iextdefsym;
2184
26
      cmd->nundefsym = bfd_get_symcount (abfd)
2185
26
      - cmd->nlocalsym
2186
26
      - cmd->nextdefsym;
2187
26
    }
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
26
  cmd->nindirectsyms = bfd_mach_o_count_indirect_symbols (abfd, mdata);
2198
26
  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
26
  return true;
2253
26
}
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
26
{
2261
26
  bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
2262
2263
26
  BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
2264
2265
26
  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_bwrite ((void *) &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_bwrite ((void *) &n, sizeof (n), abfd) != sizeof (n))
2328
0
    return false;
2329
0
      }
2330
0
  }
2331
0
    }
2332
2333
26
  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_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2349
0
      return false;
2350
0
  }
2351
0
    }
2352
2353
26
  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_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
2366
0
      return false;
2367
0
  }
2368
0
    }
2369
2370
26
  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_bwrite (raw, sizeof (raw), abfd) != sizeof (raw))
2399
0
      return false;
2400
0
  }
2401
0
    }
2402
2403
  /* The command.  */
2404
26
  if (bfd_seek (abfd, command->offset + BFD_MACH_O_LC_SIZE, SEEK_SET) != 0)
2405
0
    return false;
2406
26
  else
2407
26
    {
2408
26
      struct mach_o_dysymtab_command_external raw;
2409
2410
26
      bfd_h_put_32 (abfd, cmd->ilocalsym, &raw.ilocalsym);
2411
26
      bfd_h_put_32 (abfd, cmd->nlocalsym, &raw.nlocalsym);
2412
26
      bfd_h_put_32 (abfd, cmd->iextdefsym, &raw.iextdefsym);
2413
26
      bfd_h_put_32 (abfd, cmd->nextdefsym, &raw.nextdefsym);
2414
26
      bfd_h_put_32 (abfd, cmd->iundefsym, &raw.iundefsym);
2415
26
      bfd_h_put_32 (abfd, cmd->nundefsym, &raw.nundefsym);
2416
26
      bfd_h_put_32 (abfd, cmd->tocoff, &raw.tocoff);
2417
26
      bfd_h_put_32 (abfd, cmd->ntoc, &raw.ntoc);
2418
26
      bfd_h_put_32 (abfd, cmd->modtaboff, &raw.modtaboff);
2419
26
      bfd_h_put_32 (abfd, cmd->nmodtab, &raw.nmodtab);
2420
26
      bfd_h_put_32 (abfd, cmd->extrefsymoff, &raw.extrefsymoff);
2421
26
      bfd_h_put_32 (abfd, cmd->nextrefsyms, &raw.nextrefsyms);
2422
26
      bfd_h_put_32 (abfd, cmd->indirectsymoff, &raw.indirectsymoff);
2423
26
      bfd_h_put_32 (abfd, cmd->nindirectsyms, &raw.nindirectsyms);
2424
26
      bfd_h_put_32 (abfd, cmd->extreloff, &raw.extreloff);
2425
26
      bfd_h_put_32 (abfd, cmd->nextrel, &raw.nextrel);
2426
26
      bfd_h_put_32 (abfd, cmd->locreloff, &raw.locreloff);
2427
26
      bfd_h_put_32 (abfd, cmd->nlocrel, &raw.nlocrel);
2428
2429
26
      if (bfd_bwrite (&raw, sizeof (raw), abfd) != sizeof (raw))
2430
0
  return false;
2431
26
    }
2432
2433
26
  return true;
2434
26
}
2435
2436
static unsigned
2437
bfd_mach_o_primary_symbol_sort_key (bfd_mach_o_asymbol *s)
2438
110k
{
2439
110k
  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
110k
  if (s->n_type & BFD_MACH_O_N_STAB)
2444
28.8k
    return 0;
2445
2446
  /* Local (we should never see an undefined local AFAICT).  */
2447
81.2k
  if (! (s->n_type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT)))
2448
36.0k
    return 0;
2449
2450
  /* Common symbols look like undefined externs.  */
2451
45.2k
  if (mtyp == BFD_MACH_O_N_UNDF)
2452
21.0k
    return 2;
2453
2454
  /* A defined non-local, non-debug symbol.  */
2455
24.1k
  return 1;
2456
45.2k
}
2457
2458
static int
2459
bfd_mach_o_cf_symbols (const void *a, const void *b)
2460
55.0k
{
2461
55.0k
  bfd_mach_o_asymbol *sa = *(bfd_mach_o_asymbol **) a;
2462
55.0k
  bfd_mach_o_asymbol *sb = *(bfd_mach_o_asymbol **) b;
2463
55.0k
  unsigned int soa, sob;
2464
2465
55.0k
  soa = bfd_mach_o_primary_symbol_sort_key (sa);
2466
55.0k
  sob = bfd_mach_o_primary_symbol_sort_key (sb);
2467
55.0k
  if (soa < sob)
2468
2.78k
    return -1;
2469
2470
52.2k
  if (soa > sob)
2471
5.52k
    return 1;
2472
2473
  /* If it's local or stab, just preserve the input order.  */
2474
46.7k
  if (soa == 0)
2475
28.6k
    {
2476
28.6k
      if (sa->symbol.udata.i < sb->symbol.udata.i)
2477
28.6k
  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
18.0k
  return strcmp (sa->symbol.name, sb->symbol.name);
2487
46.7k
}
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
50
{
2511
50
  unsigned long i;
2512
50
  asymbol **symbols = bfd_get_outsymbols (abfd);
2513
2514
50
  if (symbols == NULL || bfd_get_symcount (abfd) == 0)
2515
24
    return true;
2516
2517
10.4k
  for (i = 0; i < bfd_get_symcount (abfd); i++)
2518
10.4k
    {
2519
10.4k
      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
10.4k
      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
10.4k
      if (s->symbol.flags & BSF_GLOBAL)
2552
3.91k
  s->n_type |= BFD_MACH_O_N_EXT;
2553
6.51k
      else
2554
6.51k
  s->n_type &= ~BFD_MACH_O_N_EXT;
2555
2556
      /* Put the section index in, where required.  */
2557
10.4k
      if ((s->symbol.section != bfd_abs_section_ptr
2558
10.4k
    && s->symbol.section != bfd_und_section_ptr
2559
10.4k
    && s->symbol.section != bfd_com_section_ptr)
2560
10.4k
    || ((s->n_type & BFD_MACH_O_N_STAB) != 0
2561
6.38k
         && s->symbol.name == NULL))
2562
4.05k
  s->n_sect = s->symbol.section->output_section->target_index;
2563
2564
      /* Number to preserve order for local and debug syms.  */
2565
10.4k
      s->symbol.udata.i = i;
2566
10.4k
    }
2567
2568
  /* Sort the symbols.  */
2569
26
  qsort ((void *) symbols, (size_t) bfd_get_symcount (abfd),
2570
26
   sizeof (asymbol *), bfd_mach_o_cf_symbols);
2571
2572
10.4k
  for (i = 0; i < bfd_get_symcount (abfd); ++i)
2573
10.4k
    {
2574
10.4k
      bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *)symbols[i];
2575
10.4k
      s->symbol.udata.i = i;  /* renumber.  */
2576
10.4k
    }
2577
2578
26
  return true;
2579
50
}
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
50
{
2587
50
  asection *sec;
2588
50
  unsigned target_index;
2589
50
  unsigned nsect;
2590
50
  size_t amt;
2591
2592
50
  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
50
  if (mdata->nsects == nsect
2597
50
      && (mdata->nsects == 0 || mdata->sections != NULL))
2598
24
    return true;
2599
2600
  /* We need to check that this can be done...  */
2601
26
  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
26
  mdata->nsects = nsect;
2609
26
  amt = mdata->nsects * sizeof (bfd_mach_o_section *);
2610
26
  mdata->sections = bfd_alloc (abfd, amt);
2611
26
  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
26
  target_index = 0;
2618
441
  for (sec = abfd->sections; sec; sec = sec->next)
2619
415
    {
2620
415
      unsigned bfd_align = bfd_section_alignment (sec);
2621
415
      bfd_mach_o_section *msect = bfd_mach_o_get_mach_o_section (sec);
2622
2623
415
      mdata->sections[target_index] = msect;
2624
2625
415
      msect->addr = bfd_section_vma (sec);
2626
415
      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
415
      msect->align = msect->align > bfd_align ? msect->align : bfd_align;
2631
2632
415
      msect->offset = 0;
2633
415
      sec->target_index = ++target_index;
2634
415
    }
2635
2636
26
  return true;
2637
26
}
2638
2639
bool
2640
bfd_mach_o_write_contents (bfd *abfd)
2641
50
{
2642
50
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2643
50
  bfd_mach_o_load_command *cmd;
2644
50
  bfd_mach_o_symtab_command *symtab = NULL;
2645
50
  bfd_mach_o_dysymtab_command *dysymtab = NULL;
2646
50
  bfd_mach_o_segment_command *linkedit = NULL;
2647
2648
  /* Make the commands, if not already present.  */
2649
50
  if (!abfd->output_has_begun && !bfd_mach_o_build_commands (abfd))
2650
0
    return false;
2651
50
  abfd->output_has_begun = true;
2652
2653
  /* Write the header.  */
2654
50
  if (!bfd_mach_o_write_header (abfd, &mdata->header))
2655
0
    return false;
2656
2657
  /* First pass: allocate the linkedit segment.  */
2658
453
  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
2659
403
    switch (cmd->type)
2660
403
      {
2661
24
      case BFD_MACH_O_LC_SEGMENT_64:
2662
171
      case BFD_MACH_O_LC_SEGMENT:
2663
171
  if (strcmp (cmd->command.segment.segname, "__LINKEDIT") == 0)
2664
48
    linkedit = &cmd->command.segment;
2665
171
  break;
2666
26
      case BFD_MACH_O_LC_SYMTAB:
2667
26
  symtab = &cmd->command.symtab;
2668
26
  break;
2669
26
      case BFD_MACH_O_LC_DYSYMTAB:
2670
26
  dysymtab = &cmd->command.dysymtab;
2671
26
  break;
2672
23
      case BFD_MACH_O_LC_DYLD_INFO:
2673
23
  {
2674
23
    bfd_mach_o_dyld_info_command *di = &cmd->command.dyld_info;
2675
2676
23
    di->rebase_off = di->rebase_size != 0 ? mdata->filelen : 0;
2677
23
    mdata->filelen += di->rebase_size;
2678
23
    di->bind_off = di->bind_size != 0 ? mdata->filelen : 0;
2679
23
    mdata->filelen += di->bind_size;
2680
23
    di->weak_bind_off = di->weak_bind_size != 0 ? mdata->filelen : 0;
2681
23
    mdata->filelen += di->weak_bind_size;
2682
23
    di->lazy_bind_off = di->lazy_bind_size != 0 ? mdata->filelen : 0;
2683
23
    mdata->filelen += di->lazy_bind_size;
2684
23
    di->export_off = di->export_size != 0 ? mdata->filelen : 0;
2685
23
    mdata->filelen += di->export_size;
2686
23
  }
2687
23
  break;
2688
114
      case BFD_MACH_O_LC_LOAD_DYLIB:
2689
136
      case BFD_MACH_O_LC_LOAD_DYLINKER:
2690
157
      case BFD_MACH_O_LC_MAIN:
2691
  /* Nothing to do.  */
2692
157
  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
403
      }
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
50
  if (symtab != NULL)
2706
26
    {
2707
26
      unsigned int symlen;
2708
26
      unsigned int wide = bfd_mach_o_wide_p (abfd);
2709
2710
26
      symlen = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
2711
2712
      /* Align for symbols.  */
2713
26
      mdata->filelen = FILE_ALIGN (mdata->filelen, wide ? 3 : 2);
2714
26
      symtab->symoff = mdata->filelen;
2715
2716
26
      symtab->nsyms = bfd_get_symcount (abfd);
2717
26
      mdata->filelen += symtab->nsyms * symlen;
2718
26
    }
2719
2720
  /* Build the dysymtab.  */
2721
50
  if (dysymtab != NULL)
2722
26
    if (!bfd_mach_o_build_dysymtab (abfd, dysymtab))
2723
0
      return false;
2724
2725
  /* Write symtab and strtab.  */
2726
50
  if (symtab != NULL)
2727
26
    if (!bfd_mach_o_write_symtab_content (abfd, symtab))
2728
0
      return false;
2729
2730
  /* Adjust linkedit size.  */
2731
50
  if (linkedit != NULL)
2732
48
    {
2733
      /* bfd_vma pagemask = bfd_mach_o_get_backend_data (abfd)->page_size - 1; */
2734
2735
48
      linkedit->vmsize = mdata->filelen - linkedit->fileoff;
2736
      /* linkedit->vmsize = (linkedit->vmsize + pagemask) & ~pagemask; */
2737
48
      linkedit->filesize = mdata->filelen - linkedit->fileoff;
2738
2739
48
      linkedit->initprot = BFD_MACH_O_PROT_READ;
2740
48
      linkedit->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
2741
48
  | BFD_MACH_O_PROT_EXECUTE;
2742
48
    }
2743
2744
  /* Second pass: write commands.  */
2745
453
  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
2746
403
    {
2747
403
      struct mach_o_load_command_external raw;
2748
403
      unsigned long typeflag;
2749
2750
403
      typeflag = cmd->type | (cmd->type_required ? BFD_MACH_O_LC_REQ_DYLD : 0);
2751
2752
403
      bfd_h_put_32 (abfd, typeflag, raw.cmd);
2753
403
      bfd_h_put_32 (abfd, cmd->len, raw.cmdsize);
2754
2755
403
      if (bfd_seek (abfd, cmd->offset, SEEK_SET) != 0
2756
403
    || bfd_bwrite (&raw, BFD_MACH_O_LC_SIZE, abfd) != 8)
2757
0
  return false;
2758
2759
403
      switch (cmd->type)
2760
403
  {
2761
147
  case BFD_MACH_O_LC_SEGMENT:
2762
147
    if (!bfd_mach_o_write_segment_32 (abfd, cmd))
2763
0
      return false;
2764
147
    break;
2765
147
  case BFD_MACH_O_LC_SEGMENT_64:
2766
24
    if (!bfd_mach_o_write_segment_64 (abfd, cmd))
2767
0
      return false;
2768
24
    break;
2769
26
  case BFD_MACH_O_LC_SYMTAB:
2770
26
    if (!bfd_mach_o_write_symtab (abfd, cmd))
2771
0
      return false;
2772
26
    break;
2773
26
  case BFD_MACH_O_LC_DYSYMTAB:
2774
26
    if (!bfd_mach_o_write_dysymtab (abfd, cmd))
2775
0
      return false;
2776
26
    break;
2777
26
  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
114
  case BFD_MACH_O_LC_LOAD_DYLIB:
2783
114
    if (!bfd_mach_o_write_dylib (abfd, cmd))
2784
0
      return false;
2785
114
    break;
2786
114
  case BFD_MACH_O_LC_LOAD_DYLINKER:
2787
22
    if (!bfd_mach_o_write_dylinker (abfd, cmd))
2788
0
      return false;
2789
22
    break;
2790
22
  case BFD_MACH_O_LC_MAIN:
2791
21
    if (!bfd_mach_o_write_main (abfd, cmd))
2792
0
      return false;
2793
21
    break;
2794
23
  case BFD_MACH_O_LC_DYLD_INFO:
2795
23
    if (!bfd_mach_o_write_dyld_info (abfd, cmd))
2796
0
      return false;
2797
23
    break;
2798
23
  default:
2799
0
    _bfd_error_handler
2800
0
      (_("unable to write unknown load command %#x"),
2801
0
       cmd->type);
2802
0
    return false;
2803
403
  }
2804
403
    }
2805
2806
50
  return true;
2807
50
}
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
6.23M
{
2813
6.23M
  if (seg->sect_head == NULL)
2814
41.1k
    seg->sect_head = s;
2815
6.19M
  else
2816
6.19M
    seg->sect_tail->next = s;
2817
6.23M
  seg->sect_tail = s;
2818
6.23M
}
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
6.27M
{
2826
6.27M
  flagword bfd_flags;
2827
6.27M
  bfd_mach_o_section *s = bfd_mach_o_get_mach_o_section (sec);
2828
2829
  /* Create default flags.  */
2830
6.27M
  bfd_flags = bfd_section_flags (sec);
2831
6.27M
  if ((bfd_flags & SEC_CODE) == SEC_CODE)
2832
2.22k
    s->flags = BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS
2833
2.22k
      | BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS
2834
2.22k
      | BFD_MACH_O_S_REGULAR;
2835
6.27M
  else if ((bfd_flags & (SEC_ALLOC | SEC_LOAD)) == SEC_ALLOC)
2836
218
    s->flags = BFD_MACH_O_S_ZEROFILL;
2837
6.27M
  else if (bfd_flags & SEC_DEBUGGING)
2838
1.32k
    s->flags = BFD_MACH_O_S_REGULAR |  BFD_MACH_O_S_ATTR_DEBUG;
2839
6.27M
  else
2840
6.27M
    s->flags = BFD_MACH_O_S_REGULAR;
2841
6.27M
}
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
75
{
2954
75
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2955
75
  unsigned int i;
2956
75
  bfd_vma pagemask = bfd_mach_o_get_backend_data (abfd)->page_size - 1;
2957
75
  bfd_vma vma;
2958
75
  bfd_mach_o_section *s;
2959
2960
75
  seg->vmsize = 0;
2961
2962
75
  seg->fileoff = mdata->filelen;
2963
75
  seg->maxprot = 0;
2964
75
  seg->initprot = 0;
2965
75
  seg->flags = 0;
2966
2967
  /*  Append sections to the segment.  We assume they are properly ordered
2968
      by vma (but we check that).  */
2969
75
  vma = 0;
2970
1.28k
  for (i = 0; i < mdata->nsects; ++i)
2971
1.20k
    {
2972
1.20k
      s = mdata->sections[i];
2973
2974
      /* Consider only sections for this segment.  */
2975
1.20k
      if (strcmp (seg->segname, s->segname) != 0)
2976
754
  continue;
2977
2978
451
      bfd_mach_o_append_section_to_segment (seg, s);
2979
2980
451
      if (s->addr < vma)
2981
0
  {
2982
0
    _bfd_error_handler
2983
      /* xgettext:c-format */
2984
0
      (_("section address (%#" PRIx64 ") "
2985
0
         "below start of segment (%#" PRIx64 ")"),
2986
0
         (uint64_t) s->addr, (uint64_t) vma);
2987
0
    return false;
2988
0
  }
2989
2990
451
      vma = s->addr + s->size;
2991
451
    }
2992
2993
  /* Set segment file offset: make it page aligned.  */
2994
75
  vma = seg->sect_head->addr;
2995
75
  seg->vmaddr = vma & ~pagemask;
2996
75
  if ((mdata->filelen & pagemask) > (vma & pagemask))
2997
4
    mdata->filelen += pagemask + 1;
2998
75
  seg->fileoff = mdata->filelen & ~pagemask;
2999
75
  mdata->filelen = seg->fileoff + (vma & pagemask);
3000
3001
  /* Set section file offset.  */
3002
526
  for (s = seg->sect_head; s != NULL; s = s->next)
3003
451
    {
3004
451
      asection *sec = s->bfdsection;
3005
451
      flagword flags = bfd_section_flags (sec);
3006
3007
      /* Adjust segment size.  */
3008
451
      seg->vmsize = FILE_ALIGN (seg->vmsize, s->align);
3009
451
      seg->vmsize += s->size;
3010
3011
      /* File offset and length.  */
3012
451
      seg->filesize = FILE_ALIGN (seg->filesize, s->align);
3013
3014
451
      if ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK) != BFD_MACH_O_S_ZEROFILL
3015
451
    && ((s->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3016
423
        != BFD_MACH_O_S_GB_ZEROFILL))
3017
423
  {
3018
423
    mdata->filelen = FILE_ALIGN (mdata->filelen, s->align);
3019
3020
423
    s->offset = mdata->filelen;
3021
423
    s->bfdsection->filepos = s->offset;
3022
3023
423
    seg->filesize += s->size;
3024
423
    mdata->filelen += s->size;
3025
423
  }
3026
28
      else
3027
28
  {
3028
28
    s->offset = 0;
3029
28
    s->bfdsection->filepos = 0;
3030
28
  }
3031
3032
      /* Set protection.  */
3033
451
      if (flags & SEC_LOAD)
3034
412
  {
3035
412
    if (flags & SEC_CODE)
3036
146
      seg->initprot |= BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_EXECUTE;
3037
412
    if ((flags & (SEC_DATA | SEC_READONLY)) == SEC_DATA)
3038
224
      seg->initprot |= BFD_MACH_O_PROT_WRITE | BFD_MACH_O_PROT_READ;
3039
412
  }
3040
3041
      /* Relocs shouldn't appear in non-object files.  */
3042
451
      if (s->bfdsection->reloc_count != 0)
3043
0
  return false;
3044
451
    }
3045
3046
  /* Set maxprot.  */
3047
75
  if (seg->initprot != 0)
3048
64
    seg->maxprot = BFD_MACH_O_PROT_READ | BFD_MACH_O_PROT_WRITE
3049
64
     | BFD_MACH_O_PROT_EXECUTE;
3050
11
  else
3051
11
    seg->maxprot = 0;
3052
3053
  /* Round segment size (and file size).  */
3054
75
  seg->vmsize = (seg->vmsize + pagemask) & ~pagemask;
3055
75
  seg->filesize = (seg->filesize + pagemask) & ~pagemask;
3056
75
  mdata->filelen = (mdata->filelen + pagemask) & ~pagemask;
3057
3058
75
  return true;
3059
75
}
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
50
{
3067
50
  unsigned wide = mach_o_wide_p (&mdata->header);
3068
50
  unsigned int hdrlen;
3069
50
  ufile_ptr offset;
3070
50
  bfd_mach_o_load_command *cmd;
3071
50
  unsigned int align;
3072
50
  bool ret = true;
3073
3074
50
  hdrlen = wide ? BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
3075
50
  align = wide ? 8 - 1 : 4 - 1;
3076
50
  offset = hdrlen;
3077
50
  mdata->header.ncmds = 0;
3078
3079
453
  for (cmd = mdata->first_command; cmd; cmd = cmd->next)
3080
403
    {
3081
403
      mdata->header.ncmds++;
3082
403
      cmd->offset = offset;
3083
3084
403
      switch (cmd->type)
3085
403
  {
3086
24
  case BFD_MACH_O_LC_SEGMENT_64:
3087
24
    cmd->len = BFD_MACH_O_LC_SEGMENT_64_SIZE
3088
24
      + BFD_MACH_O_SECTION_64_SIZE * cmd->command.segment.nsects;
3089
24
    break;
3090
147
  case BFD_MACH_O_LC_SEGMENT:
3091
147
    cmd->len = BFD_MACH_O_LC_SEGMENT_SIZE
3092
147
      + BFD_MACH_O_SECTION_SIZE * cmd->command.segment.nsects;
3093
147
    break;
3094
26
  case BFD_MACH_O_LC_SYMTAB:
3095
26
    cmd->len = sizeof (struct mach_o_symtab_command_external)
3096
26
      + BFD_MACH_O_LC_SIZE;
3097
26
    break;
3098
26
  case BFD_MACH_O_LC_DYSYMTAB:
3099
26
    cmd->len = sizeof (struct mach_o_dysymtab_command_external)
3100
26
     + BFD_MACH_O_LC_SIZE;
3101
26
    break;
3102
114
  case BFD_MACH_O_LC_LOAD_DYLIB:
3103
114
    cmd->len = sizeof (struct mach_o_dylib_command_external)
3104
114
     + BFD_MACH_O_LC_SIZE;
3105
114
    cmd->command.dylib.name_offset = cmd->len;
3106
114
    cmd->len += strlen (cmd->command.dylib.name_str);
3107
114
    cmd->len = (cmd->len + align) & ~align;
3108
114
    break;
3109
22
  case BFD_MACH_O_LC_LOAD_DYLINKER:
3110
22
    cmd->len = sizeof (struct mach_o_str_command_external)
3111
22
     + BFD_MACH_O_LC_SIZE;
3112
22
    cmd->command.dylinker.name_offset = cmd->len;
3113
22
    cmd->len += strlen (cmd->command.dylinker.name_str);
3114
22
    cmd->len = (cmd->len + align) & ~align;
3115
22
    break;
3116
21
  case BFD_MACH_O_LC_MAIN:
3117
21
    cmd->len = sizeof (struct mach_o_entry_point_command_external)
3118
21
     + BFD_MACH_O_LC_SIZE;
3119
21
    break;
3120
23
  case BFD_MACH_O_LC_DYLD_INFO:
3121
23
    cmd->len = sizeof (struct mach_o_dyld_info_command_external)
3122
23
     + BFD_MACH_O_LC_SIZE;
3123
23
    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
403
  }
3131
3132
403
      BFD_ASSERT (cmd->len % (align + 1) == 0);
3133
403
      offset += cmd->len;
3134
403
    }
3135
50
  mdata->header.sizeofcmds = offset - hdrlen;
3136
50
  mdata->filelen = offset;
3137
3138
50
  return ret;
3139
50
}
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
171
{
3149
171
  bfd_mach_o_segment_command *seg = &cmd->command.segment;
3150
171
  unsigned wide = mach_o_wide_p (&mdata->header);
3151
3152
  /* Init segment command.  */
3153
171
  cmd->type = wide ? BFD_MACH_O_LC_SEGMENT_64 : BFD_MACH_O_LC_SEGMENT;
3154
171
  cmd->type_required = false;
3155
3156
171
  strcpy (seg->segname, segname);
3157
171
  seg->nsects = nbr_sect;
3158
3159
171
  seg->vmaddr = 0;
3160
171
  seg->vmsize = 0;
3161
3162
171
  seg->fileoff = 0;
3163
171
  seg->filesize = 0;
3164
171
  seg->maxprot = 0;
3165
171
  seg->initprot = 0;
3166
171
  seg->flags = 0;
3167
171
  seg->sect_head = NULL;
3168
171
  seg->sect_tail = NULL;
3169
171
}
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
50
{
3178
50
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3179
50
  unsigned wide = mach_o_wide_p (&mdata->header);
3180
50
  unsigned int nbr_segcmd = 0;
3181
50
  bfd_mach_o_load_command *commands;
3182
50
  unsigned int nbr_commands;
3183
50
  int symtab_idx = -1;
3184
50
  int dysymtab_idx = -1;
3185
50
  int main_idx = -1;
3186
50
  unsigned int i;
3187
3188
  /* Return now if already built.  */
3189
50
  if (mdata->header.ncmds != 0)
3190
0
    return true;
3191
3192
  /* Fill in the file type, if not already set.  */
3193
50
  if (mdata->header.filetype == 0)
3194
50
    {
3195
50
      if (abfd->flags & EXEC_P)
3196
44
  mdata->header.filetype = BFD_MACH_O_MH_EXECUTE;
3197
6
      else if (abfd->flags & DYNAMIC)
3198
4
  mdata->header.filetype = BFD_MACH_O_MH_DYLIB;
3199
2
      else
3200
2
  mdata->header.filetype = BFD_MACH_O_MH_OBJECT;
3201
50
    }
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
50
  if (mdata->nsects == 0 || mdata->sections == NULL)
3207
50
    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
50
  if (!bfd_mach_o_mangle_symbols (abfd))
3213
0
    return false;
3214
3215
  /* Segment commands.  */
3216
50
  if (mdata->header.filetype == BFD_MACH_O_MH_OBJECT)
3217
2
    {
3218
      /* Only one segment for all the sections.  But the segment is
3219
   optional if there is no sections.  */
3220
2
      nbr_segcmd = (mdata->nsects > 0) ? 1 : 0;
3221
2
    }
3222
48
  else
3223
48
    {
3224
48
      bfd_mach_o_section *prev_sect = NULL;
3225
3226
      /* One pagezero segment and one linkedit segment.  */
3227
48
      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
463
      for (i = 0; i < mdata->nsects; i++)
3232
415
  {
3233
415
    bfd_mach_o_section *this_sect = mdata->sections[i];
3234
3235
415
    if (prev_sect == NULL
3236
415
        || strcmp (prev_sect->segname, this_sect->segname) != 0)
3237
75
      {
3238
75
        nbr_segcmd++;
3239
75
        prev_sect = this_sect;
3240
75
      }
3241
415
  }
3242
48
    }
3243
3244
50
  nbr_commands = nbr_segcmd;
3245
3246
  /* One command for the symbol table (only if there are symbols.  */
3247
50
  if (bfd_get_symcount (abfd) > 0)
3248
26
    symtab_idx = nbr_commands++;
3249
3250
  /* FIXME:
3251
     This is a rather crude test for whether we should build a dysymtab.  */
3252
50
  if (bfd_mach_o_should_emit_dysymtab ()
3253
50
      && bfd_get_symcount (abfd))
3254
26
    {
3255
      /* If there should be a case where a dysymtab could be emitted without
3256
   a symtab (seems improbable), this would need amending.  */
3257
26
      dysymtab_idx = nbr_commands++;
3258
26
    }
3259
3260
  /* Add an entry point command.  */
3261
50
  if (mdata->header.filetype == BFD_MACH_O_MH_EXECUTE
3262
50
      && bfd_get_start_address (abfd) != 0)
3263
21
    main_idx = nbr_commands++;
3264
3265
  /* Well, we must have a header, at least.  */
3266
50
  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
50
  if (nbr_commands == 0)
3271
2
    {
3272
      /* Layout commands (well none...) and set headers command fields.  */
3273
2
      return bfd_mach_o_layout_commands (mdata);
3274
2
    }
3275
3276
  /* Create commands for segments (and symtabs), prepend them.  */
3277
48
  commands = bfd_zalloc (abfd, nbr_commands * sizeof (bfd_mach_o_load_command));
3278
48
  if (commands == NULL)
3279
0
    return false;
3280
244
  for (i = 0; i < nbr_commands - 1; i++)
3281
196
    commands[i].next = &commands[i + 1];
3282
48
  commands[nbr_commands - 1].next = mdata->first_command;
3283
48
  if (mdata->first_command == NULL)
3284
22
    mdata->last_command = &commands[nbr_commands - 1];
3285
48
  mdata->first_command = &commands[0];
3286
3287
48
  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
48
  else if (nbr_segcmd != 0)
3293
48
    {
3294
48
      bfd_mach_o_load_command *cmd;
3295
3296
48
      BFD_ASSERT (nbr_segcmd >= 2);
3297
3298
      /* The pagezero.  */
3299
48
      cmd = &commands[0];
3300
48
      bfd_mach_o_init_segment (mdata, cmd, "__PAGEZERO", 0);
3301
3302
      /* Segments from sections.  */
3303
48
      cmd++;
3304
123
      for (i = 0; i < mdata->nsects;)
3305
75
  {
3306
75
    const char *segname = mdata->sections[i]->segname;
3307
75
    unsigned int nbr_sect = 1;
3308
3309
    /* Count number of sections for this segment.  */
3310
415
    for (i++; i < mdata->nsects; i++)
3311
389
      if (strcmp (mdata->sections[i]->segname, segname) == 0)
3312
340
        nbr_sect++;
3313
49
      else
3314
49
        break;
3315
3316
75
    bfd_mach_o_init_segment (mdata, cmd, segname, nbr_sect);
3317
75
    cmd++;
3318
75
  }
3319
3320
      /* The linkedit.  */
3321
48
      bfd_mach_o_init_segment (mdata, cmd, "__LINKEDIT", 0);
3322
48
    }
3323
3324
48
  if (symtab_idx >= 0)
3325
26
    {
3326
      /* Init symtab command.  */
3327
26
      bfd_mach_o_load_command *cmd = &commands[symtab_idx];
3328
3329
26
      cmd->type = BFD_MACH_O_LC_SYMTAB;
3330
26
      cmd->type_required = false;
3331
26
    }
3332
3333
  /* If required, setup symtab command, see comment above about the quality
3334
     of this test.  */
3335
48
  if (dysymtab_idx >= 0)
3336
26
    {
3337
26
      bfd_mach_o_load_command *cmd = &commands[dysymtab_idx];
3338
3339
26
      cmd->type = BFD_MACH_O_LC_DYSYMTAB;
3340
26
      cmd->type_required = false;
3341
26
    }
3342
3343
  /* Create the main command.  */
3344
48
  if (main_idx >= 0)
3345
21
    {
3346
21
      bfd_mach_o_load_command *cmd = &commands[main_idx];
3347
3348
21
      cmd->type = BFD_MACH_O_LC_MAIN;
3349
21
      cmd->type_required = true;
3350
3351
21
      cmd->command.main.entryoff = 0;
3352
21
      cmd->command.main.stacksize = 0;
3353
21
    }
3354
3355
  /* Layout commands.  */
3356
48
  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
48
  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
48
  else
3369
48
    {
3370
48
      bfd_vma maxvma = 0;
3371
3372
      /* Skip pagezero and linkedit segments.  */
3373
123
      for (i = 1; i < nbr_segcmd - 1; i++)
3374
75
  {
3375
75
    bfd_mach_o_segment_command *seg = &commands[i].command.segment;
3376
3377
75
    if (!bfd_mach_o_build_exec_seg_command (abfd, seg))
3378
0
      return false;
3379
3380
75
    if (seg->vmaddr + seg->vmsize > maxvma)
3381
57
      maxvma = seg->vmaddr + seg->vmsize;
3382
75
  }
3383
3384
      /* Set the size of __PAGEZERO.  */
3385
48
      commands[0].command.segment.vmsize =
3386
48
  commands[1].command.segment.vmaddr;
3387
3388
      /* Set the vma and fileoff of __LINKEDIT.  */
3389
48
      commands[nbr_segcmd - 1].command.segment.vmaddr = maxvma;
3390
48
      commands[nbr_segcmd - 1].command.segment.fileoff = mdata->filelen;
3391
3392
      /* Set entry point (once segments have been laid out).  */
3393
48
      if (main_idx >= 0)
3394
21
  commands[main_idx].command.main.entryoff =
3395
21
    bfd_get_start_address (abfd) - commands[1].command.segment.vmaddr;
3396
48
    }
3397
3398
48
  return true;
3399
48
}
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
388
{
3410
388
  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
388
  if (!abfd->output_has_begun && !bfd_mach_o_build_commands (abfd))
3415
0
    return false;
3416
3417
388
  if (count == 0)
3418
0
    return true;
3419
3420
388
  pos = section->filepos + offset;
3421
388
  if (bfd_seek (abfd, pos, SEEK_SET) != 0
3422
388
      || bfd_bwrite (location, count, abfd) != count)
3423
0
    return false;
3424
3425
388
  return true;
3426
388
}
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
6.31M
{
3441
6.31M
  asymbol *new_symbol;
3442
3443
6.31M
  new_symbol = bfd_zalloc (abfd, sizeof (bfd_mach_o_asymbol));
3444
6.31M
  if (new_symbol == NULL)
3445
0
    return new_symbol;
3446
6.31M
  new_symbol->the_bfd = abfd;
3447
6.31M
  new_symbol->udata.i = SYM_MACHO_FIELDS_UNSET;
3448
6.31M
  return new_symbol;
3449
6.31M
}
3450
3451
static bool
3452
bfd_mach_o_read_header (bfd *abfd, file_ptr hdr_off, bfd_mach_o_header *header)
3453
10.9M
{
3454
10.9M
  struct mach_o_header_external raw;
3455
10.9M
  unsigned int size;
3456
10.9M
  bfd_vma (*get32) (const void *) = NULL;
3457
3458
  /* Just read the magic number.  */
3459
10.9M
  if (bfd_seek (abfd, hdr_off, SEEK_SET) != 0
3460
10.9M
      || bfd_bread (raw.magic, sizeof (raw.magic), abfd) != 4)
3461
22.3k
    return false;
3462
3463
10.8M
  if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
3464
4.57k
    {
3465
4.57k
      header->byteorder = BFD_ENDIAN_BIG;
3466
4.57k
      header->magic = BFD_MACH_O_MH_MAGIC;
3467
4.57k
      header->version = 1;
3468
4.57k
      get32 = bfd_getb32;
3469
4.57k
    }
3470
10.8M
  else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC)
3471
218k
    {
3472
218k
      header->byteorder = BFD_ENDIAN_LITTLE;
3473
218k
      header->magic = BFD_MACH_O_MH_MAGIC;
3474
218k
      header->version = 1;
3475
218k
      get32 = bfd_getl32;
3476
218k
    }
3477
10.6M
  else if (bfd_getb32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
3478
1.47k
    {
3479
1.47k
      header->byteorder = BFD_ENDIAN_BIG;
3480
1.47k
      header->magic = BFD_MACH_O_MH_MAGIC_64;
3481
1.47k
      header->version = 2;
3482
1.47k
      get32 = bfd_getb32;
3483
1.47k
    }
3484
10.6M
  else if (bfd_getl32 (raw.magic) == BFD_MACH_O_MH_MAGIC_64)
3485
374k
    {
3486
374k
      header->byteorder = BFD_ENDIAN_LITTLE;
3487
374k
      header->magic = BFD_MACH_O_MH_MAGIC_64;
3488
374k
      header->version = 2;
3489
374k
      get32 = bfd_getl32;
3490
374k
    }
3491
10.2M
  else
3492
10.2M
    {
3493
10.2M
      header->byteorder = BFD_ENDIAN_UNKNOWN;
3494
10.2M
      return false;
3495
10.2M
    }
3496
3497
  /* Once the size of the header is known, read the full header.  */
3498
598k
  size = mach_o_wide_p (header) ?
3499
375k
    BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
3500
3501
598k
  if (bfd_seek (abfd, hdr_off, SEEK_SET) != 0
3502
598k
      || bfd_bread (&raw, size, abfd) != size)
3503
2.95k
    return false;
3504
3505
595k
  header->cputype = (*get32) (raw.cputype);
3506
595k
  header->cpusubtype = (*get32) (raw.cpusubtype);
3507
595k
  header->filetype = (*get32) (raw.filetype);
3508
595k
  header->ncmds = (*get32) (raw.ncmds);
3509
595k
  header->sizeofcmds = (*get32) (raw.sizeofcmds);
3510
595k
  header->flags = (*get32) (raw.flags);
3511
3512
595k
  if (mach_o_wide_p (header))
3513
373k
    header->reserved = (*get32) (raw.reserved);
3514
221k
  else
3515
221k
    header->reserved = 0;
3516
3517
595k
  return true;
3518
598k
}
3519
3520
bool
3521
bfd_mach_o_new_section_hook (bfd *abfd, asection *sec)
3522
6.31M
{
3523
6.31M
  bfd_mach_o_section *s;
3524
6.31M
  unsigned bfdalign = bfd_section_alignment (sec);
3525
3526
6.31M
  s = bfd_mach_o_get_mach_o_section (sec);
3527
6.31M
  if (s == NULL)
3528
6.31M
    {
3529
6.31M
      flagword bfd_flags;
3530
6.31M
      static const mach_o_section_name_xlat * xlat;
3531
3532
6.31M
      s = (bfd_mach_o_section *) bfd_zalloc (abfd, sizeof (*s));
3533
6.31M
      if (s == NULL)
3534
0
  return false;
3535
6.31M
      sec->used_by_bfd = s;
3536
6.31M
      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
6.31M
      xlat = bfd_mach_o_convert_section_name_to_mach_o (abfd, sec, s);
3543
6.31M
      if (xlat != NULL)
3544
37.1k
  {
3545
37.1k
    s->flags = xlat->macho_sectype | xlat->macho_secattr;
3546
37.1k
    s->align = xlat->sectalign > bfdalign ? xlat->sectalign
3547
37.1k
            : bfdalign;
3548
37.1k
    bfd_set_section_alignment (sec, s->align);
3549
37.1k
    bfd_flags = bfd_section_flags (sec);
3550
37.1k
    if (bfd_flags == SEC_NO_FLAGS)
3551
3.58k
      bfd_set_section_flags (sec, xlat->bfd_flags);
3552
37.1k
  }
3553
6.27M
      else
3554
  /* Create default flags.  */
3555
6.27M
  bfd_mach_o_set_section_flags_from_bfd (abfd, sec);
3556
6.31M
    }
3557
3558
6.31M
  return _bfd_generic_new_section_hook (abfd, sec);
3559
6.31M
}
3560
3561
static void
3562
bfd_mach_o_init_section_from_mach_o (asection *sec, unsigned long prot)
3563
6.23M
{
3564
6.23M
  flagword flags;
3565
6.23M
  bfd_mach_o_section *section;
3566
3567
6.23M
  flags = bfd_section_flags (sec);
3568
6.23M
  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
6.23M
  if (flags == SEC_NO_FLAGS)
3574
6.20M
    {
3575
      /* Try to guess flags.  */
3576
6.20M
      if (section->flags & BFD_MACH_O_S_ATTR_DEBUG)
3577
1.28M
  flags = SEC_DEBUGGING;
3578
4.91M
      else
3579
4.91M
  {
3580
4.91M
    flags = SEC_ALLOC;
3581
4.91M
    if ((section->flags & BFD_MACH_O_SECTION_TYPE_MASK)
3582
4.91M
        != BFD_MACH_O_S_ZEROFILL)
3583
4.81M
      {
3584
4.81M
        flags |= SEC_LOAD;
3585
4.81M
        if (prot & BFD_MACH_O_PROT_EXECUTE)
3586
3.17M
    flags |= SEC_CODE;
3587
4.81M
        if (prot & BFD_MACH_O_PROT_WRITE)
3588
1.15M
    flags |= SEC_DATA;
3589
3.66M
        else if (prot & BFD_MACH_O_PROT_READ)
3590
2.40M
    flags |= SEC_READONLY;
3591
4.81M
      }
3592
4.91M
  }
3593
6.20M
    }
3594
33.3k
  else
3595
33.3k
    {
3596
33.3k
      if ((flags & SEC_DEBUGGING) == 0)
3597
32.3k
  flags |= SEC_ALLOC;
3598
33.3k
    }
3599
3600
6.23M
  if (section->offset != 0)
3601
4.66M
    flags |= SEC_HAS_CONTENTS;
3602
6.23M
  if (section->nreloc != 0)
3603
4.57M
    flags |= SEC_RELOC;
3604
3605
6.23M
  bfd_set_section_flags (sec, flags);
3606
3607
6.23M
  sec->vma = section->addr;
3608
6.23M
  sec->lma = section->addr;
3609
6.23M
  sec->size = section->size;
3610
6.23M
  sec->filepos = section->offset;
3611
6.23M
  sec->alignment_power = section->align;
3612
6.23M
  sec->segment_mark = 0;
3613
6.23M
  sec->reloc_count = section->nreloc;
3614
6.23M
  sec->rel_filepos = section->reloff;
3615
6.23M
}
3616
3617
static asection *
3618
bfd_mach_o_make_bfd_section (bfd *abfd,
3619
           const unsigned char *segname,
3620
           const unsigned char *sectname)
3621
6.23M
{
3622
6.23M
  const char *sname;
3623
6.23M
  flagword flags;
3624
3625
6.23M
  bfd_mach_o_convert_section_name_to_bfd
3626
6.23M
    (abfd, (const char *)segname, (const char *)sectname, &sname, &flags);
3627
6.23M
  if (sname == NULL)
3628
0
    return NULL;
3629
3630
6.23M
  return bfd_make_section_anyway_with_flags (abfd, sname, flags);
3631
6.23M
}
3632
3633
static asection *
3634
bfd_mach_o_read_section_32 (bfd *abfd, unsigned long prot)
3635
1.47M
{
3636
1.47M
  struct mach_o_section_32_external raw;
3637
1.47M
  asection *sec;
3638
1.47M
  bfd_mach_o_section *section;
3639
3640
1.47M
  if (bfd_bread (&raw, BFD_MACH_O_SECTION_SIZE, abfd)
3641
1.47M
      != BFD_MACH_O_SECTION_SIZE)
3642
7.84k
    return NULL;
3643
3644
1.46M
  sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
3645
1.46M
  if (sec == NULL)
3646
0
    return NULL;
3647
3648
1.46M
  section = bfd_mach_o_get_mach_o_section (sec);
3649
1.46M
  memcpy (section->segname, raw.segname, sizeof (raw.segname));
3650
1.46M
  section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
3651
1.46M
  memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
3652
1.46M
  section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
3653
1.46M
  section->addr = bfd_h_get_32 (abfd, raw.addr);
3654
1.46M
  section->size = bfd_h_get_32 (abfd, raw.size);
3655
1.46M
  section->offset = bfd_h_get_32 (abfd, raw.offset);
3656
1.46M
  section->align = bfd_h_get_32 (abfd, raw.align);
3657
  /* PR 17512: file: 0017eb76.  */
3658
1.46M
  if (section->align >= 31)
3659
959k
    {
3660
959k
      _bfd_error_handler
3661
959k
  (_("bfd_mach_o_read_section_32: overlarge alignment value: %#lx"),
3662
959k
   section->align);
3663
959k
      section->align = 30;
3664
959k
    }
3665
1.46M
  section->reloff = bfd_h_get_32 (abfd, raw.reloff);
3666
1.46M
  section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
3667
1.46M
  section->flags = bfd_h_get_32 (abfd, raw.flags);
3668
1.46M
  section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
3669
1.46M
  section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
3670
1.46M
  section->reserved3 = 0;
3671
3672
1.46M
  bfd_mach_o_init_section_from_mach_o (sec, prot);
3673
3674
1.46M
  return sec;
3675
1.46M
}
3676
3677
static asection *
3678
bfd_mach_o_read_section_64 (bfd *abfd, unsigned long prot)
3679
4.78M
{
3680
4.78M
  struct mach_o_section_64_external raw;
3681
4.78M
  asection *sec;
3682
4.78M
  bfd_mach_o_section *section;
3683
3684
4.78M
  if (bfd_bread (&raw, BFD_MACH_O_SECTION_64_SIZE, abfd)
3685
4.78M
      != BFD_MACH_O_SECTION_64_SIZE)
3686
9.63k
    return NULL;
3687
3688
4.77M
  sec = bfd_mach_o_make_bfd_section (abfd, raw.segname, raw.sectname);
3689
4.77M
  if (sec == NULL)
3690
0
    return NULL;
3691
3692
4.77M
  section = bfd_mach_o_get_mach_o_section (sec);
3693
4.77M
  memcpy (section->segname, raw.segname, sizeof (raw.segname));
3694
4.77M
  section->segname[BFD_MACH_O_SEGNAME_SIZE] = 0;
3695
4.77M
  memcpy (section->sectname, raw.sectname, sizeof (raw.sectname));
3696
4.77M
  section->sectname[BFD_MACH_O_SECTNAME_SIZE] = 0;
3697
4.77M
  section->addr = bfd_h_get_64 (abfd, raw.addr);
3698
4.77M
  section->size = bfd_h_get_64 (abfd, raw.size);
3699
4.77M
  section->offset = bfd_h_get_32 (abfd, raw.offset);
3700
4.77M
  section->align = bfd_h_get_32 (abfd, raw.align);
3701
4.77M
  if (section->align >= 63)
3702
3.46M
    {
3703
3.46M
      _bfd_error_handler
3704
3.46M
  (_("bfd_mach_o_read_section_64: overlarge alignment value: %#lx"),
3705
3.46M
   section->align);
3706
3.46M
      section->align = 62;
3707
3.46M
    }
3708
4.77M
  section->reloff = bfd_h_get_32 (abfd, raw.reloff);
3709
4.77M
  section->nreloc = bfd_h_get_32 (abfd, raw.nreloc);
3710
4.77M
  section->flags = bfd_h_get_32 (abfd, raw.flags);
3711
4.77M
  section->reserved1 = bfd_h_get_32 (abfd, raw.reserved1);
3712
4.77M
  section->reserved2 = bfd_h_get_32 (abfd, raw.reserved2);
3713
4.77M
  section->reserved3 = bfd_h_get_32 (abfd, raw.reserved3);
3714
3715
4.77M
  bfd_mach_o_init_section_from_mach_o (sec, prot);
3716
3717
4.77M
  return sec;
3718
4.77M
}
3719
3720
static asection *
3721
bfd_mach_o_read_section (bfd *abfd, unsigned long prot, unsigned int wide)
3722
6.25M
{
3723
6.25M
  if (wide)
3724
4.78M
    return bfd_mach_o_read_section_64 (abfd, prot);
3725
1.47M
  else
3726
1.47M
    return bfd_mach_o_read_section_32 (abfd, prot);
3727
6.25M
}
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
70.5k
{
3735
70.5k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3736
70.5k
  unsigned int wide = mach_o_wide_p (&mdata->header);
3737
70.5k
  unsigned int symwidth =
3738
70.5k
    wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
3739
70.5k
  unsigned int symoff = sym->symoff + (i * symwidth);
3740
70.5k
  struct mach_o_nlist_64_external raw;
3741
70.5k
  unsigned char type = -1;
3742
70.5k
  unsigned char section = -1;
3743
70.5k
  short desc = -1;
3744
70.5k
  symvalue value = -1;
3745
70.5k
  unsigned long stroff = -1;
3746
70.5k
  unsigned int symtype = -1;
3747
3748
70.5k
  BFD_ASSERT (sym->strtab != NULL);
3749
3750
70.5k
  if (bfd_seek (abfd, symoff, SEEK_SET) != 0
3751
70.5k
      || bfd_bread (&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
70.5k
  stroff = bfd_h_get_32 (abfd, raw.n_strx);
3761
70.5k
  type = bfd_h_get_8 (abfd, raw.n_type);
3762
70.5k
  symtype = type & BFD_MACH_O_N_TYPE;
3763
70.5k
  section = bfd_h_get_8 (abfd, raw.n_sect);
3764
70.5k
  desc = bfd_h_get_16 (abfd, raw.n_desc);
3765
70.5k
  if (wide)
3766
17.4k
    value = bfd_h_get_64 (abfd, raw.n_value);
3767
53.0k
  else
3768
53.0k
    value = bfd_h_get_32 (abfd, raw.n_value);
3769
3770
70.5k
  if (stroff >= sym->strsize)
3771
572
    {
3772
572
      _bfd_error_handler
3773
  /* xgettext:c-format */
3774
572
  (_("bfd_mach_o_read_symtab_symbol: name out of range (%lu >= %u)"),
3775
572
   stroff,
3776
572
   sym->strsize);
3777
572
      return false;
3778
572
    }
3779
3780
69.9k
  s->symbol.the_bfd = abfd;
3781
69.9k
  s->symbol.name = sym->strtab + stroff;
3782
69.9k
  s->symbol.value = value;
3783
69.9k
  s->symbol.flags = 0x0;
3784
69.9k
  s->symbol.udata.i = i;
3785
69.9k
  s->n_type = type;
3786
69.9k
  s->n_sect = section;
3787
69.9k
  s->n_desc = desc;
3788
3789
69.9k
  if (type & BFD_MACH_O_N_STAB)
3790
18.9k
    {
3791
18.9k
      s->symbol.flags |= BSF_DEBUGGING;
3792
18.9k
      s->symbol.section = bfd_und_section_ptr;
3793
18.9k
      switch (type)
3794
18.9k
  {
3795
3.06k
  case N_FUN:
3796
3.14k
  case N_STSYM:
3797
3.29k
  case N_LCSYM:
3798
4.86k
  case N_BNSYM:
3799
4.99k
  case N_SLINE:
3800
6.52k
  case N_ENSYM:
3801
6.58k
  case N_ECOMM:
3802
6.71k
  case N_ECOML:
3803
7.48k
  case N_GSYM:
3804
7.48k
    if ((section > 0) && (section <= mdata->nsects))
3805
4.93k
      {
3806
4.93k
        s->symbol.section = mdata->sections[section - 1]->bfdsection;
3807
4.93k
        s->symbol.value =
3808
4.93k
    s->symbol.value - mdata->sections[section - 1]->addr;
3809
4.93k
      }
3810
7.48k
    break;
3811
18.9k
  }
3812
18.9k
    }
3813
51.0k
  else
3814
51.0k
    {
3815
51.0k
      if (type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT))
3816
21.8k
  s->symbol.flags |= BSF_GLOBAL;
3817
29.1k
      else
3818
29.1k
  s->symbol.flags |= BSF_LOCAL;
3819
3820
51.0k
      switch (symtype)
3821
51.0k
  {
3822
34.3k
  case BFD_MACH_O_N_UNDF:
3823
34.3k
    if (type == (BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT)
3824
34.3k
        && s->symbol.value != 0)
3825
927
      {
3826
        /* A common symbol.  */
3827
927
        s->symbol.section = bfd_com_section_ptr;
3828
927
        s->symbol.flags = BSF_NO_FLAGS;
3829
927
      }
3830
33.4k
    else
3831
33.4k
      {
3832
33.4k
        s->symbol.section = bfd_und_section_ptr;
3833
33.4k
        if (s->n_desc & BFD_MACH_O_N_WEAK_REF)
3834
1.21k
    s->symbol.flags |= BSF_WEAK;
3835
33.4k
      }
3836
34.3k
    break;
3837
455
  case BFD_MACH_O_N_PBUD:
3838
455
    s->symbol.section = bfd_und_section_ptr;
3839
455
    break;
3840
643
  case BFD_MACH_O_N_ABS:
3841
643
    s->symbol.section = bfd_abs_section_ptr;
3842
643
    break;
3843
14.3k
  case BFD_MACH_O_N_SECT:
3844
14.3k
    if ((section > 0) && (section <= mdata->nsects))
3845
14.1k
      {
3846
14.1k
        s->symbol.section = mdata->sections[section - 1]->bfdsection;
3847
14.1k
        s->symbol.value =
3848
14.1k
    s->symbol.value - mdata->sections[section - 1]->addr;
3849
14.1k
      }
3850
223
    else
3851
223
      {
3852
        /* Mach-O uses 0 to mean "no section"; not an error.  */
3853
223
        if (section != 0)
3854
126
    {
3855
126
      _bfd_error_handler
3856
        /* xgettext:c-format */
3857
126
        (_("bfd_mach_o_read_symtab_symbol: "
3858
126
           "symbol \"%s\" specified invalid section %d (max %lu): "
3859
126
           "setting to undefined"),
3860
126
         s->symbol.name, section, mdata->nsects);
3861
126
    }
3862
223
        s->symbol.section = bfd_und_section_ptr;
3863
223
      }
3864
14.3k
    break;
3865
356
  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
356
    s->symbol.flags |= BSF_INDIRECT;
3870
356
    s->symbol.section = bfd_ind_section_ptr;
3871
356
    s->symbol.value = 0;
3872
356
    break;
3873
894
  default:
3874
894
    _bfd_error_handler
3875
      /* xgettext:c-format */
3876
894
      (_("bfd_mach_o_read_symtab_symbol: "
3877
894
         "symbol \"%s\" specified invalid type field 0x%x: "
3878
894
         "setting to undefined"), s->symbol.name, symtype);
3879
894
    s->symbol.section = bfd_und_section_ptr;
3880
894
    break;
3881
51.0k
  }
3882
51.0k
    }
3883
3884
69.9k
  return true;
3885
69.9k
}
3886
3887
bool
3888
bfd_mach_o_read_symtab_strtab (bfd *abfd)
3889
1.49k
{
3890
1.49k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3891
1.49k
  bfd_mach_o_symtab_command *sym = mdata->symtab;
3892
3893
  /* Fail if there is no symtab.  */
3894
1.49k
  if (sym == NULL)
3895
0
    return false;
3896
3897
  /* Success if already loaded.  */
3898
1.49k
  if (sym->strtab)
3899
0
    return true;
3900
3901
1.49k
  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
1.49k
  else
3915
1.49k
    {
3916
      /* See PR 21840 for a reproducer.  */
3917
1.49k
      if ((sym->strsize + 1) == 0)
3918
0
  return false;
3919
1.49k
      if (bfd_seek (abfd, sym->stroff, SEEK_SET) != 0)
3920
0
  return false;
3921
1.49k
      sym->strtab = (char *) _bfd_alloc_and_read (abfd, sym->strsize + 1,
3922
1.49k
              sym->strsize);
3923
1.49k
      if (sym->strtab == NULL)
3924
0
  return false;
3925
3926
      /* Zero terminate the string table.  */
3927
1.49k
      sym->strtab[sym->strsize] = 0;
3928
1.49k
    }
3929
3930
1.49k
  return true;
3931
1.49k
}
3932
3933
bool
3934
bfd_mach_o_read_symtab_symbols (bfd *abfd)
3935
2.27k
{
3936
2.27k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
3937
2.27k
  bfd_mach_o_symtab_command *sym = mdata->symtab;
3938
2.27k
  unsigned long i;
3939
2.27k
  size_t amt;
3940
2.27k
  ufile_ptr filesize;
3941
3942
2.27k
  if (sym == NULL || sym->nsyms == 0 || sym->symbols)
3943
    /* Return now if there are no symbols or if already loaded.  */
3944
778
    return true;
3945
3946
1.50k
  filesize = bfd_get_file_size (abfd);
3947
1.50k
  if (filesize != 0)
3948
1.50k
    {
3949
1.50k
      unsigned int wide = mach_o_wide_p (&mdata->header);
3950
1.50k
      unsigned int symwidth
3951
1.50k
  = wide ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE;
3952
3953
1.50k
      if (sym->symoff > filesize
3954
1.50k
    || sym->nsyms > (filesize - sym->symoff) / symwidth)
3955
3
  {
3956
3
    bfd_set_error (bfd_error_file_truncated);
3957
3
    sym->nsyms = 0;
3958
3
    return false;
3959
3
  }
3960
1.50k
    }
3961
1.49k
  if (_bfd_mul_overflow (sym->nsyms, sizeof (bfd_mach_o_asymbol), &amt)
3962
1.49k
      || (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
1.49k
  if (!bfd_mach_o_read_symtab_strtab (abfd))
3970
0
    goto fail;
3971
3972
71.4k
  for (i = 0; i < sym->nsyms; i++)
3973
70.5k
    if (!bfd_mach_o_read_symtab_symbol (abfd, sym, &sym->symbols[i], i))
3974
572
      goto fail;
3975
3976
925
  return true;
3977
3978
572
 fail:
3979
572
  bfd_release (abfd, sym->symbols);
3980
572
  sym->symbols = NULL;
3981
572
  sym->nsyms = 0;
3982
572
  return false;
3983
1.49k
}
3984
3985
static const char *
3986
bfd_mach_o_i386_flavour_string (unsigned int flavour)
3987
54.6k
{
3988
54.6k
  switch ((int) flavour)
3989
54.6k
    {
3990
1.23k
    case BFD_MACH_O_x86_THREAD_STATE32:    return "x86_THREAD_STATE32";
3991
5
    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
6.74k
    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
486
    case BFD_MACH_O_x86_FLOAT_STATE:       return "x86_FLOAT_STATE";
3998
22
    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
0
    case BFD_MACH_O_x86_DEBUG_STATE:       return "x86_DEBUG_STATE";
4002
2
    case BFD_MACH_O_x86_THREAD_STATE_NONE: return "x86_THREAD_STATE_NONE";
4003
46.1k
    default: return "UNKNOWN";
4004
54.6k
    }
4005
54.6k
}
4006
4007
static const char *
4008
bfd_mach_o_ppc_flavour_string (unsigned int flavour)
4009
6.06k
{
4010
6.06k
  switch ((int) flavour)
4011
6.06k
    {
4012
315
    case BFD_MACH_O_PPC_THREAD_STATE:      return "PPC_THREAD_STATE";
4013
3
    case BFD_MACH_O_PPC_FLOAT_STATE:       return "PPC_FLOAT_STATE";
4014
1
    case BFD_MACH_O_PPC_EXCEPTION_STATE:   return "PPC_EXCEPTION_STATE";
4015
12
    case BFD_MACH_O_PPC_VECTOR_STATE:      return "PPC_VECTOR_STATE";
4016
15
    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
5.72k
    default: return "UNKNOWN";
4019
6.06k
    }
4020
6.06k
}
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
22.4k
{
4026
22.4k
  if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
4027
0
    return NULL;
4028
22.4k
  unsigned char *ret = _bfd_alloc_and_read (abfd, size + extra, size);
4029
22.4k
  if (ret && extra != 0)
4030
16.5k
    memset (ret + size, 0, extra);
4031
22.4k
  return ret;
4032
22.4k
}
4033
4034
static bool
4035
bfd_mach_o_read_dylinker (bfd *abfd, bfd_mach_o_load_command *command)
4036
8.77k
{
4037
8.77k
  bfd_mach_o_dylinker_command *cmd = &command->command.dylinker;
4038
8.77k
  struct mach_o_str_command_external raw;
4039
8.77k
  unsigned int nameoff;
4040
8.77k
  size_t namelen;
4041
4042
8.77k
  if (command->len < sizeof (raw) + 8)
4043
124
    return false;
4044
8.64k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4045
847
    return false;
4046
4047
7.80k
  nameoff = bfd_h_get_32 (abfd, raw.str);
4048
7.80k
  if (nameoff > command->len)
4049
980
    return false;
4050
4051
6.82k
  cmd->name_offset = nameoff;
4052
6.82k
  namelen = command->len - nameoff;
4053
6.82k
  nameoff += command->offset;
4054
6.82k
  cmd->name_str = (char *) bfd_mach_o_alloc_and_read (abfd, nameoff,
4055
6.82k
                  namelen, 1);
4056
6.82k
  return cmd->name_str != NULL;
4057
7.80k
}
4058
4059
static bool
4060
bfd_mach_o_read_dylib (bfd *abfd, bfd_mach_o_load_command *command)
4061
12.9k
{
4062
12.9k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4063
12.9k
  bfd_mach_o_dylib_command *cmd = &command->command.dylib;
4064
12.9k
  struct mach_o_dylib_command_external raw;
4065
12.9k
  unsigned int nameoff;
4066
12.9k
  size_t namelen;
4067
12.9k
  file_ptr pos;
4068
4069
12.9k
  if (command->len < sizeof (raw) + 8)
4070
135
    return false;
4071
12.8k
  switch (command->type)
4072
12.8k
    {
4073
5.19k
    case BFD_MACH_O_LC_LOAD_DYLIB:
4074
6.38k
    case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
4075
7.27k
    case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
4076
7.83k
    case BFD_MACH_O_LC_ID_DYLIB:
4077
12.5k
    case BFD_MACH_O_LC_REEXPORT_DYLIB:
4078
12.8k
    case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
4079
12.8k
      break;
4080
0
    default:
4081
0
      BFD_FAIL ();
4082
0
      return false;
4083
12.8k
    }
4084
4085
12.8k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4086
1.08k
    return false;
4087
4088
11.7k
  nameoff = bfd_h_get_32 (abfd, raw.name);
4089
11.7k
  if (nameoff > command->len)
4090
716
    return false;
4091
11.0k
  cmd->timestamp = bfd_h_get_32 (abfd, raw.timestamp);
4092
11.0k
  cmd->current_version = bfd_h_get_32 (abfd, raw.current_version);
4093
11.0k
  cmd->compatibility_version = bfd_h_get_32 (abfd, raw.compatibility_version);
4094
4095
11.0k
  cmd->name_offset = command->offset + nameoff;
4096
11.0k
  namelen = command->len - nameoff;
4097
11.0k
  pos = mdata->hdr_offset + cmd->name_offset;
4098
11.0k
  cmd->name_str = (char *) bfd_mach_o_alloc_and_read (abfd, pos, namelen, 1);
4099
11.0k
  return cmd->name_str != NULL;
4100
11.7k
}
4101
4102
static bool
4103
bfd_mach_o_read_prebound_dylib (bfd *abfd,
4104
        bfd_mach_o_load_command *command)
4105
3.89k
{
4106
3.89k
  bfd_mach_o_prebound_dylib_command *cmd = &command->command.prebound_dylib;
4107
3.89k
  struct mach_o_prebound_dylib_command_external raw;
4108
3.89k
  unsigned int nameoff;
4109
3.89k
  unsigned int modoff;
4110
3.89k
  unsigned int str_len;
4111
3.89k
  unsigned char *str;
4112
4113
3.89k
  if (command->len < sizeof (raw) + 8)
4114
228
    return false;
4115
3.66k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4116
852
    return false;
4117
4118
2.81k
  nameoff = bfd_h_get_32 (abfd, raw.name);
4119
2.81k
  modoff = bfd_h_get_32 (abfd, raw.linked_modules);
4120
2.81k
  if (nameoff > command->len || modoff > command->len)
4121
1.24k
    return false;
4122
4123
1.57k
  str_len = command->len - sizeof (raw);
4124
1.57k
  str = _bfd_alloc_and_read (abfd, str_len, str_len);
4125
1.57k
  if (str == NULL)
4126
1.16k
    return false;
4127
4128
403
  cmd->name_offset = command->offset + nameoff;
4129
403
  cmd->nmodules = bfd_h_get_32 (abfd, raw.nmodules);
4130
403
  cmd->linked_modules_offset = command->offset + modoff;
4131
4132
403
  cmd->name_str = (char *)str + nameoff - (sizeof (raw) + BFD_MACH_O_LC_SIZE);
4133
403
  cmd->linked_modules = str + modoff - (sizeof (raw) + BFD_MACH_O_LC_SIZE);
4134
403
  return true;
4135
1.57k
}
4136
4137
static bool
4138
bfd_mach_o_read_prebind_cksum (bfd *abfd,
4139
             bfd_mach_o_load_command *command)
4140
1.25k
{
4141
1.25k
  bfd_mach_o_prebind_cksum_command *cmd = &command->command.prebind_cksum;
4142
1.25k
  struct mach_o_prebind_cksum_command_external raw;
4143
4144
1.25k
  if (command->len < sizeof (raw) + 8)
4145
14
    return false;
4146
1.24k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4147
220
    return false;
4148
4149
1.02k
  cmd->cksum = bfd_get_32 (abfd, raw.cksum);
4150
1.02k
  return true;
4151
1.24k
}
4152
4153
static bool
4154
bfd_mach_o_read_twolevel_hints (bfd *abfd,
4155
        bfd_mach_o_load_command *command)
4156
8.36k
{
4157
8.36k
  bfd_mach_o_twolevel_hints_command *cmd = &command->command.twolevel_hints;
4158
8.36k
  struct mach_o_twolevel_hints_command_external raw;
4159
4160
8.36k
  if (command->len < sizeof (raw) + 8)
4161
13
    return false;
4162
8.35k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4163
26
    return false;
4164
4165
8.33k
  cmd->offset = bfd_get_32 (abfd, raw.offset);
4166
8.33k
  cmd->nhints = bfd_get_32 (abfd, raw.nhints);
4167
8.33k
  return true;
4168
8.35k
}
4169
4170
static bool
4171
bfd_mach_o_read_fvmlib (bfd *abfd, bfd_mach_o_load_command *command)
4172
1.70k
{
4173
1.70k
  bfd_mach_o_fvmlib_command *fvm = &command->command.fvmlib;
4174
1.70k
  struct mach_o_fvmlib_command_external raw;
4175
1.70k
  unsigned int nameoff;
4176
1.70k
  size_t namelen;
4177
4178
1.70k
  if (command->len < sizeof (raw) + 8)
4179
21
    return false;
4180
1.68k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4181
439
    return false;
4182
4183
1.24k
  nameoff = bfd_h_get_32 (abfd, raw.name);
4184
1.24k
  if (nameoff > command->len)
4185
151
    return false;
4186
1.09k
  fvm->minor_version = bfd_h_get_32 (abfd, raw.minor_version);
4187
1.09k
  fvm->header_addr = bfd_h_get_32 (abfd, raw.header_addr);
4188
4189
1.09k
  fvm->name_offset = command->offset + nameoff;
4190
1.09k
  namelen = command->len - nameoff;
4191
1.09k
  fvm->name_str = (char *) bfd_mach_o_alloc_and_read (abfd, fvm->name_offset,
4192
1.09k
                  namelen, 1);
4193
1.09k
  return fvm->name_str != NULL;
4194
1.24k
}
4195
4196
static bool
4197
bfd_mach_o_read_thread (bfd *abfd, bfd_mach_o_load_command *command)
4198
16.7k
{
4199
16.7k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4200
16.7k
  bfd_mach_o_thread_command *cmd = &command->command.thread;
4201
16.7k
  unsigned int offset;
4202
16.7k
  unsigned int nflavours;
4203
16.7k
  unsigned int i;
4204
16.7k
  struct mach_o_thread_command_external raw;
4205
16.7k
  size_t amt;
4206
4207
16.7k
  BFD_ASSERT ((command->type == BFD_MACH_O_LC_THREAD)
4208
16.7k
        || (command->type == BFD_MACH_O_LC_UNIXTHREAD));
4209
4210
  /* Count the number of threads.  */
4211
16.7k
  offset = 8;
4212
16.7k
  nflavours = 0;
4213
90.5k
  while (offset + sizeof (raw) <= command->len)
4214
76.6k
    {
4215
76.6k
      unsigned int count;
4216
4217
76.6k
      if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
4218
76.6k
    || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4219
1.35k
  return false;
4220
4221
75.2k
      count = bfd_h_get_32 (abfd, raw.count);
4222
75.2k
      if (count > (unsigned) -1 / 4
4223
75.2k
    || command->len - (offset + sizeof (raw)) < count * 4)
4224
1.53k
  return false;
4225
73.7k
      offset += sizeof (raw) + count * 4;
4226
73.7k
      nflavours++;
4227
73.7k
    }
4228
13.9k
  if (nflavours == 0 || offset != command->len)
4229
242
    return false;
4230
4231
  /* Allocate threads.  */
4232
13.6k
  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
13.6k
  cmd->flavours = bfd_alloc (abfd, amt);
4238
13.6k
  if (cmd->flavours == NULL)
4239
0
    return false;
4240
13.6k
  cmd->nflavours = nflavours;
4241
4242
13.6k
  offset = 8;
4243
13.6k
  nflavours = 0;
4244
84.1k
  while (offset != command->len)
4245
70.4k
    {
4246
70.4k
      if (bfd_seek (abfd, command->offset + offset, SEEK_SET) != 0
4247
70.4k
    || bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4248
0
  return false;
4249
4250
70.4k
      cmd->flavours[nflavours].flavour = bfd_h_get_32 (abfd, raw.flavour);
4251
70.4k
      cmd->flavours[nflavours].offset = command->offset + offset + sizeof (raw);
4252
70.4k
      cmd->flavours[nflavours].size = bfd_h_get_32 (abfd, raw.count) * 4;
4253
70.4k
      offset += cmd->flavours[nflavours].size + sizeof (raw);
4254
70.4k
      nflavours++;
4255
70.4k
    }
4256
4257
84.1k
  for (i = 0; i < nflavours; i++)
4258
70.4k
    {
4259
70.4k
      asection *bfdsec;
4260
70.4k
      size_t snamelen;
4261
70.4k
      char *sname;
4262
70.4k
      const char *flavourstr;
4263
70.4k
      const char *prefix = "LC_THREAD";
4264
70.4k
      unsigned int j = 0;
4265
4266
70.4k
      switch (mdata->header.cputype)
4267
70.4k
  {
4268
5.59k
  case BFD_MACH_O_CPU_TYPE_POWERPC:
4269
6.06k
  case BFD_MACH_O_CPU_TYPE_POWERPC_64:
4270
6.06k
    flavourstr =
4271
6.06k
      bfd_mach_o_ppc_flavour_string (cmd->flavours[i].flavour);
4272
6.06k
    break;
4273
17.4k
  case BFD_MACH_O_CPU_TYPE_I386:
4274
54.6k
  case BFD_MACH_O_CPU_TYPE_X86_64:
4275
54.6k
    flavourstr =
4276
54.6k
      bfd_mach_o_i386_flavour_string (cmd->flavours[i].flavour);
4277
54.6k
    break;
4278
9.70k
  default:
4279
9.70k
    flavourstr = "UNKNOWN_ARCHITECTURE";
4280
9.70k
    break;
4281
70.4k
  }
4282
4283
70.4k
      snamelen = strlen (prefix) + 1 + 20 + 1 + strlen (flavourstr) + 1;
4284
70.4k
      sname = bfd_alloc (abfd, snamelen);
4285
70.4k
      if (sname == NULL)
4286
0
  return false;
4287
4288
70.4k
      for (;;)
4289
417k
  {
4290
417k
    sprintf (sname, "%s.%s.%u", prefix, flavourstr, j);
4291
417k
    if (bfd_get_section_by_name (abfd, sname) == NULL)
4292
70.4k
      break;
4293
346k
    j++;
4294
346k
  }
4295
4296
70.4k
      bfdsec = bfd_make_section_with_flags (abfd, sname, SEC_HAS_CONTENTS);
4297
4298
70.4k
      bfdsec->vma = 0;
4299
70.4k
      bfdsec->lma = 0;
4300
70.4k
      bfdsec->size = cmd->flavours[i].size;
4301
70.4k
      bfdsec->filepos = cmd->flavours[i].offset;
4302
70.4k
      bfdsec->alignment_power = 0x0;
4303
4304
70.4k
      cmd->section = bfdsec;
4305
70.4k
    }
4306
4307
13.6k
  return true;
4308
13.6k
}
4309
4310
static bool
4311
bfd_mach_o_read_dysymtab (bfd *abfd, bfd_mach_o_load_command *command,
4312
        ufile_ptr filesize)
4313
25.3k
{
4314
25.3k
  bfd_mach_o_dysymtab_command *cmd = &command->command.dysymtab;
4315
25.3k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4316
4317
25.3k
  BFD_ASSERT (command->type == BFD_MACH_O_LC_DYSYMTAB);
4318
4319
25.3k
  {
4320
25.3k
    struct mach_o_dysymtab_command_external raw;
4321
4322
25.3k
    if (command->len < sizeof (raw) + 8)
4323
339
      return false;
4324
25.0k
    if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4325
1.29k
      return false;
4326
4327
23.7k
    cmd->ilocalsym = bfd_h_get_32 (abfd, raw.ilocalsym);
4328
23.7k
    cmd->nlocalsym = bfd_h_get_32 (abfd, raw.nlocalsym);
4329
23.7k
    cmd->iextdefsym = bfd_h_get_32 (abfd, raw.iextdefsym);
4330
23.7k
    cmd->nextdefsym = bfd_h_get_32 (abfd, raw.nextdefsym);
4331
23.7k
    cmd->iundefsym = bfd_h_get_32 (abfd, raw.iundefsym);
4332
23.7k
    cmd->nundefsym = bfd_h_get_32 (abfd, raw.nundefsym);
4333
23.7k
    cmd->tocoff = bfd_h_get_32 (abfd, raw.tocoff);
4334
23.7k
    cmd->ntoc = bfd_h_get_32 (abfd, raw.ntoc);
4335
23.7k
    cmd->modtaboff = bfd_h_get_32 (abfd, raw.modtaboff);
4336
23.7k
    cmd->nmodtab = bfd_h_get_32 (abfd, raw.nmodtab);
4337
23.7k
    cmd->extrefsymoff = bfd_h_get_32 (abfd, raw.extrefsymoff);
4338
23.7k
    cmd->nextrefsyms = bfd_h_get_32 (abfd, raw.nextrefsyms);
4339
23.7k
    cmd->indirectsymoff = bfd_h_get_32 (abfd, raw.indirectsymoff);
4340
23.7k
    cmd->nindirectsyms = bfd_h_get_32 (abfd, raw.nindirectsyms);
4341
23.7k
    cmd->extreloff = bfd_h_get_32 (abfd, raw.extreloff);
4342
23.7k
    cmd->nextrel = bfd_h_get_32 (abfd, raw.nextrel);
4343
23.7k
    cmd->locreloff = bfd_h_get_32 (abfd, raw.locreloff);
4344
23.7k
    cmd->nlocrel = bfd_h_get_32 (abfd, raw.nlocrel);
4345
23.7k
  }
4346
4347
23.7k
  if (cmd->nmodtab != 0)
4348
11.1k
    {
4349
11.1k
      unsigned int i;
4350
11.1k
      int wide = bfd_mach_o_wide_p (abfd);
4351
11.1k
      unsigned int module_len = wide ? 56 : 52;
4352
11.1k
      size_t amt;
4353
4354
11.1k
      if (cmd->modtaboff > filesize
4355
11.1k
    || cmd->nmodtab > (filesize - cmd->modtaboff) / module_len)
4356
5.12k
  {
4357
5.12k
    bfd_set_error (bfd_error_file_truncated);
4358
5.12k
    return false;
4359
5.12k
  }
4360
6.04k
      if (_bfd_mul_overflow (cmd->nmodtab,
4361
6.04k
           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.04k
      cmd->dylib_module = bfd_alloc (abfd, amt);
4367
6.04k
      if (cmd->dylib_module == NULL)
4368
0
  return false;
4369
4370
6.04k
      if (bfd_seek (abfd, cmd->modtaboff, SEEK_SET) != 0)
4371
0
  return false;
4372
4373
67.3k
      for (i = 0; i < cmd->nmodtab; i++)
4374
62.2k
  {
4375
62.2k
    bfd_mach_o_dylib_module *module = &cmd->dylib_module[i];
4376
62.2k
    unsigned long v;
4377
62.2k
    unsigned char buf[56];
4378
4379
62.2k
    if (bfd_bread ((void *) buf, module_len, abfd) != module_len)
4380
948
      return false;
4381
4382
61.3k
    module->module_name_idx = bfd_h_get_32 (abfd, buf + 0);
4383
61.3k
    module->iextdefsym = bfd_h_get_32 (abfd, buf + 4);
4384
61.3k
    module->nextdefsym = bfd_h_get_32 (abfd, buf + 8);
4385
61.3k
    module->irefsym = bfd_h_get_32 (abfd, buf + 12);
4386
61.3k
    module->nrefsym = bfd_h_get_32 (abfd, buf + 16);
4387
61.3k
    module->ilocalsym = bfd_h_get_32 (abfd, buf + 20);
4388
61.3k
    module->nlocalsym = bfd_h_get_32 (abfd, buf + 24);
4389
61.3k
    module->iextrel = bfd_h_get_32 (abfd, buf + 28);
4390
61.3k
    module->nextrel = bfd_h_get_32 (abfd, buf + 32);
4391
61.3k
    v = bfd_h_get_32 (abfd, buf +36);
4392
61.3k
    module->iinit = v & 0xffff;
4393
61.3k
    module->iterm = (v >> 16) & 0xffff;
4394
61.3k
    v = bfd_h_get_32 (abfd, buf + 40);
4395
61.3k
    module->ninit = v & 0xffff;
4396
61.3k
    module->nterm = (v >> 16) & 0xffff;
4397
61.3k
    if (wide)
4398
21.6k
      {
4399
21.6k
        module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 44);
4400
21.6k
        module->objc_module_info_addr = bfd_h_get_64 (abfd, buf + 48);
4401
21.6k
      }
4402
39.6k
    else
4403
39.6k
      {
4404
39.6k
        module->objc_module_info_addr = bfd_h_get_32 (abfd, buf + 44);
4405
39.6k
        module->objc_module_info_size = bfd_h_get_32 (abfd, buf + 48);
4406
39.6k
      }
4407
61.3k
  }
4408
6.04k
    }
4409
4410
17.6k
  if (cmd->ntoc != 0)
4411
7.07k
    {
4412
7.07k
      unsigned long i;
4413
7.07k
      size_t amt;
4414
7.07k
      struct mach_o_dylib_table_of_contents_external raw;
4415
4416
7.07k
      if (cmd->tocoff > filesize
4417
7.07k
    || cmd->ntoc > (filesize - cmd->tocoff) / sizeof (raw))
4418
3.81k
  {
4419
3.81k
    bfd_set_error (bfd_error_file_truncated);
4420
3.81k
    return false;
4421
3.81k
  }
4422
3.25k
      if (_bfd_mul_overflow (cmd->ntoc,
4423
3.25k
           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
3.25k
      cmd->dylib_toc = bfd_alloc (abfd, amt);
4429
3.25k
      if (cmd->dylib_toc == NULL)
4430
0
  return false;
4431
4432
3.25k
      if (bfd_seek (abfd, cmd->tocoff, SEEK_SET) != 0)
4433
0
  return false;
4434
4435
285k
      for (i = 0; i < cmd->ntoc; i++)
4436
283k
  {
4437
283k
    bfd_mach_o_dylib_table_of_content *toc = &cmd->dylib_toc[i];
4438
4439
283k
    if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4440
742
      return false;
4441
4442
282k
    toc->symbol_index = bfd_h_get_32 (abfd, raw.symbol_index);
4443
282k
    toc->module_index = bfd_h_get_32 (abfd, raw.module_index);
4444
282k
  }
4445
3.25k
    }
4446
4447
13.1k
  if (cmd->nindirectsyms != 0)
4448
9.07k
    {
4449
9.07k
      unsigned int i;
4450
9.07k
      size_t amt;
4451
4452
9.07k
      if (cmd->indirectsymoff > filesize
4453
9.07k
    || cmd->nindirectsyms > (filesize - cmd->indirectsymoff) / 4)
4454
3.93k
  {
4455
3.93k
    bfd_set_error (bfd_error_file_truncated);
4456
3.93k
    return false;
4457
3.93k
  }
4458
5.13k
      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
5.13k
      cmd->indirect_syms = bfd_alloc (abfd, amt);
4464
5.13k
      if (cmd->indirect_syms == NULL)
4465
0
  return false;
4466
4467
5.13k
      if (bfd_seek (abfd, cmd->indirectsymoff, SEEK_SET) != 0)
4468
0
  return false;
4469
4470
394k
      for (i = 0; i < cmd->nindirectsyms; i++)
4471
390k
  {
4472
390k
    unsigned char raw[4];
4473
390k
    unsigned int *is = &cmd->indirect_syms[i];
4474
4475
390k
    if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
4476
1.04k
      return false;
4477
4478
389k
    *is = bfd_h_get_32 (abfd, raw);
4479
389k
  }
4480
5.13k
    }
4481
4482
8.12k
  if (cmd->nextrefsyms != 0)
4483
5.19k
    {
4484
5.19k
      unsigned long v;
4485
5.19k
      unsigned int i;
4486
5.19k
      size_t amt;
4487
4488
5.19k
      if (cmd->extrefsymoff > filesize
4489
5.19k
    || cmd->nextrefsyms > (filesize - cmd->extrefsymoff) / 4)
4490
2.15k
  {
4491
2.15k
    bfd_set_error (bfd_error_file_truncated);
4492
2.15k
    return false;
4493
2.15k
  }
4494
3.03k
      if (_bfd_mul_overflow (cmd->nextrefsyms,
4495
3.03k
           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
3.03k
      cmd->ext_refs = bfd_alloc (abfd, amt);
4501
3.03k
      if (cmd->ext_refs == NULL)
4502
0
  return false;
4503
4504
3.03k
      if (bfd_seek (abfd, cmd->extrefsymoff, SEEK_SET) != 0)
4505
0
  return false;
4506
4507
280k
      for (i = 0; i < cmd->nextrefsyms; i++)
4508
278k
  {
4509
278k
    unsigned char raw[4];
4510
278k
    bfd_mach_o_dylib_reference *ref = &cmd->ext_refs[i];
4511
4512
278k
    if (bfd_bread (raw, sizeof (raw), abfd) != sizeof (raw))
4513
838
      return false;
4514
4515
    /* Fields isym and flags are written as bit-fields, thus we need
4516
       a specific processing for endianness.  */
4517
277k
    v = bfd_h_get_32 (abfd, raw);
4518
277k
    if (bfd_big_endian (abfd))
4519
1.25k
      {
4520
1.25k
        ref->isym = (v >> 8) & 0xffffff;
4521
1.25k
        ref->flags = v & 0xff;
4522
1.25k
      }
4523
276k
    else
4524
276k
      {
4525
276k
        ref->isym = v & 0xffffff;
4526
276k
        ref->flags = (v >> 24) & 0xff;
4527
276k
      }
4528
277k
  }
4529
3.03k
    }
4530
4531
5.12k
  if (mdata->dysymtab)
4532
4
    return false;
4533
5.12k
  mdata->dysymtab = cmd;
4534
4535
5.12k
  return true;
4536
5.12k
}
4537
4538
static bool
4539
bfd_mach_o_read_symtab (bfd *abfd, bfd_mach_o_load_command *command,
4540
      ufile_ptr filesize)
4541
12.1k
{
4542
12.1k
  bfd_mach_o_symtab_command *symtab = &command->command.symtab;
4543
12.1k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4544
12.1k
  struct mach_o_symtab_command_external raw;
4545
4546
12.1k
  BFD_ASSERT (command->type == BFD_MACH_O_LC_SYMTAB);
4547
4548
12.1k
  if (command->len < sizeof (raw) + 8)
4549
432
    return false;
4550
11.7k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4551
772
    return false;
4552
4553
10.9k
  symtab->symoff = bfd_h_get_32 (abfd, raw.symoff);
4554
10.9k
  symtab->nsyms = bfd_h_get_32 (abfd, raw.nsyms);
4555
10.9k
  symtab->stroff = bfd_h_get_32 (abfd, raw.stroff);
4556
10.9k
  symtab->strsize = bfd_h_get_32 (abfd, raw.strsize);
4557
10.9k
  symtab->symbols = NULL;
4558
10.9k
  symtab->strtab = NULL;
4559
4560
10.9k
  if (symtab->symoff > filesize
4561
10.9k
      || symtab->nsyms > (filesize - symtab->symoff) / BFD_MACH_O_NLIST_SIZE
4562
10.9k
      || symtab->stroff > filesize
4563
10.9k
      || symtab->strsize > filesize - symtab->stroff)
4564
5.07k
    {
4565
5.07k
      bfd_set_error (bfd_error_file_truncated);
4566
5.07k
      return false;
4567
5.07k
    }
4568
4569
5.87k
  if (symtab->nsyms != 0)
4570
4.71k
    abfd->flags |= HAS_SYMS;
4571
4572
5.87k
  if (mdata->symtab)
4573
17
    return false;
4574
5.86k
  mdata->symtab = symtab;
4575
5.86k
  return true;
4576
5.87k
}
4577
4578
static bool
4579
bfd_mach_o_read_uuid (bfd *abfd, bfd_mach_o_load_command *command)
4580
4.53k
{
4581
4.53k
  bfd_mach_o_uuid_command *cmd = &command->command.uuid;
4582
4583
4.53k
  BFD_ASSERT (command->type == BFD_MACH_O_LC_UUID);
4584
4585
4.53k
  if (command->len < 16 + 8)
4586
121
    return false;
4587
4.41k
  if (bfd_bread (cmd->uuid, 16, abfd) != 16)
4588
435
    return false;
4589
4590
3.97k
  return true;
4591
4.41k
}
4592
4593
static bool
4594
bfd_mach_o_read_linkedit (bfd *abfd, bfd_mach_o_load_command *command)
4595
19.4k
{
4596
19.4k
  bfd_mach_o_linkedit_command *cmd = &command->command.linkedit;
4597
19.4k
  struct mach_o_linkedit_data_command_external raw;
4598
4599
19.4k
  if (command->len < sizeof (raw) + 8)
4600
336
    return false;
4601
19.1k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4602
1.21k
    return false;
4603
4604
17.8k
  cmd->dataoff = bfd_get_32 (abfd, raw.dataoff);
4605
17.8k
  cmd->datasize = bfd_get_32 (abfd, raw.datasize);
4606
17.8k
  return true;
4607
19.1k
}
4608
4609
static bool
4610
bfd_mach_o_read_str (bfd *abfd, bfd_mach_o_load_command *command)
4611
5.20k
{
4612
5.20k
  bfd_mach_o_str_command *cmd = &command->command.str;
4613
5.20k
  struct mach_o_str_command_external raw;
4614
5.20k
  unsigned long off;
4615
4616
5.20k
  if (command->len < sizeof (raw) + 8)
4617
129
    return false;
4618
5.07k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4619
761
    return false;
4620
4621
4.31k
  off = bfd_get_32 (abfd, raw.str);
4622
4.31k
  if (off > command->len)
4623
990
    return false;
4624
4625
3.32k
  cmd->stroff = command->offset + off;
4626
3.32k
  cmd->str_len = command->len - off;
4627
3.32k
  cmd->str = (char *) bfd_mach_o_alloc_and_read (abfd, cmd->stroff,
4628
3.32k
             cmd->str_len, 1);
4629
3.32k
  return cmd->str != NULL;
4630
4.31k
}
4631
4632
static bool
4633
bfd_mach_o_read_dyld_content (bfd *abfd, bfd_mach_o_dyld_info_command *cmd)
4634
36
{
4635
  /* Read rebase content.  */
4636
36
  if (cmd->rebase_content == NULL && cmd->rebase_size != 0)
4637
34
    {
4638
34
      cmd->rebase_content
4639
34
  = bfd_mach_o_alloc_and_read (abfd, cmd->rebase_off,
4640
34
             cmd->rebase_size, 0);
4641
34
      if (cmd->rebase_content == NULL)
4642
0
  return false;
4643
34
    }
4644
4645
  /* Read bind content.  */
4646
36
  if (cmd->bind_content == NULL && cmd->bind_size != 0)
4647
36
    {
4648
36
      cmd->bind_content
4649
36
  = bfd_mach_o_alloc_and_read (abfd, cmd->bind_off,
4650
36
             cmd->bind_size, 0);
4651
36
      if (cmd->bind_content == NULL)
4652
0
  return false;
4653
36
    }
4654
4655
  /* Read weak bind content.  */
4656
36
  if (cmd->weak_bind_content == NULL && cmd->weak_bind_size != 0)
4657
1
    {
4658
1
      cmd->weak_bind_content
4659
1
  = bfd_mach_o_alloc_and_read (abfd, cmd->weak_bind_off,
4660
1
             cmd->weak_bind_size, 0);
4661
1
      if (cmd->weak_bind_content == NULL)
4662
0
  return false;
4663
1
    }
4664
4665
  /* Read lazy bind content.  */
4666
36
  if (cmd->lazy_bind_content == NULL && cmd->lazy_bind_size != 0)
4667
36
    {
4668
36
      cmd->lazy_bind_content
4669
36
  = bfd_mach_o_alloc_and_read (abfd, cmd->lazy_bind_off,
4670
36
             cmd->lazy_bind_size, 0);
4671
36
      if (cmd->lazy_bind_content == NULL)
4672
0
  return false;
4673
36
    }
4674
4675
  /* Read export content.  */
4676
36
  if (cmd->export_content == NULL && cmd->export_size != 0)
4677
36
    {
4678
36
      cmd->export_content
4679
36
  = bfd_mach_o_alloc_and_read (abfd, cmd->export_off,
4680
36
             cmd->export_size, 0);
4681
36
      if (cmd->export_content == NULL)
4682
0
  return false;
4683
36
    }
4684
4685
36
  return true;
4686
36
}
4687
4688
static bool
4689
bfd_mach_o_read_dyld_info (bfd *abfd, bfd_mach_o_load_command *command)
4690
7.45k
{
4691
7.45k
  bfd_mach_o_dyld_info_command *cmd = &command->command.dyld_info;
4692
7.45k
  struct mach_o_dyld_info_command_external raw;
4693
4694
7.45k
  if (command->len < sizeof (raw) + 8)
4695
26
    return false;
4696
7.42k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4697
865
    return false;
4698
4699
6.56k
  cmd->rebase_off = bfd_get_32 (abfd, raw.rebase_off);
4700
6.56k
  cmd->rebase_size = bfd_get_32 (abfd, raw.rebase_size);
4701
6.56k
  cmd->rebase_content = NULL;
4702
6.56k
  cmd->bind_off = bfd_get_32 (abfd, raw.bind_off);
4703
6.56k
  cmd->bind_size = bfd_get_32 (abfd, raw.bind_size);
4704
6.56k
  cmd->bind_content = NULL;
4705
6.56k
  cmd->weak_bind_off = bfd_get_32 (abfd, raw.weak_bind_off);
4706
6.56k
  cmd->weak_bind_size = bfd_get_32 (abfd, raw.weak_bind_size);
4707
6.56k
  cmd->weak_bind_content = NULL;
4708
6.56k
  cmd->lazy_bind_off = bfd_get_32 (abfd, raw.lazy_bind_off);
4709
6.56k
  cmd->lazy_bind_size = bfd_get_32 (abfd, raw.lazy_bind_size);
4710
6.56k
  cmd->lazy_bind_content = NULL;
4711
6.56k
  cmd->export_off = bfd_get_32 (abfd, raw.export_off);
4712
6.56k
  cmd->export_size = bfd_get_32 (abfd, raw.export_size);
4713
6.56k
  cmd->export_content = NULL;
4714
6.56k
  return true;
4715
7.42k
}
4716
4717
static bool
4718
bfd_mach_o_read_version_min (bfd *abfd, bfd_mach_o_load_command *command)
4719
9.53k
{
4720
9.53k
  bfd_mach_o_version_min_command *cmd = &command->command.version_min;
4721
9.53k
  struct mach_o_version_min_command_external raw;
4722
4723
9.53k
  if (command->len < sizeof (raw) + 8)
4724
27
    return false;
4725
9.51k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4726
569
    return false;
4727
4728
8.94k
  cmd->version = bfd_get_32 (abfd, raw.version);
4729
8.94k
  cmd->sdk = bfd_get_32 (abfd, raw.sdk);
4730
8.94k
  return true;
4731
9.51k
}
4732
4733
static bool
4734
bfd_mach_o_read_encryption_info (bfd *abfd, bfd_mach_o_load_command *command)
4735
1.75k
{
4736
1.75k
  bfd_mach_o_encryption_info_command *cmd = &command->command.encryption_info;
4737
1.75k
  struct mach_o_encryption_info_command_external raw;
4738
4739
1.75k
  if (command->len < sizeof (raw) + 8)
4740
224
    return false;
4741
1.53k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4742
128
    return false;
4743
4744
1.40k
  cmd->cryptoff = bfd_get_32 (abfd, raw.cryptoff);
4745
1.40k
  cmd->cryptsize = bfd_get_32 (abfd, raw.cryptsize);
4746
1.40k
  cmd->cryptid = bfd_get_32 (abfd, raw.cryptid);
4747
1.40k
  return true;
4748
1.53k
}
4749
4750
static bool
4751
bfd_mach_o_read_encryption_info_64 (bfd *abfd, bfd_mach_o_load_command *command)
4752
2.31k
{
4753
2.31k
  bfd_mach_o_encryption_info_command *cmd = &command->command.encryption_info;
4754
2.31k
  struct mach_o_encryption_info_64_command_external raw;
4755
4756
2.31k
  if (command->len < sizeof (raw) + 8)
4757
29
    return false;
4758
2.28k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4759
241
    return false;
4760
4761
2.04k
  cmd->cryptoff = bfd_get_32 (abfd, raw.cryptoff);
4762
2.04k
  cmd->cryptsize = bfd_get_32 (abfd, raw.cryptsize);
4763
2.04k
  cmd->cryptid = bfd_get_32 (abfd, raw.cryptid);
4764
2.04k
  return true;
4765
2.28k
}
4766
4767
static bool
4768
bfd_mach_o_read_main (bfd *abfd, bfd_mach_o_load_command *command)
4769
10.8k
{
4770
10.8k
  bfd_mach_o_main_command *cmd = &command->command.main;
4771
10.8k
  struct mach_o_entry_point_command_external raw;
4772
4773
10.8k
  if (command->len < sizeof (raw) + 8)
4774
425
    return false;
4775
10.4k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4776
740
    return false;
4777
4778
9.73k
  cmd->entryoff = bfd_get_64 (abfd, raw.entryoff);
4779
9.73k
  cmd->stacksize = bfd_get_64 (abfd, raw.stacksize);
4780
9.73k
  return true;
4781
10.4k
}
4782
4783
static bool
4784
bfd_mach_o_read_source_version (bfd *abfd, bfd_mach_o_load_command *command)
4785
4.50k
{
4786
4.50k
  bfd_mach_o_source_version_command *cmd = &command->command.source_version;
4787
4.50k
  struct mach_o_source_version_command_external raw;
4788
4.50k
  uint64_t ver;
4789
4790
4.50k
  if (command->len < sizeof (raw) + 8)
4791
127
    return false;
4792
4.37k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4793
227
    return false;
4794
4795
4.15k
  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
4.15k
  cmd->e = ver & 0x3ff;
4800
4.15k
  ver >>= 10;
4801
4.15k
  cmd->d = ver & 0x3ff;
4802
4.15k
  ver >>= 10;
4803
4.15k
  cmd->c = ver & 0x3ff;
4804
4.15k
  ver >>= 10;
4805
4.15k
  cmd->b = ver & 0x3ff;
4806
4.15k
  ver >>= 10;
4807
4.15k
  cmd->a = ver & 0xffffff;
4808
4.15k
  return true;
4809
4.37k
}
4810
4811
static bool
4812
bfd_mach_o_read_note (bfd *abfd, bfd_mach_o_load_command *command)
4813
6.24k
{
4814
6.24k
  bfd_mach_o_note_command *cmd = &command->command.note;
4815
6.24k
  struct mach_o_note_command_external raw;
4816
4817
6.24k
  if (command->len < sizeof (raw) + 8)
4818
330
    return false;
4819
5.91k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4820
559
    return false;
4821
4822
5.36k
  memcpy (cmd->data_owner, raw.data_owner, 16);
4823
5.36k
  cmd->offset = bfd_get_64 (abfd, raw.offset);
4824
5.36k
  cmd->size = bfd_get_64 (abfd, raw.size);
4825
5.36k
  return true;
4826
5.91k
}
4827
4828
static bool
4829
bfd_mach_o_read_build_version (bfd *abfd, bfd_mach_o_load_command *command)
4830
5.68k
{
4831
5.68k
  bfd_mach_o_build_version_command *cmd = &command->command.build_version;
4832
5.68k
  struct mach_o_build_version_command_external raw;
4833
4834
5.68k
  if (command->len < sizeof (raw) + 8)
4835
236
    return false;
4836
5.44k
  if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4837
548
    return false;
4838
4839
4.89k
  cmd->platform = bfd_get_32 (abfd, raw.platform);
4840
4.89k
  cmd->minos = bfd_get_32 (abfd, raw.minos);
4841
4.89k
  cmd->sdk = bfd_get_32 (abfd, raw.sdk);
4842
4.89k
  cmd->ntools = bfd_get_32 (abfd, raw.ntools);
4843
4.89k
  return true;
4844
5.44k
}
4845
4846
static bool
4847
bfd_mach_o_read_segment (bfd *abfd,
4848
       bfd_mach_o_load_command *command,
4849
       unsigned int wide)
4850
59.8k
{
4851
59.8k
  bfd_mach_o_segment_command *seg = &command->command.segment;
4852
59.8k
  unsigned long i;
4853
4854
59.8k
  if (wide)
4855
38.1k
    {
4856
38.1k
      struct mach_o_segment_command_64_external raw;
4857
4858
38.1k
      BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT_64);
4859
4860
38.1k
      if (command->len < sizeof (raw) + 8)
4861
29
  return false;
4862
38.0k
      if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4863
766
  return false;
4864
4865
37.3k
      memcpy (seg->segname, raw.segname, 16);
4866
37.3k
      seg->segname[16] = '\0';
4867
4868
37.3k
      seg->vmaddr = bfd_h_get_64 (abfd, raw.vmaddr);
4869
37.3k
      seg->vmsize = bfd_h_get_64 (abfd, raw.vmsize);
4870
37.3k
      seg->fileoff = bfd_h_get_64 (abfd, raw.fileoff);
4871
37.3k
      seg->filesize = bfd_h_get_64 (abfd, raw.filesize);
4872
37.3k
      seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
4873
37.3k
      seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
4874
37.3k
      seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
4875
37.3k
      seg->flags = bfd_h_get_32 (abfd, raw.flags);
4876
37.3k
    }
4877
21.7k
  else
4878
21.7k
    {
4879
21.7k
      struct mach_o_segment_command_32_external raw;
4880
4881
21.7k
      BFD_ASSERT (command->type == BFD_MACH_O_LC_SEGMENT);
4882
4883
21.7k
      if (command->len < sizeof (raw) + 8)
4884
244
  return false;
4885
21.4k
      if (bfd_bread (&raw, sizeof (raw), abfd) != sizeof (raw))
4886
910
  return false;
4887
4888
20.5k
      memcpy (seg->segname, raw.segname, 16);
4889
20.5k
      seg->segname[16] = '\0';
4890
4891
20.5k
      seg->vmaddr = bfd_h_get_32 (abfd, raw.vmaddr);
4892
20.5k
      seg->vmsize = bfd_h_get_32 (abfd, raw.vmsize);
4893
20.5k
      seg->fileoff = bfd_h_get_32 (abfd, raw.fileoff);
4894
20.5k
      seg->filesize = bfd_h_get_32 (abfd, raw.filesize);
4895
20.5k
      seg->maxprot = bfd_h_get_32 (abfd, raw.maxprot);
4896
20.5k
      seg->initprot = bfd_h_get_32 (abfd, raw.initprot);
4897
20.5k
      seg->nsects = bfd_h_get_32 (abfd, raw.nsects);
4898
20.5k
      seg->flags = bfd_h_get_32 (abfd, raw.flags);
4899
20.5k
    }
4900
57.8k
  seg->sect_head = NULL;
4901
57.8k
  seg->sect_tail = NULL;
4902
4903
6.29M
  for (i = 0; i < seg->nsects; i++)
4904
6.25M
    {
4905
6.25M
      asection *sec;
4906
4907
6.25M
      sec = bfd_mach_o_read_section (abfd, seg->initprot, wide);
4908
6.25M
      if (sec == NULL)
4909
17.4k
  return false;
4910
4911
6.23M
      bfd_mach_o_append_section_to_segment
4912
6.23M
  (seg, bfd_mach_o_get_mach_o_section (sec));
4913
6.23M
    }
4914
4915
40.3k
  return true;
4916
57.8k
}
4917
4918
static bool
4919
bfd_mach_o_read_segment_32 (bfd *abfd, bfd_mach_o_load_command *command)
4920
21.7k
{
4921
21.7k
  return bfd_mach_o_read_segment (abfd, command, 0);
4922
21.7k
}
4923
4924
static bool
4925
bfd_mach_o_read_segment_64 (bfd *abfd, bfd_mach_o_load_command *command)
4926
38.1k
{
4927
38.1k
  return bfd_mach_o_read_segment (abfd, command, 1);
4928
38.1k
}
4929
4930
static bool
4931
bfd_mach_o_read_command (bfd *abfd, bfd_mach_o_load_command *command,
4932
       ufile_ptr filesize)
4933
259k
{
4934
259k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
4935
259k
  struct mach_o_load_command_external raw;
4936
259k
  unsigned int cmd;
4937
4938
  /* Read command type and length.  */
4939
259k
  if (bfd_seek (abfd, mdata->hdr_offset + command->offset, SEEK_SET) != 0
4940
259k
      || bfd_bread (&raw, BFD_MACH_O_LC_SIZE, abfd) != BFD_MACH_O_LC_SIZE)
4941
10.1k
    return false;
4942
4943
249k
  cmd = bfd_h_get_32 (abfd, raw.cmd);
4944
249k
  command->type = cmd & ~BFD_MACH_O_LC_REQ_DYLD;
4945
249k
  command->type_required = (cmd & BFD_MACH_O_LC_REQ_DYLD) != 0;
4946
249k
  command->len = bfd_h_get_32 (abfd, raw.cmdsize);
4947
249k
  if (command->len < 8 || command->len % 4 != 0)
4948
3.01k
    return false;
4949
4950
246k
  switch (command->type)
4951
246k
    {
4952
21.7k
    case BFD_MACH_O_LC_SEGMENT:
4953
21.7k
      if (!bfd_mach_o_read_segment_32 (abfd, command))
4954
9.00k
  return false;
4955
12.7k
      break;
4956
38.1k
    case BFD_MACH_O_LC_SEGMENT_64:
4957
38.1k
      if (!bfd_mach_o_read_segment_64 (abfd, command))
4958
10.4k
  return false;
4959
27.6k
      break;
4960
27.6k
    case BFD_MACH_O_LC_SYMTAB:
4961
12.1k
      if (!bfd_mach_o_read_symtab (abfd, command, filesize))
4962
6.30k
  return false;
4963
5.86k
      break;
4964
5.86k
    case BFD_MACH_O_LC_SYMSEG:
4965
1.90k
      break;
4966
6.78k
    case BFD_MACH_O_LC_THREAD:
4967
16.7k
    case BFD_MACH_O_LC_UNIXTHREAD:
4968
16.7k
      if (!bfd_mach_o_read_thread (abfd, command))
4969
3.13k
  return false;
4970
13.6k
      break;
4971
13.6k
    case BFD_MACH_O_LC_LOAD_DYLINKER:
4972
6.43k
    case BFD_MACH_O_LC_ID_DYLINKER:
4973
8.77k
    case BFD_MACH_O_LC_DYLD_ENVIRONMENT:
4974
8.77k
      if (!bfd_mach_o_read_dylinker (abfd, command))
4975
4.10k
  return false;
4976
4.66k
      break;
4977
5.30k
    case BFD_MACH_O_LC_LOAD_DYLIB:
4978
6.50k
    case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
4979
7.05k
    case BFD_MACH_O_LC_ID_DYLIB:
4980
7.95k
    case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
4981
12.6k
    case BFD_MACH_O_LC_REEXPORT_DYLIB:
4982
12.9k
    case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
4983
12.9k
      if (!bfd_mach_o_read_dylib (abfd, command))
4984
2.66k
  return false;
4985
10.3k
      break;
4986
10.3k
    case BFD_MACH_O_LC_PREBOUND_DYLIB:
4987
3.89k
      if (!bfd_mach_o_read_prebound_dylib (abfd, command))
4988
3.49k
  return false;
4989
403
      break;
4990
557
    case BFD_MACH_O_LC_LOADFVMLIB:
4991
1.70k
    case BFD_MACH_O_LC_IDFVMLIB:
4992
1.70k
      if (!bfd_mach_o_read_fvmlib (abfd, command))
4993
1.29k
  return false;
4994
413
      break;
4995
2.62k
    case BFD_MACH_O_LC_IDENT:
4996
3.55k
    case BFD_MACH_O_LC_FVMFILE:
4997
4.64k
    case BFD_MACH_O_LC_PREPAGE:
4998
6.40k
    case BFD_MACH_O_LC_ROUTINES:
4999
7.82k
    case BFD_MACH_O_LC_ROUTINES_64:
5000
7.82k
      break;
5001
1.54k
    case BFD_MACH_O_LC_SUB_FRAMEWORK:
5002
2.62k
    case BFD_MACH_O_LC_SUB_UMBRELLA:
5003
3.77k
    case BFD_MACH_O_LC_SUB_LIBRARY:
5004
4.84k
    case BFD_MACH_O_LC_SUB_CLIENT:
5005
5.20k
    case BFD_MACH_O_LC_RPATH:
5006
5.20k
      if (!bfd_mach_o_read_str (abfd, command))
5007
4.02k
  return false;
5008
1.18k
      break;
5009
25.3k
    case BFD_MACH_O_LC_DYSYMTAB:
5010
25.3k
      if (!bfd_mach_o_read_dysymtab (abfd, command, filesize))
5011
20.2k
  return false;
5012
5.12k
      break;
5013
5.12k
    case BFD_MACH_O_LC_PREBIND_CKSUM:
5014
1.25k
      if (!bfd_mach_o_read_prebind_cksum (abfd, command))
5015
234
  return false;
5016
1.02k
      break;
5017
8.36k
    case BFD_MACH_O_LC_TWOLEVEL_HINTS:
5018
8.36k
      if (!bfd_mach_o_read_twolevel_hints (abfd, command))
5019
39
  return false;
5020
8.33k
      break;
5021
8.33k
    case BFD_MACH_O_LC_UUID:
5022
4.53k
      if (!bfd_mach_o_read_uuid (abfd, command))
5023
556
  return false;
5024
3.97k
      break;
5025
3.97k
    case BFD_MACH_O_LC_CODE_SIGNATURE:
5026
3.19k
    case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
5027
6.97k
    case BFD_MACH_O_LC_FUNCTION_STARTS:
5028
9.22k
    case BFD_MACH_O_LC_DATA_IN_CODE:
5029
10.4k
    case BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS:
5030
15.9k
    case BFD_MACH_O_LC_LINKER_OPTIMIZATION_HINT:
5031
17.0k
    case BFD_MACH_O_LC_DYLD_EXPORTS_TRIE:
5032
19.4k
    case BFD_MACH_O_LC_DYLD_CHAINED_FIXUPS:
5033
19.4k
      if (!bfd_mach_o_read_linkedit (abfd, command))
5034
1.54k
  return false;
5035
17.8k
      break;
5036
17.8k
    case BFD_MACH_O_LC_ENCRYPTION_INFO:
5037
1.75k
      if (!bfd_mach_o_read_encryption_info (abfd, command))
5038
352
  return false;
5039
1.40k
      break;
5040
2.31k
    case BFD_MACH_O_LC_ENCRYPTION_INFO_64:
5041
2.31k
      if (!bfd_mach_o_read_encryption_info_64 (abfd, command))
5042
270
  return false;
5043
2.04k
      break;
5044
7.45k
    case BFD_MACH_O_LC_DYLD_INFO:
5045
7.45k
      if (!bfd_mach_o_read_dyld_info (abfd, command))
5046
891
  return false;
5047
6.56k
      break;
5048
6.56k
    case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
5049
6.06k
    case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
5050
8.34k
    case BFD_MACH_O_LC_VERSION_MIN_WATCHOS:
5051
9.53k
    case BFD_MACH_O_LC_VERSION_MIN_TVOS:
5052
9.53k
      if (!bfd_mach_o_read_version_min (abfd, command))
5053
596
  return false;
5054
8.94k
      break;
5055
10.8k
    case BFD_MACH_O_LC_MAIN:
5056
10.8k
      if (!bfd_mach_o_read_main (abfd, command))
5057
1.16k
  return false;
5058
9.73k
      break;
5059
9.73k
    case BFD_MACH_O_LC_SOURCE_VERSION:
5060
4.50k
      if (!bfd_mach_o_read_source_version (abfd, command))
5061
354
  return false;
5062
4.15k
      break;
5063
6.19k
    case BFD_MACH_O_LC_LINKER_OPTIONS:
5064
6.19k
      break;
5065
6.24k
    case BFD_MACH_O_LC_NOTE:
5066
6.24k
      if (!bfd_mach_o_read_note (abfd, command))
5067
889
  return false;
5068
5.36k
      break;
5069
5.68k
    case BFD_MACH_O_LC_BUILD_VERSION:
5070
5.68k
      if (!bfd_mach_o_read_build_version (abfd, command))
5071
784
  return false;
5072
4.89k
      break;
5073
4.89k
    default:
5074
1.39k
      command->len = 0;
5075
1.39k
      _bfd_error_handler (_("%pB: unknown load command %#x"),
5076
1.39k
        abfd, command->type);
5077
1.39k
      return false;
5078
246k
    }
5079
5080
172k
  return true;
5081
246k
}
5082
5083
static bool
5084
bfd_mach_o_flatten_sections (bfd *abfd)
5085
58.8k
{
5086
58.8k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5087
58.8k
  bfd_mach_o_load_command *cmd;
5088
58.8k
  long csect = 0;
5089
58.8k
  size_t amt;
5090
5091
  /* Count total number of sections.  */
5092
58.8k
  mdata->nsects = 0;
5093
5094
213k
  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5095
154k
    {
5096
154k
      if (cmd->type == BFD_MACH_O_LC_SEGMENT
5097
154k
    || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
5098
37.3k
  {
5099
37.3k
    bfd_mach_o_segment_command *seg = &cmd->command.segment;
5100
5101
37.3k
    mdata->nsects += seg->nsects;
5102
37.3k
  }
5103
154k
    }
5104
5105
  /* Allocate sections array.  */
5106
58.8k
  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
58.8k
  mdata->sections = bfd_alloc (abfd, amt);
5112
58.8k
  if (mdata->sections == NULL && mdata->nsects != 0)
5113
0
    return false;
5114
5115
  /* Fill the array.  */
5116
58.8k
  csect = 0;
5117
5118
213k
  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5119
154k
    {
5120
154k
      if (cmd->type == BFD_MACH_O_LC_SEGMENT
5121
154k
    || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
5122
37.3k
  {
5123
37.3k
    bfd_mach_o_segment_command *seg = &cmd->command.segment;
5124
37.3k
    bfd_mach_o_section *sec;
5125
5126
37.3k
    BFD_ASSERT (csect + seg->nsects <= mdata->nsects);
5127
5128
4.69M
    for (sec = seg->sect_head; sec != NULL; sec = sec->next)
5129
4.65M
      mdata->sections[csect++] = sec;
5130
37.3k
  }
5131
154k
    }
5132
58.8k
  return true;
5133
58.8k
}
5134
5135
static bool
5136
bfd_mach_o_scan_start_address (bfd *abfd)
5137
58.8k
{
5138
58.8k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5139
58.8k
  bfd_mach_o_thread_command *thr = NULL;
5140
58.8k
  bfd_mach_o_load_command *cmd;
5141
58.8k
  unsigned long i;
5142
5143
185k
  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5144
140k
    if (cmd->type == BFD_MACH_O_LC_THREAD
5145
140k
  || cmd->type == BFD_MACH_O_LC_UNIXTHREAD)
5146
11.9k
      {
5147
11.9k
  thr = &cmd->command.thread;
5148
11.9k
  break;
5149
11.9k
      }
5150
128k
    else if (cmd->type == BFD_MACH_O_LC_MAIN && mdata->nsects > 1)
5151
1.57k
      {
5152
1.57k
  bfd_mach_o_main_command *main_cmd = &cmd->command.main;
5153
1.57k
  bfd_mach_o_section *text_sect = mdata->sections[0];
5154
5155
1.57k
  if (text_sect)
5156
1.57k
    {
5157
1.57k
      abfd->start_address = main_cmd->entryoff
5158
1.57k
        + (text_sect->addr - text_sect->offset);
5159
1.57k
      return true;
5160
1.57k
    }
5161
1.57k
      }
5162
5163
  /* An object file has no start address, so do not fail if not found.  */
5164
57.2k
  if (thr == NULL)
5165
45.3k
    return true;
5166
5167
  /* FIXME: create a subtarget hook ?  */
5168
80.1k
  for (i = 0; i < thr->nflavours; i++)
5169
68.3k
    {
5170
68.3k
      if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_I386)
5171
68.3k
    && (thr->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE32))
5172
1.17k
  {
5173
1.17k
    unsigned char buf[4];
5174
5175
1.17k
    if (bfd_seek (abfd, thr->flavours[i].offset + 40, SEEK_SET) != 0
5176
1.17k
        || bfd_bread (buf, 4, abfd) != 4)
5177
41
      return false;
5178
5179
1.13k
    abfd->start_address = bfd_h_get_32 (abfd, buf);
5180
1.13k
  }
5181
67.1k
      else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC)
5182
67.1k
         && (thr->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE))
5183
302
  {
5184
302
    unsigned char buf[4];
5185
5186
302
    if (bfd_seek (abfd, thr->flavours[i].offset + 0, SEEK_SET) != 0
5187
302
        || bfd_bread (buf, 4, abfd) != 4)
5188
5
      return false;
5189
5190
297
    abfd->start_address = bfd_h_get_32 (abfd, buf);
5191
297
  }
5192
66.8k
      else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_POWERPC_64)
5193
66.8k
         && (thr->flavours[i].flavour == BFD_MACH_O_PPC_THREAD_STATE64))
5194
9
  {
5195
9
    unsigned char buf[8];
5196
5197
9
    if (bfd_seek (abfd, thr->flavours[i].offset + 0, SEEK_SET) != 0
5198
9
        || bfd_bread (buf, 8, abfd) != 8)
5199
2
      return false;
5200
5201
7
    abfd->start_address = bfd_h_get_64 (abfd, buf);
5202
7
  }
5203
66.8k
      else if ((mdata->header.cputype == BFD_MACH_O_CPU_TYPE_X86_64)
5204
66.8k
         && (thr->flavours[i].flavour == BFD_MACH_O_x86_THREAD_STATE64))
5205
5.17k
  {
5206
5.17k
    unsigned char buf[8];
5207
5208
5.17k
    if (bfd_seek (abfd, thr->flavours[i].offset + (16 * 8), SEEK_SET) != 0
5209
5.17k
        || bfd_bread (buf, 8, abfd) != 8)
5210
26
      return false;
5211
5212
5.15k
    abfd->start_address = bfd_h_get_64 (abfd, buf);
5213
5.15k
  }
5214
68.3k
    }
5215
5216
11.8k
  return true;
5217
11.9k
}
5218
5219
bool
5220
bfd_mach_o_set_arch_mach (bfd *abfd,
5221
        enum bfd_architecture arch,
5222
        unsigned long machine)
5223
148k
{
5224
148k
  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
148k
  if (arch != bed->arch
5229
148k
      && arch != bfd_arch_unknown
5230
148k
      && bed->arch != bfd_arch_unknown)
5231
0
    return false;
5232
5233
148k
  return bfd_default_set_arch_mach (abfd, arch, machine);
5234
148k
}
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
150k
{
5241
150k
  unsigned int i;
5242
150k
  enum bfd_architecture cpu_type;
5243
150k
  unsigned long cpu_subtype;
5244
150k
  unsigned int hdrsize;
5245
5246
150k
  hdrsize = mach_o_wide_p (header) ?
5247
99.9k
    BFD_MACH_O_HEADER_64_SIZE : BFD_MACH_O_HEADER_SIZE;
5248
5249
150k
  mdata->header = *header;
5250
5251
150k
  abfd->flags = abfd->flags & BFD_IN_MEMORY;
5252
150k
  switch (header->filetype)
5253
150k
    {
5254
5.87k
    case BFD_MACH_O_MH_OBJECT:
5255
5.87k
      abfd->flags |= HAS_RELOC;
5256
5.87k
      break;
5257
5.24k
    case BFD_MACH_O_MH_EXECUTE:
5258
5.24k
      abfd->flags |= EXEC_P;
5259
5.24k
      break;
5260
310
    case BFD_MACH_O_MH_DYLIB:
5261
568
    case BFD_MACH_O_MH_BUNDLE:
5262
568
      abfd->flags |= DYNAMIC;
5263
568
      break;
5264
150k
    }
5265
5266
150k
  abfd->tdata.mach_o_data = mdata;
5267
5268
150k
  bfd_mach_o_convert_architecture (header->cputype, header->cpusubtype,
5269
150k
           &cpu_type, &cpu_subtype);
5270
150k
  if (cpu_type == bfd_arch_unknown)
5271
2.40k
    {
5272
2.40k
      _bfd_error_handler
5273
  /* xgettext:c-format */
5274
2.40k
  (_("bfd_mach_o_scan: unknown architecture 0x%lx/0x%lx"),
5275
2.40k
   header->cputype, header->cpusubtype);
5276
2.40k
      return false;
5277
2.40k
    }
5278
5279
148k
  bfd_set_arch_mach (abfd, cpu_type, cpu_subtype);
5280
5281
148k
  if (header->ncmds != 0)
5282
135k
    {
5283
135k
      bfd_mach_o_load_command *cmd;
5284
135k
      size_t amt;
5285
135k
      ufile_ptr filesize = bfd_get_file_size (abfd);
5286
5287
135k
      if (filesize == 0)
5288
0
  filesize = (ufile_ptr) -1;
5289
5290
135k
      mdata->first_command = NULL;
5291
135k
      mdata->last_command = NULL;
5292
5293
135k
      if (header->ncmds > (filesize - hdrsize) / BFD_MACH_O_LC_SIZE)
5294
2.74k
  {
5295
2.74k
    bfd_set_error (bfd_error_file_truncated);
5296
2.74k
    return false;
5297
2.74k
  }
5298
132k
      if (_bfd_mul_overflow (header->ncmds,
5299
132k
           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
132k
      cmd = bfd_alloc (abfd, amt);
5305
132k
      if (cmd == NULL)
5306
0
  return false;
5307
5308
304k
      for (i = 0; i < header->ncmds; i++)
5309
259k
  {
5310
259k
    bfd_mach_o_load_command *cur = &cmd[i];
5311
5312
259k
    bfd_mach_o_append_command (abfd, cur);
5313
5314
259k
    if (i == 0)
5315
132k
      cur->offset = hdrsize;
5316
126k
    else
5317
126k
      {
5318
126k
        bfd_mach_o_load_command *prev = &cmd[i - 1];
5319
126k
        cur->offset = prev->offset + prev->len;
5320
126k
      }
5321
5322
259k
    if (!bfd_mach_o_read_command (abfd, cur, filesize))
5323
86.8k
      return false;
5324
259k
  }
5325
132k
    }
5326
5327
  /* Sections should be flatten before scanning start address.  */
5328
58.8k
  if (!bfd_mach_o_flatten_sections (abfd))
5329
0
    return false;
5330
58.8k
  if (!bfd_mach_o_scan_start_address (abfd))
5331
74
    return false;
5332
5333
58.7k
  return true;
5334
58.8k
}
5335
5336
bool
5337
bfd_mach_o_mkobject_init (bfd *abfd)
5338
121
{
5339
121
  bfd_mach_o_data_struct *mdata = NULL;
5340
5341
121
  mdata = bfd_zalloc (abfd, sizeof (bfd_mach_o_data_struct));
5342
121
  if (mdata == NULL)
5343
0
    return false;
5344
121
  abfd->tdata.mach_o_data = mdata;
5345
5346
121
  mdata->header.magic = 0;
5347
121
  mdata->header.cputype = 0;
5348
121
  mdata->header.cpusubtype = 0;
5349
121
  mdata->header.filetype = 0;
5350
121
  mdata->header.ncmds = 0;
5351
121
  mdata->header.sizeofcmds = 0;
5352
121
  mdata->header.flags = 0;
5353
121
  mdata->header.byteorder = BFD_ENDIAN_UNKNOWN;
5354
121
  mdata->first_command = NULL;
5355
121
  mdata->last_command = NULL;
5356
121
  mdata->nsects = 0;
5357
121
  mdata->sections = NULL;
5358
121
  mdata->dyn_reloc_cache = NULL;
5359
5360
121
  return true;
5361
121
}
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
10.9M
{
5387
10.9M
  bfd_mach_o_header header;
5388
10.9M
  bfd_mach_o_data_struct *mdata;
5389
5390
10.9M
  if (!bfd_mach_o_read_header (abfd, hdr_off, &header))
5391
10.3M
    goto wrong;
5392
5393
595k
  if (! (header.byteorder == BFD_ENDIAN_BIG
5394
595k
   || 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
595k
  if (! ((header.byteorder == BFD_ENDIAN_BIG
5402
595k
    && abfd->xvec->byteorder == BFD_ENDIAN_BIG
5403
595k
    && abfd->xvec->header_byteorder == BFD_ENDIAN_BIG)
5404
595k
   || (header.byteorder == BFD_ENDIAN_LITTLE
5405
594k
       && abfd->xvec->byteorder == BFD_ENDIAN_LITTLE
5406
594k
       && abfd->xvec->header_byteorder == BFD_ENDIAN_LITTLE)))
5407
102k
    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
493k
  if (cpu_type)
5413
395k
    {
5414
395k
      if (header.cputype != cpu_type)
5415
341k
  goto wrong;
5416
395k
    }
5417
98.1k
  else
5418
98.1k
    {
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
98.1k
    }
5426
5427
152k
  if (file_type)
5428
1.31k
    {
5429
1.31k
      if (header.filetype != file_type)
5430
1.29k
  goto wrong;
5431
1.31k
    }
5432
151k
  else
5433
151k
    {
5434
151k
      switch (header.filetype)
5435
151k
  {
5436
343
  case BFD_MACH_O_MH_CORE:
5437
    /* Handled by core_p */
5438
343
    goto wrong;
5439
150k
  default:
5440
150k
    break;
5441
151k
  }
5442
151k
    }
5443
5444
150k
  mdata = (bfd_mach_o_data_struct *) bfd_zalloc (abfd, sizeof (*mdata));
5445
150k
  if (mdata == NULL)
5446
0
    goto fail;
5447
150k
  mdata->hdr_offset = hdr_off;
5448
5449
150k
  if (!bfd_mach_o_scan (abfd, &header, mdata))
5450
92.1k
    goto wrong;
5451
5452
58.7k
  return _bfd_no_cleanup;
5453
5454
10.8M
 wrong:
5455
10.8M
  bfd_set_error (bfd_error_wrong_format);
5456
5457
10.8M
 fail:
5458
10.8M
  return NULL;
5459
10.8M
}
5460
5461
static bfd_cleanup
5462
bfd_mach_o_gen_object_p (bfd *abfd)
5463
3.60M
{
5464
3.60M
  return bfd_mach_o_header_p (abfd, 0, 0, 0);
5465
3.60M
}
5466
5467
static bfd_cleanup
5468
bfd_mach_o_gen_core_p (bfd *abfd)
5469
31.4k
{
5470
31.4k
  return bfd_mach_o_header_p (abfd, 0, BFD_MACH_O_MH_CORE, 0);
5471
31.4k
}
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
516
{
5523
516
  unsigned long j = i;
5524
961
  while (j-- != 0)
5525
470
    if (elt[i].offset == elt[j].offset
5526
470
  || (elt[i].offset > elt[j].offset
5527
458
      ? elt[i].offset - elt[j].offset < elt[j].size
5528
458
      : elt[j].offset - elt[i].offset < elt[i].size))
5529
25
      return true;
5530
491
  return false;
5531
516
}
5532
5533
bfd_cleanup
5534
bfd_mach_o_fat_archive_p (bfd *abfd)
5535
129k
{
5536
129k
  mach_o_fat_data_struct *adata = NULL;
5537
129k
  struct mach_o_fat_header_external hdr;
5538
129k
  unsigned long i;
5539
129k
  size_t amt;
5540
129k
  ufile_ptr filesize;
5541
5542
129k
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
5543
129k
      || bfd_bread (&hdr, sizeof (hdr), abfd) != sizeof (hdr))
5544
628
    goto error;
5545
5546
128k
  adata = bfd_alloc (abfd, sizeof (mach_o_fat_data_struct));
5547
128k
  if (adata == NULL)
5548
0
    goto error;
5549
5550
128k
  adata->magic = bfd_getb32 (hdr.magic);
5551
128k
  adata->nfat_arch = bfd_getb32 (hdr.nfat_arch);
5552
128k
  if (adata->magic != 0xcafebabe)
5553
128k
    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
451
  if (adata->nfat_arch > 30)
5558
51
    goto error;
5559
5560
400
  if (_bfd_mul_overflow (adata->nfat_arch,
5561
400
       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
400
  adata->archentries = bfd_alloc (abfd, amt);
5567
400
  if (adata->archentries == NULL)
5568
0
    goto error;
5569
5570
400
  filesize = bfd_get_file_size (abfd);
5571
891
  for (i = 0; i < adata->nfat_arch; i++)
5572
743
    {
5573
743
      struct mach_o_fat_arch_external arch;
5574
743
      if (bfd_bread (&arch, sizeof (arch), abfd) != sizeof (arch))
5575
22
  goto error;
5576
721
      adata->archentries[i].cputype = bfd_getb32 (arch.cputype);
5577
721
      adata->archentries[i].cpusubtype = bfd_getb32 (arch.cpusubtype);
5578
721
      adata->archentries[i].offset = bfd_getb32 (arch.offset);
5579
721
      adata->archentries[i].size = bfd_getb32 (arch.size);
5580
721
      adata->archentries[i].align = bfd_getb32 (arch.align);
5581
721
      if ((filesize != 0
5582
721
     && (adata->archentries[i].offset > filesize
5583
721
         || (adata->archentries[i].size
5584
634
       > filesize - adata->archentries[i].offset)))
5585
721
    || (adata->archentries[i].offset
5586
543
        < sizeof (hdr) + adata->nfat_arch * sizeof (arch))
5587
721
    || overlap_previous (adata->archentries, i))
5588
230
  {
5589
230
    bfd_release (abfd, adata);
5590
230
    bfd_set_error (bfd_error_malformed_archive);
5591
230
    return NULL;
5592
230
  }
5593
721
    }
5594
5595
148
  abfd->tdata.mach_o_fat_data = adata;
5596
5597
148
  return _bfd_no_cleanup;
5598
5599
128k
 error:
5600
128k
  if (adata != NULL)
5601
128k
    bfd_release (abfd, adata);
5602
128k
  bfd_set_error (bfd_error_wrong_format);
5603
128k
  return NULL;
5604
400
}
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
267
{
5616
267
  struct areltdata *areltdata;
5617
  /* Create the member filename. Use ARCH_NAME.  */
5618
267
  const bfd_arch_info_type *ap = bfd_lookup_arch (arch_type, arch_subtype);
5619
267
  const char *filename;
5620
5621
267
  if (ap)
5622
218
    {
5623
      /* Use the architecture name if known.  */
5624
218
      filename = bfd_set_filename (abfd, ap->printable_name);
5625
218
    }
5626
49
  else
5627
49
    {
5628
      /* Forge a uniq id.  */
5629
49
      char buf[2 + 8 + 1 + 2 + 8 + 1];
5630
49
      snprintf (buf, sizeof (buf), "0x%lx-0x%lx",
5631
49
    entry->cputype, entry->cpusubtype);
5632
49
      filename = bfd_set_filename (abfd, buf);
5633
49
    }
5634
267
  if (!filename)
5635
0
    return false;
5636
5637
267
  areltdata = bfd_zmalloc (sizeof (struct areltdata));
5638
267
  if (areltdata == NULL)
5639
0
    return false;
5640
267
  areltdata->parsed_size = entry->size;
5641
267
  abfd->arelt_data = areltdata;
5642
267
  abfd->iostream = NULL;
5643
267
  abfd->origin = entry->offset;
5644
267
  return true;
5645
267
}
5646
5647
bfd *
5648
bfd_mach_o_fat_openr_next_archived_file (bfd *archive, bfd *prev)
5649
402
{
5650
402
  mach_o_fat_data_struct *adata;
5651
402
  mach_o_fat_archentry *entry = NULL;
5652
402
  unsigned long i;
5653
402
  bfd *nbfd;
5654
402
  enum bfd_architecture arch_type;
5655
402
  unsigned long arch_subtype;
5656
5657
402
  adata = (mach_o_fat_data_struct *) archive->tdata.mach_o_fat_data;
5658
402
  BFD_ASSERT (adata != NULL);
5659
5660
  /* Find index of previous entry.  */
5661
402
  if (prev == NULL)
5662
139
    {
5663
      /* Start at first one.  */
5664
139
      i = 0;
5665
139
    }
5666
263
  else
5667
263
    {
5668
      /* Find index of PREV.  */
5669
420
      for (i = 0; i < adata->nfat_arch; i++)
5670
420
  {
5671
420
    if (adata->archentries[i].offset == prev->origin)
5672
263
      break;
5673
420
  }
5674
5675
263
      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
263
      i++;
5684
263
    }
5685
5686
402
  if (i >= adata->nfat_arch)
5687
135
    {
5688
135
      bfd_set_error (bfd_error_no_more_archived_files);
5689
135
      return NULL;
5690
135
    }
5691
5692
267
  entry = &adata->archentries[i];
5693
267
  nbfd = _bfd_new_bfd_contained_in (archive);
5694
267
  if (nbfd == NULL)
5695
0
    return NULL;
5696
5697
267
  bfd_mach_o_convert_architecture (entry->cputype, entry->cpusubtype,
5698
267
           &arch_type, &arch_subtype);
5699
5700
267
  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
267
  bfd_set_arch_mach (nbfd, arch_type, arch_subtype);
5707
5708
267
  return nbfd;
5709
267
}
5710
5711
/* Analogous to stat call.  */
5712
5713
static int
5714
bfd_mach_o_fat_stat_arch_elt (bfd *abfd, struct stat *buf)
5715
42
{
5716
42
  if (abfd->arelt_data == NULL)
5717
0
    {
5718
0
      bfd_set_error (bfd_error_invalid_operation);
5719
0
      return -1;
5720
0
    }
5721
5722
42
  buf->st_mtime = 0;
5723
42
  buf->st_uid = 0;
5724
42
  buf->st_gid = 0;
5725
42
  buf->st_mode = 0644;
5726
42
  buf->st_size = arelt_size (abfd);
5727
5728
42
  return 0;
5729
42
}
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
377
{
5792
377
  _bfd_unlink_from_archive_parent (abfd);
5793
377
  return true;
5794
377
}
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
89
{
5801
89
  struct mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
5802
89
  struct bfd_mach_o_load_command *cmd;
5803
89
  unsigned int num;
5804
5805
89
  BFD_ASSERT (mdata != NULL);
5806
89
  BFD_ASSERT (mcommand != NULL);
5807
5808
89
  num = 0;
5809
1.37k
  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
5810
1.28k
    {
5811
1.28k
      if (cmd->type != type)
5812
1.22k
  continue;
5813
5814
60
      if (num == 0)
5815
56
  *mcommand = cmd;
5816
60
      num++;
5817
60
    }
5818
5819
89
  return num;
5820
89
}
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_bread (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
89
{
6037
89
  bfd_mach_o_load_command *uuid_cmd = NULL;
6038
89
  int ncmd = bfd_mach_o_lookup_command (abfd, BFD_MACH_O_LC_UUID, &uuid_cmd);
6039
89
  if (ncmd != 1 || uuid_cmd == NULL)
6040
37
    return false;
6041
52
  return &uuid_cmd->command.uuid;
6042
89
}
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
52
{
6082
52
  bfd *base_dsym_bfd, *dsym_bfd;
6083
6084
52
  BFD_ASSERT (uuid_cmd);
6085
6086
52
  base_dsym_bfd = bfd_openr (dsym_filename, NULL);
6087
52
  if (base_dsym_bfd == NULL)
6088
52
    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
89
{
6108
89
  char *dsym_filename;
6109
89
  bfd_mach_o_uuid_command *uuid_cmd;
6110
89
  bfd *dsym_bfd, *base_bfd = abfd;
6111
89
  const char *base_basename;
6112
6113
89
  if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_mach_o_flavour)
6114
0
    return NULL;
6115
6116
89
  if (abfd->my_archive && !bfd_is_thin_archive (abfd->my_archive))
6117
13
    base_bfd = abfd->my_archive;
6118
  /* BFD may have been opened from a stream. */
6119
89
  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
89
  base_basename = lbasename (bfd_get_filename (base_bfd));
6125
6126
89
  uuid_cmd = bfd_mach_o_lookup_uuid_command (abfd);
6127
89
  if (uuid_cmd == NULL)
6128
37
    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
52
  dsym_filename = (char *)bfd_malloc (strlen (bfd_get_filename (base_bfd))
6135
52
               + strlen (dsym_subdir) + 1
6136
52
               + strlen (base_basename) + 1);
6137
52
  if (dsym_filename == NULL)
6138
0
    return NULL;
6139
6140
52
  sprintf (dsym_filename, "%s%s/%s",
6141
52
     bfd_get_filename (base_bfd), dsym_subdir, base_basename);
6142
6143
52
  dsym_bfd = bfd_mach_o_find_dsym (dsym_filename, uuid_cmd,
6144
52
           bfd_get_arch_info (abfd));
6145
52
  if (dsym_bfd == NULL)
6146
52
    free (dsym_filename);
6147
6148
52
  return dsym_bfd;
6149
52
}
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
20.3k
{
6161
20.3k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
6162
20.3k
  if (mdata == NULL)
6163
0
    return false;
6164
20.3k
  switch (mdata->header.filetype)
6165
20.3k
    {
6166
578
    case BFD_MACH_O_MH_OBJECT:
6167
578
      break;
6168
7.56k
    case BFD_MACH_O_MH_EXECUTE:
6169
7.80k
    case BFD_MACH_O_MH_DYLIB:
6170
7.88k
    case BFD_MACH_O_MH_BUNDLE:
6171
8.18k
    case BFD_MACH_O_MH_KEXT_BUNDLE:
6172
8.18k
      if (mdata->dwarf2_find_line_info == NULL)
6173
89
  {
6174
89
    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
89
    if (! mdata->dsym_bfd)
6180
89
      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
8.09k
      break;
6188
11.5k
    default:
6189
11.5k
      return false;
6190
20.3k
    }
6191
8.75k
  return _bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
6192
8.75k
          filename_ptr, functionname_ptr,
6193
8.75k
          line_ptr, discriminator_ptr,
6194
8.75k
          dwarf_debug_sections,
6195
8.75k
          &mdata->dwarf2_find_line_info);
6196
20.3k
}
6197
6198
bool
6199
bfd_mach_o_close_and_cleanup (bfd *abfd)
6200
36.9k
{
6201
36.9k
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
6202
36.9k
  if (bfd_get_format (abfd) == bfd_object && mdata != NULL)
6203
33.3k
    {
6204
33.3k
      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
33.3k
    }
6229
6230
36.9k
  return _bfd_generic_close_and_cleanup (abfd);
6231
36.9k
}
6232
6233
bool
6234
bfd_mach_o_bfd_free_cached_info (bfd *abfd)
6235
37.3k
{
6236
37.3k
  bfd_mach_o_data_struct *mdata;
6237
6238
37.3k
  if ((bfd_get_format (abfd) == bfd_object
6239
37.3k
       || bfd_get_format (abfd) == bfd_core)
6240
37.3k
      && (mdata = bfd_mach_o_get_data (abfd)) != NULL)
6241
33.3k
    {
6242
33.3k
      _bfd_dwarf2_cleanup_debug_info (abfd, &mdata->dwarf2_find_line_info);
6243
33.3k
      free (mdata->dyn_reloc_cache);
6244
33.3k
      mdata->dyn_reloc_cache = NULL;
6245
6246
1.96M
      for (asection *asect = abfd->sections; asect; asect = asect->next)
6247
1.93M
  {
6248
1.93M
    free (asect->relocation);
6249
1.93M
    asect->relocation = NULL;
6250
1.93M
  }
6251
33.3k
    }
6252
6253
  /* Do not call _bfd_generic_bfd_free_cached_info here.
6254
     bfd_mach_o_close_and_cleanup uses tdata.  */
6255
37.3k
  return true;
6256
37.3k
}
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