OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [mach-o.h] - Blame information for rev 146

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 14 khays
/* Mach-O support for BFD.
2
   Copyright 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008, 2009
3
   Free Software Foundation, Inc.
4
 
5
   This file is part of BFD, the Binary File Descriptor library.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
 
22
#ifndef _BFD_MACH_O_H_
23
#define _BFD_MACH_O_H_
24
 
25
#include "bfd.h"
26
 
27
/* Symbol n_type values.  */
28
#define BFD_MACH_O_N_STAB  0xe0 /* If any of these bits set, a symbolic debugging entry.  */
29
#define BFD_MACH_O_N_PEXT  0x10 /* Private external symbol bit.  */
30
#define BFD_MACH_O_N_TYPE  0x0e /* Mask for the type bits.  */
31
#define BFD_MACH_O_N_EXT   0x01 /* External symbol bit, set for external symbols.  */
32
#define BFD_MACH_O_N_UNDF  0x00 /* Undefined, n_sect == NO_SECT.  */
33
#define BFD_MACH_O_N_ABS   0x02 /* Absolute, n_sect == NO_SECT.  */
34
#define BFD_MACH_O_N_INDR  0x0a /* Indirect.  */
35
#define BFD_MACH_O_N_PBUD  0x0c /* Prebound undefined (defined in a dylib).  */
36
#define BFD_MACH_O_N_SECT  0x0e /* Defined in section number n_sect.  */
37
 
38
#define BFD_MACH_O_NO_SECT 0    /* Symbol not in any section of the image.  */
39
 
40
/* Symbol n_desc reference flags.  */
41
#define BFD_MACH_O_REFERENCE_MASK                               0x0f
42
#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_NON_LAZY            0x00
43
#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_LAZY                0x01
44
#define BFD_MACH_O_REFERENCE_FLAG_DEFINED                       0x02
45
#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_DEFINED               0x03
46
#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY    0x04
47
#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY        0x05
48
 
49
#define BFD_MACH_O_REFERENCED_DYNAMICALLY                       0x10
50
#define BFD_MACH_O_N_DESC_DISCARDED                             0x20
51
#define BFD_MACH_O_N_NO_DEAD_STRIP                              0x20
52
#define BFD_MACH_O_N_WEAK_REF                                   0x40
53
#define BFD_MACH_O_N_WEAK_DEF                                   0x80
54
 
55
typedef enum bfd_mach_o_mach_header_magic
56
{
57
  BFD_MACH_O_MH_MAGIC    = 0xfeedface,
58
  BFD_MACH_O_MH_CIGAM    = 0xcefaedfe,
59
  BFD_MACH_O_MH_MAGIC_64 = 0xfeedfacf,
60
  BFD_MACH_O_MH_CIGAM_64 = 0xcffaedfe
61
}
62
bfd_mach_o_mach_header_magic;
63
 
64
typedef enum bfd_mach_o_ppc_thread_flavour
65
{
66
  BFD_MACH_O_PPC_THREAD_STATE      = 1,
67
  BFD_MACH_O_PPC_FLOAT_STATE       = 2,
68
  BFD_MACH_O_PPC_EXCEPTION_STATE   = 3,
69
  BFD_MACH_O_PPC_VECTOR_STATE      = 4,
70
  BFD_MACH_O_PPC_THREAD_STATE64    = 5,
71
  BFD_MACH_O_PPC_EXCEPTION_STATE64 = 6,
72
  BFD_MACH_O_PPC_THREAD_STATE_NONE = 7
73
}
74
bfd_mach_o_ppc_thread_flavour;
75
 
76
/* Defined in <mach/i386/thread_status.h> */
77
typedef enum bfd_mach_o_i386_thread_flavour
78
{
79
  BFD_MACH_O_x86_THREAD_STATE32    = 1,
80
  BFD_MACH_O_x86_FLOAT_STATE32     = 2,
81
  BFD_MACH_O_x86_EXCEPTION_STATE32 = 3,
82
  BFD_MACH_O_x86_THREAD_STATE64    = 4,
83
  BFD_MACH_O_x86_FLOAT_STATE64     = 5,
84
  BFD_MACH_O_x86_EXCEPTION_STATE64 = 6,
85
  BFD_MACH_O_x86_THREAD_STATE      = 7,
86
  BFD_MACH_O_x86_FLOAT_STATE       = 8,
87
  BFD_MACH_O_x86_EXCEPTION_STATE   = 9,
88
  BFD_MACH_O_x86_DEBUG_STATE32     = 10,
89
  BFD_MACH_O_x86_DEBUG_STATE64     = 11,
90
  BFD_MACH_O_x86_DEBUG_STATE       = 12,
91
  BFD_MACH_O_x86_THREAD_STATE_NONE = 13
92
}
93
bfd_mach_o_i386_thread_flavour;
94
 
95
#define BFD_MACH_O_LC_REQ_DYLD 0x80000000
96
 
