Add new field to bfd_target structure.
[deliverable/binutils-gdb.git] / bfd / bout.c
CommitLineData
252b5132 1/* BFD back-end for Intel 960 b.out binaries.
5f771d47
ILT
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
252b5132
RH
4 Written by Cygnus Support.
5
6This file is part of BFD, the Binary File Descriptor library.
7
8This program is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2 of the License, or
11(at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with this program; if not, write to the Free Software
20Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22
23#include "bfd.h"
24#include "sysdep.h"
25#include "libbfd.h"
26#include "bfdlink.h"
27#include "genlink.h"
28#include "bout.h"
29
30#include "aout/stab_gnu.h"
31#include "libaout.h" /* BFD a.out internal data structures */
32
33
34static int aligncode PARAMS ((bfd *abfd, asection *input_section,
35 arelent *r, unsigned int shrink));
36static void perform_slip PARAMS ((bfd *abfd, unsigned int slip,
37 asection *input_section, bfd_vma value));
38static boolean b_out_squirt_out_relocs PARAMS ((bfd *abfd, asection *section));
39static const bfd_target *b_out_callback PARAMS ((bfd *));
40static bfd_reloc_status_type calljx_callback
41 PARAMS ((bfd *, struct bfd_link_info *, arelent *, PTR src, PTR dst,
42 asection *));
43static bfd_reloc_status_type callj_callback
44 PARAMS ((bfd *, struct bfd_link_info *, arelent *, PTR data,
45 unsigned int srcidx, unsigned int dstidx, asection *, boolean));
46static bfd_vma get_value PARAMS ((arelent *, struct bfd_link_info *,
47 asection *));
48static int abs32code PARAMS ((bfd *, asection *, arelent *,
49 unsigned int, struct bfd_link_info *));
50static boolean b_out_bfd_relax_section PARAMS ((bfd *, asection *,
51 struct bfd_link_info *,
52 boolean *));
53static bfd_byte *b_out_bfd_get_relocated_section_contents
54 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
55 bfd_byte *, boolean, asymbol **));
56
57/* Swaps the information in an executable header taken from a raw byte
58 stream memory image, into the internal exec_header structure. */
59
60void
61bout_swap_exec_header_in (abfd, raw_bytes, execp)
62 bfd *abfd;
63 struct external_exec *raw_bytes;
64 struct internal_exec *execp;
65{
66 struct external_exec *bytes = (struct external_exec *)raw_bytes;
67
68 /* Now fill in fields in the execp, from the bytes in the raw data. */
69 execp->a_info = bfd_h_get_32 (abfd, bytes->e_info);
70 execp->a_text = GET_WORD (abfd, bytes->e_text);
71 execp->a_data = GET_WORD (abfd, bytes->e_data);
72 execp->a_bss = GET_WORD (abfd, bytes->e_bss);
73 execp->a_syms = GET_WORD (abfd, bytes->e_syms);
74 execp->a_entry = GET_WORD (abfd, bytes->e_entry);
75 execp->a_trsize = GET_WORD (abfd, bytes->e_trsize);
76 execp->a_drsize = GET_WORD (abfd, bytes->e_drsize);
77 execp->a_tload = GET_WORD (abfd, bytes->e_tload);
78 execp->a_dload = GET_WORD (abfd, bytes->e_dload);
79 execp->a_talign = bytes->e_talign[0];
80 execp->a_dalign = bytes->e_dalign[0];
81 execp->a_balign = bytes->e_balign[0];
82 execp->a_relaxable = bytes->e_relaxable[0];
83}
84
85/* Swaps the information in an internal exec header structure into the
86 supplied buffer ready for writing to disk. */
87
88PROTO(void, bout_swap_exec_header_out,
89 (bfd *abfd,
90 struct internal_exec *execp,
91 struct external_exec *raw_bytes));
92void
93bout_swap_exec_header_out (abfd, execp, raw_bytes)
94 bfd *abfd;
95 struct internal_exec *execp;
96 struct external_exec *raw_bytes;
97{
98 struct external_exec *bytes = (struct external_exec *)raw_bytes;
99
100 /* Now fill in fields in the raw data, from the fields in the exec struct. */
101 bfd_h_put_32 (abfd, execp->a_info , bytes->e_info);
102 PUT_WORD (abfd, execp->a_text , bytes->e_text);
103 PUT_WORD (abfd, execp->a_data , bytes->e_data);
104 PUT_WORD (abfd, execp->a_bss , bytes->e_bss);
105 PUT_WORD (abfd, execp->a_syms , bytes->e_syms);
106 PUT_WORD (abfd, execp->a_entry , bytes->e_entry);
107 PUT_WORD (abfd, execp->a_trsize, bytes->e_trsize);
108 PUT_WORD (abfd, execp->a_drsize, bytes->e_drsize);
109 PUT_WORD (abfd, execp->a_tload , bytes->e_tload);
110 PUT_WORD (abfd, execp->a_dload , bytes->e_dload);
111 bytes->e_talign[0] = execp->a_talign;
112 bytes->e_dalign[0] = execp->a_dalign;
113 bytes->e_balign[0] = execp->a_balign;
114 bytes->e_relaxable[0] = execp->a_relaxable;
115}
116
117
118static const bfd_target *
119b_out_object_p (abfd)
120 bfd *abfd;
121{
122 struct internal_exec anexec;
123 struct external_exec exec_bytes;
124
125 if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd)
126 != EXEC_BYTES_SIZE) {
127 if (bfd_get_error () != bfd_error_system_call)
128 bfd_set_error (bfd_error_wrong_format);
129 return 0;
130 }
131
132 anexec.a_info = bfd_h_get_32 (abfd, exec_bytes.e_info);
133
134 if (N_BADMAG (anexec)) {
135 bfd_set_error (bfd_error_wrong_format);
136 return 0;
137 }
138
139 bout_swap_exec_header_in (abfd, &exec_bytes, &anexec);
140 return aout_32_some_aout_object_p (abfd, &anexec, b_out_callback);
141}
142
143
144/* Finish up the opening of a b.out file for reading. Fill in all the
145 fields that are not handled by common code. */
146
147static const bfd_target *
148b_out_callback (abfd)
149 bfd *abfd;
150{
151 struct internal_exec *execp = exec_hdr (abfd);
152 unsigned long bss_start;
153
154 /* Architecture and machine type */
155 bfd_set_arch_mach(abfd,
156 bfd_arch_i960, /* B.out only used on i960 */
157 bfd_mach_i960_core /* Default */
158 );
159
160 /* The positions of the string table and symbol table. */
161 obj_str_filepos (abfd) = N_STROFF (*execp);
162 obj_sym_filepos (abfd) = N_SYMOFF (*execp);
163
164 /* The alignments of the sections */
165 obj_textsec (abfd)->alignment_power = execp->a_talign;
166 obj_datasec (abfd)->alignment_power = execp->a_dalign;
167 obj_bsssec (abfd)->alignment_power = execp->a_balign;
168
169 /* The starting addresses of the sections. */
170 obj_textsec (abfd)->vma = execp->a_tload;
171 obj_datasec (abfd)->vma = execp->a_dload;
172
173 obj_textsec (abfd)->lma = obj_textsec (abfd)->vma;
174 obj_datasec (abfd)->lma = obj_datasec (abfd)->vma;
175
176 /* And reload the sizes, since the aout module zaps them */
177 obj_textsec (abfd)->_raw_size = execp->a_text;
178
179 bss_start = execp->a_dload + execp->a_data; /* BSS = end of data section */
180 obj_bsssec (abfd)->vma = align_power (bss_start, execp->a_balign);
181
182 obj_bsssec (abfd)->lma = obj_bsssec (abfd)->vma;
183
184 /* The file positions of the sections */
185 obj_textsec (abfd)->filepos = N_TXTOFF(*execp);
186 obj_datasec (abfd)->filepos = N_DATOFF(*execp);
187
188 /* The file positions of the relocation info */
189 obj_textsec (abfd)->rel_filepos = N_TROFF(*execp);
190 obj_datasec (abfd)->rel_filepos = N_DROFF(*execp);
191
192 adata(abfd).page_size = 1; /* Not applicable. */
193 adata(abfd).segment_size = 1; /* Not applicable. */
194 adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE;
195
196 if (execp->a_relaxable)
197 abfd->flags |= BFD_IS_RELAXABLE;
198 return abfd->xvec;
199}
200
201struct bout_data_struct {
202 struct aoutdata a;
203 struct internal_exec e;
204};
205
206static boolean
207b_out_mkobject (abfd)
208 bfd *abfd;
209{
210 struct bout_data_struct *rawptr;
211
212 rawptr = (struct bout_data_struct *) bfd_zalloc (abfd, sizeof (struct bout_data_struct));
213 if (rawptr == NULL)
214 return false;
215
216 abfd->tdata.bout_data = rawptr;
217 exec_hdr (abfd) = &rawptr->e;
218
219 obj_textsec (abfd) = (asection *)NULL;
220 obj_datasec (abfd) = (asection *)NULL;
221 obj_bsssec (abfd) = (asection *)NULL;
222
223 return true;
224}
225
226static int
227b_out_symbol_cmp (a, b)
228 struct aout_symbol **a, **b;
229{
230 asection *sec;
231 bfd_vma av, bv;
232
233 /* Primary key is address */
234 sec = bfd_get_section (&(*a)->symbol);
235 av = sec->output_section->vma + sec->output_offset + (*a)->symbol.value;
236 sec = bfd_get_section (&(*b)->symbol);
237 bv = sec->output_section->vma + sec->output_offset + (*b)->symbol.value;
238
239 if (av < bv)
240 return -1;
241 if (av > bv)
242 return 1;
243
244 /* Secondary key puts CALLNAME syms last and BALNAME syms first, so
245 that they have the best chance of being contiguous. */
246 if (IS_BALNAME ((*a)->other) || IS_CALLNAME ((*b)->other))
247 return -1;
248 if (IS_CALLNAME ((*a)->other) || IS_BALNAME ((*b)->other))
249 return 1;
250
251 return 0;
252}
253
254static boolean
255b_out_write_object_contents (abfd)
256 bfd *abfd;
257{
258 struct external_exec swapped_hdr;
259
260 if (! aout_32_make_sections (abfd))
261 return false;
262
263 exec_hdr (abfd)->a_info = BMAGIC;
264
265 exec_hdr (abfd)->a_text = obj_textsec (abfd)->_raw_size;
266 exec_hdr (abfd)->a_data = obj_datasec (abfd)->_raw_size;
267 exec_hdr (abfd)->a_bss = obj_bsssec (abfd)->_raw_size;
268 exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) * sizeof (struct nlist);
269 exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd);
270 exec_hdr (abfd)->a_trsize = ((obj_textsec (abfd)->reloc_count) *
271 sizeof (struct relocation_info));
272 exec_hdr (abfd)->a_drsize = ((obj_datasec (abfd)->reloc_count) *
273 sizeof (struct relocation_info));
274
275 exec_hdr (abfd)->a_talign = obj_textsec (abfd)->alignment_power;
276 exec_hdr (abfd)->a_dalign = obj_datasec (abfd)->alignment_power;
277 exec_hdr (abfd)->a_balign = obj_bsssec (abfd)->alignment_power;
278
279 exec_hdr (abfd)->a_tload = obj_textsec (abfd)->vma;
280 exec_hdr (abfd)->a_dload = obj_datasec (abfd)->vma;
281
282 bout_swap_exec_header_out (abfd, exec_hdr (abfd), &swapped_hdr);
283
284 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
285 || (bfd_write ((PTR) &swapped_hdr, 1, EXEC_BYTES_SIZE, abfd)
286 != EXEC_BYTES_SIZE))
287 return false;
288
289 /* Now write out reloc info, followed by syms and strings */
290 if (bfd_get_symcount (abfd) != 0)
291 {
292 /* Make sure {CALL,BAL}NAME symbols remain adjacent on output
293 by sorting. This is complicated by the fact that stabs are
294 also ordered. Solve this by shifting all stabs to the end
295 in order, then sorting the rest. */
296
297 asymbol **outsyms, **p, **q;
298
299 outsyms = bfd_get_outsymbols (abfd);
300 p = outsyms + bfd_get_symcount (abfd);
301
302 for (q = p--; p >= outsyms; p--)
303 {
304 if ((*p)->flags & BSF_DEBUGGING)
305 {
306 asymbol *t = *--q;
307 *q = *p;
308 *p = t;
309 }
310 }
311
312 if (q > outsyms)
313 qsort (outsyms, q - outsyms, sizeof(asymbol*), b_out_symbol_cmp);
314
315 /* Back to your regularly scheduled program. */
316
317 if (bfd_seek (abfd, (file_ptr)(N_SYMOFF(*exec_hdr(abfd))), SEEK_SET)
318 != 0)
319 return false;
320
321 if (! aout_32_write_syms (abfd))
322 return false;
323
324 if (bfd_seek (abfd, (file_ptr)(N_TROFF(*exec_hdr(abfd))), SEEK_SET) != 0)
325 return false;
326
327 if (!b_out_squirt_out_relocs (abfd, obj_textsec (abfd))) return false;
328 if (bfd_seek (abfd, (file_ptr)(N_DROFF(*exec_hdr(abfd))), SEEK_SET)
329 != 0)
330 return false;
331
332 if (!b_out_squirt_out_relocs (abfd, obj_datasec (abfd))) return false;
333 }
334 return true;
335}
336\f
337/** Some reloc hackery */
338
339#define CALLS 0x66003800 /* Template for 'calls' instruction */
340#define BAL 0x0b000000 /* Template for 'bal' instruction */
341#define BAL_MASK 0x00ffffff
342#define BALX 0x85f00000 /* Template for 'balx' instruction */
343#define BALX_MASK 0x0007ffff
344#define CALL 0x09000000
345#define PCREL13_MASK 0x1fff
346
347
348#define output_addr(sec) ((sec)->output_offset+(sec)->output_section->vma)
349
350/* Magic to turn callx into calljx */
351static bfd_reloc_status_type
352calljx_callback (abfd, link_info, reloc_entry, src, dst, input_section)
353 bfd *abfd;
354 struct bfd_link_info *link_info;
355 arelent *reloc_entry;
356 PTR src;
357 PTR dst;
358 asection *input_section;
359{
360 int word = bfd_get_32 (abfd, src);
361 asymbol *symbol_in = *(reloc_entry->sym_ptr_ptr);
362 aout_symbol_type *symbol = aout_symbol (symbol_in);
363 bfd_vma value;
364
365 value = get_value (reloc_entry, link_info, input_section);
366
367 if (IS_CALLNAME (symbol->other))
368 {
369 aout_symbol_type *balsym = symbol+1;
370 int inst = bfd_get_32 (abfd, (bfd_byte *) src-4);
371 /* The next symbol should be an N_BALNAME */
372 BFD_ASSERT (IS_BALNAME (balsym->other));
373 inst &= BALX_MASK;
374 inst |= BALX;
375 bfd_put_32 (abfd, inst, (bfd_byte *) dst-4);
376 symbol = balsym;
377 value = (symbol->symbol.value
378 + output_addr (symbol->symbol.section));
379 }
380
381 word += value + reloc_entry->addend;
382
383 bfd_put_32(abfd, word, dst);
384 return bfd_reloc_ok;
385}
386
387
388/* Magic to turn call into callj */
389static bfd_reloc_status_type
390callj_callback (abfd, link_info, reloc_entry, data, srcidx, dstidx,
391 input_section, shrinking)
392 bfd *abfd;
393 struct bfd_link_info *link_info;
394 arelent *reloc_entry;
395 PTR data;
396 unsigned int srcidx;
397 unsigned int dstidx;
398 asection *input_section;
399 boolean shrinking;
400{
401 int word = bfd_get_32 (abfd, (bfd_byte *) data + srcidx);
402 asymbol *symbol_in = *(reloc_entry->sym_ptr_ptr);
403 aout_symbol_type *symbol = aout_symbol (symbol_in);
404 bfd_vma value;
405
406 value = get_value (reloc_entry, link_info, input_section);
407
408 if (IS_OTHER(symbol->other))
409 {
410 /* Call to a system procedure - replace code with system
411 procedure number. */
412 word = CALLS | (symbol->other - 1);
413 }
414 else if (IS_CALLNAME(symbol->other))
415 {
416 aout_symbol_type *balsym = symbol+1;
417
418 /* The next symbol should be an N_BALNAME. */
419 BFD_ASSERT(IS_BALNAME(balsym->other));
420
421 /* We are calling a leaf, so replace the call instruction with a
422 bal. */
423 word = BAL | ((word
424 + output_addr (balsym->symbol.section)
425 + balsym->symbol.value + reloc_entry->addend
426 - dstidx
427 - output_addr (input_section))
428 & BAL_MASK);
429 }
430 else if ((symbol->symbol.flags & BSF_SECTION_SYM) != 0)
431 {
432 /* A callj against a symbol in the same section is a fully
433 resolved relative call. We don't need to do anything here.
434 If the symbol is not in the same section, I'm not sure what
435 to do; fortunately, this case will probably never arise. */
436 BFD_ASSERT (! shrinking);
437 BFD_ASSERT (symbol->symbol.section == input_section);
438 }
439 else
440 {
441 word = CALL | (((word & BAL_MASK)
442 + value
443 + reloc_entry->addend
444 - (shrinking ? dstidx : 0)
445 - output_addr (input_section))
446 & BAL_MASK);
447 }
448 bfd_put_32(abfd, word, (bfd_byte *) data + dstidx);
449 return bfd_reloc_ok;
450}
451
452/* type rshift size bitsize pcrel bitpos absolute overflow check*/
453
454#define ABS32CODE 0
455#define ABS32CODE_SHRUNK 1
456#define PCREL24 2
457#define CALLJ 3
458#define ABS32 4
459#define PCREL13 5
460#define ABS32_MAYBE_RELAXABLE 1
461#define ABS32_WAS_RELAXABLE 2
462
463#define ALIGNER 10
464#define ALIGNDONE 11
465static reloc_howto_type howto_reloc_callj =
466HOWTO(CALLJ, 0, 2, 24, true, 0, complain_overflow_signed, 0,"callj", true, 0x00ffffff, 0x00ffffff,false);
467static reloc_howto_type howto_reloc_abs32 =
468HOWTO(ABS32, 0, 2, 32, false, 0, complain_overflow_bitfield,0,"abs32", true, 0xffffffff,0xffffffff,false);
469static reloc_howto_type howto_reloc_pcrel24 =
470HOWTO(PCREL24, 0, 2, 24, true, 0, complain_overflow_signed,0,"pcrel24", true, 0x00ffffff,0x00ffffff,false);
471
472static reloc_howto_type howto_reloc_pcrel13 =
473HOWTO(PCREL13, 0, 2, 13, true, 0, complain_overflow_signed,0,"pcrel13", true, 0x00001fff,0x00001fff,false);
474
475
476static reloc_howto_type howto_reloc_abs32codeshrunk =
477HOWTO(ABS32CODE_SHRUNK, 0, 2, 24, true, 0, complain_overflow_signed, 0,"callx->callj", true, 0x00ffffff, 0x00ffffff,false);
478
479static reloc_howto_type howto_reloc_abs32code =
480HOWTO(ABS32CODE, 0, 2, 32, false, 0, complain_overflow_bitfield,0,"callx", true, 0xffffffff,0xffffffff,false);
481
482static reloc_howto_type howto_align_table[] = {
483 HOWTO (ALIGNER, 0, 0x1, 0, false, 0, complain_overflow_dont, 0, "align16", false, 0, 0, false),
484 HOWTO (ALIGNER, 0, 0x3, 0, false, 0, complain_overflow_dont, 0, "align32", false, 0, 0, false),
485 HOWTO (ALIGNER, 0, 0x7, 0, false, 0, complain_overflow_dont, 0, "align64", false, 0, 0, false),
486 HOWTO (ALIGNER, 0, 0xf, 0, false, 0, complain_overflow_dont, 0, "align128", false, 0, 0, false),
487};
488
489static reloc_howto_type howto_done_align_table[] = {
490 HOWTO (ALIGNDONE, 0x1, 0x1, 0, false, 0, complain_overflow_dont, 0, "donealign16", false, 0, 0, false),
491 HOWTO (ALIGNDONE, 0x3, 0x3, 0, false, 0, complain_overflow_dont, 0, "donealign32", false, 0, 0, false),
492 HOWTO (ALIGNDONE, 0x7, 0x7, 0, false, 0, complain_overflow_dont, 0, "donealign64", false, 0, 0, false),
493 HOWTO (ALIGNDONE, 0xf, 0xf, 0, false, 0, complain_overflow_dont, 0, "donealign128", false, 0, 0, false),
494};
495
496static reloc_howto_type *
497b_out_bfd_reloc_type_lookup (abfd, code)
5f771d47 498 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
499 bfd_reloc_code_real_type code;
500{
501 switch (code)
502 {
503 default:
504 return 0;
505 case BFD_RELOC_I960_CALLJ:
506 return &howto_reloc_callj;
507 case BFD_RELOC_32:
508 case BFD_RELOC_CTOR:
509 return &howto_reloc_abs32;
510 case BFD_RELOC_24_PCREL:
511 return &howto_reloc_pcrel24;
512 }
513}
514
515/* Allocate enough room for all the reloc entries, plus pointers to them all */
516
517static boolean
518b_out_slurp_reloc_table (abfd, asect, symbols)
519 bfd *abfd;
520 sec_ptr asect;
521 asymbol **symbols;
522{
523 register struct relocation_info *rptr;
524 unsigned int counter ;
525 arelent *cache_ptr ;
526 int extern_mask, pcrel_mask, callj_mask, length_shift;
527 int incode_mask;
528 int size_mask;
529 bfd_vma prev_addr = 0;
530 unsigned int count;
531 size_t reloc_size;
532 struct relocation_info *relocs;
533 arelent *reloc_cache;
534
535 if (asect->relocation)
536 return true;
537 if (!aout_32_slurp_symbol_table (abfd))
538 return false;
539
540 if (asect == obj_datasec (abfd)) {
541 reloc_size = exec_hdr(abfd)->a_drsize;
542 goto doit;
543 }
544
545 if (asect == obj_textsec (abfd)) {
546 reloc_size = exec_hdr(abfd)->a_trsize;
547 goto doit;
548 }
549
550 if (asect == obj_bsssec (abfd)) {
551 reloc_size = 0;
552 goto doit;
553 }
554
555 bfd_set_error (bfd_error_invalid_operation);
556 return false;
557
558 doit:
559 if (bfd_seek (abfd, (file_ptr)(asect->rel_filepos), SEEK_SET) != 0)
560 return false;
561 count = reloc_size / sizeof (struct relocation_info);
562
563 relocs = (struct relocation_info *) bfd_malloc (reloc_size);
564 if (!relocs && reloc_size != 0)
565 return false;
566 reloc_cache = (arelent *) bfd_malloc ((count+1) * sizeof (arelent));
567 if (!reloc_cache) {
568 if (relocs != NULL)
569 free ((char*)relocs);
570 return false;
571 }
572
573 if (bfd_read ((PTR) relocs, 1, reloc_size, abfd) != reloc_size) {
574 free (reloc_cache);
575 if (relocs != NULL)
576 free (relocs);
577 return false;
578 }
579
580
581
582 if (bfd_header_big_endian (abfd)) {
583 /* big-endian bit field allocation order */
584 pcrel_mask = 0x80;
585 extern_mask = 0x10;
586 incode_mask = 0x08;
587 callj_mask = 0x02;
588 size_mask = 0x20;
589 length_shift = 5;
590 } else {
591 /* little-endian bit field allocation order */
592 pcrel_mask = 0x01;
593 extern_mask = 0x08;
594 incode_mask = 0x10;
595 callj_mask = 0x40;
596 size_mask = 0x02;
597 length_shift = 1;
598 }
599
600 for (rptr = relocs, cache_ptr = reloc_cache, counter = 0;
601 counter < count;
602 counter++, rptr++, cache_ptr++)
603 {
604 unsigned char *raw = (unsigned char *)rptr;
605 unsigned int symnum;
606 cache_ptr->address = bfd_h_get_32 (abfd, raw + 0);
607 cache_ptr->howto = 0;
608 if (bfd_header_big_endian (abfd))
609 {
610 symnum = (raw[4] << 16) | (raw[5] << 8) | raw[6];
611 }
612 else
613 {
614 symnum = (raw[6] << 16) | (raw[5] << 8) | raw[4];
615 }
616
617 if (raw[7] & extern_mask)
618 {
619 /* if this is set then the r_index is a index into the symbol table;
620 * if the bit is not set then r_index contains a section map.
621 * we either fill in the sym entry with a pointer to the symbol,
622 * or point to the correct section
623 */
624 cache_ptr->sym_ptr_ptr = symbols + symnum;
625 cache_ptr->addend = 0;
626 } else
627 {
628 /* in a.out symbols are relative to the beginning of the
629 * file rather than sections ?
630 * (look in translate_from_native_sym_flags)
631 * the reloc entry addend has added to it the offset into the
632 * file of the data, so subtract the base to make the reloc
633 * section relative */
634 int s;
635 {
636 /* sign-extend symnum from 24 bits to whatever host uses */
637 s = symnum;
638 if (s & (1 << 23))
639 s |= (~0) << 24;
640 }
641 cache_ptr->sym_ptr_ptr = (asymbol **)NULL;
642 switch (s)
643 {
644 case N_TEXT:
645 case N_TEXT | N_EXT:
646 cache_ptr->sym_ptr_ptr = obj_textsec(abfd)->symbol_ptr_ptr;
647 cache_ptr->addend = - obj_textsec(abfd)->vma;
648 break;
649 case N_DATA:
650 case N_DATA | N_EXT:
651 cache_ptr->sym_ptr_ptr = obj_datasec(abfd)->symbol_ptr_ptr;
652 cache_ptr->addend = - obj_datasec(abfd)->vma;
653 break;
654 case N_BSS:
655 case N_BSS | N_EXT:
656 cache_ptr->sym_ptr_ptr = obj_bsssec(abfd)->symbol_ptr_ptr;
657 cache_ptr->addend = - obj_bsssec(abfd)->vma;
658 break;
659 case N_ABS:
660 case N_ABS | N_EXT:
661 cache_ptr->sym_ptr_ptr = obj_bsssec(abfd)->symbol_ptr_ptr;
662 cache_ptr->addend = 0;
663 break;
664 case -2: /* .align */
665 if (raw[7] & pcrel_mask)
666 {
667 cache_ptr->howto = &howto_align_table[(raw[7] >> length_shift) & 3];
668 cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
669 }
670 else
671 {
672 /* .org? */
673 abort ();
674 }
675 cache_ptr->addend = 0;
676 break;
677 default:
678 BFD_ASSERT(0);
679 break;
680 }
681
682 }
683
684 /* the i960 only has a few relocation types:
685 abs 32-bit and pcrel 24bit. except for callj's! */
686 if (cache_ptr->howto != 0)
687 ;
688 else if (raw[7] & callj_mask)
689 {
690 cache_ptr->howto = &howto_reloc_callj;
691 }
692 else if ( raw[7] & pcrel_mask)
693 {
694 if (raw[7] & size_mask)
695 cache_ptr->howto = &howto_reloc_pcrel13;
696 else
697 cache_ptr->howto = &howto_reloc_pcrel24;
698 }
699 else
700 {
701 if (raw[7] & incode_mask)
702 {
703 cache_ptr->howto = &howto_reloc_abs32code;
704 }
705 else
706 {
707 cache_ptr->howto = &howto_reloc_abs32;
708 }
709 }
710 if (cache_ptr->address < prev_addr)
711 {
712 /* Ouch! this reloc is out of order, insert into the right place
713 */
714 arelent tmp;
715 arelent *cursor = cache_ptr-1;
716 bfd_vma stop = cache_ptr->address;
717 tmp = *cache_ptr;
718 while (cursor->address > stop && cursor >= reloc_cache)
719 {
720 cursor[1] = cursor[0];
721 cursor--;
722 }
723 cursor[1] = tmp;
724 }
725 else
726 {
727 prev_addr = cache_ptr->address;
728 }
729 }
730
731
732 if (relocs != NULL)
733 free (relocs);
734 asect->relocation = reloc_cache;
735 asect->reloc_count = count;
736
737
738 return true;
739}
740
741
742static boolean
743b_out_squirt_out_relocs (abfd, section)
744 bfd *abfd;
745 asection *section;
746{
747 arelent **generic;
748 int r_extern = 0;
749 int r_idx;
750 int incode_mask;
751 int len_1;
752 unsigned int count = section->reloc_count;
753 struct relocation_info *native, *natptr;
754 size_t natsize = count * sizeof (struct relocation_info);
755 int extern_mask, pcrel_mask, len_2, callj_mask;
756 if (count == 0) return true;
757 generic = section->orelocation;
758 native = ((struct relocation_info *) bfd_malloc (natsize));
759 if (!native && natsize != 0)
760 return false;
761
762 if (bfd_header_big_endian (abfd))
763 {
764 /* Big-endian bit field allocation order */
765 pcrel_mask = 0x80;
766 extern_mask = 0x10;
767 len_2 = 0x40;
768 len_1 = 0x20;
769 callj_mask = 0x02;
770 incode_mask = 0x08;
771 }
772 else
773 {
774 /* Little-endian bit field allocation order */
775 pcrel_mask = 0x01;
776 extern_mask = 0x08;
777 len_2 = 0x04;
778 len_1 = 0x02;
779 callj_mask = 0x40;
780 incode_mask = 0x10;
781 }
782
783 for (natptr = native; count > 0; --count, ++natptr, ++generic)
784 {
785 arelent *g = *generic;
786 unsigned char *raw = (unsigned char *)natptr;
787 asymbol *sym = *(g->sym_ptr_ptr);
788
789 asection *output_section = sym->section->output_section;
790
791 bfd_h_put_32(abfd, g->address, raw);
792 /* Find a type in the output format which matches the input howto -
793 * at the moment we assume input format == output format FIXME!!
794 */
795 r_idx = 0;
796 /* FIXME: Need callj stuff here, and to check the howto entries to
797 be sure they are real for this architecture. */
798 if (g->howto== &howto_reloc_callj)
799 {
800 raw[7] = callj_mask + pcrel_mask + len_2;
801 }
802 else if (g->howto == &howto_reloc_pcrel24)
803 {
804 raw[7] = pcrel_mask + len_2;
805 }
806 else if (g->howto == &howto_reloc_pcrel13)
807 {
808 raw[7] = pcrel_mask + len_1;
809 }
810 else if (g->howto == &howto_reloc_abs32code)
811 {
812 raw[7] = len_2 + incode_mask;
813 }
814 else if (g->howto >= howto_align_table
815 && g->howto <= (howto_align_table
816 + sizeof (howto_align_table) / sizeof (howto_align_table[0])
817 - 1))
818 {
819 /* symnum == -2; extern_mask not set, pcrel_mask set */
820 r_idx = -2;
821 r_extern = 0;
822 raw[7] = (pcrel_mask
823 | ((g->howto - howto_align_table) << 1));
824 }
825 else {
826 raw[7] = len_2;
827 }
828
829 if (r_idx != 0)
830 /* already mucked with r_extern, r_idx */;
831 else if (bfd_is_com_section (output_section)
832 || bfd_is_abs_section (output_section)
833 || bfd_is_und_section (output_section))
834 {
835
836 if (bfd_abs_section_ptr->symbol == sym)
837 {
838 /* Whoops, looked like an abs symbol, but is really an offset
839 from the abs section */
840 r_idx = 0;
841 r_extern = 0;
842 }
843 else
844 {
845 /* Fill in symbol */
846
847 r_extern = 1;
848 r_idx = (*g->sym_ptr_ptr)->udata.i;
849 }
850 }
851 else
852 {
853 /* Just an ordinary section */
854 r_extern = 0;
855 r_idx = output_section->target_index;
856 }
857
858 if (bfd_header_big_endian (abfd)) {
859 raw[4] = (unsigned char) (r_idx >> 16);
860 raw[5] = (unsigned char) (r_idx >> 8);
861 raw[6] = (unsigned char) (r_idx );
862 } else {
863 raw[6] = (unsigned char) (r_idx >> 16);
864 raw[5] = (unsigned char) (r_idx>> 8);
865 raw[4] = (unsigned char) (r_idx );
866 }
867 if (r_extern)
868 raw[7] |= extern_mask;
869 }
870
871 if (bfd_write ((PTR) native, 1, natsize, abfd) != natsize) {
872 free((PTR)native);
873 return false;
874 }
875 free ((PTR)native);
876
877 return true;
878}
879
880/* This is stupid. This function should be a boolean predicate */
881static long
882b_out_canonicalize_reloc (abfd, section, relptr, symbols)
883 bfd *abfd;
884 sec_ptr section;
885 arelent **relptr;
886 asymbol **symbols;
887{
888 arelent *tblptr;
889 unsigned int count;
890
891 if ((section->flags & SEC_CONSTRUCTOR) != 0)
892 {
893 arelent_chain *chain = section->constructor_chain;
894 for (count = 0; count < section->reloc_count; count++)
895 {
896 *relptr++ = &chain->relent;
897 chain = chain->next;
898 }
899 }
900 else
901 {
902 if (section->relocation == NULL
903 && ! b_out_slurp_reloc_table (abfd, section, symbols))
904 return -1;
905
906 tblptr = section->relocation;
907 for (count = 0; count++ < section->reloc_count;)
908 *relptr++ = tblptr++;
909 }
910
911 *relptr = NULL;
912
913 return section->reloc_count;
914}
915
916static long
917b_out_get_reloc_upper_bound (abfd, asect)
918 bfd *abfd;
919 sec_ptr asect;
920{
921 if (bfd_get_format (abfd) != bfd_object) {
922 bfd_set_error (bfd_error_invalid_operation);
923 return -1;
924 }
925
926 if (asect->flags & SEC_CONSTRUCTOR)
927 return sizeof (arelent *) * (asect->reloc_count + 1);
928
929 if (asect == obj_datasec (abfd))
930 return (sizeof (arelent *) *
931 ((exec_hdr(abfd)->a_drsize / sizeof (struct relocation_info))
932 +1));
933
934 if (asect == obj_textsec (abfd))
935 return (sizeof (arelent *) *
936 ((exec_hdr(abfd)->a_trsize / sizeof (struct relocation_info))
937 +1));
938
939 if (asect == obj_bsssec (abfd))
940 return 0;
941
942 bfd_set_error (bfd_error_invalid_operation);
943 return -1;
944}
945\f
946static boolean
947b_out_set_section_contents (abfd, section, location, offset, count)
948 bfd *abfd;
949 asection *section;
950 PTR location;
951 file_ptr offset;
952 bfd_size_type count;
953{
954
955 if (abfd->output_has_begun == false) { /* set by bfd.c handler */
956 if (! aout_32_make_sections (abfd))
957 return false;
958
959 obj_textsec (abfd)->filepos = sizeof(struct internal_exec);
960 obj_datasec(abfd)->filepos = obj_textsec(abfd)->filepos
961 + obj_textsec (abfd)->_raw_size;
962
963 }
964 /* regardless, once we know what we're doing, we might as well get going */
965 if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0)
966 return false;
967
968 if (count != 0) {
969 return (bfd_write ((PTR)location, 1, count, abfd) == count) ?true:false;
970 }
971 return true;
972}
973
974static boolean
975b_out_set_arch_mach (abfd, arch, machine)
976 bfd *abfd;
977 enum bfd_architecture arch;
978 unsigned long machine;
979{
980 bfd_default_set_arch_mach(abfd, arch, machine);
981
982 if (arch == bfd_arch_unknown) /* Unknown machine arch is OK */
983 return true;
984 if (arch == bfd_arch_i960) /* i960 default is OK */
985 switch (machine) {
986 case bfd_mach_i960_core:
987 case bfd_mach_i960_kb_sb:
988 case bfd_mach_i960_mc:
989 case bfd_mach_i960_xa:
990 case bfd_mach_i960_ca:
991 case bfd_mach_i960_ka_sa:
992 case bfd_mach_i960_jx:
993 case bfd_mach_i960_hx:
994 case 0:
995 return true;
996 default:
997 return false;
998 }
999
1000 return false;
1001}
1002
1003static int
1004b_out_sizeof_headers (ignore_abfd, ignore)
5f771d47
ILT
1005 bfd *ignore_abfd ATTRIBUTE_UNUSED;
1006 boolean ignore ATTRIBUTE_UNUSED;
252b5132
RH
1007{
1008 return sizeof(struct internal_exec);
1009}
1010
1011
1012
1013/************************************************************************/
1014static bfd_vma
1015get_value (reloc, link_info, input_section)
1016 arelent *reloc;
1017 struct bfd_link_info *link_info;
1018 asection *input_section;
1019{
1020 bfd_vma value;
1021 asymbol *symbol = *(reloc->sym_ptr_ptr);
1022
1023 /* A symbol holds a pointer to a section, and an offset from the
1024 base of the section. To relocate, we find where the section will
1025 live in the output and add that in */
1026
1027 if (bfd_is_und_section (symbol->section))
1028 {
1029 struct bfd_link_hash_entry *h;
1030
1031 /* The symbol is undefined in this BFD. Look it up in the
1032 global linker hash table. FIXME: This should be changed when
1033 we convert b.out to use a specific final_link function and
1034 change the interface to bfd_relax_section to not require the
1035 generic symbols. */
1036 h = bfd_wrapped_link_hash_lookup (input_section->owner, link_info,
1037 bfd_asymbol_name (symbol),
1038 false, false, true);
1039 if (h != (struct bfd_link_hash_entry *) NULL
1040 && (h->type == bfd_link_hash_defined
1041 || h->type == bfd_link_hash_defweak))
1042 value = h->u.def.value + output_addr (h->u.def.section);
1043 else if (h != (struct bfd_link_hash_entry *) NULL
1044 && h->type == bfd_link_hash_common)
1045 value = h->u.c.size;
1046 else
1047 {
1048 if (! ((*link_info->callbacks->undefined_symbol)
1049 (link_info, bfd_asymbol_name (symbol),
1050 input_section->owner, input_section, reloc->address)))
1051 abort ();
1052 value = 0;
1053 }
1054 }
1055 else
1056 {
1057 value = symbol->value + output_addr (symbol->section);
1058 }
1059
1060 /* Add the value contained in the relocation */
1061 value += reloc->addend;
1062
1063 return value;
1064}
1065
1066static void
1067perform_slip (abfd, slip, input_section, value)
1068 bfd *abfd;
1069 unsigned int slip;
1070 asection *input_section;
1071 bfd_vma value;
1072{
1073 asymbol **s;
1074
1075 s = _bfd_generic_link_get_symbols (abfd);
1076 BFD_ASSERT (s != (asymbol **) NULL);
1077
1078 /* Find all symbols past this point, and make them know
1079 what's happened */
1080 while (*s)
1081 {
1082 asymbol *p = *s;
1083 if (p->section == input_section)
1084 {
1085 /* This was pointing into this section, so mangle it */
1086 if (p->value > value)
1087 {
1088 p->value -=slip;
1089 if (p->udata.p != NULL)
1090 {
1091 struct generic_link_hash_entry *h;
1092
1093 h = (struct generic_link_hash_entry *) p->udata.p;
1094 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
1095 h->root.u.def.value -= slip;
1096 BFD_ASSERT (h->root.u.def.value == p->value);
1097 }
1098 }
1099 }
1100 s++;
1101
1102 }
1103}
1104
1105/* This routine works out if the thing we want to get to can be
1106 reached with a 24bit offset instead of a 32 bit one.
1107 If it can, then it changes the amode */
1108
1109static int
1110abs32code (abfd, input_section, r, shrink, link_info)
1111 bfd *abfd;
1112 asection *input_section;
1113 arelent *r;
1114 unsigned int shrink;
1115 struct bfd_link_info *link_info;
1116{
1117 bfd_vma value = get_value (r, link_info, input_section);
1118 bfd_vma dot = output_addr (input_section) + r->address;
1119 bfd_vma gap;
1120
1121 /* See if the address we're looking at within 2^23 bytes of where
1122 we are, if so then we can use a small branch rather than the
1123 jump we were going to */
1124
1125 gap = value - (dot - shrink);
1126
1127
1128 if (-1<<23 < (long)gap && (long)gap < 1<<23 )
1129 {
1130 /* Change the reloc type from 32bitcode possible 24, to 24bit
1131 possible 32 */
1132
1133 r->howto = &howto_reloc_abs32codeshrunk;
1134 /* The place to relc moves back by four bytes */
1135 r->address -=4;
1136
1137 /* This will be four bytes smaller in the long run */
1138 shrink += 4 ;
1139 perform_slip (abfd, 4, input_section, r->address-shrink + 4);
1140 }
1141 return shrink;
1142}
1143
1144static int
1145aligncode (abfd, input_section, r, shrink)
1146 bfd *abfd;
1147 asection *input_section;
1148 arelent *r;
1149 unsigned int shrink;
1150{
1151 bfd_vma dot = output_addr (input_section) + r->address;
1152 bfd_vma gap;
1153 bfd_vma old_end;
1154 bfd_vma new_end;
1155 int shrink_delta;
1156 int size = r->howto->size;
1157
1158 /* Reduce the size of the alignment so that it's still aligned but
1159 smaller - the current size is already the same size as or bigger
1160 than the alignment required. */
1161
1162 /* calculate the first byte following the padding before we optimize */
1163 old_end = ((dot + size ) & ~size) + size+1;
1164 /* work out where the new end will be - remember that we're smaller
1165 than we used to be */
1166 new_end = ((dot - shrink + size) & ~size);
1167
1168 /* This is the new end */
1169 gap = old_end - ((dot + size) & ~size);
1170
1171 shrink_delta = (old_end - new_end) - shrink;
1172
1173 if (shrink_delta)
1174 {
1175 /* Change the reloc so that it knows how far to align to */
1176 r->howto = howto_done_align_table + (r->howto - howto_align_table);
1177
1178 /* Encode the stuff into the addend - for future use we need to
1179 know how big the reloc used to be */
1180 r->addend = old_end - dot + r->address;
1181
1182 /* This will be N bytes smaller in the long run, adjust all the symbols */
1183 perform_slip (abfd, shrink_delta, input_section, r->address - shrink);
1184 shrink += shrink_delta;
1185 }
1186 return shrink;
1187}
1188
1189static boolean
1190b_out_bfd_relax_section (abfd, i, link_info, again)
1191 bfd *abfd;
1192 asection *i;
1193 struct bfd_link_info *link_info;
1194 boolean *again;
1195{
1196 /* Get enough memory to hold the stuff */
1197 bfd *input_bfd = i->owner;
1198 asection *input_section = i;
1199 int shrink = 0 ;
1200 arelent **reloc_vector = NULL;
1201 long reloc_size = bfd_get_reloc_upper_bound(input_bfd,
1202 input_section);
1203
1204 if (reloc_size < 0)
1205 return false;
1206
1207 /* We only run this relaxation once. It might work to run it
1208 multiple times, but it hasn't been tested. */
1209 *again = false;
1210
1211 if (reloc_size)
1212 {
1213 long reloc_count;
1214
1215 reloc_vector = (arelent **) bfd_malloc (reloc_size);
1216 if (reloc_vector == NULL && reloc_size != 0)
1217 goto error_return;
1218
1219 /* Get the relocs and think about them */
1220 reloc_count =
1221 bfd_canonicalize_reloc (input_bfd, input_section, reloc_vector,
1222 _bfd_generic_link_get_symbols (input_bfd));
1223 if (reloc_count < 0)
1224 goto error_return;
1225 if (reloc_count > 0)
1226 {
1227 arelent **parent;
1228 for (parent = reloc_vector; *parent; parent++)
1229 {
1230 arelent *r = *parent;
1231 switch (r->howto->type)
1232 {
1233 case ALIGNER:
1234 /* An alignment reloc */
1235 shrink = aligncode (abfd, input_section, r, shrink);
1236 break;
1237 case ABS32CODE:
1238 /* A 32bit reloc in an addressing mode */
1239 shrink = abs32code (input_bfd, input_section, r, shrink,
1240 link_info);
1241 break;
1242 case ABS32CODE_SHRUNK:
1243 shrink+=4;
1244 break;
1245 }
1246 }
1247 }
1248 }
1249 input_section->_cooked_size = input_section->_raw_size - shrink;
1250
1251 if (reloc_vector != NULL)
1252 free (reloc_vector);
1253 return true;
1254 error_return:
1255 if (reloc_vector != NULL)
1256 free (reloc_vector);
1257 return false;
1258}
1259
1260static bfd_byte *
1261b_out_bfd_get_relocated_section_contents (output_bfd, link_info, link_order,
1262 data, relocateable, symbols)
1263 bfd *output_bfd;
1264 struct bfd_link_info *link_info;
1265 struct bfd_link_order *link_order;
1266 bfd_byte *data;
1267 boolean relocateable;
1268 asymbol **symbols;
1269{
1270 /* Get enough memory to hold the stuff */
1271 bfd *input_bfd = link_order->u.indirect.section->owner;
1272 asection *input_section = link_order->u.indirect.section;
1273 long reloc_size = bfd_get_reloc_upper_bound (input_bfd,
1274 input_section);
1275 arelent **reloc_vector = NULL;
1276 long reloc_count;
1277
1278 if (reloc_size < 0)
1279 goto error_return;
1280
1281 /* If producing relocateable output, don't bother to relax. */
1282 if (relocateable)
1283 return bfd_generic_get_relocated_section_contents (output_bfd, link_info,
1284 link_order,
1285 data, relocateable,
1286 symbols);
1287
1288 reloc_vector = (arelent **) bfd_malloc (reloc_size);
1289 if (reloc_vector == NULL && reloc_size != 0)
1290 goto error_return;
1291
1292 input_section->reloc_done = 1;
1293
1294 /* read in the section */
1295 BFD_ASSERT (true == bfd_get_section_contents (input_bfd,
1296 input_section,
1297 data,
1298 0,
1299 input_section->_raw_size));
1300
1301 reloc_count = bfd_canonicalize_reloc (input_bfd,
1302 input_section,
1303 reloc_vector,
1304 symbols);
1305 if (reloc_count < 0)
1306 goto error_return;
1307 if (reloc_count > 0)
1308 {
1309 arelent **parent = reloc_vector;
1310 arelent *reloc ;
1311
1312 unsigned int dst_address = 0;
1313 unsigned int src_address = 0;
1314 unsigned int run;
1315 unsigned int idx;
1316
1317 /* Find how long a run we can do */
1318 while (dst_address < link_order->size)
1319 {
1320 reloc = *parent;
1321 if (reloc)
1322 {
1323 /* Note that the relaxing didn't tie up the addresses in the
1324 relocation, so we use the original address to work out the
1325 run of non-relocated data */
1326 BFD_ASSERT (reloc->address >= src_address);
1327 run = reloc->address - src_address;
1328 parent++;
1329 }
1330 else
1331 {
1332 run = link_order->size - dst_address;
1333 }
1334 /* Copy the bytes */
1335 for (idx = 0; idx < run; idx++)
1336 {
1337 data[dst_address++] = data[src_address++];
1338 }
1339
1340 /* Now do the relocation */
1341
1342 if (reloc)
1343 {
1344 switch (reloc->howto->type)
1345 {
1346 case ABS32CODE:
1347 calljx_callback (input_bfd, link_info, reloc,
1348 src_address + data, dst_address + data,
1349 input_section);
1350 src_address+=4;
1351 dst_address+=4;
1352 break;
1353 case ABS32:
1354 bfd_put_32 (input_bfd,
1355 (bfd_get_32 (input_bfd, data + src_address)
1356 + get_value (reloc, link_info, input_section)),
1357 data + dst_address);
1358 src_address+=4;
1359 dst_address+=4;
1360 break;
1361 case CALLJ:
1362 callj_callback (input_bfd, link_info, reloc, data,
1363 src_address, dst_address, input_section,
1364 false);
1365 src_address+=4;
1366 dst_address+=4;
1367 break;
1368 case ALIGNDONE:
1369 BFD_ASSERT (reloc->addend >= src_address);
1370 BFD_ASSERT (reloc->addend <= input_section->_raw_size);
1371 src_address = reloc->addend;
1372 dst_address = ((dst_address + reloc->howto->size)
1373 & ~reloc->howto->size);
1374 break;
1375 case ABS32CODE_SHRUNK:
1376 /* This used to be a callx, but we've found out that a
1377 callj will reach, so do the right thing. */
1378 callj_callback (input_bfd, link_info, reloc, data,
1379 src_address + 4, dst_address, input_section,
1380 true);
1381 dst_address+=4;
1382 src_address+=8;
1383 break;
1384 case PCREL24:
1385 {
1386 long int word = bfd_get_32 (input_bfd,
1387 data + src_address);
1388 bfd_vma value;
1389
1390 value = get_value (reloc, link_info, input_section);
1391 word = ((word & ~BAL_MASK)
1392 | (((word & BAL_MASK)
1393 + value
1394 - output_addr (input_section)
1395 + reloc->addend)
1396 & BAL_MASK));
1397
1398 bfd_put_32 (input_bfd, word, data + dst_address);
1399 dst_address+=4;
1400 src_address+=4;
1401
1402 }
1403 break;
1404
1405 case PCREL13:
1406 {
1407 long int word = bfd_get_32 (input_bfd,
1408 data + src_address);
1409 bfd_vma value;
1410
1411 value = get_value (reloc, link_info, input_section);
1412 word = ((word & ~PCREL13_MASK)
1413 | (((word & PCREL13_MASK)
1414 + value
1415 + reloc->addend
1416 - output_addr (input_section))
1417 & PCREL13_MASK));
1418
1419 bfd_put_32 (input_bfd, word, data + dst_address);
1420 dst_address+=4;
1421 src_address+=4;
1422
1423 }
1424 break;
1425
1426 default:
1427 abort();
1428 }
1429 }
1430 }
1431 }
1432 if (reloc_vector != NULL)
1433 free (reloc_vector);
1434 return data;
1435 error_return:
1436 if (reloc_vector != NULL)
1437 free (reloc_vector);
1438 return NULL;
1439}
1440/***********************************************************************/
1441
1442/* Build the transfer vectors for Big and Little-Endian B.OUT files. */
1443
1444#define aout_32_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
1445#define aout_32_close_and_cleanup aout_32_bfd_free_cached_info
1446
1447#define b_out_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
1448#define b_out_bfd_link_add_symbols _bfd_generic_link_add_symbols
1449#define b_out_bfd_final_link _bfd_generic_final_link
1450#define b_out_bfd_link_split_section _bfd_generic_link_split_section
1451#define b_out_bfd_gc_sections bfd_generic_gc_sections
1452
1453#define aout_32_get_section_contents_in_window \
1454 _bfd_generic_get_section_contents_in_window
1455
c3c89269
NC
1456extern const bfd_target b_out_vec_little_host;
1457
252b5132
RH
1458const bfd_target b_out_vec_big_host =
1459{
1460 "b.out.big", /* name */
1461 bfd_target_aout_flavour,
1462 BFD_ENDIAN_LITTLE, /* data byte order is little */
1463 BFD_ENDIAN_BIG, /* hdr byte order is big */
1464 (HAS_RELOC | EXEC_P | /* object flags */
1465 HAS_LINENO | HAS_DEBUG |
1466 HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE ),
1467 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA),
1468 '_', /* symbol leading char */
1469 ' ', /* ar_pad_char */
1470 16, /* ar_max_namelen */
1471
1472 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
1473 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
1474 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
1475 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
1476 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
1477 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
1478 {_bfd_dummy_target, b_out_object_p, /* bfd_check_format */
1479 bfd_generic_archive_p, _bfd_dummy_target},
1480 {bfd_false, b_out_mkobject, /* bfd_set_format */
1481 _bfd_generic_mkarchive, bfd_false},
1482 {bfd_false, b_out_write_object_contents, /* bfd_write_contents */
1483 _bfd_write_archive_contents, bfd_false},
1484
1485 BFD_JUMP_TABLE_GENERIC (aout_32),
1486 BFD_JUMP_TABLE_COPY (_bfd_generic),
1487 BFD_JUMP_TABLE_CORE (_bfd_nocore),
1488 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd),
1489 BFD_JUMP_TABLE_SYMBOLS (aout_32),
1490 BFD_JUMP_TABLE_RELOCS (b_out),
1491 BFD_JUMP_TABLE_WRITE (b_out),
1492 BFD_JUMP_TABLE_LINK (b_out),
1493 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
1494
c3c89269
NC
1495 & b_out_vec_little_host,
1496
252b5132
RH
1497 (PTR) 0,
1498};
1499
1500
1501const bfd_target b_out_vec_little_host =
1502{
1503 "b.out.little", /* name */
1504 bfd_target_aout_flavour,
1505 BFD_ENDIAN_LITTLE, /* data byte order is little */
1506 BFD_ENDIAN_LITTLE, /* header byte order is little */
1507 (HAS_RELOC | EXEC_P | /* object flags */
1508 HAS_LINENO | HAS_DEBUG |
1509 HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE ),
1510 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA),
1511 '_', /* symbol leading char */
1512 ' ', /* ar_pad_char */
1513 16, /* ar_max_namelen */
1514 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
1515 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
1516 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
1517 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
1518 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
1519 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
1520
1521 {_bfd_dummy_target, b_out_object_p, /* bfd_check_format */
1522 bfd_generic_archive_p, _bfd_dummy_target},
1523 {bfd_false, b_out_mkobject, /* bfd_set_format */
1524 _bfd_generic_mkarchive, bfd_false},
1525 {bfd_false, b_out_write_object_contents, /* bfd_write_contents */
1526 _bfd_write_archive_contents, bfd_false},
1527
1528 BFD_JUMP_TABLE_GENERIC (aout_32),
1529 BFD_JUMP_TABLE_COPY (_bfd_generic),
1530 BFD_JUMP_TABLE_CORE (_bfd_nocore),
1531 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd),
1532 BFD_JUMP_TABLE_SYMBOLS (aout_32),
1533 BFD_JUMP_TABLE_RELOCS (b_out),
1534 BFD_JUMP_TABLE_WRITE (b_out),
1535 BFD_JUMP_TABLE_LINK (b_out),
1536 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
1537
c3c89269
NC
1538 & b_out_vec_big_host,
1539
252b5132
RH
1540 (PTR) 0
1541};
This page took 0.083112 seconds and 4 git commands to generate.