Coverage Report

Created: 2026-04-04 08:16

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