97
typedef enum bfd_mach_o_load_command_type
98
{
99
  BFD_MACH_O_LC_SEGMENT = 0x1,          /* File segment to be mapped.  */
100
  BFD_MACH_O_LC_SYMTAB = 0x2,           /* Link-edit stab symbol table info (obsolete).  */
101
  BFD_MACH_O_LC_SYMSEG = 0x3,           /* Link-edit gdb symbol table info.  */
102
  BFD_MACH_O_LC_THREAD = 0x4,           /* Thread.  */
103
  BFD_MACH_O_LC_UNIXTHREAD = 0x5,       /* UNIX thread (includes a stack).  */
104
  BFD_MACH_O_LC_LOADFVMLIB = 0x6,       /* Load a fixed VM shared library.  */
105
  BFD_MACH_O_LC_IDFVMLIB = 0x7,         /* Fixed VM shared library id.  */
106
  BFD_MACH_O_LC_IDENT = 0x8,            /* Object identification information (obsolete).  */
107
  BFD_MACH_O_LC_FVMFILE = 0x9,          /* Fixed VM file inclusion.  */
108
  BFD_MACH_O_LC_PREPAGE = 0xa,          /* Prepage command (internal use).  */
109
  BFD_MACH_O_LC_DYSYMTAB = 0xb,         /* Dynamic link-edit symbol table info.  */
110
  BFD_MACH_O_LC_LOAD_DYLIB = 0xc,       /* Load a dynamically linked shared library.  */
111
  BFD_MACH_O_LC_ID_DYLIB = 0xd,         /* Dynamically linked shared lib identification.  */
112
  BFD_MACH_O_LC_LOAD_DYLINKER = 0xe,    /* Load a dynamic linker.  */
113
  BFD_MACH_O_LC_ID_DYLINKER = 0xf,      /* Dynamic linker identification.  */
114
  BFD_MACH_O_LC_PREBOUND_DYLIB = 0x10,  /* Modules prebound for a dynamically.  */
115
  BFD_MACH_O_LC_ROUTINES = 0x11,        /* Image routines.  */
116
  BFD_MACH_O_LC_SUB_FRAMEWORK = 0x12,   /* Sub framework.  */
117
  BFD_MACH_O_LC_SUB_UMBRELLA = 0x13,    /* Sub umbrella.  */
118
  BFD_MACH_O_LC_SUB_CLIENT = 0x14,      /* Sub client.  */
119
  BFD_MACH_O_LC_SUB_LIBRARY = 0x15,     /* Sub library.  */
120
  BFD_MACH_O_LC_TWOLEVEL_HINTS = 0x16,  /* Two-level namespace lookup hints.  */
121
  BFD_MACH_O_LC_PREBIND_CKSUM = 0x17,   /* Prebind checksum.  */
122
  /* Load a dynamically linked shared library that is allowed to be
123
       missing (weak).  */
124
  BFD_MACH_O_LC_LOAD_WEAK_DYLIB = 0x18,
125
  BFD_MACH_O_LC_SEGMENT_64 = 0x19,      /* 64-bit segment of this file to be
126
                                           mapped.  */
127
  BFD_MACH_O_LC_ROUTINES_64 = 0x1a,     /* Address of the dyld init routine
128
                                           in a dylib.  */
129
  BFD_MACH_O_LC_UUID = 0x1b,            /* 128-bit UUID of the executable.  */
130
  BFD_MACH_O_LC_RPATH = 0x1c,           /* Run path addiions.  */
131
  BFD_MACH_O_LC_CODE_SIGNATURE = 0x1d,  /* Local of code signature.  */
132
  BFD_MACH_O_LC_SEGMENT_SPLIT_INFO = 0x1e, /* Local of info to split seg.  */
133
  BFD_MACH_O_LC_REEXPORT_DYLIB = 0x1f,  /* Load and re-export lib.  */
134
  BFD_MACH_O_LC_LAZY_LOAD_DYLIB = 0x20, /* Delay load of lib until use.  */
135
  BFD_MACH_O_LC_ENCRYPTION_INFO = 0x21, /* Encrypted segment info.  */
136
  BFD_MACH_O_LC_DYLD_INFO = 0x22        /* Compressed dyld information.  */
137
}
138
bfd_mach_o_load_command_type;
139
 
140
#define BFD_MACH_O_CPU_IS64BIT 0x1000000
141
 
142
typedef enum bfd_mach_o_cpu_type
143
{
144
  BFD_MACH_O_CPU_TYPE_VAX = 1,
145
  BFD_MACH_O_CPU_TYPE_MC680x0 = 6,
146
  BFD_MACH_O_CPU_TYPE_I386 = 7,
147
  BFD_MACH_O_CPU_TYPE_MIPS = 8,
148
  BFD_MACH_O_CPU_TYPE_MC98000 = 10,
149
  BFD_MACH_O_CPU_TYPE_HPPA = 11,
150
  BFD_MACH_O_CPU_TYPE_ARM = 12,
151
  BFD_MACH_O_CPU_TYPE_MC88000 = 13,
152
  BFD_MACH_O_CPU_TYPE_SPARC = 14,
153
  BFD_MACH_O_CPU_TYPE_I860 = 15,
154
  BFD_MACH_O_CPU_TYPE_ALPHA = 16,
155
  BFD_MACH_O_CPU_TYPE_POWERPC = 18,
156
  BFD_MACH_O_CPU_TYPE_POWERPC_64 = (BFD_MACH_O_CPU_TYPE_POWERPC | BFD_MACH_O_CPU_IS64BIT),
157
  BFD_MACH_O_CPU_TYPE_X86_64 = (BFD_MACH_O_CPU_TYPE_I386 | BFD_MACH_O_CPU_IS64BIT)
158
}
159
bfd_mach_o_cpu_type;
160
 
161
typedef enum bfd_mach_o_cpu_subtype
162
{
163
  BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3
164
}
165
bfd_mach_o_cpu_subtype;
166
 
167
typedef enum bfd_mach_o_filetype
168
{
169
  BFD_MACH_O_MH_OBJECT      = 0x01,
170
  BFD_MACH_O_MH_EXECUTE     = 0x02,
171
  BFD_MACH_O_MH_FVMLIB      = 0x03,
172
  BFD_MACH_O_MH_CORE        = 0x04,
173
  BFD_MACH_O_MH_PRELOAD     = 0x05,
174
  BFD_MACH_O_MH_DYLIB       = 0x06,
175
  BFD_MACH_O_MH_DYLINKER    = 0x07,
176
  BFD_MACH_O_MH_BUNDLE      = 0x08,
177
  BFD_MACH_O_MH_DYLIB_STUB  = 0x09,
178
  BFD_MACH_O_MH_DSYM        = 0x0a,
179
  BFD_MACH_O_MH_KEXT_BUNDLE = 0x0b
180
}
181
bfd_mach_o_filetype;
182
 
