1 | This is bfd.info, produced by makeinfo version 4.3 from bfd.texinfo.
|
---|
2 |
|
---|
3 | START-INFO-DIR-ENTRY
|
---|
4 | * Bfd: (bfd). The Binary File Descriptor library.
|
---|
5 | END-INFO-DIR-ENTRY
|
---|
6 |
|
---|
7 | This file documents the BFD library.
|
---|
8 |
|
---|
9 | Copyright (C) 1991, 2000, 2001, 2003 Free Software Foundation, Inc.
|
---|
10 |
|
---|
11 | Permission is granted to copy, distribute and/or modify this document
|
---|
12 | under the terms of the GNU Free Documentation License, Version 1.1
|
---|
13 | or any later version published by the Free Software Foundation;
|
---|
14 | with no Invariant Sections, with no Front-Cover Texts, and with no
|
---|
15 | Back-Cover Texts. A copy of the license is included in the
|
---|
16 | section entitled "GNU Free Documentation License".
|
---|
17 |
|
---|
18 |
|
---|
19 | File: bfd.info, Node: typedef arelent, Next: howto manager, Prev: Relocations, Up: Relocations
|
---|
20 |
|
---|
21 | typedef arelent
|
---|
22 | ---------------
|
---|
23 |
|
---|
24 | This is the structure of a relocation entry:
|
---|
25 |
|
---|
26 |
|
---|
27 | typedef enum bfd_reloc_status
|
---|
28 | {
|
---|
29 | /* No errors detected. */
|
---|
30 | bfd_reloc_ok,
|
---|
31 |
|
---|
32 | /* The relocation was performed, but there was an overflow. */
|
---|
33 | bfd_reloc_overflow,
|
---|
34 |
|
---|
35 | /* The address to relocate was not within the section supplied. */
|
---|
36 | bfd_reloc_outofrange,
|
---|
37 |
|
---|
38 | /* Used by special functions. */
|
---|
39 | bfd_reloc_continue,
|
---|
40 |
|
---|
41 | /* Unsupported relocation size requested. */
|
---|
42 | bfd_reloc_notsupported,
|
---|
43 |
|
---|
44 | /* Unused. */
|
---|
45 | bfd_reloc_other,
|
---|
46 |
|
---|
47 | /* The symbol to relocate against was undefined. */
|
---|
48 | bfd_reloc_undefined,
|
---|
49 |
|
---|
50 | /* The relocation was performed, but may not be ok - presently
|
---|
51 | generated only when linking i960 coff files with i960 b.out
|
---|
52 | symbols. If this type is returned, the error_message argument
|
---|
53 | to bfd_perform_relocation will be set. */
|
---|
54 | bfd_reloc_dangerous
|
---|
55 | }
|
---|
56 | bfd_reloc_status_type;
|
---|
57 |
|
---|
58 |
|
---|
59 | typedef struct reloc_cache_entry
|
---|
60 | {
|
---|
61 | /* A pointer into the canonical table of pointers. */
|
---|
62 | struct symbol_cache_entry **sym_ptr_ptr;
|
---|
63 |
|
---|
64 | /* offset in section. */
|
---|
65 | bfd_size_type address;
|
---|
66 |
|
---|
67 | /* addend for relocation value. */
|
---|
68 | bfd_vma addend;
|
---|
69 |
|
---|
70 | /* Pointer to how to perform the required relocation. */
|
---|
71 | reloc_howto_type *howto;
|
---|
72 |
|
---|
73 | }
|
---|
74 | arelent;
|
---|
75 | *Description*
|
---|
76 | Here is a description of each of the fields within an `arelent':
|
---|
77 |
|
---|
78 | * `sym_ptr_ptr'
|
---|
79 | The symbol table pointer points to a pointer to the symbol
|
---|
80 | associated with the relocation request. It is the pointer into the
|
---|
81 | table returned by the back end's `get_symtab' action. *Note Symbols::.
|
---|
82 | The symbol is referenced through a pointer to a pointer so that tools
|
---|
83 | like the linker can fix up all the symbols of the same name by
|
---|
84 | modifying only one pointer. The relocation routine looks in the symbol
|
---|
85 | and uses the base of the section the symbol is attached to and the
|
---|
86 | value of the symbol as the initial relocation offset. If the symbol
|
---|
87 | pointer is zero, then the section provided is looked up.
|
---|
88 |
|
---|
89 | * `address'
|
---|
90 | The `address' field gives the offset in bytes from the base of the
|
---|
91 | section data which owns the relocation record to the first byte of
|
---|
92 | relocatable information. The actual data relocated will be relative to
|
---|
93 | this point; for example, a relocation type which modifies the bottom
|
---|
94 | two bytes of a four byte word would not touch the first byte pointed to
|
---|
95 | in a big endian world.
|
---|
96 |
|
---|
97 | * `addend'
|
---|
98 | The `addend' is a value provided by the back end to be added (!) to
|
---|
99 | the relocation offset. Its interpretation is dependent upon the howto.
|
---|
100 | For example, on the 68k the code:
|
---|
101 |
|
---|
102 | char foo[];
|
---|
103 | main()
|
---|
104 | {
|
---|
105 | return foo[0x12345678];
|
---|
106 | }
|
---|
107 |
|
---|
108 | Could be compiled into:
|
---|
109 |
|
---|
110 | linkw fp,#-4
|
---|
111 | moveb @#12345678,d0
|
---|
112 | extbl d0
|
---|
113 | unlk fp
|
---|
114 | rts
|
---|
115 |
|
---|
116 | This could create a reloc pointing to `foo', but leave the offset in
|
---|
117 | the data, something like:
|
---|
118 |
|
---|
119 | RELOCATION RECORDS FOR [.text]:
|
---|
120 | offset type value
|
---|
121 | 00000006 32 _foo
|
---|
122 |
|
---|
123 | 00000000 4e56 fffc ; linkw fp,#-4
|
---|
124 | 00000004 1039 1234 5678 ; moveb @#12345678,d0
|
---|
125 | 0000000a 49c0 ; extbl d0
|
---|
126 | 0000000c 4e5e ; unlk fp
|
---|
127 | 0000000e 4e75 ; rts
|
---|
128 |
|
---|
129 | Using coff and an 88k, some instructions don't have enough space in
|
---|
130 | them to represent the full address range, and pointers have to be
|
---|
131 | loaded in two parts. So you'd get something like:
|
---|
132 |
|
---|
133 | or.u r13,r0,hi16(_foo+0x12345678)
|
---|
134 | ld.b r2,r13,lo16(_foo+0x12345678)
|
---|
135 | jmp r1
|
---|
136 |
|
---|
137 | This should create two relocs, both pointing to `_foo', and with
|
---|
138 | 0x12340000 in their addend field. The data would consist of:
|
---|
139 |
|
---|
140 | RELOCATION RECORDS FOR [.text]:
|
---|
141 | offset type value
|
---|
142 | 00000002 HVRT16 _foo+0x12340000
|
---|
143 | 00000006 LVRT16 _foo+0x12340000
|
---|
144 |
|
---|
145 | 00000000 5da05678 ; or.u r13,r0,0x5678
|
---|
146 | 00000004 1c4d5678 ; ld.b r2,r13,0x5678
|
---|
147 | 00000008 f400c001 ; jmp r1
|
---|
148 |
|
---|
149 | The relocation routine digs out the value from the data, adds it to
|
---|
150 | the addend to get the original offset, and then adds the value of
|
---|
151 | `_foo'. Note that all 32 bits have to be kept around somewhere, to cope
|
---|
152 | with carry from bit 15 to bit 16.
|
---|
153 |
|
---|
154 | One further example is the sparc and the a.out format. The sparc has
|
---|
155 | a similar problem to the 88k, in that some instructions don't have room
|
---|
156 | for an entire offset, but on the sparc the parts are created in odd
|
---|
157 | sized lumps. The designers of the a.out format chose to not use the
|
---|
158 | data within the section for storing part of the offset; all the offset
|
---|
159 | is kept within the reloc. Anything in the data should be ignored.
|
---|
160 |
|
---|
161 | save %sp,-112,%sp
|
---|
162 | sethi %hi(_foo+0x12345678),%g2
|
---|
163 | ldsb [%g2+%lo(_foo+0x12345678)],%i0
|
---|
164 | ret
|
---|
165 | restore
|
---|
166 |
|
---|
167 | Both relocs contain a pointer to `foo', and the offsets contain junk.
|
---|
168 |
|
---|
169 | RELOCATION RECORDS FOR [.text]:
|
---|
170 | offset type value
|
---|
171 | 00000004 HI22 _foo+0x12345678
|
---|
172 | 00000008 LO10 _foo+0x12345678
|
---|
173 |
|
---|
174 | 00000000 9de3bf90 ; save %sp,-112,%sp
|
---|
175 | 00000004 05000000 ; sethi %hi(_foo+0),%g2
|
---|
176 | 00000008 f048a000 ; ldsb [%g2+%lo(_foo+0)],%i0
|
---|
177 | 0000000c 81c7e008 ; ret
|
---|
178 | 00000010 81e80000 ; restore
|
---|
179 |
|
---|
180 | * `howto'
|
---|
181 | The `howto' field can be imagined as a relocation instruction. It is
|
---|
182 | a pointer to a structure which contains information on what to do with
|
---|
183 | all of the other information in the reloc record and data section. A
|
---|
184 | back end would normally have a relocation instruction set and turn
|
---|
185 | relocations into pointers to the correct structure on input - but it
|
---|
186 | would be possible to create each howto field on demand.
|
---|
187 |
|
---|
188 | `enum complain_overflow'
|
---|
189 | ........................
|
---|
190 |
|
---|
191 | Indicates what sort of overflow checking should be done when
|
---|
192 | performing a relocation.
|
---|
193 |
|
---|
194 |
|
---|
195 | enum complain_overflow
|
---|
196 | {
|
---|
197 | /* Do not complain on overflow. */
|
---|
198 | complain_overflow_dont,
|
---|
199 |
|
---|
200 | /* Complain if the bitfield overflows, whether it is considered
|
---|
201 | as signed or unsigned. */
|
---|
202 | complain_overflow_bitfield,
|
---|
203 |
|
---|
204 | /* Complain if the value overflows when considered as signed
|
---|
205 | number. */
|
---|
206 | complain_overflow_signed,
|
---|
207 |
|
---|
208 | /* Complain if the value overflows when considered as an
|
---|
209 | unsigned number. */
|
---|
210 | complain_overflow_unsigned
|
---|
211 | };
|
---|
212 |
|
---|
213 | `reloc_howto_type'
|
---|
214 | ..................
|
---|
215 |
|
---|
216 | The `reloc_howto_type' is a structure which contains all the
|
---|
217 | information that libbfd needs to know to tie up a back end's data.
|
---|
218 |
|
---|
219 | struct symbol_cache_entry; /* Forward declaration. */
|
---|
220 |
|
---|
221 | struct reloc_howto_struct
|
---|
222 | {
|
---|
223 | /* The type field has mainly a documentary use - the back end can
|
---|
224 | do what it wants with it, though normally the back end's
|
---|
225 | external idea of what a reloc number is stored
|
---|
226 | in this field. For example, a PC relative word relocation
|
---|
227 | in a coff environment has the type 023 - because that's
|
---|
228 | what the outside world calls a R_PCRWORD reloc. */
|
---|
229 | unsigned int type;
|
---|
230 |
|
---|
231 | /* The value the final relocation is shifted right by. This drops
|
---|
232 | unwanted data from the relocation. */
|
---|
233 | unsigned int rightshift;
|
---|
234 |
|
---|
235 | /* The size of the item to be relocated. This is *not* a
|
---|
236 | power-of-two measure. To get the number of bytes operated
|
---|
237 | on by a type of relocation, use bfd_get_reloc_size. */
|
---|
238 | int size;
|
---|
239 |
|
---|
240 | /* The number of bits in the item to be relocated. This is used
|
---|
241 | when doing overflow checking. */
|
---|
242 | unsigned int bitsize;
|
---|
243 |
|
---|
244 | /* Notes that the relocation is relative to the location in the
|
---|
245 | data section of the addend. The relocation function will
|
---|
246 | subtract from the relocation value the address of the location
|
---|
247 | being relocated. */
|
---|
248 | bfd_boolean pc_relative;
|
---|
249 |
|
---|
250 | /* The bit position of the reloc value in the destination.
|
---|
251 | The relocated value is left shifted by this amount. */
|
---|
252 | unsigned int bitpos;
|
---|
253 |
|
---|
254 | /* What type of overflow error should be checked for when
|
---|
255 | relocating. */
|
---|
256 | enum complain_overflow complain_on_overflow;
|
---|
257 |
|
---|
258 | /* If this field is non null, then the supplied function is
|
---|
259 | called rather than the normal function. This allows really
|
---|
260 | strange relocation methods to be accomodated (e.g., i960 callj
|
---|
261 | instructions). */
|
---|
262 | bfd_reloc_status_type (*special_function)
|
---|
263 | PARAMS ((bfd *, arelent *, struct symbol_cache_entry *, PTR, asection *,
|
---|
264 | bfd *, char **));
|
---|
265 |
|
---|
266 | /* The textual name of the relocation type. */
|
---|
267 | char *name;
|
---|
268 |
|
---|
269 | /* Some formats record a relocation addend in the section contents
|
---|
270 | rather than with the relocation. For ELF formats this is the
|
---|
271 | distinction between USE_REL and USE_RELA (though the code checks
|
---|
272 | for USE_REL == 1/0). The value of this field is TRUE if the
|
---|
273 | addend is recorded with the section contents; when performing a
|
---|
274 | partial link (ld -r) the section contents (the data) will be
|
---|
275 | modified. The value of this field is FALSE if addends are
|
---|
276 | recorded with the relocation (in arelent.addend); when performing
|
---|
277 | a partial link the relocation will be modified.
|
---|
278 | All relocations for all ELF USE_RELA targets should set this field
|
---|
279 | to FALSE (values of TRUE should be looked on with suspicion).
|
---|
280 | However, the converse is not true: not all relocations of all ELF
|
---|
281 | USE_REL targets set this field to TRUE. Why this is so is peculiar
|
---|
282 | to each particular target. For relocs that aren't used in partial
|
---|
283 | links (e.g. GOT stuff) it doesn't matter what this is set to. */
|
---|
284 | bfd_boolean partial_inplace;
|
---|
285 |
|
---|
286 | /* src_mask selects the part of the instruction (or data) to be used
|
---|
287 | in the relocation sum. If the target relocations don't have an
|
---|
288 | addend in the reloc, eg. ELF USE_REL, src_mask will normally equal
|
---|
289 | dst_mask to extract the addend from the section contents. If
|
---|
290 | relocations do have an addend in the reloc, eg. ELF USE_RELA, this
|
---|
291 | field should be zero. Non-zero values for ELF USE_RELA targets are
|
---|
292 | bogus as in those cases the value in the dst_mask part of the
|
---|
293 | section contents should be treated as garbage. */
|
---|
294 | bfd_vma src_mask;
|
---|
295 |
|
---|
296 | /* dst_mask selects which parts of the instruction (or data) are
|
---|
297 | replaced with a relocated value. */
|
---|
298 | bfd_vma dst_mask;
|
---|
299 |
|
---|
300 | /* When some formats create PC relative instructions, they leave
|
---|
301 | the value of the pc of the place being relocated in the offset
|
---|
302 | slot of the instruction, so that a PC relative relocation can
|
---|
303 | be made just by adding in an ordinary offset (e.g., sun3 a.out).
|
---|
304 | Some formats leave the displacement part of an instruction
|
---|
305 | empty (e.g., m88k bcs); this flag signals the fact. */
|
---|
306 | bfd_boolean pcrel_offset;
|
---|
307 | };
|
---|
308 |
|
---|
309 | `The HOWTO Macro'
|
---|
310 | .................
|
---|
311 |
|
---|
312 | *Description*
|
---|
313 | The HOWTO define is horrible and will go away.
|
---|
314 | #define HOWTO(C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \
|
---|
315 | { (unsigned) C, R, S, B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC }
|
---|
316 |
|
---|
317 | *Description*
|
---|
318 | And will be replaced with the totally magic way. But for the moment, we
|
---|
319 | are compatible, so do it this way.
|
---|
320 | #define NEWHOWTO(FUNCTION, NAME, SIZE, REL, IN) \
|
---|
321 | HOWTO (0, 0, SIZE, 0, REL, 0, complain_overflow_dont, FUNCTION, \
|
---|
322 | NAME, FALSE, 0, 0, IN)
|
---|
323 |
|
---|
324 | *Description*
|
---|
325 | This is used to fill in an empty howto entry in an array.
|
---|
326 | #define EMPTY_HOWTO(C) \
|
---|
327 | HOWTO ((C), 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL, \
|
---|
328 | NULL, FALSE, 0, 0, FALSE)
|
---|
329 |
|
---|
330 | *Description*
|
---|
331 | Helper routine to turn a symbol into a relocation value.
|
---|
332 | #define HOWTO_PREPARE(relocation, symbol) \
|
---|
333 | { \
|
---|
334 | if (symbol != (asymbol *) NULL) \
|
---|
335 | { \
|
---|
336 | if (bfd_is_com_section (symbol->section)) \
|
---|
337 | { \
|
---|
338 | relocation = 0; \
|
---|
339 | } \
|
---|
340 | else \
|
---|
341 | { \
|
---|
342 | relocation = symbol->value; \
|
---|
343 | } \
|
---|
344 | } \
|
---|
345 | }
|
---|
346 |
|
---|
347 | `bfd_get_reloc_size'
|
---|
348 | ....................
|
---|
349 |
|
---|
350 | *Synopsis*
|
---|
351 | unsigned int bfd_get_reloc_size (reloc_howto_type *);
|
---|
352 | *Description*
|
---|
353 | For a reloc_howto_type that operates on a fixed number of bytes, this
|
---|
354 | returns the number of bytes operated on.
|
---|
355 |
|
---|
356 | `arelent_chain'
|
---|
357 | ...............
|
---|
358 |
|
---|
359 | *Description*
|
---|
360 | How relocs are tied together in an `asection':
|
---|
361 | typedef struct relent_chain
|
---|
362 | {
|
---|
363 | arelent relent;
|
---|
364 | struct relent_chain *next;
|
---|
365 | }
|
---|
366 | arelent_chain;
|
---|
367 |
|
---|
368 | `bfd_check_overflow'
|
---|
369 | ....................
|
---|
370 |
|
---|
371 | *Synopsis*
|
---|
372 | bfd_reloc_status_type
|
---|
373 | bfd_check_overflow
|
---|
374 | (enum complain_overflow how,
|
---|
375 | unsigned int bitsize,
|
---|
376 | unsigned int rightshift,
|
---|
377 | unsigned int addrsize,
|
---|
378 | bfd_vma relocation);
|
---|
379 | *Description*
|
---|
380 | Perform overflow checking on RELOCATION which has BITSIZE significant
|
---|
381 | bits and will be shifted right by RIGHTSHIFT bits, on a machine with
|
---|
382 | addresses containing ADDRSIZE significant bits. The result is either of
|
---|
383 | `bfd_reloc_ok' or `bfd_reloc_overflow'.
|
---|
384 |
|
---|
385 | `bfd_perform_relocation'
|
---|
386 | ........................
|
---|
387 |
|
---|
388 | *Synopsis*
|
---|
389 | bfd_reloc_status_type
|
---|
390 | bfd_perform_relocation
|
---|
391 | (bfd *abfd,
|
---|
392 | arelent *reloc_entry,
|
---|
393 | PTR data,
|
---|
394 | asection *input_section,
|
---|
395 | bfd *output_bfd,
|
---|
396 | char **error_message);
|
---|
397 | *Description*
|
---|
398 | If OUTPUT_BFD is supplied to this function, the generated image will be
|
---|
399 | relocatable; the relocations are copied to the output file after they
|
---|
400 | have been changed to reflect the new state of the world. There are two
|
---|
401 | ways of reflecting the results of partial linkage in an output file: by
|
---|
402 | modifying the output data in place, and by modifying the relocation
|
---|
403 | record. Some native formats (e.g., basic a.out and basic coff) have no
|
---|
404 | way of specifying an addend in the relocation type, so the addend has
|
---|
405 | to go in the output data. This is no big deal since in these formats
|
---|
406 | the output data slot will always be big enough for the addend. Complex
|
---|
407 | reloc types with addends were invented to solve just this problem. The
|
---|
408 | ERROR_MESSAGE argument is set to an error message if this return
|
---|
409 | `bfd_reloc_dangerous'.
|
---|
410 |
|
---|
411 | `bfd_install_relocation'
|
---|
412 | ........................
|
---|
413 |
|
---|
414 | *Synopsis*
|
---|
415 | bfd_reloc_status_type
|
---|
416 | bfd_install_relocation
|
---|
417 | (bfd *abfd,
|
---|
418 | arelent *reloc_entry,
|
---|
419 | PTR data, bfd_vma data_start,
|
---|
420 | asection *input_section,
|
---|
421 | char **error_message);
|
---|
422 | *Description*
|
---|
423 | This looks remarkably like `bfd_perform_relocation', except it does not
|
---|
424 | expect that the section contents have been filled in. I.e., it's
|
---|
425 | suitable for use when creating, rather than applying a relocation.
|
---|
426 |
|
---|
427 | For now, this function should be considered reserved for the
|
---|
428 | assembler.
|
---|
429 |
|
---|