Coverage Report

Created: 2023-08-28 06:23

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