183
typedef enum bfd_mach_o_header_flags
184
{
185
  BFD_MACH_O_MH_NOUNDEFS                = 0x000001,
186
  BFD_MACH_O_MH_INCRLINK                = 0x000002,
187
  BFD_MACH_O_MH_DYLDLINK                = 0x000004,
188
  BFD_MACH_O_MH_BINDATLOAD              = 0x000008,
189
  BFD_MACH_O_MH_PREBOUND                = 0x000010,
190
  BFD_MACH_O_MH_SPLIT_SEGS              = 0x000020,
191
  BFD_MACH_O_MH_LAZY_INIT               = 0x000040,
192
  BFD_MACH_O_MH_TWOLEVEL                = 0x000080,
193
  BFD_MACH_O_MH_FORCE_FLAT              = 0x000100,
194
  BFD_MACH_O_MH_NOMULTIDEFS             = 0x000200,
195
  BFD_MACH_O_MH_NOFIXPREBINDING         = 0x000400,
196
  BFD_MACH_O_MH_PREBINDABLE             = 0x000800,
197
  BFD_MACH_O_MH_ALLMODSBOUND            = 0x001000,
198
  BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS = 0x002000,
199
  BFD_MACH_O_MH_CANONICAL               = 0x004000,
200
  BFD_MACH_O_MH_WEAK_DEFINES            = 0x008000,
201
  BFD_MACH_O_MH_BINDS_TO_WEAK           = 0x010000,
202
  BFD_MACH_O_MH_ALLOW_STACK_EXECUTION   = 0x020000,
203
  BFD_MACH_O_MH_ROOT_SAFE               = 0x040000,
204
  BFD_MACH_O_MH_SETUID_SAFE             = 0x080000,
205
  BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS    = 0x100000,
206
  BFD_MACH_O_MH_PIE                     = 0x200000
207
}
208
bfd_mach_o_header_flags;
209
 
210
/* Constants for the type of a section.  */
211
 
212
typedef enum bfd_mach_o_section_type
213
{
214
  /* Regular section.  */
215
  BFD_MACH_O_S_REGULAR = 0x0,
216
 
217
  /* Zero fill on demand section.  */
218
  BFD_MACH_O_S_ZEROFILL = 0x1,
219
 
220
  /* Section with only literal C strings.  */
221
  BFD_MACH_O_S_CSTRING_LITERALS = 0x2,
222
 
223
  /* Section with only 4 byte literals.  */
224
  BFD_MACH_O_S_4BYTE_LITERALS = 0x3,
225
 
226
  /* Section with only 8 byte literals.  */
227
  BFD_MACH_O_S_8BYTE_LITERALS = 0x4,
228
 
229
  /* Section with only pointers to literals.  */
230
  BFD_MACH_O_S_LITERAL_POINTERS = 0x5,
231
 
232
  /* For the two types of symbol pointers sections and the symbol stubs
233
     section they have indirect symbol table entries.  For each of the
234
     entries in the section the indirect symbol table entries, in
235
     corresponding order in the indirect symbol table, start at the index
236
     stored in the reserved1 field of the section structure.  Since the
237
     indirect symbol table entries correspond to the entries in the
238
     section the number of indirect symbol table entries is inferred from
239
     the size of the section divided by the size of the entries in the
240
     section.  For symbol pointers sections the size of the entries in
241
     the section is 4 bytes and for symbol stubs sections the byte size
242
     of the stubs is stored in the reserved2 field of the section
243
     structure.  */
244
 
245
  /* Section with only non-lazy symbol pointers.  */
246
  BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS = 0x6,
247
 
248
  /* Section with only lazy symbol pointers.  */
249
  BFD_MACH_O_S_LAZY_SYMBOL_POINTERS = 0x7,
250
 
251
  /* Section with only symbol stubs, byte size of stub in the reserved2
252
     field.  */
253
  BFD_MACH_O_S_SYMBOL_STUBS = 0x8,
254
 
255
  /* Section with only function pointers for initialization.  */
256
  BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS = 0x9,
257
 
258
  /* Section with only function pointers for termination.  */
259
  BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS = 0xa,
260
 
261
  /* Section contains symbols that are coalesced by the linkers.  */
262
  BFD_MACH_O_S_COALESCED = 0xb,
263
 
264
  /* Zero fill on demand section (possibly larger than 4 GB).  */
265
  BFD_MACH_O_S_GB_ZEROFILL = 0xc,
266
 
267
  /* Section with only pairs of function pointers for interposing.  */
268
  BFD_MACH_O_S_INTERPOSING = 0xd,
269
 
270
  /* Section with only 16 byte literals.  */
271
  BFD_MACH_O_S_16BYTE_LITERALS = 0xe,
272
 
273
  /* Section contains DTrace Object Format.  */
274
  BFD_MACH_O_S_DTRACE_DOF = 0xf,
275
 
276
  /* Section with only lazy symbol pointers to lazy loaded dylibs.  */
277
  BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS = 0x10
278
}
279
bfd_mach_o_section_type;
280
 
281
/* The flags field of a section structure is separated into two parts a section
282
   type and section attributes.  The section types are mutually exclusive (it
283
   can only have one type) but the section attributes are not (it may have more
284
   than one attribute).  */
285
 
286
#define BFD_MACH_O_SECTION_TYPE_MASK        0x000000ff
287
 
288
/* Constants for the section attributes part of the flags field of a section
289
   structure.  */
290
#define BFD_MACH_O_SECTION_ATTRIBUTES_MASK  0xffffff00
291
/* System setable attributes.  */
292
#define BFD_MACH_O_SECTION_ATTRIBUTES_SYS   0x00ffff00
293
/* User attributes.  */
294
#define BFD_MACH_O_SECTION_ATTRIBUTES_USR   0xff000000
295
 
