1 /* BFD back-end for Intel 960 b.out binaries.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006
4 Free Software Foundation, Inc.
5 Written by Cygnus Support.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
29 #include "libiberty.h"
31 #include "aout/stab_gnu.h"
32 #include "libaout.h" /* BFD a.out internal data structures. */
35 #define ABS32CODE_SHRUNK 1
40 #define ABS32_MAYBE_RELAXABLE 1
41 #define ABS32_WAS_RELAXABLE 2
46 static reloc_howto_type howto_reloc_callj
=
47 HOWTO (CALLJ
, 0, 2, 24, TRUE
, 0, complain_overflow_signed
, 0,"callj", TRUE
, 0x00ffffff, 0x00ffffff,FALSE
);
48 static reloc_howto_type howto_reloc_abs32
=
49 HOWTO (ABS32
, 0, 2, 32, FALSE
, 0, complain_overflow_bitfield
,0,"abs32", TRUE
, 0xffffffff,0xffffffff,FALSE
);
50 static reloc_howto_type howto_reloc_pcrel24
=
51 HOWTO (PCREL24
, 0, 2, 24, TRUE
, 0, complain_overflow_signed
,0,"pcrel24", TRUE
, 0x00ffffff,0x00ffffff,FALSE
);
52 static reloc_howto_type howto_reloc_pcrel13
=
53 HOWTO (PCREL13
, 0, 2, 13, TRUE
, 0, complain_overflow_signed
,0,"pcrel13", TRUE
, 0x00001fff,0x00001fff,FALSE
);
54 static reloc_howto_type howto_reloc_abs32codeshrunk
=
55 HOWTO (ABS32CODE_SHRUNK
, 0, 2, 24, TRUE
, 0, complain_overflow_signed
, 0,"callx->callj", TRUE
, 0x00ffffff, 0x00ffffff,FALSE
);
56 static reloc_howto_type howto_reloc_abs32code
=
57 HOWTO (ABS32CODE
, 0, 2, 32, FALSE
, 0, complain_overflow_bitfield
,0,"callx", TRUE
, 0xffffffff,0xffffffff,FALSE
);
59 static reloc_howto_type howto_align_table
[] =
61 HOWTO (ALIGNER
, 0, 0x1, 0, FALSE
, 0, complain_overflow_dont
, 0, "align16", FALSE
, 0, 0, FALSE
),
62 HOWTO (ALIGNER
, 0, 0x3, 0, FALSE
, 0, complain_overflow_dont
, 0, "align32", FALSE
, 0, 0, FALSE
),
63 HOWTO (ALIGNER
, 0, 0x7, 0, FALSE
, 0, complain_overflow_dont
, 0, "align64", FALSE
, 0, 0, FALSE
),
64 HOWTO (ALIGNER
, 0, 0xf, 0, FALSE
, 0, complain_overflow_dont
, 0, "align128", FALSE
, 0, 0, FALSE
),
67 static reloc_howto_type howto_done_align_table
[] =
69 HOWTO (ALIGNDONE
, 0x1, 0x1, 0, FALSE
, 0, complain_overflow_dont
, 0, "donealign16", FALSE
, 0, 0, FALSE
),
70 HOWTO (ALIGNDONE
, 0x3, 0x3, 0, FALSE
, 0, complain_overflow_dont
, 0, "donealign32", FALSE
, 0, 0, FALSE
),
71 HOWTO (ALIGNDONE
, 0x7, 0x7, 0, FALSE
, 0, complain_overflow_dont
, 0, "donealign64", FALSE
, 0, 0, FALSE
),
72 HOWTO (ALIGNDONE
, 0xf, 0xf, 0, FALSE
, 0, complain_overflow_dont
, 0, "donealign128", FALSE
, 0, 0, FALSE
),
75 /* Swaps the information in an executable header taken from a raw byte
76 stream memory image, into the internal exec_header structure. */
79 bout_swap_exec_header_in (bfd
*abfd
,
80 struct external_exec
*bytes
,
81 struct internal_exec
*execp
)
83 /* Now fill in fields in the execp, from the bytes in the raw data. */
84 execp
->a_info
= H_GET_32 (abfd
, bytes
->e_info
);
85 execp
->a_text
= GET_WORD (abfd
, bytes
->e_text
);
86 execp
->a_data
= GET_WORD (abfd
, bytes
->e_data
);
87 execp
->a_bss
= GET_WORD (abfd
, bytes
->e_bss
);
88 execp
->a_syms
= GET_WORD (abfd
, bytes
->e_syms
);
89 execp
->a_entry
= GET_WORD (abfd
, bytes
->e_entry
);
90 execp
->a_trsize
= GET_WORD (abfd
, bytes
->e_trsize
);
91 execp
->a_drsize
= GET_WORD (abfd
, bytes
->e_drsize
);
92 execp
->a_tload
= GET_WORD (abfd
, bytes
->e_tload
);
93 execp
->a_dload
= GET_WORD (abfd
, bytes
->e_dload
);
94 execp
->a_talign
= bytes
->e_talign
[0];
95 execp
->a_dalign
= bytes
->e_dalign
[0];
96 execp
->a_balign
= bytes
->e_balign
[0];
97 execp
->a_relaxable
= bytes
->e_relaxable
[0];
100 /* Swaps the information in an internal exec header structure into the
101 supplied buffer ready for writing to disk. */
104 bout_swap_exec_header_out (bfd
*abfd
,
105 struct internal_exec
*execp
,
106 struct external_exec
*bytes
)
108 /* Now fill in fields in the raw data, from the fields in the exec struct. */
109 H_PUT_32 (abfd
, execp
->a_info
, bytes
->e_info
);
110 PUT_WORD (abfd
, execp
->a_text
, bytes
->e_text
);
111 PUT_WORD (abfd
, execp
->a_data
, bytes
->e_data
);
112 PUT_WORD (abfd
, execp
->a_bss
, bytes
->e_bss
);
113 PUT_WORD (abfd
, execp
->a_syms
, bytes
->e_syms
);
114 PUT_WORD (abfd
, execp
->a_entry
, bytes
->e_entry
);
115 PUT_WORD (abfd
, execp
->a_trsize
, bytes
->e_trsize
);
116 PUT_WORD (abfd
, execp
->a_drsize
, bytes
->e_drsize
);
117 PUT_WORD (abfd
, execp
->a_tload
, bytes
->e_tload
);
118 PUT_WORD (abfd
, execp
->a_dload
, bytes
->e_dload
);
119 bytes
->e_talign
[0] = execp
->a_talign
;
120 bytes
->e_dalign
[0] = execp
->a_dalign
;
121 bytes
->e_balign
[0] = execp
->a_balign
;
122 bytes
->e_relaxable
[0] = execp
->a_relaxable
;
125 /* Finish up the opening of a b.out file for reading. Fill in all the
126 fields that are not handled by common code. */
128 static const bfd_target
*
129 b_out_callback (bfd
*abfd
)
131 struct internal_exec
*execp
= exec_hdr (abfd
);
132 unsigned long bss_start
;
134 /* Architecture and machine type. */
135 bfd_set_arch_mach (abfd
,
136 bfd_arch_i960
, /* B.out only used on i960. */
137 bfd_mach_i960_core
/* Default. */
140 /* The positions of the string table and symbol table. */
141 obj_str_filepos (abfd
) = N_STROFF (*execp
);
142 obj_sym_filepos (abfd
) = N_SYMOFF (*execp
);
144 /* The alignments of the sections. */
145 obj_textsec (abfd
)->alignment_power
= execp
->a_talign
;
146 obj_datasec (abfd
)->alignment_power
= execp
->a_dalign
;
147 obj_bsssec (abfd
)->alignment_power
= execp
->a_balign
;
149 /* The starting addresses of the sections. */
150 obj_textsec (abfd
)->vma
= execp
->a_tload
;
151 obj_datasec (abfd
)->vma
= execp
->a_dload
;
153 obj_textsec (abfd
)->lma
= obj_textsec (abfd
)->vma
;
154 obj_datasec (abfd
)->lma
= obj_datasec (abfd
)->vma
;
156 /* And reload the sizes, since the aout module zaps them. */
157 obj_textsec (abfd
)->size
= execp
->a_text
;
159 bss_start
= execp
->a_dload
+ execp
->a_data
; /* BSS = end of data section. */
160 obj_bsssec (abfd
)->vma
= align_power (bss_start
, execp
->a_balign
);
162 obj_bsssec (abfd
)->lma
= obj_bsssec (abfd
)->vma
;
164 /* The file positions of the sections. */
165 obj_textsec (abfd
)->filepos
= N_TXTOFF (*execp
);
166 obj_datasec (abfd
)->filepos
= N_DATOFF (*execp
);
168 /* The file positions of the relocation info. */
169 obj_textsec (abfd
)->rel_filepos
= N_TROFF (*execp
);
170 obj_datasec (abfd
)->rel_filepos
= N_DROFF (*execp
);
172 adata (abfd
).page_size
= 1; /* Not applicable. */
173 adata (abfd
).segment_size
= 1; /* Not applicable. */
174 adata (abfd
).exec_bytes_size
= EXEC_BYTES_SIZE
;
176 if (execp
->a_relaxable
)
177 abfd
->flags
|= BFD_IS_RELAXABLE
;
181 static const bfd_target
*
182 b_out_object_p (bfd
*abfd
)
184 struct internal_exec anexec
;
185 struct external_exec exec_bytes
;
186 bfd_size_type amt
= EXEC_BYTES_SIZE
;
188 if (bfd_bread ((void *) &exec_bytes
, amt
, abfd
) != amt
)
190 if (bfd_get_error () != bfd_error_system_call
)
191 bfd_set_error (bfd_error_wrong_format
);
195 anexec
.a_info
= H_GET_32 (abfd
, exec_bytes
.e_info
);
197 if (N_BADMAG (anexec
))
199 bfd_set_error (bfd_error_wrong_format
);
203 bout_swap_exec_header_in (abfd
, &exec_bytes
, &anexec
);
204 return aout_32_some_aout_object_p (abfd
, &anexec
, b_out_callback
);
207 struct bout_data_struct
210 struct internal_exec e
;
214 b_out_mkobject (bfd
*abfd
)
216 struct bout_data_struct
*rawptr
;
217 bfd_size_type amt
= sizeof (struct bout_data_struct
);
219 rawptr
= bfd_zalloc (abfd
, amt
);
223 abfd
->tdata
.bout_data
= rawptr
;
224 exec_hdr (abfd
) = &rawptr
->e
;
226 obj_textsec (abfd
) = NULL
;
227 obj_datasec (abfd
) = NULL
;
228 obj_bsssec (abfd
) = NULL
;
234 b_out_symbol_cmp (const void * a_ptr
, const void * b_ptr
)
236 struct aout_symbol
** a
= (struct aout_symbol
**) a_ptr
;
237 struct aout_symbol
** b
= (struct aout_symbol
**) b_ptr
;
241 /* Primary key is address. */
242 sec
= bfd_get_section (&(*a
)->symbol
);
243 av
= sec
->output_section
->vma
+ sec
->output_offset
+ (*a
)->symbol
.value
;
244 sec
= bfd_get_section (&(*b
)->symbol
);
245 bv
= sec
->output_section
->vma
+ sec
->output_offset
+ (*b
)->symbol
.value
;
252 /* Secondary key puts CALLNAME syms last and BALNAME syms first,
253 so that they have the best chance of being contiguous. */
254 if (IS_BALNAME ((*a
)->other
) || IS_CALLNAME ((*b
)->other
))
256 if (IS_CALLNAME ((*a
)->other
) || IS_BALNAME ((*b
)->other
))
263 b_out_squirt_out_relocs (bfd
*abfd
, asection
*section
)
270 unsigned int count
= section
->reloc_count
;
271 struct relocation_info
*native
, *natptr
;
272 bfd_size_type natsize
;
273 int extern_mask
, pcrel_mask
, len_2
, callj_mask
;
278 generic
= section
->orelocation
;
279 natsize
= (bfd_size_type
) count
* sizeof (struct relocation_info
);
280 native
= bfd_malloc (natsize
);
281 if (!native
&& natsize
!= 0)
284 if (bfd_header_big_endian (abfd
))
286 /* Big-endian bit field allocation order. */
296 /* Little-endian bit field allocation order. */
305 for (natptr
= native
; count
> 0; --count
, ++natptr
, ++generic
)
307 arelent
*g
= *generic
;
308 unsigned char *raw
= (unsigned char *) natptr
;
309 asymbol
*sym
= *(g
->sym_ptr_ptr
);
310 asection
*output_section
= sym
->section
->output_section
;
312 H_PUT_32 (abfd
, g
->address
, raw
);
313 /* Find a type in the output format which matches the input howto -
314 at the moment we assume input format == output format FIXME!! */
316 /* FIXME: Need callj stuff here, and to check the howto entries to
317 be sure they are real for this architecture. */
318 if (g
->howto
== &howto_reloc_callj
)
319 raw
[7] = callj_mask
+ pcrel_mask
+ len_2
;
320 else if (g
->howto
== &howto_reloc_pcrel24
)
321 raw
[7] = pcrel_mask
+ len_2
;
322 else if (g
->howto
== &howto_reloc_pcrel13
)
323 raw
[7] = pcrel_mask
+ len_1
;
324 else if (g
->howto
== &howto_reloc_abs32code
)
325 raw
[7] = len_2
+ incode_mask
;
326 else if (g
->howto
>= howto_align_table
327 && g
->howto
<= (howto_align_table
+ ARRAY_SIZE (howto_align_table
) - 1))
329 /* symnum == -2; extern_mask not set, pcrel_mask set. */
333 | ((g
->howto
- howto_align_table
) << 1));
339 /* Already mucked with r_extern, r_idx. */;
340 else if (bfd_is_com_section (output_section
)
341 || bfd_is_abs_section (output_section
)
342 || bfd_is_und_section (output_section
))
344 if (bfd_abs_section_ptr
->symbol
== sym
)
346 /* Whoops, looked like an abs symbol, but is really an offset
347 from the abs section. */
353 /* Fill in symbol. */
355 r_idx
= (*g
->sym_ptr_ptr
)->udata
.i
;
360 /* Just an ordinary section. */
362 r_idx
= output_section
->target_index
;
365 if (bfd_header_big_endian (abfd
))
367 raw
[4] = (unsigned char) (r_idx
>> 16);
368 raw
[5] = (unsigned char) (r_idx
>> 8);
369 raw
[6] = (unsigned char) (r_idx
);
373 raw
[6] = (unsigned char) (r_idx
>> 16);
374 raw
[5] = (unsigned char) (r_idx
>> 8);
375 raw
[4] = (unsigned char) (r_idx
);
379 raw
[7] |= extern_mask
;
382 if (bfd_bwrite ((void *) native
, natsize
, abfd
) != natsize
)
394 b_out_write_object_contents (bfd
*abfd
)
396 struct external_exec swapped_hdr
;
399 if (! aout_32_make_sections (abfd
))
402 exec_hdr (abfd
)->a_info
= BMAGIC
;
404 exec_hdr (abfd
)->a_text
= obj_textsec (abfd
)->size
;
405 exec_hdr (abfd
)->a_data
= obj_datasec (abfd
)->size
;
406 exec_hdr (abfd
)->a_bss
= obj_bsssec (abfd
)->size
;
407 exec_hdr (abfd
)->a_syms
= bfd_get_symcount (abfd
) * 12;
408 exec_hdr (abfd
)->a_entry
= bfd_get_start_address (abfd
);
409 exec_hdr (abfd
)->a_trsize
= (obj_textsec (abfd
)->reloc_count
) * 8;
410 exec_hdr (abfd
)->a_drsize
= (obj_datasec (abfd
)->reloc_count
) * 8;
412 exec_hdr (abfd
)->a_talign
= obj_textsec (abfd
)->alignment_power
;
413 exec_hdr (abfd
)->a_dalign
= obj_datasec (abfd
)->alignment_power
;
414 exec_hdr (abfd
)->a_balign
= obj_bsssec (abfd
)->alignment_power
;
416 exec_hdr (abfd
)->a_tload
= obj_textsec (abfd
)->vma
;
417 exec_hdr (abfd
)->a_dload
= obj_datasec (abfd
)->vma
;
419 bout_swap_exec_header_out (abfd
, exec_hdr (abfd
), &swapped_hdr
);
421 amt
= EXEC_BYTES_SIZE
;
422 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0
423 || bfd_bwrite ((void *) &swapped_hdr
, amt
, abfd
) != amt
)
426 /* Now write out reloc info, followed by syms and strings */
427 if (bfd_get_symcount (abfd
) != 0)
429 /* Make sure {CALL,BAL}NAME symbols remain adjacent on output
430 by sorting. This is complicated by the fact that stabs are
431 also ordered. Solve this by shifting all stabs to the end
432 in order, then sorting the rest. */
434 asymbol
**outsyms
, **p
, **q
;
436 outsyms
= bfd_get_outsymbols (abfd
);
437 p
= outsyms
+ bfd_get_symcount (abfd
);
439 for (q
= p
--; p
>= outsyms
; p
--)
441 if ((*p
)->flags
& BSF_DEBUGGING
)
450 qsort (outsyms
, (size_t) (q
- outsyms
), sizeof (asymbol
*),
453 /* Back to your regularly scheduled program. */
454 if (bfd_seek (abfd
, (file_ptr
) (N_SYMOFF (*exec_hdr (abfd
))), SEEK_SET
)
458 if (! aout_32_write_syms (abfd
))
461 if (bfd_seek (abfd
, (file_ptr
) (N_TROFF (*exec_hdr (abfd
))), SEEK_SET
)
465 if (!b_out_squirt_out_relocs (abfd
, obj_textsec (abfd
)))
467 if (bfd_seek (abfd
, (file_ptr
) (N_DROFF (*exec_hdr (abfd
))), SEEK_SET
)
471 if (!b_out_squirt_out_relocs (abfd
, obj_datasec (abfd
)))
477 /* Some reloc hackery. */
479 #define CALLS 0x66003800 /* Template for 'calls' instruction */
480 #define BAL 0x0b000000 /* Template for 'bal' instruction */
481 #define BAL_MASK 0x00ffffff
482 #define BALX 0x85f00000 /* Template for 'balx' instruction */
483 #define BALX_MASK 0x0007ffff
484 #define CALL 0x09000000
485 #define PCREL13_MASK 0x1fff
487 #define output_addr(sec) ((sec)->output_offset+(sec)->output_section->vma)
490 get_value (arelent
*reloc
,
491 struct bfd_link_info
*link_info
,
492 asection
*input_section
)
495 asymbol
*symbol
= *(reloc
->sym_ptr_ptr
);
497 /* A symbol holds a pointer to a section, and an offset from the
498 base of the section. To relocate, we find where the section will
499 live in the output and add that in. */
500 if (bfd_is_und_section (symbol
->section
))
502 struct bfd_link_hash_entry
*h
;
504 /* The symbol is undefined in this BFD. Look it up in the
505 global linker hash table. FIXME: This should be changed when
506 we convert b.out to use a specific final_link function and
507 change the interface to bfd_relax_section to not require the
509 h
= bfd_wrapped_link_hash_lookup (input_section
->owner
, link_info
,
510 bfd_asymbol_name (symbol
),
512 if (h
!= (struct bfd_link_hash_entry
*) NULL
513 && (h
->type
== bfd_link_hash_defined
514 || h
->type
== bfd_link_hash_defweak
))
515 value
= h
->u
.def
.value
+ output_addr (h
->u
.def
.section
);
516 else if (h
!= (struct bfd_link_hash_entry
*) NULL
517 && h
->type
== bfd_link_hash_common
)
521 if (! ((*link_info
->callbacks
->undefined_symbol
)
522 (link_info
, bfd_asymbol_name (symbol
),
523 input_section
->owner
, input_section
, reloc
->address
,
530 value
= symbol
->value
+ output_addr (symbol
->section
);
532 /* Add the value contained in the relocation. */
533 value
+= reloc
->addend
;
538 /* Magic to turn callx into calljx. */
540 static bfd_reloc_status_type
541 calljx_callback (bfd
*abfd
,
542 struct bfd_link_info
*link_info
,
543 arelent
*reloc_entry
,
546 asection
*input_section
)
548 int word
= bfd_get_32 (abfd
, src
);
549 asymbol
*symbol_in
= *(reloc_entry
->sym_ptr_ptr
);
550 aout_symbol_type
*symbol
= aout_symbol (symbol_in
);
553 value
= get_value (reloc_entry
, link_info
, input_section
);
555 if (IS_CALLNAME (symbol
->other
))
557 aout_symbol_type
*balsym
= symbol
+1;
558 int inst
= bfd_get_32 (abfd
, (bfd_byte
*) src
-4);
560 /* The next symbol should be an N_BALNAME. */
561 BFD_ASSERT (IS_BALNAME (balsym
->other
));
564 bfd_put_32 (abfd
, (bfd_vma
) inst
, (bfd_byte
*) dst
-4);
566 value
= (symbol
->symbol
.value
567 + output_addr (symbol
->symbol
.section
));
570 word
+= value
+ reloc_entry
->addend
;
572 bfd_put_32 (abfd
, (bfd_vma
) word
, dst
);
576 /* Magic to turn call into callj. */
578 static bfd_reloc_status_type
579 callj_callback (bfd
*abfd
,
580 struct bfd_link_info
*link_info
,
581 arelent
*reloc_entry
,
585 asection
*input_section
,
586 bfd_boolean shrinking
)
588 int word
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ srcidx
);
589 asymbol
*symbol_in
= *(reloc_entry
->sym_ptr_ptr
);
590 aout_symbol_type
*symbol
= aout_symbol (symbol_in
);
593 value
= get_value (reloc_entry
, link_info
, input_section
);
595 if (IS_OTHER (symbol
->other
))
596 /* Call to a system procedure - replace code with system
598 word
= CALLS
| (symbol
->other
- 1);
600 else if (IS_CALLNAME (symbol
->other
))
602 aout_symbol_type
*balsym
= symbol
+1;
604 /* The next symbol should be an N_BALNAME. */
605 BFD_ASSERT (IS_BALNAME (balsym
->other
));
607 /* We are calling a leaf, so replace the call instruction with a
610 + output_addr (balsym
->symbol
.section
)
611 + balsym
->symbol
.value
+ reloc_entry
->addend
613 - output_addr (input_section
))
616 else if ((symbol
->symbol
.flags
& BSF_SECTION_SYM
) != 0)
618 /* A callj against a symbol in the same section is a fully
619 resolved relative call. We don't need to do anything here.
620 If the symbol is not in the same section, I'm not sure what
621 to do; fortunately, this case will probably never arise. */
622 BFD_ASSERT (! shrinking
);
623 BFD_ASSERT (symbol
->symbol
.section
== input_section
);
626 word
= CALL
| (((word
& BAL_MASK
)
628 + reloc_entry
->addend
629 - (shrinking
? dstidx
: 0)
630 - output_addr (input_section
))
633 bfd_put_32 (abfd
, (bfd_vma
) word
, (bfd_byte
*) data
+ dstidx
);
637 static reloc_howto_type
*
638 b_out_bfd_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
, bfd_reloc_code_real_type code
)
644 case BFD_RELOC_I960_CALLJ
:
645 return &howto_reloc_callj
;
648 return &howto_reloc_abs32
;
649 case BFD_RELOC_24_PCREL
:
650 return &howto_reloc_pcrel24
;
654 /* Allocate enough room for all the reloc entries, plus pointers to them all. */
657 b_out_slurp_reloc_table (bfd
*abfd
, sec_ptr asect
, asymbol
**symbols
)
659 struct relocation_info
*rptr
;
660 unsigned int counter
;
662 int extern_mask
, pcrel_mask
, callj_mask
, length_shift
;
665 bfd_vma prev_addr
= 0;
667 bfd_size_type reloc_size
, amt
;
668 struct relocation_info
*relocs
;
669 arelent
*reloc_cache
;
671 if (asect
->relocation
)
674 if (!aout_32_slurp_symbol_table (abfd
))
677 if (asect
== obj_datasec (abfd
))
678 reloc_size
= exec_hdr (abfd
)->a_drsize
;
679 else if (asect
== obj_textsec (abfd
))
680 reloc_size
= exec_hdr (abfd
)->a_trsize
;
681 else if (asect
== obj_bsssec (abfd
))
685 bfd_set_error (bfd_error_invalid_operation
);
689 if (bfd_seek (abfd
, asect
->rel_filepos
, SEEK_SET
) != 0)
691 count
= reloc_size
/ sizeof (struct relocation_info
);
693 relocs
= bfd_malloc (reloc_size
);
694 if (!relocs
&& reloc_size
!= 0)
697 amt
= ((bfd_size_type
) count
+ 1) * sizeof (arelent
);
698 reloc_cache
= bfd_malloc (amt
);
706 if (bfd_bread ((void *) relocs
, reloc_size
, abfd
) != reloc_size
)
714 if (bfd_header_big_endian (abfd
))
716 /* Big-endian bit field allocation order. */
726 /* Little-endian bit field allocation order. */
735 for (rptr
= relocs
, cache_ptr
= reloc_cache
, counter
= 0;
737 counter
++, rptr
++, cache_ptr
++)
739 unsigned char *raw
= (unsigned char *)rptr
;
742 cache_ptr
->address
= H_GET_32 (abfd
, raw
+ 0);
743 cache_ptr
->howto
= 0;
745 if (bfd_header_big_endian (abfd
))
746 symnum
= (raw
[4] << 16) | (raw
[5] << 8) | raw
[6];
748 symnum
= (raw
[6] << 16) | (raw
[5] << 8) | raw
[4];
750 if (raw
[7] & extern_mask
)
752 /* If this is set then the r_index is an index into the symbol table;
753 if the bit is not set then r_index contains a section map.
754 We either fill in the sym entry with a pointer to the symbol,
755 or point to the correct section. */
756 cache_ptr
->sym_ptr_ptr
= symbols
+ symnum
;
757 cache_ptr
->addend
= 0;
761 /* In a.out symbols are relative to the beginning of the
762 file rather than sections ?
763 (look in translate_from_native_sym_flags)
764 The reloc entry addend has added to it the offset into the
765 file of the data, so subtract the base to make the reloc
769 /* Sign-extend symnum from 24 bits to whatever host uses. */
774 cache_ptr
->sym_ptr_ptr
= (asymbol
**)NULL
;
779 cache_ptr
->sym_ptr_ptr
= obj_textsec (abfd
)->symbol_ptr_ptr
;
780 cache_ptr
->addend
= - obj_textsec (abfd
)->vma
;
784 cache_ptr
->sym_ptr_ptr
= obj_datasec (abfd
)->symbol_ptr_ptr
;
785 cache_ptr
->addend
= - obj_datasec (abfd
)->vma
;
789 cache_ptr
->sym_ptr_ptr
= obj_bsssec (abfd
)->symbol_ptr_ptr
;
790 cache_ptr
->addend
= - obj_bsssec (abfd
)->vma
;
794 cache_ptr
->sym_ptr_ptr
= obj_bsssec (abfd
)->symbol_ptr_ptr
;
795 cache_ptr
->addend
= 0;
797 case -2: /* .align */
798 if (raw
[7] & pcrel_mask
)
800 cache_ptr
->howto
= &howto_align_table
[(raw
[7] >> length_shift
) & 3];
801 cache_ptr
->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
808 cache_ptr
->addend
= 0;
816 /* The i960 only has a few relocation types:
817 abs 32-bit and pcrel 24bit. except for callj's! */
818 if (cache_ptr
->howto
!= 0)
820 else if (raw
[7] & callj_mask
)
822 cache_ptr
->howto
= &howto_reloc_callj
;
824 else if ( raw
[7] & pcrel_mask
)
826 if (raw
[7] & size_mask
)
827 cache_ptr
->howto
= &howto_reloc_pcrel13
;
829 cache_ptr
->howto
= &howto_reloc_pcrel24
;
833 if (raw
[7] & incode_mask
)
834 cache_ptr
->howto
= &howto_reloc_abs32code
;
836 cache_ptr
->howto
= &howto_reloc_abs32
;
839 if (cache_ptr
->address
< prev_addr
)
841 /* Ouch! this reloc is out of order, insert into the right place. */
843 arelent
*cursor
= cache_ptr
-1;
844 bfd_vma stop
= cache_ptr
->address
;
847 while (cursor
->address
> stop
&& cursor
>= reloc_cache
)
849 cursor
[1] = cursor
[0];
856 prev_addr
= cache_ptr
->address
;
861 asect
->relocation
= reloc_cache
;
862 asect
->reloc_count
= count
;
867 /* This is stupid. This function should be a boolean predicate. */
870 b_out_canonicalize_reloc (bfd
*abfd
,
878 if ((section
->flags
& SEC_CONSTRUCTOR
) != 0)
880 arelent_chain
*chain
= section
->constructor_chain
;
882 for (count
= 0; count
< section
->reloc_count
; count
++)
884 *relptr
++ = &chain
->relent
;
890 if (section
->relocation
== NULL
891 && ! b_out_slurp_reloc_table (abfd
, section
, symbols
))
894 tblptr
= section
->relocation
;
895 for (count
= 0; count
++ < section
->reloc_count
;)
896 *relptr
++ = tblptr
++;
901 return section
->reloc_count
;
905 b_out_get_reloc_upper_bound (bfd
*abfd
, sec_ptr asect
)
907 if (bfd_get_format (abfd
) != bfd_object
)
909 bfd_set_error (bfd_error_invalid_operation
);
913 if (asect
->flags
& SEC_CONSTRUCTOR
)
914 return sizeof (arelent
*) * (asect
->reloc_count
+ 1);
916 if (asect
== obj_datasec (abfd
))
917 return (sizeof (arelent
*) *
918 ((exec_hdr (abfd
)->a_drsize
/ sizeof (struct relocation_info
))
921 if (asect
== obj_textsec (abfd
))
922 return (sizeof (arelent
*) *
923 ((exec_hdr (abfd
)->a_trsize
/ sizeof (struct relocation_info
))
926 if (asect
== obj_bsssec (abfd
))
929 bfd_set_error (bfd_error_invalid_operation
);
935 b_out_set_section_contents (bfd
*abfd
,
937 const void * location
,
941 if (! abfd
->output_has_begun
)
943 /* Set by bfd.c handler. */
944 if (! aout_32_make_sections (abfd
))
947 obj_textsec (abfd
)->filepos
= sizeof (struct external_exec
);
948 obj_datasec (abfd
)->filepos
= obj_textsec (abfd
)->filepos
949 + obj_textsec (abfd
)->size
;
952 /* Regardless, once we know what we're doing, we might as well get going. */
953 if (bfd_seek (abfd
, section
->filepos
+ offset
, SEEK_SET
) != 0)
959 return bfd_bwrite ((void *) location
, count
, abfd
) == count
;
963 b_out_set_arch_mach (bfd
*abfd
,
964 enum bfd_architecture arch
,
965 unsigned long machine
)
967 bfd_default_set_arch_mach (abfd
, arch
, machine
);
969 if (arch
== bfd_arch_unknown
) /* Unknown machine arch is OK. */
972 if (arch
== bfd_arch_i960
) /* i960 default is OK. */
975 case bfd_mach_i960_core
:
976 case bfd_mach_i960_kb_sb
:
977 case bfd_mach_i960_mc
:
978 case bfd_mach_i960_xa
:
979 case bfd_mach_i960_ca
:
980 case bfd_mach_i960_ka_sa
:
981 case bfd_mach_i960_jx
:
982 case bfd_mach_i960_hx
:
993 b_out_sizeof_headers (bfd
*ignore_abfd ATTRIBUTE_UNUSED
,
994 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
996 return sizeof (struct external_exec
);
1000 perform_slip (bfd
*abfd
,
1002 asection
*input_section
,
1007 s
= _bfd_generic_link_get_symbols (abfd
);
1008 BFD_ASSERT (s
!= (asymbol
**) NULL
);
1010 /* Find all symbols past this point, and make them know
1016 if (p
->section
== input_section
)
1018 /* This was pointing into this section, so mangle it. */
1019 if (p
->value
> value
)
1023 if (p
->udata
.p
!= NULL
)
1025 struct generic_link_hash_entry
*h
;
1027 h
= (struct generic_link_hash_entry
*) p
->udata
.p
;
1028 BFD_ASSERT (h
->root
.type
== bfd_link_hash_defined
);
1029 h
->root
.u
.def
.value
-= slip
;
1030 BFD_ASSERT (h
->root
.u
.def
.value
== p
->value
);
1038 /* This routine works out if the thing we want to get to can be
1039 reached with a 24bit offset instead of a 32 bit one.
1040 If it can, then it changes the amode. */
1043 abs32code (bfd
*abfd
,
1044 asection
*input_section
,
1046 unsigned int shrink
,
1047 struct bfd_link_info
*link_info
)
1049 bfd_vma value
= get_value (r
, link_info
, input_section
);
1050 bfd_vma dot
= output_addr (input_section
) + r
->address
;
1053 /* See if the address we're looking at within 2^23 bytes of where
1054 we are, if so then we can use a small branch rather than the
1055 jump we were going to. */
1056 gap
= value
- (dot
- shrink
);
1058 if (-1 << 23 < (long)gap
&& (long)gap
< 1 << 23)
1060 /* Change the reloc type from 32bitcode possible 24, to 24bit
1062 r
->howto
= &howto_reloc_abs32codeshrunk
;
1063 /* The place to relc moves back by four bytes. */
1066 /* This will be four bytes smaller in the long run. */
1068 perform_slip (abfd
, 4, input_section
, r
->address
-shrink
+ 4);
1075 aligncode (bfd
*abfd
,
1076 asection
*input_section
,
1078 unsigned int shrink
)
1080 bfd_vma dot
= output_addr (input_section
) + r
->address
;
1084 unsigned int shrink_delta
;
1085 int size
= r
->howto
->size
;
1087 /* Reduce the size of the alignment so that it's still aligned but
1088 smaller - the current size is already the same size as or bigger
1089 than the alignment required. */
1091 /* Calculate the first byte following the padding before we optimize. */
1092 old_end
= ((dot
+ size
) & ~size
) + size
+1;
1093 /* Work out where the new end will be - remember that we're smaller
1094 than we used to be. */
1095 new_end
= ((dot
- shrink
+ size
) & ~size
);
1097 /* This is the new end. */
1098 gap
= old_end
- ((dot
+ size
) & ~size
);
1100 shrink_delta
= (old_end
- new_end
) - shrink
;
1104 /* Change the reloc so that it knows how far to align to. */
1105 r
->howto
= howto_done_align_table
+ (r
->howto
- howto_align_table
);
1107 /* Encode the stuff into the addend - for future use we need to
1108 know how big the reloc used to be. */
1109 r
->addend
= old_end
- dot
+ r
->address
;
1111 /* This will be N bytes smaller in the long run, adjust all the symbols. */
1112 perform_slip (abfd
, shrink_delta
, input_section
, r
->address
- shrink
);
1113 shrink
+= shrink_delta
;
1120 b_out_bfd_relax_section (bfd
*abfd
,
1122 struct bfd_link_info
*link_info
,
1125 /* Get enough memory to hold the stuff. */
1126 bfd
*input_bfd
= i
->owner
;
1127 asection
*input_section
= i
;
1128 unsigned int shrink
= 0 ;
1129 arelent
**reloc_vector
= NULL
;
1130 long reloc_size
= bfd_get_reloc_upper_bound (input_bfd
, input_section
);
1135 /* We only run this relaxation once. It might work to run it
1136 multiple times, but it hasn't been tested. */
1143 reloc_vector
= bfd_malloc ((bfd_size_type
) reloc_size
);
1144 if (reloc_vector
== NULL
&& reloc_size
!= 0)
1147 /* Get the relocs and think about them. */
1149 bfd_canonicalize_reloc (input_bfd
, input_section
, reloc_vector
,
1150 _bfd_generic_link_get_symbols (input_bfd
));
1151 if (reloc_count
< 0)
1153 if (reloc_count
> 0)
1157 for (parent
= reloc_vector
; *parent
; parent
++)
1159 arelent
*r
= *parent
;
1161 switch (r
->howto
->type
)
1164 /* An alignment reloc. */
1165 shrink
= aligncode (abfd
, input_section
, r
, shrink
);
1168 /* A 32bit reloc in an addressing mode. */
1169 shrink
= abs32code (input_bfd
, input_section
, r
, shrink
,
1172 case ABS32CODE_SHRUNK
:
1179 input_section
->size
-= shrink
;
1181 if (reloc_vector
!= NULL
)
1182 free (reloc_vector
);
1185 if (reloc_vector
!= NULL
)
1186 free (reloc_vector
);
1191 b_out_bfd_get_relocated_section_contents (bfd
*output_bfd
,
1192 struct bfd_link_info
*link_info
,
1193 struct bfd_link_order
*link_order
,
1195 bfd_boolean relocatable
,
1198 /* Get enough memory to hold the stuff. */
1199 bfd
*input_bfd
= link_order
->u
.indirect
.section
->owner
;
1200 asection
*input_section
= link_order
->u
.indirect
.section
;
1201 long reloc_size
= bfd_get_reloc_upper_bound (input_bfd
, input_section
);
1202 arelent
**reloc_vector
= NULL
;
1208 /* If producing relocatable output, don't bother to relax. */
1210 return bfd_generic_get_relocated_section_contents (output_bfd
, link_info
,
1215 reloc_vector
= bfd_malloc ((bfd_size_type
) reloc_size
);
1216 if (reloc_vector
== NULL
&& reloc_size
!= 0)
1219 /* Read in the section. */
1220 BFD_ASSERT (bfd_get_section_contents (input_bfd
,
1224 input_section
->size
));
1226 reloc_count
= bfd_canonicalize_reloc (input_bfd
,
1230 if (reloc_count
< 0)
1232 if (reloc_count
> 0)
1234 arelent
**parent
= reloc_vector
;
1236 unsigned int dst_address
= 0;
1237 unsigned int src_address
= 0;
1241 /* Find how long a run we can do. */
1242 while (dst_address
< link_order
->size
)
1247 /* Note that the relaxing didn't tie up the addresses in the
1248 relocation, so we use the original address to work out the
1249 run of non-relocated data. */
1250 BFD_ASSERT (reloc
->address
>= src_address
);
1251 run
= reloc
->address
- src_address
;
1255 run
= link_order
->size
- dst_address
;
1257 /* Copy the bytes. */
1258 for (idx
= 0; idx
< run
; idx
++)
1259 data
[dst_address
++] = data
[src_address
++];
1261 /* Now do the relocation. */
1264 switch (reloc
->howto
->type
)
1267 calljx_callback (input_bfd
, link_info
, reloc
,
1268 src_address
+ data
, dst_address
+ data
,
1274 bfd_put_32 (input_bfd
,
1275 (bfd_get_32 (input_bfd
, data
+ src_address
)
1276 + get_value (reloc
, link_info
, input_section
)),
1277 data
+ dst_address
);
1282 callj_callback (input_bfd
, link_info
, reloc
, data
,
1283 src_address
, dst_address
, input_section
,
1289 BFD_ASSERT (reloc
->addend
>= src_address
);
1290 BFD_ASSERT ((bfd_vma
) reloc
->addend
1291 <= input_section
->size
);
1292 src_address
= reloc
->addend
;
1293 dst_address
= ((dst_address
+ reloc
->howto
->size
)
1294 & ~reloc
->howto
->size
);
1296 case ABS32CODE_SHRUNK
:
1297 /* This used to be a callx, but we've found out that a
1298 callj will reach, so do the right thing. */
1299 callj_callback (input_bfd
, link_info
, reloc
, data
,
1300 src_address
+ 4, dst_address
, input_section
,
1307 long int word
= bfd_get_32 (input_bfd
,
1308 data
+ src_address
);
1311 value
= get_value (reloc
, link_info
, input_section
);
1312 word
= ((word
& ~BAL_MASK
)
1313 | (((word
& BAL_MASK
)
1315 - output_addr (input_section
)
1319 bfd_put_32 (input_bfd
, (bfd_vma
) word
, data
+ dst_address
);
1327 long int word
= bfd_get_32 (input_bfd
,
1328 data
+ src_address
);
1331 value
= get_value (reloc
, link_info
, input_section
);
1332 word
= ((word
& ~PCREL13_MASK
)
1333 | (((word
& PCREL13_MASK
)
1336 - output_addr (input_section
))
1339 bfd_put_32 (input_bfd
, (bfd_vma
) word
, data
+ dst_address
);
1351 if (reloc_vector
!= NULL
)
1352 free (reloc_vector
);
1355 if (reloc_vector
!= NULL
)
1356 free (reloc_vector
);
1361 /* Build the transfer vectors for Big and Little-Endian B.OUT files. */
1363 #define aout_32_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
1364 #define aout_32_close_and_cleanup aout_32_bfd_free_cached_info
1365 #define b_out_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
1366 #define b_out_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
1367 #define b_out_bfd_link_add_symbols _bfd_generic_link_add_symbols
1368 #define b_out_bfd_link_just_syms _bfd_generic_link_just_syms
1369 #define b_out_bfd_final_link _bfd_generic_final_link
1370 #define b_out_bfd_link_split_section _bfd_generic_link_split_section
1371 #define b_out_bfd_gc_sections bfd_generic_gc_sections
1372 #define b_out_bfd_merge_sections bfd_generic_merge_sections
1373 #define b_out_bfd_is_group_section bfd_generic_is_group_section
1374 #define b_out_bfd_discard_group bfd_generic_discard_group
1375 #define b_out_section_already_linked _bfd_generic_section_already_linked
1376 #define aout_32_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
1378 extern const bfd_target b_out_vec_little_host
;
1380 const bfd_target b_out_vec_big_host
=
1382 "b.out.big", /* Name. */
1383 bfd_target_aout_flavour
,
1384 BFD_ENDIAN_LITTLE
, /* Data byte order. */
1385 BFD_ENDIAN_BIG
, /* Header byte order. */
1386 (HAS_RELOC
| EXEC_P
| /* Object flags. */
1387 HAS_LINENO
| HAS_DEBUG
|
1388 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| BFD_IS_RELAXABLE
),
1389 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_CODE
| SEC_DATA
),
1390 '_', /* Symbol leading char. */
1391 ' ', /* AR_pad_char. */
1392 16, /* AR_max_namelen. */
1394 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
1395 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
1396 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* Data. */
1397 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
1398 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
1399 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* Headers. */
1400 {_bfd_dummy_target
, b_out_object_p
, /* bfd_check_format. */
1401 bfd_generic_archive_p
, _bfd_dummy_target
},
1402 {bfd_false
, b_out_mkobject
, /* bfd_set_format. */
1403 _bfd_generic_mkarchive
, bfd_false
},
1404 {bfd_false
, b_out_write_object_contents
, /* bfd_write_contents. */
1405 _bfd_write_archive_contents
, bfd_false
},
1407 BFD_JUMP_TABLE_GENERIC (aout_32
),
1408 BFD_JUMP_TABLE_COPY (_bfd_generic
),
1409 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
1410 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd
),
1411 BFD_JUMP_TABLE_SYMBOLS (aout_32
),
1412 BFD_JUMP_TABLE_RELOCS (b_out
),
1413 BFD_JUMP_TABLE_WRITE (b_out
),
1414 BFD_JUMP_TABLE_LINK (b_out
),
1415 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),
1417 & b_out_vec_little_host
,
1422 const bfd_target b_out_vec_little_host
=
1424 "b.out.little", /* Name. */
1425 bfd_target_aout_flavour
,
1426 BFD_ENDIAN_LITTLE
, /* Data byte order. */
1427 BFD_ENDIAN_LITTLE
, /* Header byte order. */
1428 (HAS_RELOC
| EXEC_P
| /* Object flags. */
1429 HAS_LINENO
| HAS_DEBUG
|
1430 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| BFD_IS_RELAXABLE
),
1431 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
| SEC_CODE
| SEC_DATA
),
1432 '_', /* Symbol leading char. */
1433 ' ', /* AR_pad_char. */
1434 16, /* AR_max_namelen. */
1435 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
1436 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
1437 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* Data. */
1438 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
1439 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
1440 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* Headers. */
1442 {_bfd_dummy_target
, b_out_object_p
, /* bfd_check_format. */
1443 bfd_generic_archive_p
, _bfd_dummy_target
},
1444 {bfd_false
, b_out_mkobject
, /* bfd_set_format. */
1445 _bfd_generic_mkarchive
, bfd_false
},
1446 {bfd_false
, b_out_write_object_contents
, /* bfd_write_contents. */
1447 _bfd_write_archive_contents
, bfd_false
},
1449 BFD_JUMP_TABLE_GENERIC (aout_32
),
1450 BFD_JUMP_TABLE_COPY (_bfd_generic
),
1451 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
1452 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd
),
1453 BFD_JUMP_TABLE_SYMBOLS (aout_32
),
1454 BFD_JUMP_TABLE_RELOCS (b_out
),
1455 BFD_JUMP_TABLE_WRITE (b_out
),
1456 BFD_JUMP_TABLE_LINK (b_out
),
1457 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),
1459 & b_out_vec_big_host
,