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