296
typedef enum bfd_mach_o_section_attribute
297
{
298
  /* Section has local relocation entries.  */
299
  BFD_MACH_O_S_ATTR_LOC_RELOC         = 0x00000100,
300
 
301
  /* Section has external relocation entries.  */
302
  BFD_MACH_O_S_ATTR_EXT_RELOC         = 0x00000200,
303
 
304
  /* Section contains some machine instructions.  */
305
  BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS = 0x00000400,
306
 
307
  /* A debug section.  */
308
  BFD_MACH_O_S_ATTR_DEBUG             = 0x02000000,
309
 
310
  /* Used with i386 stubs.  */
311
  BFD_MACH_O_S_SELF_MODIFYING_CODE    = 0x04000000,
312
 
313
  /* Blocks are live if they reference live blocks.  */
314
  BFD_MACH_O_S_ATTR_LIVE_SUPPORT      = 0x08000000,
315
 
316
  /* No dead stripping.  */
317
  BFD_MACH_O_S_ATTR_NO_DEAD_STRIP     = 0x10000000,
318
 
319
  /* Section symbols can be stripped in files with MH_DYLDLINK flag.  */
320
  BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS = 0x20000000,
321
 
322
  /* Section contains coalesced symbols that are not to be in the TOC of an
323
     archive.  */
324
  BFD_MACH_O_S_ATTR_NO_TOC            = 0x40000000,
325
 
326
  /* Section contains only true machine instructions.  */
327
  BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS = 0x80000000
328
}
329
bfd_mach_o_section_attribute;
330
 
331
typedef struct bfd_mach_o_header
332
{
333
  unsigned long magic;
334
  unsigned long cputype;
335
  unsigned long cpusubtype;
336
  unsigned long filetype;
337
  unsigned long ncmds;
338
  unsigned long sizeofcmds;
339
  unsigned long flags;
340
  unsigned int reserved;
341
  /* Version 1: 32 bits, version 2: 64 bits.  */
342
  unsigned int version;
343
  enum bfd_endian byteorder;
344
}
345
bfd_mach_o_header;
346
 
347
#define BFD_MACH_O_HEADER_SIZE 28
348
#define BFD_MACH_O_HEADER_64_SIZE 32
349
 
350
typedef struct bfd_mach_o_section
351
{
352
  asection *bfdsection;
353
  char sectname[16 + 1];
354
  char segname[16 + 1];
355
  bfd_vma addr;
356
  bfd_vma size;
357
  bfd_vma offset;
358
  unsigned long align;
359
  bfd_vma reloff;
360
  unsigned long nreloc;
361
  unsigned long flags;
362
  unsigned long reserved1;
363
  unsigned long reserved2;
364
  unsigned long reserved3;
365
}
366
bfd_mach_o_section;
367
#define BFD_MACH_O_SECTION_SIZE 68
368
#define BFD_MACH_O_SECTION_64_SIZE 80
369
 
370
typedef struct bfd_mach_o_segment_command
371
{
372
  char segname[16 + 1];
373
  bfd_vma vmaddr;
374
  bfd_vma vmsize;
375
  bfd_vma fileoff;
376
  unsigned long filesize;
377
  unsigned long maxprot;        /* Maximum permitted protection.  */
378
  unsigned long initprot;       /* Initial protection.  */
379
  unsigned long nsects;
380
  unsigned long flags;
381
  bfd_mach_o_section *sections;
382
}
383
bfd_mach_o_segment_command;
384
#define BFD_MACH_O_LC_SEGMENT_SIZE 56
385
#define BFD_MACH_O_LC_SEGMENT_64_SIZE 72
386
 
387
/* Protection flags.  */
388
#define BFD_MACH_O_PROT_READ    0x01
389
#define BFD_MACH_O_PROT_WRITE   0x02
390
#define BFD_MACH_O_PROT_EXECUTE 0x04
391
 
392
/* Generic relocation types (used by i386).  */
393
#define BFD_MACH_O_GENERIC_RELOC_VANILLA        0
394
#define BFD_MACH_O_GENERIC_RELOC_PAIR           1
395
#define BFD_MACH_O_GENERIC_RELOC_SECTDIFF       2
396
#define BFD_MACH_O_GENERIC_RELOC_PB_LA_PTR      3
397
#define BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF 4
398
 
399
/* X86-64 relocations.  */
400
#define BFD_MACH_O_X86_64_RELOC_UNSIGNED   0 /* Absolute addresses.  */
401
#define BFD_MACH_O_X86_64_RELOC_SIGNED     1 /* 32-bit disp.  */
402
#define BFD_MACH_O_X86_64_RELOC_BRANCH     2 /* 32-bit pcrel disp.  */
403
#define BFD_MACH_O_X86_64_RELOC_GOT_LOAD   3 /* Movq load of a GOT entry.  */
404
#define BFD_MACH_O_X86_64_RELOC_GOT        4 /* GOT reference.  */
405
#define BFD_MACH_O_X86_64_RELOC_SUBTRACTOR 5 /* Symbol difference.  */
406
#define BFD_MACH_O_X86_64_RELOC_SIGNED_1   6 /* 32-bit signed disp -1.  */
407
#define BFD_MACH_O_X86_64_RELOC_SIGNED_2   7 /* 32-bit signed disp -2.  */
408
#define BFD_MACH_O_X86_64_RELOC_SIGNED_4   8 /* 32-bit signed disp -4.  */
409
 
410
/* Size of a relocation entry.  */
411
#define BFD_MACH_O_RELENT_SIZE 8
412
 
