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