Add linux.mh and xm-linux.h.
[deliverable/binutils-gdb.git] / bfd / reloc.c
CommitLineData
c618de01 1/* BFD support for handling relocation entries.
e9f03cd4 2 Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
c618de01
SC
3 Written by Cygnus Support.
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
e9f03cd4 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
c618de01 20
0cda46cf
SC
21/*
22SECTION
23 Relocations
985fca12 24
c188b0be
DM
25 BFD maintains relocations in much the same way it maintains
26 symbols: they are left alone until required, then read in
27 en-mass and translated into an internal form. A common
28 routine <<bfd_perform_relocation>> acts upon the
29 canonical form to do the fixup.
985fca12 30
c188b0be
DM
31 Relocations are maintained on a per section basis,
32 while symbols are maintained on a per BFD basis.
985fca12 33
c188b0be
DM
34 All that a back end has to do to fit the BFD interface is to create
35 a <<struct reloc_cache_entry>> for each relocation
36 in a particular section, and fill in the right bits of the structures.
985fca12
SC
37
38@menu
e98e6ec1
SC
39@* typedef arelent::
40@* howto manager::
985fca12
SC
41@end menu
42
43*/
0443af31
KR
44
45/* DO compile in the reloc_code name table from libbfd.h. */
46#define _BFD_MAKE_TABLE_bfd_reloc_code_real
47
985fca12 48#include "bfd.h"
0cda46cf 49#include "sysdep.h"
4c3721d5 50#include "bfdlink.h"
985fca12 51#include "libbfd.h"
c26d7d17
SC
52/*
53DOCDD
e98e6ec1
SC
54INODE
55 typedef arelent, howto manager, Relocations, Relocations
985fca12 56
0cda46cf
SC
57SUBSECTION
58 typedef arelent
985fca12 59
e98e6ec1 60 This is the structure of a relocation entry:
985fca12 61
e98e6ec1
SC
62CODE_FRAGMENT
63.
326e32d7 64.typedef enum bfd_reloc_status
e98e6ec1
SC
65.{
66. {* No errors detected *}
0cda46cf 67. bfd_reloc_ok,
e98e6ec1
SC
68.
69. {* The relocation was performed, but there was an overflow. *}
0cda46cf 70. bfd_reloc_overflow,
e98e6ec1 71.
65cab589 72. {* The address to relocate was not within the section supplied. *}
0cda46cf 73. bfd_reloc_outofrange,
e98e6ec1
SC
74.
75. {* Used by special functions *}
0cda46cf 76. bfd_reloc_continue,
e98e6ec1 77.
c188b0be 78. {* Unsupported relocation size requested. *}
0cda46cf 79. bfd_reloc_notsupported,
e98e6ec1 80.
c188b0be 81. {* Unused *}
0cda46cf 82. bfd_reloc_other,
e98e6ec1 83.
65cab589 84. {* The symbol to relocate against was undefined. *}
0cda46cf 85. bfd_reloc_undefined,
e98e6ec1
SC
86.
87. {* The relocation was performed, but may not be ok - presently
88. generated only when linking i960 coff files with i960 b.out
4c3721d5
ILT
89. symbols. If this type is returned, the error_message argument
90. to bfd_perform_relocation will be set. *}
0cda46cf 91. bfd_reloc_dangerous
e98e6ec1 92. }
0cda46cf 93. bfd_reloc_status_type;
e98e6ec1
SC
94.
95.
326e32d7 96.typedef struct reloc_cache_entry
0cda46cf 97.{
e98e6ec1
SC
98. {* A pointer into the canonical table of pointers *}
99. struct symbol_cache_entry **sym_ptr_ptr;
100.
101. {* offset in section *}
65cab589 102. bfd_size_type address;
e98e6ec1
SC
103.
104. {* addend for relocation value *}
326e32d7 105. bfd_vma addend;
e98e6ec1
SC
106.
107. {* Pointer to how to perform the required relocation *}
e9f03cd4 108. reloc_howto_type *howto;
e98e6ec1
SC
109.
110.} arelent;
985fca12 111
e98e6ec1 112*/
985fca12 113
e98e6ec1
SC
114/*
115DESCRIPTION
985fca12 116
c188b0be 117 Here is a description of each of the fields within an <<arelent>>:
985fca12 118
c188b0be 119 o <<sym_ptr_ptr>>
985fca12 120
e98e6ec1 121 The symbol table pointer points to a pointer to the symbol
c188b0be
DM
122 associated with the relocation request. It is
123 the pointer into the table returned by the back end's
124 <<get_symtab>> action. @xref{Symbols}. The symbol is referenced
e98e6ec1
SC
125 through a pointer to a pointer so that tools like the linker
126 can fix up all the symbols of the same name by modifying only
127 one pointer. The relocation routine looks in the symbol and
128 uses the base of the section the symbol is attached to and the
129 value of the symbol as the initial relocation offset. If the
130 symbol pointer is zero, then the section provided is looked up.
985fca12 131
c188b0be 132 o <<address>>
985fca12 133
c188b0be 134 The <<address>> field gives the offset in bytes from the base of
e98e6ec1
SC
135 the section data which owns the relocation record to the first
136 byte of relocatable information. The actual data relocated
c188b0be 137 will be relative to this point; for example, a relocation
e98e6ec1
SC
138 type which modifies the bottom two bytes of a four byte word
139 would not touch the first byte pointed to in a big endian
c26d7d17
SC
140 world.
141
c188b0be 142 o <<addend>>
c26d7d17 143
c188b0be 144 The <<addend>> is a value provided by the back end to be added (!)
c26d7d17
SC
145 to the relocation offset. Its interpretation is dependent upon
146 the howto. For example, on the 68k the code:
985fca12 147
985fca12 148
e98e6ec1
SC
149| char foo[];
150| main()
151| {
152| return foo[0x12345678];
153| }
985fca12 154
e98e6ec1 155 Could be compiled into:
985fca12 156
e98e6ec1
SC
157| linkw fp,#-4
158| moveb @@#12345678,d0
159| extbl d0
160| unlk fp
161| rts
985fca12 162
985fca12 163
c188b0be
DM
164 This could create a reloc pointing to <<foo>>, but leave the
165 offset in the data, something like:
0cda46cf 166
985fca12 167
e98e6ec1 168|RELOCATION RECORDS FOR [.text]:
326e32d7 169|offset type value
e98e6ec1
SC
170|00000006 32 _foo
171|
172|00000000 4e56 fffc ; linkw fp,#-4
173|00000004 1039 1234 5678 ; moveb @@#12345678,d0
174|0000000a 49c0 ; extbl d0
175|0000000c 4e5e ; unlk fp
176|0000000e 4e75 ; rts
0cda46cf 177
985fca12 178
e98e6ec1
SC
179 Using coff and an 88k, some instructions don't have enough
180 space in them to represent the full address range, and
181 pointers have to be loaded in two parts. So you'd get something like:
0cda46cf 182
985fca12 183
e98e6ec1
SC
184| or.u r13,r0,hi16(_foo+0x12345678)
185| ld.b r2,r13,lo16(_foo+0x12345678)
186| jmp r1
985fca12 187
985fca12 188
c188b0be 189 This should create two relocs, both pointing to <<_foo>>, and with
e98e6ec1 190 0x12340000 in their addend field. The data would consist of:
0cda46cf 191
985fca12 192
e98e6ec1 193|RELOCATION RECORDS FOR [.text]:
326e32d7 194|offset type value
e98e6ec1
SC
195|00000002 HVRT16 _foo+0x12340000
196|00000006 LVRT16 _foo+0x12340000
4c3721d5 197|
e98e6ec1
SC
198|00000000 5da05678 ; or.u r13,r0,0x5678
199|00000004 1c4d5678 ; ld.b r2,r13,0x5678
200|00000008 f400c001 ; jmp r1
985fca12 201
0cda46cf 202
e98e6ec1 203 The relocation routine digs out the value from the data, adds
c188b0be
DM
204 it to the addend to get the original offset, and then adds the
205 value of <<_foo>>. Note that all 32 bits have to be kept around
e98e6ec1 206 somewhere, to cope with carry from bit 15 to bit 16.
985fca12 207
65cab589 208 One further example is the sparc and the a.out format. The
e98e6ec1
SC
209 sparc has a similar problem to the 88k, in that some
210 instructions don't have room for an entire offset, but on the
c188b0be
DM
211 sparc the parts are created in odd sized lumps. The designers of
212 the a.out format chose to not use the data within the section
e98e6ec1 213 for storing part of the offset; all the offset is kept within
326e32d7 214 the reloc. Anything in the data should be ignored.
0cda46cf 215
e98e6ec1
SC
216| save %sp,-112,%sp
217| sethi %hi(_foo+0x12345678),%g2
218| ldsb [%g2+%lo(_foo+0x12345678)],%i0
219| ret
220| restore
0cda46cf 221
4c3721d5 222 Both relocs contain a pointer to <<foo>>, and the offsets
e98e6ec1 223 contain junk.
985fca12 224
0cda46cf 225
e98e6ec1 226|RELOCATION RECORDS FOR [.text]:
326e32d7 227|offset type value
e98e6ec1
SC
228|00000004 HI22 _foo+0x12345678
229|00000008 LO10 _foo+0x12345678
4c3721d5 230|
e98e6ec1
SC
231|00000000 9de3bf90 ; save %sp,-112,%sp
232|00000004 05000000 ; sethi %hi(_foo+0),%g2
233|00000008 f048a000 ; ldsb [%g2+%lo(_foo+0)],%i0
234|0000000c 81c7e008 ; ret
235|00000010 81e80000 ; restore
236
0cda46cf 237
c188b0be 238 o <<howto>>
e98e6ec1 239
c188b0be
DM
240 The <<howto>> field can be imagined as a
241 relocation instruction. It is a pointer to a structure which
242 contains information on what to do with all of the other
e98e6ec1
SC
243 information in the reloc record and data section. A back end
244 would normally have a relocation instruction set and turn
245 relocations into pointers to the correct structure on input -
246 but it would be possible to create each howto field on demand.
326e32d7 247
985fca12
SC
248*/
249
66a277ab
ILT
250/*
251SUBSUBSECTION
252 <<enum complain_overflow>>
253
254 Indicates what sort of overflow checking should be done when
255 performing a relocation.
256
257CODE_FRAGMENT
258.
259.enum complain_overflow
260.{
261. {* Do not complain on overflow. *}
262. complain_overflow_dont,
263.
264. {* Complain if the bitfield overflows, whether it is considered
265. as signed or unsigned. *}
266. complain_overflow_bitfield,
267.
268. {* Complain if the value overflows when considered as signed
269. number. *}
270. complain_overflow_signed,
271.
272. {* Complain if the value overflows when considered as an
273. unsigned number. *}
274. complain_overflow_unsigned
275.};
276
277*/
985fca12 278
0cda46cf 279/*
326e32d7 280SUBSUBSECTION
e98e6ec1 281 <<reloc_howto_type>>
985fca12 282
e98e6ec1 283 The <<reloc_howto_type>> is a structure which contains all the
c188b0be 284 information that libbfd needs to know to tie up a back end's data.
985fca12 285
e98e6ec1 286CODE_FRAGMENT
5022aea5 287.struct symbol_cache_entry; {* Forward declaration *}
e98e6ec1 288.
1fb83be6 289.struct reloc_howto_struct
326e32d7 290.{
e98e6ec1 291. {* The type field has mainly a documetary use - the back end can
c188b0be
DM
292. do what it wants with it, though normally the back end's
293. external idea of what a reloc number is stored
294. in this field. For example, a PC relative word relocation
295. in a coff environment has the type 023 - because that's
e98e6ec1 296. what the outside world calls a R_PCRWORD reloc. *}
0cda46cf 297. unsigned int type;
e98e6ec1
SC
298.
299. {* The value the final relocation is shifted right by. This drops
300. unwanted data from the relocation. *}
0cda46cf 301. unsigned int rightshift;
e98e6ec1 302.
fb32909a 303. {* The size of the item to be relocated. This is *not* a
4c3721d5
ILT
304. power-of-two measure. To get the number of bytes operated
305. on by a type of relocation, use bfd_get_reloc_size. *}
c26d7d17 306. int size;
e98e6ec1 307.
66a277ab
ILT
308. {* The number of bits in the item to be relocated. This is used
309. when doing overflow checking. *}
0cda46cf 310. unsigned int bitsize;
e98e6ec1
SC
311.
312. {* Notes that the relocation is relative to the location in the
313. data section of the addend. The relocation function will
314. subtract from the relocation value the address of the location
315. being relocated. *}
0cda46cf 316. boolean pc_relative;
e98e6ec1 317.
66a277ab
ILT
318. {* The bit position of the reloc value in the destination.
319. The relocated value is left shifted by this amount. *}
0cda46cf 320. unsigned int bitpos;
e98e6ec1 321.
66a277ab
ILT
322. {* What type of overflow error should be checked for when
323. relocating. *}
324. enum complain_overflow complain_on_overflow;
e98e6ec1
SC
325.
326. {* If this field is non null, then the supplied function is
327. called rather than the normal function. This allows really
65cab589 328. strange relocation methods to be accomodated (e.g., i960 callj
e98e6ec1 329. instructions). *}
326e32d7 330. bfd_reloc_status_type (*special_function)
fefb4b30 331. PARAMS ((bfd *abfd,
5022aea5
SC
332. arelent *reloc_entry,
333. struct symbol_cache_entry *symbol,
334. PTR data,
326e32d7 335. asection *input_section,
4c3721d5
ILT
336. bfd *output_bfd,
337. char **error_message));
e98e6ec1
SC
338.
339. {* The textual name of the relocation type. *}
0cda46cf 340. char *name;
e98e6ec1
SC
341.
342. {* When performing a partial link, some formats must modify the
343. relocations rather than the data - this flag signals this.*}
0cda46cf 344. boolean partial_inplace;
e98e6ec1 345.
c188b0be 346. {* The src_mask selects which parts of the read in data
65cab589 347. are to be used in the relocation sum. E.g., if this was an 8 bit
e98e6ec1
SC
348. bit of data which we read and relocated, this would be
349. 0x000000ff. When we have relocs which have an addend, such as
350. sun4 extended relocs, the value in the offset part of a
351. relocating field is garbage so we never use it. In this case
352. the mask would be 0x00000000. *}
65cab589 353. bfd_vma src_mask;
e98e6ec1 354.
c188b0be 355. {* The dst_mask selects which parts of the instruction are replaced
e98e6ec1
SC
356. into the instruction. In most cases src_mask == dst_mask,
357. except in the above special case, where dst_mask would be
358. 0x000000ff, and src_mask would be 0x00000000. *}
326e32d7 359. bfd_vma dst_mask;
e98e6ec1
SC
360.
361. {* When some formats create PC relative instructions, they leave
362. the value of the pc of the place being relocated in the offset
363. slot of the instruction, so that a PC relative relocation can
65cab589 364. be made just by adding in an ordinary offset (e.g., sun3 a.out).
e98e6ec1 365. Some formats leave the displacement part of an instruction
c188b0be 366. empty (e.g., m88k bcs); this flag signals the fact.*}
0cda46cf 367. boolean pcrel_offset;
e98e6ec1 368.
1fb83be6 369.};
985fca12 370
0cda46cf 371*/
985fca12 372
0cda46cf
SC
373/*
374FUNCTION
c188b0be 375 The HOWTO Macro
e98e6ec1 376
0cda46cf
SC
377DESCRIPTION
378 The HOWTO define is horrible and will go away.
379
380
66a277ab 381.#define HOWTO(C, R,S,B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \
0443af31 382. {(unsigned)C,R,S,B, P, BI, O,SF,NAME,INPLACE,MASKSRC,MASKDST,PC}
0cda46cf
SC
383
384DESCRIPTION
385 And will be replaced with the totally magic way. But for the
c188b0be 386 moment, we are compatible, so do it this way.
0cda46cf
SC
387
388
66a277ab 389.#define NEWHOWTO( FUNCTION, NAME,SIZE,REL,IN) HOWTO(0,0,SIZE,0,REL,0,complain_overflow_dont,FUNCTION, NAME,false,0,0,IN)
0cda46cf
SC
390.
391DESCRIPTION
392 Helper routine to turn a symbol into a relocation value.
393
e98e6ec1
SC
394.#define HOWTO_PREPARE(relocation, symbol) \
395. { \
396. if (symbol != (asymbol *)NULL) { \
65cab589 397. if (bfd_is_com_section (symbol->section)) { \
e98e6ec1
SC
398. relocation = 0; \
399. } \
400. else { \
401. relocation = symbol->value; \
402. } \
403. } \
326e32d7 404.}
985fca12
SC
405
406*/
407
4c3721d5
ILT
408/*
409FUNCTION
410 bfd_get_reloc_size
411
412SYNOPSIS
82b1edf7 413 int bfd_get_reloc_size (reloc_howto_type *);
4c3721d5
ILT
414
415DESCRIPTION
416 For a reloc_howto_type that operates on a fixed number of bytes,
417 this returns the number of bytes operated on.
418 */
419
420int
421bfd_get_reloc_size (howto)
82b1edf7 422 reloc_howto_type *howto;
4c3721d5 423{
326e32d7
ILT
424 switch (howto->size)
425 {
426 case 0: return 1;
427 case 1: return 2;
428 case 2: return 4;
429 case 3: return 0;
430 case 4: return 8;
431 case -2: return 4;
432 default: abort ();
433 }
4c3721d5
ILT
434}
435
0cda46cf
SC
436/*
437TYPEDEF
c188b0be 438 arelent_chain
985fca12 439
0cda46cf 440DESCRIPTION
985fca12 441
c188b0be 442 How relocs are tied together in an <<asection>>:
985fca12 443
0cda46cf
SC
444.typedef struct relent_chain {
445. arelent relent;
446. struct relent_chain *next;
447.} arelent_chain;
985fca12
SC
448
449*/
450
451
452
0cda46cf 453/*
326e32d7 454FUNCTION
0cda46cf
SC
455 bfd_perform_relocation
456
e98e6ec1
SC
457SYNOPSIS
458 bfd_reloc_status_type
459 bfd_perform_relocation
c188b0be 460 (bfd *abfd,
4c3721d5
ILT
461 arelent *reloc_entry,
462 PTR data,
463 asection *input_section,
464 bfd *output_bfd,
465 char **error_message);
e98e6ec1 466
0cda46cf 467DESCRIPTION
4c3721d5
ILT
468 If @var{output_bfd} is supplied to this function, the
469 generated image will be relocatable; the relocations are
470 copied to the output file after they have been changed to
471 reflect the new state of the world. There are two ways of
472 reflecting the results of partial linkage in an output file:
473 by modifying the output data in place, and by modifying the
474 relocation record. Some native formats (e.g., basic a.out and
475 basic coff) have no way of specifying an addend in the
476 relocation type, so the addend has to go in the output data.
477 This is no big deal since in these formats the output data
478 slot will always be big enough for the addend. Complex reloc
479 types with addends were invented to solve just this problem.
480 The @var{error_message} argument is set to an error message if
481 this return @code{bfd_reloc_dangerous}.
0cda46cf 482
985fca12
SC
483*/
484
485
0cda46cf 486bfd_reloc_status_type
4c3721d5
ILT
487bfd_perform_relocation (abfd, reloc_entry, data, input_section, output_bfd,
488 error_message)
489 bfd *abfd;
490 arelent *reloc_entry;
491 PTR data;
492 asection *input_section;
493 bfd *output_bfd;
494 char **error_message;
985fca12
SC
495{
496 bfd_vma relocation;
0cda46cf 497 bfd_reloc_status_type flag = bfd_reloc_ok;
326e32d7 498 bfd_size_type addr = reloc_entry->address;
985fca12 499 bfd_vma output_base = 0;
82b1edf7 500 reloc_howto_type *howto = reloc_entry->howto;
4c3721d5 501 asection *reloc_target_output_section;
985fca12
SC
502 asymbol *symbol;
503
4c3721d5 504 symbol = *(reloc_entry->sym_ptr_ptr);
1fb83be6 505 if (bfd_is_abs_section (symbol->section)
326e32d7 506 && output_bfd != (bfd *) NULL)
58acdbd7
KR
507 {
508 reloc_entry->address += input_section->output_offset;
509 return bfd_reloc_ok;
510 }
511
fb32909a
KR
512 /* If we are not producing relocateable output, return an error if
513 the symbol is not defined. An undefined weak symbol is
514 considered to have a value of zero (SVR4 ABI, p. 4-27). */
1fb83be6 515 if (bfd_is_und_section (symbol->section)
fb32909a
KR
516 && (symbol->flags & BSF_WEAK) == 0
517 && output_bfd == (bfd *) NULL)
5022aea5 518 flag = bfd_reloc_undefined;
985fca12 519
58acdbd7
KR
520 /* If there is a function supplied to handle this relocation type,
521 call it. It'll return `bfd_reloc_continue' if further processing
522 can be done. */
523 if (howto->special_function)
524 {
525 bfd_reloc_status_type cont;
526 cont = howto->special_function (abfd, reloc_entry, symbol, data,
4c3721d5
ILT
527 input_section, output_bfd,
528 error_message);
58acdbd7
KR
529 if (cont != bfd_reloc_continue)
530 return cont;
531 }
985fca12 532
58acdbd7
KR
533 /* Is the address of the relocation really within the section? */
534 if (reloc_entry->address > input_section->_cooked_size)
535 return bfd_reloc_outofrange;
985fca12 536
58acdbd7
KR
537 /* Work out which section the relocation is targetted at and the
538 initial relocation command value. */
539
540 /* Get symbol value. (Common symbols are special.) */
541 if (bfd_is_com_section (symbol->section))
5022aea5 542 relocation = 0;
58acdbd7 543 else
5022aea5 544 relocation = symbol->value;
985fca12 545
985fca12 546
e98e6ec1 547 reloc_target_output_section = symbol->section->output_section;
985fca12 548
58acdbd7 549 /* Convert input-section-relative symbol value to absolute. */
326e32d7 550 if (output_bfd && howto->partial_inplace == false)
5022aea5 551 output_base = 0;
58acdbd7 552 else
5022aea5 553 output_base = reloc_target_output_section->vma;
985fca12 554
65cab589 555 relocation += output_base + symbol->section->output_offset;
985fca12 556
58acdbd7 557 /* Add in supplied addend. */
65cab589 558 relocation += reloc_entry->addend;
985fca12 559
c188b0be
DM
560 /* Here the variable relocation holds the final address of the
561 symbol we are relocating against, plus any addend. */
562
985fca12 563 if (howto->pc_relative == true)
58acdbd7 564 {
c188b0be
DM
565 /* This is a PC relative relocation. We want to set RELOCATION
566 to the distance between the address of the symbol and the
567 location. RELOCATION is already the address of the symbol.
568
569 We start by subtracting the address of the section containing
570 the location.
571
572 If pcrel_offset is set, we must further subtract the position
573 of the location within the section. Some targets arrange for
574 the addend to be the negative of the position of the location
575 within the section; for example, i386-aout does this. For
576 i386-aout, pcrel_offset is false. Some other targets do not
577 include the position of the location; for example, m88kbcs,
578 or ELF. For those targets, pcrel_offset is true.
579
580 If we are producing relocateable output, then we must ensure
581 that this reloc will be correctly computed when the final
582 relocation is done. If pcrel_offset is false we want to wind
583 up with the negative of the location within the section,
584 which means we must adjust the existing addend by the change
585 in the location within the section. If pcrel_offset is true
586 we do not want to adjust the existing addend at all.
587
588 FIXME: This seems logical to me, but for the case of
589 producing relocateable output it is not what the code
590 actually does. I don't want to change it, because it seems
591 far too likely that something will break. */
985fca12 592
326e32d7 593 relocation -=
58acdbd7
KR
594 input_section->output_section->vma + input_section->output_offset;
595
596 if (howto->pcrel_offset == true)
597 relocation -= reloc_entry->address;
5022aea5 598 }
e98e6ec1 599
326e32d7 600 if (output_bfd != (bfd *) NULL)
5022aea5 601 {
326e32d7 602 if (howto->partial_inplace == false)
58acdbd7
KR
603 {
604 /* This is a partial relocation, and we want to apply the relocation
605 to the reloc entry rather than the raw data. Modify the reloc
606 inplace to reflect what we now know. */
607 reloc_entry->addend = relocation;
326e32d7 608 reloc_entry->address += input_section->output_offset;
58acdbd7
KR
609 return flag;
610 }
c26d7d17 611 else
58acdbd7
KR
612 {
613 /* This is a partial relocation, but inplace, so modify the
326e32d7 614 reloc record a bit.
58acdbd7
KR
615
616 If we've relocated with a symbol with a section, change
617 into a ref to the section belonging to the symbol. */
618
619 reloc_entry->address += input_section->output_offset;
620
621 /* WTF?? */
3d51f02f 622 if (abfd->xvec->flavour == bfd_target_coff_flavour
1fb83be6
KR
623 && strcmp (abfd->xvec->name, "aixcoff-rs6000") != 0
624 && strcmp (abfd->xvec->name, "coff-Intel-little") != 0
625 && strcmp (abfd->xvec->name, "coff-Intel-big") != 0)
58acdbd7 626 {
c188b0be
DM
627#if 1
628 /* For m68k-coff, the addend was being subtracted twice during
629 relocation with -r. Removing the line below this comment
630 fixes that problem; see PR 2953.
631
632However, Ian wrote the following, regarding removing the line below,
633which explains why it is still enabled: --djm
634
635If you put a patch like that into BFD you need to check all the COFF
636linkers. I am fairly certain that patch will break coff-i386 (e.g.,
637SCO); see coff_i386_reloc in coff-i386.c where I worked around the
638problem in a different way. There may very well be a reason that the
639code works as it does.
640
641Hmmm. The first obvious point is that bfd_perform_relocation should
642not have any tests that depend upon the flavour. It's seem like
643entirely the wrong place for such a thing. The second obvious point
644is that the current code ignores the reloc addend when producing
645relocateable output for COFF. That's peculiar. In fact, I really
646have no idea what the point of the line you want to remove is.
647
648A typical COFF reloc subtracts the old value of the symbol and adds in
649the new value to the location in the object file (if it's a pc
650relative reloc it adds the difference between the symbol value and the
651location). When relocating we need to preserve that property.
652
653BFD handles this by setting the addend to the negative of the old
654value of the symbol. Unfortunately it handles common symbols in a
655non-standard way (it doesn't subtract the old value) but that's a
656different story (we can't change it without losing backward
657compatibility with old object files) (coff-i386 does subtract the old
658value, to be compatible with existing coff-i386 targets, like SCO).
659
660So everything works fine when not producing relocateable output. When
661we are producing relocateable output, logically we should do exactly
662what we do when not producing relocateable output. Therefore, your
663patch is correct. In fact, it should probably always just set
664reloc_entry->addend to 0 for all cases, since it is, in fact, going to
665add the value into the object file. This won't hurt the COFF code,
666which doesn't use the addend; I'm not sure what it will do to other
667formats (the thing to check for would be whether any formats both use
668the addend and set partial_inplace).
669
670When I wanted to make coff-i386 produce relocateable output, I ran
671into the problem that you are running into: I wanted to remove that
672line. Rather than risk it, I made the coff-i386 relocs use a special
673function; it's coff_i386_reloc in coff-i386.c. The function
674specifically adds the addend field into the object file, knowing that
675bfd_perform_relocation is not going to. If you remove that line, then
676coff-i386.c will wind up adding the addend field in twice. It's
677trivial to fix; it just needs to be done.
678
679The problem with removing the line is just that it may break some
680working code. With BFD it's hard to be sure of anything. The right
681way to deal with this is simply to build and test at least all the
682supported COFF targets. It should be straightforward if time and disk
683space consuming. For each target:
684 1) build the linker
685 2) generate some executable, and link it using -r (I would
686 probably use paranoia.o and link against newlib/libc.a, which
687 for all the supported targets would be available in
688 /usr/cygnus/progressive/H-host/target/lib/libc.a).
689 3) make the change to reloc.c
690 4) rebuild the linker
691 5) repeat step 2
692 6) if the resulting object files are the same, you have at least
693 made it no worse
694 7) if they are different you have to figure out which version is
695 right
696*/
58acdbd7 697 relocation -= reloc_entry->addend;
c188b0be 698#endif
58acdbd7
KR
699 reloc_entry->addend = 0;
700 }
701 else
702 {
703 reloc_entry->addend = relocation;
704 }
705 }
985fca12 706 }
326e32d7 707 else
58acdbd7
KR
708 {
709 reloc_entry->addend = 0;
710 }
985fca12 711
66a277ab
ILT
712 /* FIXME: This overflow checking is incomplete, because the value
713 might have overflowed before we get here. For a correct check we
714 need to compute the value in a size larger than bitsize, but we
715 can't reasonably do that for a reloc the same size as a host
a49880c8
KR
716 machine word.
717 FIXME: We should also do overflow checking on the result after
718 adding in the value contained in the object file. */
e9f03cd4
ILT
719 if (howto->complain_on_overflow != complain_overflow_dont
720 && flag == bfd_reloc_ok)
65cab589 721 {
109a640b
KR
722 bfd_vma check;
723
724 /* Get the value that will be used for the relocation, but
725 starting at bit position zero. */
e9f03cd4 726 check = relocation >> howto->rightshift;
109a640b
KR
727 switch (howto->complain_on_overflow)
728 {
729 case complain_overflow_signed:
730 {
731 /* Assumes two's complement. */
732 bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
326e32d7 733 bfd_signed_vma reloc_signed_min = ~reloc_signed_max;
109a640b
KR
734
735 /* The above right shift is incorrect for a signed value.
736 Fix it up by forcing on the upper bits. */
e9f03cd4 737 if (howto->rightshift > 0
109a640b 738 && (bfd_signed_vma) relocation < 0)
326e32d7
ILT
739 check |= ((bfd_vma) - 1
740 & ~((bfd_vma) - 1
e9f03cd4 741 >> howto->rightshift));
109a640b
KR
742 if ((bfd_signed_vma) check > reloc_signed_max
743 || (bfd_signed_vma) check < reloc_signed_min)
744 flag = bfd_reloc_overflow;
745 }
746 break;
747 case complain_overflow_unsigned:
748 {
749 /* Assumes two's complement. This expression avoids
750 overflow if howto->bitsize is the number of bits in
751 bfd_vma. */
752 bfd_vma reloc_unsigned_max =
326e32d7 753 (((1 << (howto->bitsize - 1)) - 1) << 1) | 1;
109a640b
KR
754
755 if ((bfd_vma) check > reloc_unsigned_max)
756 flag = bfd_reloc_overflow;
757 }
758 break;
759 case complain_overflow_bitfield:
760 {
761 /* Assumes two's complement. This expression avoids
762 overflow if howto->bitsize is the number of bits in
763 bfd_vma. */
764 bfd_vma reloc_bits = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1;
765
326e32d7
ILT
766 if (((bfd_vma) check & ~reloc_bits) != 0
767 && ((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits))
a49880c8
KR
768 {
769 /* The above right shift is incorrect for a signed
770 value. See if turning on the upper bits fixes the
771 overflow. */
e9f03cd4 772 if (howto->rightshift > 0
a49880c8
KR
773 && (bfd_signed_vma) relocation < 0)
774 {
326e32d7
ILT
775 check |= ((bfd_vma) - 1
776 & ~((bfd_vma) - 1
e9f03cd4 777 >> howto->rightshift));
326e32d7 778 if (((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits))
a49880c8
KR
779 flag = bfd_reloc_overflow;
780 }
781 else
782 flag = bfd_reloc_overflow;
783 }
109a640b
KR
784 }
785 break;
786 default:
787 abort ();
788 }
65cab589 789 }
326e32d7
ILT
790
791 /*
985fca12
SC
792 Either we are relocating all the way, or we don't want to apply
793 the relocation to the reloc entry (probably because there isn't
794 any room in the output format to describe addends to relocs)
795 */
c188b0be
DM
796
797 /* The cast to bfd_vma avoids a bug in the Alpha OSF/1 C compiler
798 (OSF version 1.3, compiler version 3.11). It miscompiles the
799 following program:
800
801 struct str
802 {
803 unsigned int i0;
804 } s = { 0 };
805
806 int
807 main ()
808 {
809 unsigned long x;
810
811 x = 0x100000000;
812 x <<= (unsigned long) s.i0;
813 if (x == 0)
814 printf ("failed\n");
815 else
816 printf ("succeeded (%lx)\n", x);
817 }
818 */
819
820 relocation >>= (bfd_vma) howto->rightshift;
985fca12
SC
821
822 /* Shift everything up to where it's going to be used */
326e32d7 823
c188b0be 824 relocation <<= (bfd_vma) howto->bitpos;
985fca12
SC
825
826 /* Wait for the day when all have the mask in them */
827
828 /* What we do:
829 i instruction to be left alone
830 o offset within instruction
831 r relocation offset to apply
832 S src mask
833 D dst mask
834 N ~dst mask
835 A part 1
836 B part 2
837 R result
326e32d7 838
985fca12
SC
839 Do this:
840 i i i i i o o o o o from bfd_get<size>
841 and S S S S S to get the size offset we want
842 + r r r r r r r r r r to get the final value to place
843 and D D D D D to chop to right size
844 -----------------------
326e32d7 845 A A A A A
985fca12
SC
846 And this:
847 ... i i i i i o o o o o from bfd_get<size>
848 and N N N N N get instruction
849 -----------------------
850 ... B B B B B
326e32d7
ILT
851
852 And then:
853 B B B B B
854 or A A A A A
985fca12
SC
855 -----------------------
856 R R R R R R R R R R put into bfd_put<size>
857 */
858
859#define DOIT(x) \
860 x = ( (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask))
861
326e32d7
ILT
862 switch (howto->size)
863 {
864 case 0:
865 {
866 char x = bfd_get_8 (abfd, (char *) data + addr);
867 DOIT (x);
868 bfd_put_8 (abfd, x, (unsigned char *) data + addr);
869 }
870 break;
871
872 case 1:
873 if (relocation)
874 {
875 short x = bfd_get_16 (abfd, (bfd_byte *) data + addr);
876 DOIT (x);
877 bfd_put_16 (abfd, x, (unsigned char *) data + addr);
878 }
879 break;
880 case 2:
881 if (relocation)
882 {
883 long x = bfd_get_32 (abfd, (bfd_byte *) data + addr);
884 DOIT (x);
885 bfd_put_32 (abfd, x, (bfd_byte *) data + addr);
886 }
887 break;
888 case -2:
889 {
890 long x = bfd_get_32 (abfd, (bfd_byte *) data + addr);
891 relocation = -relocation;
892 DOIT (x);
893 bfd_put_32 (abfd, x, (bfd_byte *) data + addr);
894 }
895 break;
896
e9f03cd4
ILT
897 case -1:
898 {
899 long x = bfd_get_16 (abfd, (bfd_byte *) data + addr);
900 relocation = -relocation;
901 DOIT (x);
902 bfd_put_16 (abfd, x, (bfd_byte *) data + addr);
903 }
904 break;
905
326e32d7
ILT
906 case 3:
907 /* Do nothing */
908 break;
909
910 case 4:
109a640b 911#ifdef BFD64
326e32d7
ILT
912 if (relocation)
913 {
914 bfd_vma x = bfd_get_64 (abfd, (bfd_byte *) data + addr);
915 DOIT (x);
916 bfd_put_64 (abfd, x, (bfd_byte *) data + addr);
917 }
109a640b 918#else
326e32d7 919 abort ();
109a640b 920#endif
326e32d7
ILT
921 break;
922 default:
923 return bfd_reloc_other;
924 }
985fca12
SC
925
926 return flag;
927}
c618de01 928
094e8be3
ILT
929/*
930FUNCTION
931 bfd_install_relocation
932
933SYNOPSIS
934 bfd_reloc_status_type
935 bfd_install_relocation
936 (bfd *abfd,
937 arelent *reloc_entry,
938 PTR data, bfd_vma data_start,
939 asection *input_section,
940 char **error_message);
941
942DESCRIPTION
943 This looks remarkably like <<bfd_perform_relocation>>, except it
944 does not expect that the section contents have been filled in.
945 I.e., it's suitable for use when creating, rather than applying
946 a relocation.
947
948 For now, this function should be considered reserved for the
949 assembler.
950
951*/
952
953
954bfd_reloc_status_type
955bfd_install_relocation (abfd, reloc_entry, data_start, data_start_offset,
956 input_section, error_message)
957 bfd *abfd;
958 arelent *reloc_entry;
959 PTR data_start;
960 bfd_vma data_start_offset;
961 asection *input_section;
962 char **error_message;
963{
964 bfd_vma relocation;
965 bfd_reloc_status_type flag = bfd_reloc_ok;
966 bfd_size_type addr = reloc_entry->address;
967 bfd_vma output_base = 0;
82b1edf7 968 reloc_howto_type *howto = reloc_entry->howto;
094e8be3
ILT
969 asection *reloc_target_output_section;
970 asymbol *symbol;
fca2b81b 971 bfd_byte *data;
094e8be3
ILT
972
973 symbol = *(reloc_entry->sym_ptr_ptr);
974 if (bfd_is_abs_section (symbol->section))
975 {
976 reloc_entry->address += input_section->output_offset;
977 return bfd_reloc_ok;
978 }
979
980 /* If there is a function supplied to handle this relocation type,
981 call it. It'll return `bfd_reloc_continue' if further processing
982 can be done. */
983 if (howto->special_function)
984 {
985 bfd_reloc_status_type cont;
986 /* XXX - The special_function calls haven't been fixed up to deal
987 with creating new relocations and section contents. */
988 cont = howto->special_function (abfd, reloc_entry, symbol,
989 /* XXX - Non-portable! */
990 ((bfd_byte *) data_start
991 - data_start_offset),
992 input_section, abfd, error_message);
993 if (cont != bfd_reloc_continue)
994 return cont;
995 }
996
997 /* Is the address of the relocation really within the section? */
998 if (reloc_entry->address > input_section->_cooked_size)
999 return bfd_reloc_outofrange;
1000
1001 /* Work out which section the relocation is targetted at and the
1002 initial relocation command value. */
1003
1004 /* Get symbol value. (Common symbols are special.) */
1005 if (bfd_is_com_section (symbol->section))
1006 relocation = 0;
1007 else
1008 relocation = symbol->value;
1009
1010
1011 reloc_target_output_section = symbol->section->output_section;
1012
1013 /* Convert input-section-relative symbol value to absolute. */
1014 if (howto->partial_inplace == false)
1015 output_base = 0;
1016 else
1017 output_base = reloc_target_output_section->vma;
1018
1019 relocation += output_base + symbol->section->output_offset;
1020
1021 /* Add in supplied addend. */
1022 relocation += reloc_entry->addend;
1023
1024 /* Here the variable relocation holds the final address of the
1025 symbol we are relocating against, plus any addend. */
1026
1027 if (howto->pc_relative == true)
1028 {
1029 /* This is a PC relative relocation. We want to set RELOCATION
1030 to the distance between the address of the symbol and the
1031 location. RELOCATION is already the address of the symbol.
1032
1033 We start by subtracting the address of the section containing
1034 the location.
1035
1036 If pcrel_offset is set, we must further subtract the position
1037 of the location within the section. Some targets arrange for
1038 the addend to be the negative of the position of the location
1039 within the section; for example, i386-aout does this. For
1040 i386-aout, pcrel_offset is false. Some other targets do not
1041 include the position of the location; for example, m88kbcs,
1042 or ELF. For those targets, pcrel_offset is true.
1043
1044 If we are producing relocateable output, then we must ensure
1045 that this reloc will be correctly computed when the final
1046 relocation is done. If pcrel_offset is false we want to wind
1047 up with the negative of the location within the section,
1048 which means we must adjust the existing addend by the change
1049 in the location within the section. If pcrel_offset is true
1050 we do not want to adjust the existing addend at all.
1051
1052 FIXME: This seems logical to me, but for the case of
1053 producing relocateable output it is not what the code
1054 actually does. I don't want to change it, because it seems
1055 far too likely that something will break. */
1056
1057 relocation -=
1058 input_section->output_section->vma + input_section->output_offset;
1059
1060 if (howto->pcrel_offset == true && howto->partial_inplace == true)
1061 relocation -= reloc_entry->address;
1062 }
1063
1064 if (howto->partial_inplace == false)
1065 {
1066 /* This is a partial relocation, and we want to apply the relocation
1067 to the reloc entry rather than the raw data. Modify the reloc
1068 inplace to reflect what we now know. */
1069 reloc_entry->addend = relocation;
1070 reloc_entry->address += input_section->output_offset;
1071 return flag;
1072 }
1073 else
1074 {
1075 /* This is a partial relocation, but inplace, so modify the
1076 reloc record a bit.
1077
1078 If we've relocated with a symbol with a section, change
1079 into a ref to the section belonging to the symbol. */
1080
1081 reloc_entry->address += input_section->output_offset;
1082
1083 /* WTF?? */
1084 if (abfd->xvec->flavour == bfd_target_coff_flavour
1085 && strcmp (abfd->xvec->name, "aixcoff-rs6000") != 0
1086 && strcmp (abfd->xvec->name, "coff-Intel-little") != 0
1087 && strcmp (abfd->xvec->name, "coff-Intel-big") != 0)
1088 {
1089#if 1
1090/* For m68k-coff, the addend was being subtracted twice during
1091 relocation with -r. Removing the line below this comment
1092 fixes that problem; see PR 2953.
1093
1094However, Ian wrote the following, regarding removing the line below,
1095which explains why it is still enabled: --djm
1096
1097If you put a patch like that into BFD you need to check all the COFF
1098linkers. I am fairly certain that patch will break coff-i386 (e.g.,
1099SCO); see coff_i386_reloc in coff-i386.c where I worked around the
1100problem in a different way. There may very well be a reason that the
1101code works as it does.
1102
1103Hmmm. The first obvious point is that bfd_install_relocation should
1104not have any tests that depend upon the flavour. It's seem like
1105entirely the wrong place for such a thing. The second obvious point
1106is that the current code ignores the reloc addend when producing
1107relocateable output for COFF. That's peculiar. In fact, I really
1108have no idea what the point of the line you want to remove is.
1109
1110A typical COFF reloc subtracts the old value of the symbol and adds in
1111the new value to the location in the object file (if it's a pc
1112relative reloc it adds the difference between the symbol value and the
1113location). When relocating we need to preserve that property.
1114
1115BFD handles this by setting the addend to the negative of the old
1116value of the symbol. Unfortunately it handles common symbols in a
1117non-standard way (it doesn't subtract the old value) but that's a
1118different story (we can't change it without losing backward
1119compatibility with old object files) (coff-i386 does subtract the old
1120value, to be compatible with existing coff-i386 targets, like SCO).
1121
1122So everything works fine when not producing relocateable output. When
1123we are producing relocateable output, logically we should do exactly
1124what we do when not producing relocateable output. Therefore, your
1125patch is correct. In fact, it should probably always just set
1126reloc_entry->addend to 0 for all cases, since it is, in fact, going to
1127add the value into the object file. This won't hurt the COFF code,
1128which doesn't use the addend; I'm not sure what it will do to other
1129formats (the thing to check for would be whether any formats both use
1130the addend and set partial_inplace).
1131
1132When I wanted to make coff-i386 produce relocateable output, I ran
1133into the problem that you are running into: I wanted to remove that
1134line. Rather than risk it, I made the coff-i386 relocs use a special
1135function; it's coff_i386_reloc in coff-i386.c. The function
1136specifically adds the addend field into the object file, knowing that
1137bfd_install_relocation is not going to. If you remove that line, then
1138coff-i386.c will wind up adding the addend field in twice. It's
1139trivial to fix; it just needs to be done.
1140
1141The problem with removing the line is just that it may break some
1142working code. With BFD it's hard to be sure of anything. The right
1143way to deal with this is simply to build and test at least all the
1144supported COFF targets. It should be straightforward if time and disk
1145space consuming. For each target:
1146 1) build the linker
1147 2) generate some executable, and link it using -r (I would
1148 probably use paranoia.o and link against newlib/libc.a, which
1149 for all the supported targets would be available in
1150 /usr/cygnus/progressive/H-host/target/lib/libc.a).
1151 3) make the change to reloc.c
1152 4) rebuild the linker
1153 5) repeat step 2
1154 6) if the resulting object files are the same, you have at least
1155 made it no worse
1156 7) if they are different you have to figure out which version is
1157 right
1158*/
1159 relocation -= reloc_entry->addend;
1160#endif
1161 reloc_entry->addend = 0;
1162 }
1163 else
1164 {
1165 reloc_entry->addend = relocation;
1166 }
1167 }
1168
1169 /* FIXME: This overflow checking is incomplete, because the value
1170 might have overflowed before we get here. For a correct check we
1171 need to compute the value in a size larger than bitsize, but we
1172 can't reasonably do that for a reloc the same size as a host
1173 machine word.
1174
1175 FIXME: We should also do overflow checking on the result after
1176 adding in the value contained in the object file. */
1177 if (howto->complain_on_overflow != complain_overflow_dont)
1178 {
1179 bfd_vma check;
1180
1181 /* Get the value that will be used for the relocation, but
1182 starting at bit position zero. */
e9f03cd4 1183 check = relocation >> howto->rightshift;
094e8be3
ILT
1184 switch (howto->complain_on_overflow)
1185 {
1186 case complain_overflow_signed:
1187 {
1188 /* Assumes two's complement. */
1189 bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
1190 bfd_signed_vma reloc_signed_min = ~reloc_signed_max;
1191
1192 /* The above right shift is incorrect for a signed value.
1193 Fix it up by forcing on the upper bits. */
e9f03cd4 1194 if (howto->rightshift > 0
094e8be3
ILT
1195 && (bfd_signed_vma) relocation < 0)
1196 check |= ((bfd_vma) - 1
1197 & ~((bfd_vma) - 1
e9f03cd4 1198 >> howto->rightshift));
094e8be3
ILT
1199 if ((bfd_signed_vma) check > reloc_signed_max
1200 || (bfd_signed_vma) check < reloc_signed_min)
1201 flag = bfd_reloc_overflow;
1202 }
1203 break;
1204 case complain_overflow_unsigned:
1205 {
1206 /* Assumes two's complement. This expression avoids
1207 overflow if howto->bitsize is the number of bits in
1208 bfd_vma. */
1209 bfd_vma reloc_unsigned_max =
1210 (((1 << (howto->bitsize - 1)) - 1) << 1) | 1;
1211
1212 if ((bfd_vma) check > reloc_unsigned_max)
1213 flag = bfd_reloc_overflow;
1214 }
1215 break;
1216 case complain_overflow_bitfield:
1217 {
1218 /* Assumes two's complement. This expression avoids
1219 overflow if howto->bitsize is the number of bits in
1220 bfd_vma. */
1221 bfd_vma reloc_bits = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1;
1222
1223 if (((bfd_vma) check & ~reloc_bits) != 0
1224 && ((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits))
1225 {
1226 /* The above right shift is incorrect for a signed
1227 value. See if turning on the upper bits fixes the
1228 overflow. */
e9f03cd4 1229 if (howto->rightshift > 0
094e8be3
ILT
1230 && (bfd_signed_vma) relocation < 0)
1231 {
1232 check |= ((bfd_vma) - 1
1233 & ~((bfd_vma) - 1
e9f03cd4 1234 >> howto->rightshift));
094e8be3
ILT
1235 if (((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits))
1236 flag = bfd_reloc_overflow;
1237 }
1238 else
1239 flag = bfd_reloc_overflow;
1240 }
1241 }
1242 break;
1243 default:
1244 abort ();
1245 }
1246 }
1247
1248 /*
1249 Either we are relocating all the way, or we don't want to apply
1250 the relocation to the reloc entry (probably because there isn't
1251 any room in the output format to describe addends to relocs)
1252 */
1253
1254 /* The cast to bfd_vma avoids a bug in the Alpha OSF/1 C compiler
1255 (OSF version 1.3, compiler version 3.11). It miscompiles the
1256 following program:
1257
1258 struct str
1259 {
1260 unsigned int i0;
1261 } s = { 0 };
1262
1263 int
1264 main ()
1265 {
1266 unsigned long x;
1267
1268 x = 0x100000000;
1269 x <<= (unsigned long) s.i0;
1270 if (x == 0)
1271 printf ("failed\n");
1272 else
1273 printf ("succeeded (%lx)\n", x);
1274 }
1275 */
1276
1277 relocation >>= (bfd_vma) howto->rightshift;
1278
1279 /* Shift everything up to where it's going to be used */
1280
1281 relocation <<= (bfd_vma) howto->bitpos;
1282
1283 /* Wait for the day when all have the mask in them */
1284
1285 /* What we do:
1286 i instruction to be left alone
1287 o offset within instruction
1288 r relocation offset to apply
1289 S src mask
1290 D dst mask
1291 N ~dst mask
1292 A part 1
1293 B part 2
1294 R result
1295
1296 Do this:
1297 i i i i i o o o o o from bfd_get<size>
1298 and S S S S S to get the size offset we want
1299 + r r r r r r r r r r to get the final value to place
1300 and D D D D D to chop to right size
1301 -----------------------
1302 A A A A A
1303 And this:
1304 ... i i i i i o o o o o from bfd_get<size>
1305 and N N N N N get instruction
1306 -----------------------
1307 ... B B B B B
1308
1309 And then:
1310 B B B B B
1311 or A A A A A
1312 -----------------------
1313 R R R R R R R R R R put into bfd_put<size>
1314 */
1315
1316#define DOIT(x) \
1317 x = ( (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask))
1318
1319 data = (bfd_byte *) data_start + (addr - data_start_offset);
1320
1321 switch (howto->size)
1322 {
1323 case 0:
1324 {
1325 char x = bfd_get_8 (abfd, (char *) data);
1326 DOIT (x);
1327 bfd_put_8 (abfd, x, (unsigned char *) data);
1328 }
1329 break;
1330
1331 case 1:
1332 if (relocation)
1333 {
1334 short x = bfd_get_16 (abfd, (bfd_byte *) data);
1335 DOIT (x);
1336 bfd_put_16 (abfd, x, (unsigned char *) data);
1337 }
1338 break;
1339 case 2:
1340 if (relocation)
1341 {
1342 long x = bfd_get_32 (abfd, (bfd_byte *) data);
1343 DOIT (x);
1344 bfd_put_32 (abfd, x, (bfd_byte *) data);
1345 }
1346 break;
1347 case -2:
1348 {
1349 long x = bfd_get_32 (abfd, (bfd_byte *) data);
1350 relocation = -relocation;
1351 DOIT (x);
1352 bfd_put_32 (abfd, x, (bfd_byte *) data);
1353 }
1354 break;
1355
1356 case 3:
1357 /* Do nothing */
1358 break;
1359
1360 case 4:
1361 if (relocation)
1362 {
1363 bfd_vma x = bfd_get_64 (abfd, (bfd_byte *) data);
1364 DOIT (x);
1365 bfd_put_64 (abfd, x, (bfd_byte *) data);
1366 }
1367 break;
1368 default:
1369 return bfd_reloc_other;
1370 }
1371
1372 return flag;
1373}
1374
4c3721d5
ILT
1375/* This relocation routine is used by some of the backend linkers.
1376 They do not construct asymbol or arelent structures, so there is no
1377 reason for them to use bfd_perform_relocation. Also,
1378 bfd_perform_relocation is so hacked up it is easier to write a new
1379 function than to try to deal with it.
1380
1381 This routine does a final relocation. It should not be used when
1382 generating relocateable output.
1383
1384 FIXME: This routine ignores any special_function in the HOWTO,
1385 since the existing special_function values have been written for
1386 bfd_perform_relocation.
1387
1388 HOWTO is the reloc howto information.
1389 INPUT_BFD is the BFD which the reloc applies to.
1390 INPUT_SECTION is the section which the reloc applies to.
1391 CONTENTS is the contents of the section.
1392 ADDRESS is the address of the reloc within INPUT_SECTION.
1393 VALUE is the value of the symbol the reloc refers to.
1394 ADDEND is the addend of the reloc. */
1395
1396bfd_reloc_status_type
1397_bfd_final_link_relocate (howto, input_bfd, input_section, contents, address,
326e32d7 1398 value, addend)
82b1edf7 1399 reloc_howto_type *howto;
4c3721d5
ILT
1400 bfd *input_bfd;
1401 asection *input_section;
1402 bfd_byte *contents;
1403 bfd_vma address;
1404 bfd_vma value;
1405 bfd_vma addend;
1406{
1407 bfd_vma relocation;
c618de01 1408
4c3721d5
ILT
1409 /* Sanity check the address. */
1410 if (address > input_section->_cooked_size)
1411 return bfd_reloc_outofrange;
1412
1413 /* This function assumes that we are dealing with a basic relocation
1414 against a symbol. We want to compute the value of the symbol to
1415 relocate to. This is just VALUE, the value of the symbol, plus
1416 ADDEND, any addend associated with the reloc. */
1417 relocation = value + addend;
1418
1419 /* If the relocation is PC relative, we want to set RELOCATION to
1420 the distance between the symbol (currently in RELOCATION) and the
1421 location we are relocating. Some targets (e.g., i386-aout)
1422 arrange for the contents of the section to be the negative of the
1423 offset of the location within the section; for such targets
1424 pcrel_offset is false. Other targets (e.g., m88kbcs or ELF)
1425 simply leave the contents of the section as zero; for such
1426 targets pcrel_offset is true. If pcrel_offset is false we do not
1427 need to subtract out the offset of the location within the
1428 section (which is just ADDRESS). */
1429 if (howto->pc_relative)
1430 {
1431 relocation -= (input_section->output_section->vma
1432 + input_section->output_offset);
1433 if (howto->pcrel_offset)
1434 relocation -= address;
1435 }
326e32d7 1436
4c3721d5
ILT
1437 return _bfd_relocate_contents (howto, input_bfd, relocation,
1438 contents + address);
1439}
1440
1441/* Relocate a given location using a given value and howto. */
1442
1443bfd_reloc_status_type
1444_bfd_relocate_contents (howto, input_bfd, relocation, location)
82b1edf7 1445 reloc_howto_type *howto;
4c3721d5
ILT
1446 bfd *input_bfd;
1447 bfd_vma relocation;
1448 bfd_byte *location;
1449{
1450 int size;
1451 bfd_vma x;
1452 boolean overflow;
1453
1454 /* If the size is negative, negate RELOCATION. This isn't very
1455 general. */
1456 if (howto->size < 0)
326e32d7 1457 relocation = -relocation;
4c3721d5
ILT
1458
1459 /* Get the value we are going to relocate. */
1460 size = bfd_get_reloc_size (howto);
1461 switch (size)
1462 {
1463 default:
1464 case 0:
1465 abort ();
1466 case 1:
1467 x = bfd_get_8 (input_bfd, location);
1468 break;
1469 case 2:
1470 x = bfd_get_16 (input_bfd, location);
1471 break;
1472 case 4:
1473 x = bfd_get_32 (input_bfd, location);
1474 break;
1475 case 8:
1476#ifdef BFD64
1477 x = bfd_get_64 (input_bfd, location);
1478#else
1479 abort ();
1480#endif
1481 break;
1482 }
1483
1484 /* Check for overflow. FIXME: We may drop bits during the addition
1485 which we don't check for. We must either check at every single
1486 operation, which would be tedious, or we must do the computations
1487 in a type larger than bfd_vma, which would be inefficient. */
1488 overflow = false;
1489 if (howto->complain_on_overflow != complain_overflow_dont)
1490 {
1491 bfd_vma check;
1492 bfd_signed_vma signed_check;
1493 bfd_vma add;
563eb766 1494 bfd_signed_vma signed_add;
4c3721d5
ILT
1495
1496 if (howto->rightshift == 0)
1497 {
1498 check = relocation;
1499 signed_check = (bfd_signed_vma) relocation;
1500 }
1501 else
1502 {
1503 /* Drop unwanted bits from the value we are relocating to. */
1504 check = relocation >> howto->rightshift;
1505
1506 /* If this is a signed value, the rightshift just dropped
1507 leading 1 bits (assuming twos complement). */
1508 if ((bfd_signed_vma) relocation >= 0)
1509 signed_check = check;
1510 else
1511 signed_check = (check
326e32d7
ILT
1512 | ((bfd_vma) - 1
1513 & ~((bfd_vma) - 1 >> howto->rightshift)));
4c3721d5
ILT
1514 }
1515
3d51f02f 1516 /* Get the value from the object file. */
4c3721d5 1517 add = x & howto->src_mask;
3d51f02f
ILT
1518
1519 /* Get the value from the object file with an appropriate sign.
1520 The expression involving howto->src_mask isolates the upper
1521 bit of src_mask. If that bit is set in the value we are
1522 adding, it is negative, and we subtract out that number times
1523 two. If src_mask includes the highest possible bit, then we
1524 can not get the upper bit, but that does not matter since
1525 signed_add needs no adjustment to become negative in that
1526 case. */
1527 signed_add = add;
326e32d7
ILT
1528 if ((add & (((~howto->src_mask) >> 1) & howto->src_mask)) != 0)
1529 signed_add -= (((~howto->src_mask) >> 1) & howto->src_mask) << 1;
3d51f02f
ILT
1530
1531 /* Add the value from the object file, shifted so that it is a
1532 straight number. */
4c3721d5
ILT
1533 if (howto->bitpos == 0)
1534 {
1535 check += add;
563eb766 1536 signed_check += signed_add;
4c3721d5
ILT
1537 }
1538 else
1539 {
563eb766 1540 check += add >> howto->bitpos;
3d51f02f
ILT
1541
1542 /* For the signed case we use ADD, rather than SIGNED_ADD,
1543 to avoid warnings from SVR4 cc. This is OK since we
1544 explictly handle the sign bits. */
563eb766 1545 if (signed_add >= 0)
3d51f02f 1546 signed_check += add >> howto->bitpos;
563eb766 1547 else
3d51f02f 1548 signed_check += ((add >> howto->bitpos)
326e32d7
ILT
1549 | ((bfd_vma) - 1
1550 & ~((bfd_vma) - 1 >> howto->bitpos)));
4c3721d5
ILT
1551 }
1552
1553 switch (howto->complain_on_overflow)
1554 {
1555 case complain_overflow_signed:
1556 {
1557 /* Assumes two's complement. */
1558 bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1;
326e32d7 1559 bfd_signed_vma reloc_signed_min = ~reloc_signed_max;
4c3721d5
ILT
1560
1561 if (signed_check > reloc_signed_max
1562 || signed_check < reloc_signed_min)
1563 overflow = true;
1564 }
1565 break;
1566 case complain_overflow_unsigned:
1567 {
1568 /* Assumes two's complement. This expression avoids
1569 overflow if howto->bitsize is the number of bits in
1570 bfd_vma. */
1571 bfd_vma reloc_unsigned_max =
326e32d7 1572 (((1 << (howto->bitsize - 1)) - 1) << 1) | 1;
4c3721d5
ILT
1573
1574 if (check > reloc_unsigned_max)
1575 overflow = true;
1576 }
1577 break;
1578 case complain_overflow_bitfield:
1579 {
1580 /* Assumes two's complement. This expression avoids
1581 overflow if howto->bitsize is the number of bits in
1582 bfd_vma. */
1583 bfd_vma reloc_bits = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1;
1584
326e32d7
ILT
1585 if ((check & ~reloc_bits) != 0
1586 && (((bfd_vma) signed_check & ~reloc_bits)
1587 != (-1 & ~reloc_bits)))
4c3721d5
ILT
1588 overflow = true;
1589 }
1590 break;
1591 default:
1592 abort ();
1593 }
1594 }
1595
1596 /* Put RELOCATION in the right bits. */
1597 relocation >>= (bfd_vma) howto->rightshift;
1598 relocation <<= (bfd_vma) howto->bitpos;
1599
1600 /* Add RELOCATION to the right bits of X. */
326e32d7 1601 x = ((x & ~howto->dst_mask)
4c3721d5
ILT
1602 | (((x & howto->src_mask) + relocation) & howto->dst_mask));
1603
1604 /* Put the relocated value back in the object file. */
1605 switch (size)
1606 {
1607 default:
1608 case 0:
1609 abort ();
1610 case 1:
1611 bfd_put_8 (input_bfd, x, location);
1612 break;
1613 case 2:
1614 bfd_put_16 (input_bfd, x, location);
1615 break;
1616 case 4:
1617 bfd_put_32 (input_bfd, x, location);
1618 break;
1619 case 8:
1620#ifdef BFD64
1621 bfd_put_64 (input_bfd, x, location);
1622#else
1623 abort ();
1624#endif
1625 break;
1626 }
1627
1628 return overflow ? bfd_reloc_overflow : bfd_reloc_ok;
1629}
2cf44d7b 1630
0cda46cf 1631/*
c26d7d17 1632DOCDD
e98e6ec1
SC
1633INODE
1634 howto manager, , typedef arelent, Relocations
1635
0cda46cf 1636SECTION
326e32d7 1637 The howto manager
2cf44d7b 1638
0cda46cf
SC
1639 When an application wants to create a relocation, but doesn't
1640 know what the target machine might call it, it can find out by
1641 using this bit of code.
2cf44d7b 1642
0cda46cf 1643*/
2cf44d7b 1644
0cda46cf
SC
1645/*
1646TYPEDEF
1647 bfd_reloc_code_type
2cf44d7b 1648
0cda46cf 1649DESCRIPTION
fb32909a
KR
1650 The insides of a reloc code. The idea is that, eventually, there
1651 will be one enumerator for every type of relocation we ever do.
1652 Pass one of these values to <<bfd_reloc_type_lookup>>, and it'll
1653 return a howto pointer.
1654
1655 This does mean that the application must determine the correct
1656 enumerator value; you can't get a howto pointer from a random set
1657 of attributes.
0cda46cf 1658
0443af31
KR
1659SENUM
1660 bfd_reloc_code_real
1661
1662ENUM
1663 BFD_RELOC_64
1664ENUMX
1665 BFD_RELOC_32
1666ENUMX
1667 BFD_RELOC_26
1668ENUMX
1669 BFD_RELOC_16
1670ENUMX
1671 BFD_RELOC_14
1672ENUMX
1673 BFD_RELOC_8
1674ENUMDOC
1675 Basic absolute relocations of N bits.
1676
1677ENUM
1678 BFD_RELOC_64_PCREL
1679ENUMX
1680 BFD_RELOC_32_PCREL
1681ENUMX
1682 BFD_RELOC_24_PCREL
1683ENUMX
1684 BFD_RELOC_16_PCREL
fca2b81b
KR
1685ENUMX
1686 BFD_RELOC_12_PCREL
0443af31
KR
1687ENUMX
1688 BFD_RELOC_8_PCREL
1689ENUMDOC
1690 PC-relative relocations. Sometimes these are relative to the address
1691of the relocation itself; sometimes they are relative to the start of
1692the section containing the relocation. It depends on the specific target.
1693
1694The 24-bit relocation is used in some Intel 960 configurations.
1695
e9f03cd4
ILT
1696ENUM
1697 BFD_RELOC_32_GOT_PCREL
1698ENUMX
1699 BFD_RELOC_16_GOT_PCREL
1700ENUMX
1701 BFD_RELOC_8_GOT_PCREL
1702ENUMX
1703 BFD_RELOC_32_GOTOFF
1704ENUMX
1705 BFD_RELOC_16_GOTOFF
1706ENUMX
1707 BFD_RELOC_LO16_GOTOFF
1708ENUMX
1709 BFD_RELOC_HI16_GOTOFF
1710ENUMX
1711 BFD_RELOC_HI16_S_GOTOFF
1712ENUMX
1713 BFD_RELOC_8_GOTOFF
1714ENUMX
1715 BFD_RELOC_32_PLT_PCREL
1716ENUMX
1717 BFD_RELOC_24_PLT_PCREL
1718ENUMX
1719 BFD_RELOC_16_PLT_PCREL
1720ENUMX
1721 BFD_RELOC_8_PLT_PCREL
1722ENUMX
1723 BFD_RELOC_32_PLTOFF
1724ENUMX
1725 BFD_RELOC_16_PLTOFF
1726ENUMX
1727 BFD_RELOC_LO16_PLTOFF
1728ENUMX
1729 BFD_RELOC_HI16_PLTOFF
1730ENUMX
1731 BFD_RELOC_HI16_S_PLTOFF
1732ENUMX
1733 BFD_RELOC_8_PLTOFF
1734ENUMDOC
1735 For ELF.
1736
1737ENUM
1738 BFD_RELOC_68K_GLOB_DAT
1739ENUMX
1740 BFD_RELOC_68K_JMP_SLOT
1741ENUMX
1742 BFD_RELOC_68K_RELATIVE
1743ENUMDOC
1744 Relocations used by 68K ELF.
1745
0443af31
KR
1746ENUM
1747 BFD_RELOC_32_BASEREL
1748ENUMX
1749 BFD_RELOC_16_BASEREL
e9f03cd4
ILT
1750ENUMX
1751 BFD_RELOC_LO16_BASEREL
1752ENUMX
1753 BFD_RELOC_HI16_BASEREL
1754ENUMX
1755 BFD_RELOC_HI16_S_BASEREL
0443af31
KR
1756ENUMX
1757 BFD_RELOC_8_BASEREL
e9f03cd4
ILT
1758ENUMX
1759 BFD_RELOC_RVA
0443af31
KR
1760ENUMDOC
1761 Linkage-table relative.
1762
1763ENUM
1764 BFD_RELOC_8_FFnn
1765ENUMDOC
1766 Absolute 8-bit relocation, but used to form an address like 0xFFnn.
1767
1768ENUM
1769 BFD_RELOC_32_PCREL_S2
1770ENUMX
1771 BFD_RELOC_16_PCREL_S2
1772ENUMX
1773 BFD_RELOC_23_PCREL_S2
1774ENUMDOC
fca2b81b
KR
1775 These PC-relative relocations are stored as word displacements --
1776i.e., byte displacements shifted right two bits. The 30-bit word
1777displacement (<<32_PCREL_S2>> -- 32 bits, shifted 2) is used on the
1778SPARC. (SPARC tools generally refer to this as <<WDISP30>>.) The
1779signed 16-bit displacement is used on the MIPS, and the 23-bit
1780displacement is used on the Alpha.
0443af31
KR
1781
1782ENUM
1783 BFD_RELOC_HI22
1784ENUMX
1785 BFD_RELOC_LO10
1786ENUMDOC
1787 High 22 bits and low 10 bits of 32-bit value, placed into lower bits of
1788the target word. These are used on the SPARC.
1789
1790ENUM
1791 BFD_RELOC_GPREL16
1792ENUMX
1793 BFD_RELOC_GPREL32
1794ENUMDOC
1795 For systems that allocate a Global Pointer register, these are
1796displacements off that register. These relocation types are
1797handled specially, because the value the register will have is
1798decided relatively late.
1799
1800
1801ENUM
1802 BFD_RELOC_I960_CALLJ
1803ENUMDOC
1804 Reloc types used for i960/b.out.
1805
1806ENUM
1807 BFD_RELOC_NONE
1808ENUMX
1809 BFD_RELOC_SPARC_WDISP22
1810ENUMX
1811 BFD_RELOC_SPARC22
1812ENUMX
1813 BFD_RELOC_SPARC13
1814ENUMX
1815 BFD_RELOC_SPARC_GOT10
1816ENUMX
1817 BFD_RELOC_SPARC_GOT13
1818ENUMX
1819 BFD_RELOC_SPARC_GOT22
1820ENUMX
1821 BFD_RELOC_SPARC_PC10
1822ENUMX
1823 BFD_RELOC_SPARC_PC22
1824ENUMX
1825 BFD_RELOC_SPARC_WPLT30
1826ENUMX
1827 BFD_RELOC_SPARC_COPY
1828ENUMX
1829 BFD_RELOC_SPARC_GLOB_DAT
1830ENUMX
1831 BFD_RELOC_SPARC_JMP_SLOT
1832ENUMX
1833 BFD_RELOC_SPARC_RELATIVE
1834ENUMX
1835 BFD_RELOC_SPARC_UA32
1836ENUMDOC
1837 SPARC ELF relocations. There is probably some overlap with other
1838 relocation types already defined.
1839
1840ENUM
1841 BFD_RELOC_SPARC_BASE13
1842ENUMX
1843 BFD_RELOC_SPARC_BASE22
1844ENUMDOC
1845 I think these are specific to SPARC a.out (e.g., Sun 4).
1846
1847ENUMEQ
1848 BFD_RELOC_SPARC_64
1849 BFD_RELOC_64
1850ENUMX
1851 BFD_RELOC_SPARC_10
1852ENUMX
1853 BFD_RELOC_SPARC_11
1854ENUMX
1855 BFD_RELOC_SPARC_OLO10
1856ENUMX
1857 BFD_RELOC_SPARC_HH22
1858ENUMX
1859 BFD_RELOC_SPARC_HM10
1860ENUMX
1861 BFD_RELOC_SPARC_LM22
1862ENUMX
1863 BFD_RELOC_SPARC_PC_HH22
1864ENUMX
1865 BFD_RELOC_SPARC_PC_HM10
1866ENUMX
1867 BFD_RELOC_SPARC_PC_LM22
1868ENUMX
1869 BFD_RELOC_SPARC_WDISP16
1870ENUMX
1871 BFD_RELOC_SPARC_WDISP19
1872ENUMX
1873 BFD_RELOC_SPARC_GLOB_JMP
1874ENUMX
e9f03cd4
ILT
1875 BFD_RELOC_SPARC_7
1876ENUMX
1877 BFD_RELOC_SPARC_6
1878ENUMX
1879 BFD_RELOC_SPARC_5
0443af31
KR
1880ENUMDOC
1881 Some relocations we're using for SPARC V9 -- subject to change.
1882
1883ENUM
1884 BFD_RELOC_ALPHA_GPDISP_HI16
1885ENUMDOC
1886 Alpha ECOFF relocations. Some of these treat the symbol or "addend"
1887 in some special way.
1888 For GPDISP_HI16 ("gpdisp") relocations, the symbol is ignored when
1889 writing; when reading, it will be the absolute section symbol. The
1890 addend is the displacement in bytes of the "lda" instruction from
1891 the "ldah" instruction (which is at the address of this reloc).
1892ENUM
1893 BFD_RELOC_ALPHA_GPDISP_LO16
1894ENUMDOC
1895 For GPDISP_LO16 ("ignore") relocations, the symbol is handled as
1896 with GPDISP_HI16 relocs. The addend is ignored when writing the
1897 relocations out, and is filled in with the file's GP value on
1898 reading, for convenience.
1899
1900ENUM
1901 BFD_RELOC_ALPHA_LITERAL
1902ENUMX
1903 BFD_RELOC_ALPHA_LITUSE
1904ENUMDOC
1905 The Alpha LITERAL/LITUSE relocs are produced by a symbol reference;
1906 the assembler turns it into a LDQ instruction to load the address of
1907 the symbol, and then fills in a register in the real instruction.
1908
1909 The LITERAL reloc, at the LDQ instruction, refers to the .lita
1910 section symbol. The addend is ignored when writing, but is filled
1911 in with the file's GP value on reading, for convenience, as with the
1912 GPDISP_LO16 reloc.
1913
1914 The LITUSE reloc, on the instruction using the loaded address, gives
1915 information to the linker that it might be able to use to optimize
1916 away some literal section references. The symbol is ignored (read
1917 as the absolute section symbol), and the "addend" indicates the type
1918 of instruction using the register:
1919 1 - "memory" fmt insn
1920 2 - byte-manipulation (byte offset reg)
1921 3 - jsr (target of branch)
1922
1923 The GNU linker currently doesn't do any of this optimizing.
1924
1925ENUM
1926 BFD_RELOC_ALPHA_HINT
1927ENUMDOC
1928 The HINT relocation indicates a value that should be filled into the
1929 "hint" field of a jmp/jsr/ret instruction, for possible branch-
1930 prediction logic which may be provided on some processors.
1931
1932ENUM
1933 BFD_RELOC_MIPS_JMP
1934ENUMDOC
1935 Bits 27..2 of the relocation address shifted right 2 bits;
1936 simple reloc otherwise.
1937
1938ENUM
1939 BFD_RELOC_HI16
1940ENUMDOC
1941 High 16 bits of 32-bit value; simple reloc.
1942ENUM
1943 BFD_RELOC_HI16_S
1944ENUMDOC
1945 High 16 bits of 32-bit value but the low 16 bits will be sign
1946 extended and added to form the final result. If the low 16
1947 bits form a negative number, we need to add one to the high value
1948 to compensate for the borrow when the low bits are added.
1949ENUM
1950 BFD_RELOC_LO16
1951ENUMDOC
1952 Low 16 bits.
1953ENUM
1954 BFD_RELOC_PCREL_HI16_S
1955ENUMDOC
1956 Like BFD_RELOC_HI16_S, but PC relative.
1957ENUM
1958 BFD_RELOC_PCREL_LO16
1959ENUMDOC
1960 Like BFD_RELOC_LO16, but PC relative.
1961
1962ENUMEQ
1963 BFD_RELOC_MIPS_GPREL
1964 BFD_RELOC_GPREL16
1965ENUMDOC
1966 Relocation relative to the global pointer.
1967
1968ENUM
1969 BFD_RELOC_MIPS_LITERAL
1970ENUMDOC
1971 Relocation against a MIPS literal section.
1972
1973ENUM
1974 BFD_RELOC_MIPS_GOT16
1975ENUMX
1976 BFD_RELOC_MIPS_CALL16
1977ENUMEQX
1978 BFD_RELOC_MIPS_GPREL32
1979 BFD_RELOC_GPREL32
e9f03cd4
ILT
1980ENUMX
1981 BFD_RELOC_MIPS_GOT_HI16
1982ENUMX
1983 BFD_RELOC_MIPS_GOT_LO16
0443af31
KR
1984ENUMDOC
1985 MIPS ELF relocations.
1986
1987ENUM
1988 BFD_RELOC_386_GOT32
1989ENUMX
1990 BFD_RELOC_386_PLT32
1991ENUMX
1992 BFD_RELOC_386_COPY
1993ENUMX
1994 BFD_RELOC_386_GLOB_DAT
1995ENUMX
1996 BFD_RELOC_386_JUMP_SLOT
1997ENUMX
1998 BFD_RELOC_386_RELATIVE
1999ENUMX
2000 BFD_RELOC_386_GOTOFF
2001ENUMX
2002 BFD_RELOC_386_GOTPC
2003ENUMDOC
2004 i386/elf relocations
2005
2006ENUM
2007 BFD_RELOC_NS32K_IMM_8
2008ENUMX
2009 BFD_RELOC_NS32K_IMM_16
2010ENUMX
2011 BFD_RELOC_NS32K_IMM_32
2012ENUMX
2013 BFD_RELOC_NS32K_IMM_8_PCREL
2014ENUMX
2015 BFD_RELOC_NS32K_IMM_16_PCREL
2016ENUMX
2017 BFD_RELOC_NS32K_IMM_32_PCREL
2018ENUMX
2019 BFD_RELOC_NS32K_DISP_8
2020ENUMX
2021 BFD_RELOC_NS32K_DISP_16
2022ENUMX
2023 BFD_RELOC_NS32K_DISP_32
2024ENUMX
2025 BFD_RELOC_NS32K_DISP_8_PCREL
2026ENUMX
2027 BFD_RELOC_NS32K_DISP_16_PCREL
2028ENUMX
2029 BFD_RELOC_NS32K_DISP_32_PCREL
2030ENUMDOC
2031 ns32k relocations
2032
2033ENUM
2034 BFD_RELOC_PPC_B26
e9f03cd4 2035ENUMX
0443af31 2036 BFD_RELOC_PPC_BA26
e9f03cd4 2037ENUMX
0443af31 2038 BFD_RELOC_PPC_TOC16
e9f03cd4
ILT
2039ENUMX
2040 BFD_RELOC_PPC_B16
2041ENUMX
2042 BFD_RELOC_PPC_B16_BRTAKEN
2043ENUMX
2044 BFD_RELOC_PPC_B16_BRNTAKEN
2045ENUMX
2046 BFD_RELOC_PPC_BA16
2047ENUMX
2048 BFD_RELOC_PPC_BA16_BRTAKEN
2049ENUMX
2050 BFD_RELOC_PPC_BA16_BRNTAKEN
2051ENUMX
2052 BFD_RELOC_PPC_COPY
2053ENUMX
2054 BFD_RELOC_PPC_GLOB_DAT
2055ENUMX
2056 BFD_RELOC_PPC_JMP_SLOT
2057ENUMX
2058 BFD_RELOC_PPC_RELATIVE
2059ENUMX
2060 BFD_RELOC_PPC_LOCAL24PC
2061ENUMX
2062 BFD_RELOC_PPC_EMB_NADDR32
2063ENUMX
2064 BFD_RELOC_PPC_EMB_NADDR16
2065ENUMX
2066 BFD_RELOC_PPC_EMB_NADDR16_LO
2067ENUMX
2068 BFD_RELOC_PPC_EMB_NADDR16_HI
2069ENUMX
2070 BFD_RELOC_PPC_EMB_NADDR16_HA
2071ENUMX
2072 BFD_RELOC_PPC_EMB_SDAI16
2073ENUMX
2074 BFD_RELOC_PPC_EMB_SDA2I16
2075ENUMX
2076 BFD_RELOC_PPC_EMB_SDA2REL
2077ENUMX
2078 BFD_RELOC_PPC_EMB_SDA21
2079ENUMX
2080 BFD_RELOC_PPC_EMB_MRKREF
2081ENUMX
2082 BFD_RELOC_PPC_EMB_RELSEC16
2083ENUMX
2084 BFD_RELOC_PPC_EMB_RELST_LO
2085ENUMX
2086 BFD_RELOC_PPC_EMB_RELST_HI
2087ENUMX
2088 BFD_RELOC_PPC_EMB_RELST_HA
2089ENUMX
2090 BFD_RELOC_PPC_EMB_BIT_FLD
2091ENUMX
2092 BFD_RELOC_PPC_EMB_RELSDA
0443af31 2093ENUMDOC
e9f03cd4 2094 Power(rs6000) and PowerPC relocations.
0443af31
KR
2095
2096ENUM
2097 BFD_RELOC_CTOR
2098ENUMDOC
2099 The type of reloc used to build a contructor table - at the moment
2100 probably a 32 bit wide absolute relocation, but the target can choose.
2101 It generally does map to one of the other relocation types.
2102
094e8be3
ILT
2103ENUM
2104 BFD_RELOC_ARM_PCREL_BRANCH
2105ENUMDOC
2106 ARM 26 bit pc-relative branch. The lowest two bits must be zero and are
2107 not stored in the instruction.
2108ENUM
2109 BFD_RELOC_ARM_IMMEDIATE
2110ENUMX
2111 BFD_RELOC_ARM_OFFSET_IMM
2112ENUMX
2113 BFD_RELOC_ARM_SHIFT_IMM
2114ENUMX
2115 BFD_RELOC_ARM_SWI
2116ENUMX
2117 BFD_RELOC_ARM_MULTI
2118ENUMX
2119 BFD_RELOC_ARM_CP_OFF_IMM
e9f03cd4
ILT
2120ENUMX
2121 BFD_RELOC_ARM_ADR_IMM
2122ENUMX
2123 BFD_RELOC_ARM_LDR_IMM
2124ENUMX
2125 BFD_RELOC_ARM_LITERAL
2126ENUMX
2127 BFD_RELOC_ARM_IN_POOL
094e8be3
ILT
2128ENUMDOC
2129 These relocs are only used within the ARM assembler. They are not
2130 (at present) written to any object files.
2131
82b1edf7
KR
2132COMMENT
2133{* start-sanitize-arc *}
2134ENUM
2135 BFD_RELOC_ARC_B22_PCREL
2136ENUMDOC
2137 Argonaut RISC Core (ARC) relocs.
2138 ARC 22 bit pc-relative branch. The lowest two bits must be zero and are
e9f03cd4
ILT
2139 not stored in the instruction. The high 20 bits are installed in bits 26
2140 through 7 of the instruction.
2141ENUM
2142 BFD_RELOC_ARC_B26
2143ENUMDOC
2144 ARC 26 bit absolute branch. The lowest two bits must be zero and are not
2145 stored in the instruction. The high 24 bits are installed in bits 23
2146 through 0.
82b1edf7
KR
2147COMMENT
2148{* end-sanitize-arc *}
0443af31
KR
2149ENDSENUM
2150 BFD_RELOC_UNUSED
e98e6ec1
SC
2151CODE_FRAGMENT
2152.
0443af31 2153.typedef enum bfd_reloc_code_real bfd_reloc_code_real_type;
2cf44d7b
SC
2154*/
2155
2156
0cda46cf 2157/*
c188b0be 2158FUNCTION
0cda46cf 2159 bfd_reloc_type_lookup
2cf44d7b 2160
e98e6ec1 2161SYNOPSIS
e9f03cd4 2162 reloc_howto_type *
3860075f 2163 bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code);
e98e6ec1 2164
0cda46cf 2165DESCRIPTION
4c3721d5 2166 Return a pointer to a howto structure which, when
c188b0be 2167 invoked, will perform the relocation @var{code} on data from the
0cda46cf 2168 architecture noted.
2cf44d7b 2169
2cf44d7b
SC
2170*/
2171
2172
e9f03cd4 2173reloc_howto_type *
326e32d7
ILT
2174bfd_reloc_type_lookup (abfd, code)
2175 bfd *abfd;
2176 bfd_reloc_code_real_type code;
2cf44d7b 2177{
8070f29d 2178 return BFD_SEND (abfd, reloc_type_lookup, (abfd, code));
2cf44d7b
SC
2179}
2180
0cda46cf 2181static reloc_howto_type bfd_howto_32 =
326e32d7 2182HOWTO (0, 00, 2, 32, false, 0, complain_overflow_bitfield, 0, "VRT32", false, 0xffffffff, 0xffffffff, true);
2cf44d7b
SC
2183
2184
0cda46cf 2185/*
e98e6ec1 2186INTERNAL_FUNCTION
0cda46cf
SC
2187 bfd_default_reloc_type_lookup
2188
0cda46cf 2189SYNOPSIS
e9f03cd4 2190 reloc_howto_type *bfd_default_reloc_type_lookup
326e32d7 2191 (bfd *abfd, bfd_reloc_code_real_type code);
0cda46cf 2192
e98e6ec1 2193DESCRIPTION
65cab589 2194 Provides a default relocation lookup routine for any architecture.
e98e6ec1
SC
2195
2196
0cda46cf 2197*/
65cab589 2198
e9f03cd4 2199reloc_howto_type *
326e32d7
ILT
2200bfd_default_reloc_type_lookup (abfd, code)
2201 bfd *abfd;
2202 bfd_reloc_code_real_type code;
0cda46cf 2203{
326e32d7 2204 switch (code)
0cda46cf 2205 {
65cab589
DM
2206 case BFD_RELOC_CTOR:
2207 /* The type of reloc used in a ctor, which will be as wide as the
fb32909a 2208 address - so either a 64, 32, or 16 bitter. */
326e32d7
ILT
2209 switch (bfd_get_arch_info (abfd)->bits_per_address)
2210 {
2211 case 64:
2212 BFD_FAIL ();
2213 case 32:
2214 return &bfd_howto_32;
2215 case 16:
2216 BFD_FAIL ();
2217 default:
2218 BFD_FAIL ();
2219 }
65cab589 2220 default:
326e32d7 2221 BFD_FAIL ();
0cda46cf 2222 }
e9f03cd4 2223 return (reloc_howto_type *) NULL;
0cda46cf 2224}
e98e6ec1 2225
0443af31
KR
2226/*
2227FUNCTION
2228 bfd_get_reloc_code_name
2229
2230SYNOPSIS
2231 const char *bfd_get_reloc_code_name (bfd_reloc_code_real_type code);
2232
2233DESCRIPTION
2234 Provides a printable name for the supplied relocation code.
2235 Useful mainly for printing error messages.
2236*/
2237
2238const char *
2239bfd_get_reloc_code_name (code)
2240 bfd_reloc_code_real_type code;
2241{
2242 if (code > BFD_RELOC_UNUSED)
2243 return 0;
2244 return bfd_reloc_code_real_names[(int)code];
2245}
e98e6ec1 2246
d58b7049
SC
2247/*
2248INTERNAL_FUNCTION
2249 bfd_generic_relax_section
2250
2251SYNOPSIS
2252 boolean bfd_generic_relax_section
2253 (bfd *abfd,
2254 asection *section,
4c3721d5 2255 struct bfd_link_info *,
326e32d7 2256 boolean *);
d58b7049
SC
2257
2258DESCRIPTION
2259 Provides default handling for relaxing for back ends which
8070f29d 2260 don't do relaxing -- i.e., does nothing.
d58b7049
SC
2261*/
2262
563eb766 2263/*ARGSUSED*/
d58b7049 2264boolean
326e32d7 2265bfd_generic_relax_section (abfd, section, link_info, again)
4c3721d5
ILT
2266 bfd *abfd;
2267 asection *section;
2268 struct bfd_link_info *link_info;
326e32d7 2269 boolean *again;
d58b7049 2270{
326e32d7
ILT
2271 *again = false;
2272 return true;
d58b7049 2273}
326e32d7 2274
e98e6ec1
SC
2275/*
2276INTERNAL_FUNCTION
2277 bfd_generic_get_relocated_section_contents
2278
2279SYNOPSIS
2280 bfd_byte *
65cab589 2281 bfd_generic_get_relocated_section_contents (bfd *abfd,
4c3721d5
ILT
2282 struct bfd_link_info *link_info,
2283 struct bfd_link_order *link_order,
65cab589 2284 bfd_byte *data,
4c3721d5
ILT
2285 boolean relocateable,
2286 asymbol **symbols);
e98e6ec1
SC
2287
2288DESCRIPTION
2289 Provides default handling of relocation effort for back ends
2290 which can't be bothered to do it efficiently.
2291
2292*/
2293
2294bfd_byte *
4c3721d5
ILT
2295bfd_generic_get_relocated_section_contents (abfd, link_info, link_order, data,
2296 relocateable, symbols)
2297 bfd *abfd;
2298 struct bfd_link_info *link_info;
2299 struct bfd_link_order *link_order;
2300 bfd_byte *data;
2301 boolean relocateable;
2302 asymbol **symbols;
e98e6ec1 2303{
e98e6ec1 2304 /* Get enough memory to hold the stuff */
4c3721d5
ILT
2305 bfd *input_bfd = link_order->u.indirect.section->owner;
2306 asection *input_section = link_order->u.indirect.section;
e98e6ec1 2307
326e32d7 2308 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
80425e6c 2309 arelent **reloc_vector = NULL;
326e32d7
ILT
2310 long reloc_count;
2311
2312 if (reloc_size < 0)
2313 goto error_return;
80425e6c 2314
e9f03cd4 2315 reloc_vector = (arelent **) bfd_malloc ((size_t) reloc_size);
326e32d7 2316 if (reloc_vector == NULL && reloc_size != 0)
e9f03cd4 2317 goto error_return;
326e32d7 2318
e98e6ec1 2319 /* read in the section */
326e32d7
ILT
2320 if (!bfd_get_section_contents (input_bfd,
2321 input_section,
2322 (PTR) data,
2323 0,
2324 input_section->_raw_size))
80425e6c
JK
2325 goto error_return;
2326
2327 /* We're not relaxing the section, so just copy the size info */
e98e6ec1
SC
2328 input_section->_cooked_size = input_section->_raw_size;
2329 input_section->reloc_done = true;
e98e6ec1 2330
326e32d7
ILT
2331 reloc_count = bfd_canonicalize_reloc (input_bfd,
2332 input_section,
2333 reloc_vector,
2334 symbols);
2335 if (reloc_count < 0)
80425e6c
JK
2336 goto error_return;
2337
326e32d7
ILT
2338 if (reloc_count > 0)
2339 {
2340 arelent **parent;
2341 for (parent = reloc_vector; *parent != (arelent *) NULL;
2342 parent++)
65cab589 2343 {
326e32d7
ILT
2344 char *error_message = (char *) NULL;
2345 bfd_reloc_status_type r =
2346 bfd_perform_relocation (input_bfd,
2347 *parent,
2348 (PTR) data,
2349 input_section,
2350 relocateable ? abfd : (bfd *) NULL,
2351 &error_message);
2352
2353 if (relocateable)
2354 {
2355 asection *os = input_section->output_section;
65cab589 2356
326e32d7
ILT
2357 /* A partial link, so keep the relocs */
2358 os->orelocation[os->reloc_count] = *parent;
2359 os->reloc_count++;
2360 }
e98e6ec1 2361
326e32d7
ILT
2362 if (r != bfd_reloc_ok)
2363 {
2364 switch (r)
2365 {
2366 case bfd_reloc_undefined:
2367 if (!((*link_info->callbacks->undefined_symbol)
2368 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
2369 input_bfd, input_section, (*parent)->address)))
2370 goto error_return;
2371 break;
2372 case bfd_reloc_dangerous:
2373 BFD_ASSERT (error_message != (char *) NULL);
2374 if (!((*link_info->callbacks->reloc_dangerous)
2375 (link_info, error_message, input_bfd, input_section,
2376 (*parent)->address)))
2377 goto error_return;
2378 break;
2379 case bfd_reloc_overflow:
2380 if (!((*link_info->callbacks->reloc_overflow)
2381 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
2382 (*parent)->howto->name, (*parent)->addend,
2383 input_bfd, input_section, (*parent)->address)))
2384 goto error_return;
2385 break;
2386 case bfd_reloc_outofrange:
2387 default:
2388 abort ();
2389 break;
2390 }
e98e6ec1 2391
326e32d7
ILT
2392 }
2393 }
2394 }
80425e6c
JK
2395 if (reloc_vector != NULL)
2396 free (reloc_vector);
e98e6ec1
SC
2397 return data;
2398
326e32d7 2399error_return:
80425e6c
JK
2400 if (reloc_vector != NULL)
2401 free (reloc_vector);
2402 return NULL;
e98e6ec1 2403}
This page took 0.290856 seconds and 4 git commands to generate.