413
/* Fields for a normal (non-scattered) entry.  */
414
#define BFD_MACH_O_R_PCREL              0x01000000
415
#define BFD_MACH_O_GET_R_LENGTH(s)      (((s) >> 25) & 0x3)
416
#define BFD_MACH_O_R_EXTERN             0x08000000
417
#define BFD_MACH_O_GET_R_TYPE(s)        (((s) >> 28) & 0x0f)
418
#define BFD_MACH_O_GET_R_SYMBOLNUM(s)   ((s) & 0x00ffffff)
419
#define BFD_MACH_O_SET_R_LENGTH(l)      (((l) & 0x3) << 25)
420
#define BFD_MACH_O_SET_R_TYPE(t)        (((t) & 0xf) << 28)
421
#define BFD_MACH_O_SET_R_SYMBOLNUM(s)   ((s) & 0x00ffffff)
422
 
423
/* Fields for a scattered entry.  */
424
#define BFD_MACH_O_SR_SCATTERED         0x80000000
425
#define BFD_MACH_O_SR_PCREL             0x40000000
426
#define BFD_MACH_O_GET_SR_LENGTH(s)     (((s) >> 28) & 0x3)
427
#define BFD_MACH_O_GET_SR_TYPE(s)       (((s) >> 24) & 0x0f)
428
#define BFD_MACH_O_GET_SR_ADDRESS(s)    ((s) & 0x00ffffff)
429
#define BFD_MACH_O_SET_SR_LENGTH(l)     (((l) & 0x3) << 28)
430
#define BFD_MACH_O_SET_SR_TYPE(t)       (((t) & 0xf) << 24)
431
#define BFD_MACH_O_SET_SR_ADDRESS(s)    ((s) & 0x00ffffff)
432
 
433
/* Expanded internal representation of a relocation entry.  */
434
typedef struct bfd_mach_o_reloc_info
435
{
436
  bfd_vma r_address;
437
  bfd_vma r_value;
438
  unsigned int r_scattered : 1;
439
  unsigned int r_type : 4;
440
  unsigned int r_pcrel : 1;
441
  unsigned int r_length : 2;
442
  unsigned int r_extern : 1;
443
}
444
bfd_mach_o_reloc_info;
445
 
446
typedef struct bfd_mach_o_asymbol
447
{
448
  /* The actual symbol which the rest of BFD works with.  */
449
  asymbol symbol;
450
 
451
  /* Fields from Mach-O symbol.  */
452
  unsigned char n_type;
453
  unsigned char n_sect;
454
  unsigned short n_desc;
455
}
456
bfd_mach_o_asymbol;
457
#define BFD_MACH_O_NLIST_SIZE 12
458
#define BFD_MACH_O_NLIST_64_SIZE 16
459
 
460
typedef struct bfd_mach_o_symtab_command
461
{
462
  unsigned int symoff;
463
  unsigned int nsyms;
464
  unsigned int stroff;
465
  unsigned int strsize;
466
  bfd_mach_o_asymbol *symbols;
467
  char *strtab;
468
}
469
bfd_mach_o_symtab_command;
470
 
471
/* This is the second set of the symbolic information which is used to support
472
   the data structures for the dynamically link editor.
473
 
474
   The original set of symbolic information in the symtab_command which contains
475
   the symbol and string tables must also be present when this load command is
476
   present.  When this load command is present the symbol table is organized
477
   into three groups of symbols:
478
       local symbols (static and debugging symbols) - grouped by module
479
       defined external symbols - grouped by module (sorted by name if not lib)
480
       undefined external symbols (sorted by name)
481
   In this load command there are offsets and counts to each of the three groups
482
   of symbols.
483
 
484
   This load command contains a the offsets and sizes of the following new
485
   symbolic information tables:
486
       table of contents
487
       module table
488
       reference symbol table
489
       indirect symbol table
490
   The first three tables above (the table of contents, module table and
491
   reference symbol table) are only present if the file is a dynamically linked
492
   shared library.  For executable and object modules, which are files
493
   containing only one module, the information that would be in these three
494
   tables is determined as follows:
495
       table of contents - the defined external symbols are sorted by name
496
       module table - the file contains only one module so everything in the
497
                      file is part of the module.
498
       reference symbol table - is the defined and undefined external symbols
499
 
500
   For dynamically linked shared library files this load command also contains
501
   offsets and sizes to the pool of relocation entries for all sections
502
   separated into two groups:
503
       external relocation entries
504
       local relocation entries
505
   For executable and object modules the relocation entries continue to hang
506
   off the section structures.  */
507
 
508
typedef struct bfd_mach_o_dylib_module
509
{
510
  /* Index into the string table indicating the name of the module.  */
511
  unsigned long module_name_idx;
512
  char *module_name;
513
 
514
  /* Index into the symbol table of the first defined external symbol provided
515
     by the module.  */
516
  unsigned long iextdefsym;
517
 
518
  /* Number of external symbols provided by this module.  */
519
  unsigned long nextdefsym;
520
 
521
  /* Index into the external reference table of the first entry
522
     provided by this module.  */
523
  unsigned long irefsym;
524
 
525
  /* Number of external reference entries provided by this module.  */
526
  unsigned long nrefsym;
527
 
528
  /* Index into the symbol table of the first local symbol provided by this
529
     module.  */
530
  unsigned long ilocalsym;
531
 
532
  /* Number of local symbols provided by this module.  */
533
  unsigned long nlocalsym;
534
 
535
  /* Index into the external relocation table of the first entry provided
536
     by this module.  */
537
  unsigned long iextrel;
538
 
539
  /* Number of external relocation entries provided by this module.  */
540
  unsigned long nextrel;
541
 
542
  /* Index in the module initialization section to the pointers for this
543
     module.  */
544
  unsigned short iinit;
545
 
546
  /* Index in the module termination section to the pointers for this
547
     module.  */
548
  unsigned short iterm;
549
 
550
  /* Number of pointers in the module initialization for this module.  */
551
  unsigned short ninit;
552
 
553
  /* Number of pointers in the module termination for this module.  */
554
  unsigned short nterm;
555
 
556
  /* Number of data byte for this module that are used in the __module_info
557
     section of the __OBJC segment.  */
558
  unsigned long objc_module_info_size;
559
 
560
  /* Statically linked address of the start of the data for this module
561
     in the __module_info section of the __OBJC_segment.  */
562
  bfd_vma objc_module_info_addr;
563
}
564
bfd_mach_o_dylib_module;
565
#define BFD_MACH_O_DYLIB_MODULE_SIZE 52
566
#define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56
567
 
568
typedef struct bfd_mach_o_dylib_table_of_content
569
{
570
  /* Index into the symbol table to the defined external symbol.  */
571
  unsigned long symbol_index;
572
 
573
  /* Index into the module table to the module for this entry.  */
574
  unsigned long module_index;
575
}
576
bfd_mach_o_dylib_table_of_content;
577
#define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8
578
 
579
typedef struct bfd_mach_o_dylib_reference
580
{
581
  /* Index into the symbol table for the symbol being referenced.  */
582
  unsigned long isym;
583
 
584
  /* Type of the reference being made (use REFERENCE_FLAGS constants).  */
585
  unsigned long flags;
586
}
587
bfd_mach_o_dylib_reference;
588
#define BFD_MACH_O_REFERENCE_SIZE 4
589
 
590
typedef struct bfd_mach_o_dysymtab_command
591
{
592
  /* The symbols indicated by symoff and nsyms of the LC_SYMTAB load command
593
     are grouped into the following three groups:
594
       local symbols (further grouped by the module they are from)
595
       defined external symbols (further grouped by the module they are from)
596
       undefined symbols
597
 
598
     The local symbols are used only for debugging.  The dynamic binding
599
     process may have to use them to indicate to the debugger the local
600
     symbols for a module that is being bound.
601
 
602
     The last two groups are used by the dynamic binding process to do the
603
     binding (indirectly through the module table and the reference symbol
604
     table when this is a dynamically linked shared library file).  */
605
 
606
  unsigned long ilocalsym;    /* Index to local symbols.  */
607
  unsigned long nlocalsym;    /* Number of local symbols.  */
608
  unsigned long iextdefsym;   /* Index to externally defined symbols.  */
609
  unsigned long nextdefsym;   /* Number of externally defined symbols.  */
610
  unsigned long iundefsym;    /* Index to undefined symbols.  */
611
  unsigned long nundefsym;    /* Number of undefined symbols.  */
612
 
613
  /* For the for the dynamic binding process to find which module a symbol
614
     is defined in the table of contents is used (analogous to the ranlib
615
     structure in an archive) which maps defined external symbols to modules
616
     they are defined in.  This exists only in a dynamically linked shared
617
     library file.  For executable and object modules the defined external
618
     symbols are sorted by name and is use as the table of contents.  */
619
 
620
  unsigned long tocoff;       /* File offset to table of contents.  */
621
  unsigned long ntoc;         /* Number of entries in table of contents.  */
622
 
623
  /* To support dynamic binding of "modules" (whole object files) the symbol
624
     table must reflect the modules that the file was created from.  This is
625
     done by having a module table that has indexes and counts into the merged
626
     tables for each module.  The module structure that these two entries
627
     refer to is described below.  This exists only in a dynamically linked
628
     shared library file.  For executable and object modules the file only
629
     contains one module so everything in the file belongs to the module.  */
630
 
631
  unsigned long modtaboff;    /* File offset to module table.  */
632
  unsigned long nmodtab;      /* Number of module table entries.  */
633
 
634
  /* To support dynamic module binding the module structure for each module
635
     indicates the external references (defined and undefined) each module
636
     makes.  For each module there is an offset and a count into the
637
     reference symbol table for the symbols that the module references.
638
     This exists only in a dynamically linked shared library file.  For
639
     executable and object modules the defined external symbols and the
640
     undefined external symbols indicates the external references.  */
641
 
642
  unsigned long extrefsymoff;  /* Offset to referenced symbol table.  */
643
  unsigned long nextrefsyms;   /* Number of referenced symbol table entries.  */
644
 
645
  /* The sections that contain "symbol pointers" and "routine stubs" have
646
     indexes and (implied counts based on the size of the section and fixed
647
     size of the entry) into the "indirect symbol" table for each pointer
648
     and stub.  For every section of these two types the index into the
649
     indirect symbol table is stored in the section header in the field
650
     reserved1.  An indirect symbol table entry is simply a 32bit index into
651
     the symbol table to the symbol that the pointer or stub is referring to.
652
     The indirect symbol table is ordered to match the entries in the section.  */
653
 
654
  unsigned long indirectsymoff; /* File offset to the indirect symbol table.  */
655
  unsigned long nindirectsyms;  /* Number of indirect symbol table entries.  */
656
 
657
  /* To support relocating an individual module in a library file quickly the
658
     external relocation entries for each module in the library need to be
659
     accessed efficiently.  Since the relocation entries can't be accessed
660
     through the section headers for a library file they are separated into
661
     groups of local and external entries further grouped by module.  In this
662
     case the presents of this load command who's extreloff, nextrel,
663
     locreloff and nlocrel fields are non-zero indicates that the relocation
664
     entries of non-merged sections are not referenced through the section
665
     structures (and the reloff and nreloc fields in the section headers are
666
     set to zero).
667
 
668
     Since the relocation entries are not accessed through the section headers
669
     this requires the r_address field to be something other than a section
670
     offset to identify the item to be relocated.  In this case r_address is
671
     set to the offset from the vmaddr of the first LC_SEGMENT command.
672
 
673
     The relocation entries are grouped by module and the module table
674
     entries have indexes and counts into them for the group of external
675
     relocation entries for that the module.
676
 
677
     For sections that are merged across modules there must not be any
678
     remaining external relocation entries for them (for merged sections
679
     remaining relocation entries must be local).  */
680
 
681
  unsigned long extreloff;    /* Offset to external relocation entries.  */
682
  unsigned long nextrel;      /* Number of external relocation entries.  */
683
 
684
  /* All the local relocation entries are grouped together (they are not
685
     grouped by their module since they are only used if the object is moved
686
     from it statically link edited address).  */
687
 
688
  unsigned long locreloff;    /* Offset to local relocation entries.  */
689
  unsigned long nlocrel;      /* Number of local relocation entries.  */
690
 
691
  bfd_mach_o_dylib_module *dylib_module;
692
  bfd_mach_o_dylib_table_of_content *dylib_toc;
693
  unsigned int *indirect_syms;
694
  bfd_mach_o_dylib_reference *ext_refs;
695
}
696
bfd_mach_o_dysymtab_command;
697
 
698
/* An indirect symbol table entry is simply a 32bit index into the symbol table
699
   to the symbol that the pointer or stub is refering to.  Unless it is for a
700
   non-lazy symbol pointer section for a defined symbol which strip(1) has
701
   removed.  In which case it has the value INDIRECT_SYMBOL_LOCAL.  If the
702
   symbol was also absolute INDIRECT_SYMBOL_ABS is or'ed with that.  */
703
 
704
#define BFD_MACH_O_INDIRECT_SYMBOL_LOCAL 0x80000000
705
#define BFD_MACH_O_INDIRECT_SYMBOL_ABS   0x40000000
706
#define BFD_MACH_O_INDIRECT_SYMBOL_SIZE  4
707
 
708
/* For LC_THREAD or LC_UNIXTHREAD.  */
709
 
710
typedef struct bfd_mach_o_thread_flavour
711
{
712
  unsigned long flavour;
713
  unsigned long offset;
714
  unsigned long size;
715
}
716
bfd_mach_o_thread_flavour;
717
 
718
typedef struct bfd_mach_o_thread_command
719
{
720
  unsigned long nflavours;
721
  bfd_mach_o_thread_flavour *flavours;
722
  asection *section;
723
}
724
bfd_mach_o_thread_command;
725
 
726
/* For LC_LOAD_DYLINKER and LC_ID_DYLINKER.  */
727
 
728
typedef struct bfd_mach_o_dylinker_command
729
{
730
  unsigned long name_offset;         /* Offset to library's path name.  */
731
  unsigned long name_len;            /* Offset to library's path name.  */
732
  char *name_str;
733
}
734
bfd_mach_o_dylinker_command;
735
 
736
/* For LC_LOAD_DYLIB, LC_LOAD_WEAK_DYLIB, LC_ID_DYLIB
737
   or LC_REEXPORT_DYLIB.  */
738
 
739
typedef struct bfd_mach_o_dylib_command
740
{
741
  unsigned long name_offset;           /* Offset to library's path name.  */
742
  unsigned long name_len;              /* Offset to library's path name.  */
743
  unsigned long timestamp;             /* Library's build time stamp.  */
744
  unsigned long current_version;       /* Library's current version number.  */
745
  unsigned long compatibility_version; /* Library's compatibility vers number.  */
746
  char *name_str;
747
}
748
bfd_mach_o_dylib_command;
749
 
750
/* For LC_PREBOUND_DYLIB.  */
751
 
752
typedef struct bfd_mach_o_prebound_dylib_command
753
{
754
  unsigned long name;                /* Library's path name.  */
755
  unsigned long nmodules;            /* Number of modules in library.  */
756
  unsigned long linked_modules;      /* Bit vector of linked modules.  */
757
}
758
bfd_mach_o_prebound_dylib_command;
759
 
760
/* For LC_UUID.  */
761
 
762
typedef struct bfd_mach_o_uuid_command
763
{
764
  unsigned char uuid[16];
765
}
766
bfd_mach_o_uuid_command;
767
 
768
/* For LC_CODE_SIGNATURE or LC_SEGMENT_SPLIT_INFO.  */
769
 
770
typedef struct bfd_mach_o_linkedit_command
771
{
772
  unsigned long dataoff;
773
  unsigned long datasize;
774
}
775
bfd_mach_o_linkedit_command;
776
 
777
typedef struct bfd_mach_o_str_command
778
{
779
  unsigned long stroff;
780
  unsigned long str_len;
781
  char *str;
782
}
783
bfd_mach_o_str_command;
784
 
785
typedef struct bfd_mach_o_dyld_info_command
786
{
787
  /* File offset and size to rebase info.  */
788
  unsigned int rebase_off;
789
  unsigned int rebase_size;
790
 
791
  /* File offset and size of binding info.  */
792
  unsigned int bind_off;
793
  unsigned int bind_size;
794
 
795
  /* File offset and size of weak binding info.  */
796
  unsigned int weak_bind_off;
797
  unsigned int weak_bind_size;
798
 
799
  /* File offset and size of lazy binding info.  */
800
  unsigned int lazy_bind_off;
801
  unsigned int lazy_bind_size;
802
 
803
  /* File offset and size of export info.  */
804
  unsigned int export_off;
805
  unsigned int export_size;
806
}
807
bfd_mach_o_dyld_info_command;
808
 
809
typedef struct bfd_mach_o_load_command
810
{
811
  bfd_mach_o_load_command_type type;
812
  bfd_boolean type_required;
813
  unsigned int offset;
814
  unsigned int len;
815
  union
816
  {
817
    bfd_mach_o_segment_command segment;
818
    bfd_mach_o_symtab_command symtab;
819
    bfd_mach_o_dysymtab_command dysymtab;
820
    bfd_mach_o_thread_command thread;
821
    bfd_mach_o_dylib_command dylib;
822
    bfd_mach_o_dylinker_command dylinker;
823
    bfd_mach_o_prebound_dylib_command prebound_dylib;
824
    bfd_mach_o_uuid_command uuid;
825
    bfd_mach_o_linkedit_command linkedit;
826
    bfd_mach_o_str_command str;
827
    bfd_mach_o_dyld_info_command dyld_info;
828
  }
829
  command;
830
}
831
bfd_mach_o_load_command;
832
 
833
typedef struct mach_o_data_struct
834
{
835
  /* Mach-O header.  */
836
  bfd_mach_o_header header;
837
  /* Array of load commands (length is given by header.ncmds).  */
838
  bfd_mach_o_load_command *commands;
839
 
840
  /* Flatten array of sections.  The array is 0-based.  */
841
  unsigned long nsects;
842
  bfd_mach_o_section **sections;
843
 
844
  /* Used while writting: current length of the output file.  This is used
845
     to allocate space in the file.  */
846
  ufile_ptr filelen;
847
 
848
  /* As symtab is referenced by other load command, it is handy to have
849
     a direct access to it.  Also it is not clearly stated, only one symtab
850
     is expected.  */
851
  bfd_mach_o_symtab_command *symtab;
852
  bfd_mach_o_dysymtab_command *dysymtab;
853
}
854
bfd_mach_o_data_struct;
855
 
856
/* Target specific routines.  */
857
typedef struct bfd_mach_o_backend_data
858
{
859
  enum bfd_architecture arch;
860
  bfd_boolean (*_bfd_mach_o_swap_reloc_in)(arelent *, bfd_mach_o_reloc_info *);
861
  bfd_boolean (*_bfd_mach_o_swap_reloc_out)(arelent *, bfd_mach_o_reloc_info *);
862
  bfd_boolean (*_bfd_mach_o_print_thread)(bfd *, bfd_mach_o_thread_flavour *,
863
                                          void *, char *);
864
}
865
bfd_mach_o_backend_data;
866
 
867
#define bfd_mach_o_get_data(abfd) ((abfd)->tdata.mach_o_data)
868
#define bfd_mach_o_get_backend_data(abfd) \
869
  ((bfd_mach_o_backend_data*)(abfd)->xvec->backend_data)
870
 
871
bfd_boolean bfd_mach_o_valid (bfd *);
872
int bfd_mach_o_read_dysymtab_symbol (bfd *, bfd_mach_o_dysymtab_command *, bfd_mach_o_symtab_command *, bfd_mach_o_asymbol *, unsigned long);
873
int bfd_mach_o_scan_start_address (bfd *);
874
int bfd_mach_o_scan (bfd *, bfd_mach_o_header *, bfd_mach_o_data_struct *);
875
bfd_boolean bfd_mach_o_mkobject_init (bfd *);
876
const bfd_target *bfd_mach_o_object_p (bfd *);
877
const bfd_target *bfd_mach_o_core_p (bfd *);
878
const bfd_target *bfd_mach_o_archive_p (bfd *);
879
bfd *bfd_mach_o_openr_next_archived_file (bfd *, bfd *);
880
bfd_boolean bfd_mach_o_set_arch_mach (bfd *, enum bfd_architecture,
881
                                      unsigned long);
882
int bfd_mach_o_lookup_section (bfd *, asection *, bfd_mach_o_load_command **, bfd_mach_o_section **);
883
int bfd_mach_o_lookup_command (bfd *, bfd_mach_o_load_command_type, bfd_mach_o_load_command **);
884
bfd_boolean bfd_mach_o_write_contents (bfd *);
885
bfd_boolean bfd_mach_o_bfd_copy_private_symbol_data (bfd *, asymbol *,
886
                                                     bfd *, asymbol *);
887
bfd_boolean bfd_mach_o_bfd_copy_private_section_data (bfd *, asection *,
888
                                                      bfd *, asection *);
889
bfd_boolean bfd_mach_o_bfd_copy_private_bfd_data (bfd *, bfd *);
890
long bfd_mach_o_get_symtab_upper_bound (bfd *);
891
long bfd_mach_o_canonicalize_symtab (bfd *, asymbol **);
892
long bfd_mach_o_get_synthetic_symtab (bfd *, long, asymbol **, long,
893
                                      asymbol **, asymbol **ret);
894
long bfd_mach_o_get_reloc_upper_bound (bfd *, asection *);
895
long bfd_mach_o_canonicalize_reloc (bfd *, asection *, arelent **, asymbol **);
896
long bfd_mach_o_get_dynamic_reloc_upper_bound (bfd *);
897
long bfd_mach_o_canonicalize_dynamic_reloc (bfd *, arelent **, asymbol **);
898
asymbol *bfd_mach_o_make_empty_symbol (bfd *);
899
void bfd_mach_o_get_symbol_info (bfd *, asymbol *, symbol_info *);
900
void bfd_mach_o_print_symbol (bfd *, PTR, asymbol *, bfd_print_symbol_type);
901
bfd_boolean bfd_mach_o_bfd_print_private_bfd_data (bfd *, PTR);
902
int bfd_mach_o_sizeof_headers (bfd *, struct bfd_link_info *);
903
unsigned long bfd_mach_o_stack_addr (enum bfd_mach_o_cpu_type);
904
int bfd_mach_o_core_fetch_environment (bfd *, unsigned char **, unsigned int *);
905
char *bfd_mach_o_core_file_failing_command (bfd *);
906
int bfd_mach_o_core_file_failing_signal (bfd *);
907
bfd_boolean bfd_mach_o_core_file_matches_executable_p (bfd *, bfd *);
908
bfd *bfd_mach_o_fat_extract (bfd *, bfd_format , const bfd_arch_info_type *);
909
const bfd_target *bfd_mach_o_header_p (bfd *, bfd_mach_o_filetype,
910
                                       bfd_mach_o_cpu_type);
911
bfd_boolean bfd_mach_o_build_commands (bfd *);
912
bfd_boolean bfd_mach_o_set_section_contents (bfd *, asection *, const void *,
913
                                             file_ptr, bfd_size_type);
914
unsigned int bfd_mach_o_version (bfd *);
915
 
916
extern const bfd_target mach_o_fat_vec;
917
 
918
#endif /* _BFD_MACH_O_H_ */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.