xref: /netbsd-src/external/gpl3/binutils/dist/bfd/pdp11.c (revision 7a6a7ae08ac6c612f0fbb0d4425825c6be2a9050)
1 /* BFD back-end for PDP-11 a.out binaries.
2    Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007
3    Free Software Foundation, Inc.
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 
23 /* BFD backend for PDP-11, running 2.11BSD in particular.
24 
25    This file was hacked up by looking hard at the existing vaxnetbsd
26    back end and the header files in 2.11BSD.
27 
28    TODO
29    * support for V7 file formats
30    * support for overlay object files (see 2.11 a.out(5))
31    * support for old and very old archives
32    (see 2.11 ar(5), historical section)
33 
34    Search for TODO to find other areas needing more work.  */
35 
36 #define	BYTES_IN_WORD	2
37 #define	BYTES_IN_LONG	4
38 #define ARCH_SIZE	16
39 #undef TARGET_IS_BIG_ENDIAN_P
40 
41 #define	TARGET_PAGE_SIZE	1024
42 #define	SEGMENT__SIZE	TARGET_PAGE_SIZE
43 
44 #define	DEFAULT_ARCH	bfd_arch_pdp11
45 #define	DEFAULT_MID 	M_PDP11
46 
47 /* Do not "beautify" the CONCAT* macro args.  Traditional C will not
48    remove whitespace added here, and thus will fail to concatenate
49    the tokens.  */
50 #define MY(OP) CONCAT2 (pdp11_aout_,OP)
51 
52 /* This needs to start with a.out so GDB knows it is an a.out variant.  */
53 #define TARGETNAME "a.out-pdp11"
54 
55 /* This is the normal load address for executables.  */
56 #define TEXT_START_ADDR		0
57 
58 /* The header is not included in the text segment.  */
59 #define N_HEADER_IN_TEXT(x)	0
60 
61 /* There are no shared libraries.  */
62 #define N_SHARED_LIB(x) 	0
63 
64 /* There is no flags field.  */
65 #define N_FLAGS(exec)		0
66 
67 #define N_SET_FLAGS(exec, flags) do { } while (0)
68 #define N_BADMAG(x) (((x).a_info != OMAGIC)   \
69 		  && ((x).a_info != NMAGIC)   \
70 		  && ((x).a_info != A_MAGIC3) \
71 		  && ((x).a_info != A_MAGIC4) \
72 		  && ((x).a_info != A_MAGIC5) \
73 		  && ((x).a_info != A_MAGIC6))
74 
75 #include "sysdep.h"
76 #include "bfd.h"
77 
78 #define external_exec pdp11_external_exec
79 struct pdp11_external_exec
80 {
81   bfd_byte e_info[2];		/* Magic number.  */
82   bfd_byte e_text[2];		/* Length of text section in bytes.  */
83   bfd_byte e_data[2];		/* Length of data section in bytes.  */
84   bfd_byte e_bss[2];		/* Length of bss area in bytes.  */
85   bfd_byte e_syms[2];		/* Length of symbol table in bytes.  */
86   bfd_byte e_entry[2];		/* Start address.  */
87   bfd_byte e_unused[2];		/* Not used.  */
88   bfd_byte e_flag[2];		/* Relocation info stripped.  */
89   bfd_byte e_relocatable; 	/* Ugly hack.  */
90 };
91 
92 #define	EXEC_BYTES_SIZE	(8 * 2)
93 
94 #define	A_MAGIC1	OMAGIC
95 #define OMAGIC		0407	/* ...object file or impure executable.  */
96 #define	A_MAGIC2	NMAGIC
97 #define NMAGIC		0410	/* Pure executable.  */
98 #define ZMAGIC		0413	/* Demand-paged executable.  */
99 #define	A_MAGIC3	0411	/* Separated I&D.  */
100 #define	A_MAGIC4	0405	/* Overlay.  */
101 #define	A_MAGIC5	0430	/* Auto-overlay (nonseparate).  */
102 #define	A_MAGIC6	0431	/* Auto-overlay (separate).  */
103 #define QMAGIC		0
104 #define BMAGIC		0
105 
106 #define A_FLAG_RELOC_STRIPPED	0x0001
107 
108 #define external_nlist pdp11_external_nlist
109 struct pdp11_external_nlist
110 {
111   bfd_byte e_unused[2];		/* Unused.  */
112   bfd_byte e_strx[2];		/* Index into string table of name.  */
113   bfd_byte e_type[1];		/* Type of symbol.  */
114   bfd_byte e_ovly[1];		/* Overlay number.  */
115   bfd_byte e_value[2];		/* Value of symbol.  */
116 };
117 
118 #define	EXTERNAL_NLIST_SIZE	8
119 
120 #define N_TXTOFF(x)	(EXEC_BYTES_SIZE)
121 #define N_DATOFF(x)	(N_TXTOFF(x) + (x).a_text)
122 #define N_TRELOFF(x)	(N_DATOFF(x) + (x).a_data)
123 #define N_DRELOFF(x)	(N_TRELOFF(x) + (x).a_trsize)
124 #define N_SYMOFF(x)	(N_DRELOFF(x) + (x).a_drsize)
125 #define N_STROFF(x)	(N_SYMOFF(x) + (x).a_syms)
126 
127 #define WRITE_HEADERS(abfd, execp) pdp11_aout_write_headers (abfd, execp)
128 
129 #include "libbfd.h"
130 #include "libaout.h"
131 
132 #define SWAP_MAGIC(ext) bfd_getl16 (ext)
133 
134 #define MY_entry_is_text_address 1
135 
136 #define MY_write_object_contents MY(write_object_contents)
137 static bfd_boolean MY(write_object_contents) (bfd *);
138 #define MY_text_includes_header 1
139 
140 #define MY_BFD_TARGET
141 
142 #include "aout-target.h"
143 
144 /* Start of modified aoutx.h.  */
145 #define KEEPIT udata.i
146 
147 #include <string.h>		/* For strchr and friends.  */
148 #include "bfd.h"
149 #include "sysdep.h"
150 #include "safe-ctype.h"
151 #include "bfdlink.h"
152 
153 #include "libaout.h"
154 #include "aout/aout64.h"
155 #include "aout/stab_gnu.h"
156 #include "aout/ar.h"
157 
158 #undef N_TYPE
159 #undef N_UNDF
160 #undef N_ABS
161 #undef N_TEXT
162 #undef N_DATA
163 #undef N_BSS
164 #undef N_REG
165 #undef N_FN
166 #undef N_EXT
167 #define N_TYPE		0x1f	/* Type mask.  */
168 #define N_UNDF		0x00	/* Undefined.  */
169 #define N_ABS		0x01	/* Absolute.  */
170 #define N_TEXT		0x02	/* Text segment.  */
171 #define N_DATA		0x03	/* Data segment.  */
172 #define N_BSS		0x04	/* Bss segment.  */
173 #define N_REG		0x14	/* Register symbol.  */
174 #define N_FN		0x1f	/* File name.  */
175 #define N_EXT		0x20	/* External flag.  */
176 
177 #define RELOC_SIZE 2
178 
179 #define RELFLG		0x0001	/* PC-relative flag.  */
180 #define RTYPE		0x000e	/* Type mask.  */
181 #define RIDXMASK	0xfff0	/* Index mask.  */
182 
183 #define RABS		0x00	/* Absolute.  */
184 #define RTEXT		0x02	/* Text.  */
185 #define RDATA		0x04	/* Data.  */
186 #define RBSS		0x06	/* Bss.  */
187 #define REXT		0x08	/* External.  */
188 
189 #define RINDEX(x)	(((x) & 0xfff0) >> 4)
190 
191 #ifndef MY_final_link_relocate
192 #define MY_final_link_relocate _bfd_final_link_relocate
193 #endif
194 
195 #ifndef MY_relocate_contents
196 #define MY_relocate_contents _bfd_relocate_contents
197 #endif
198 
199 /* A hash table used for header files with N_BINCL entries.  */
200 
201 struct aout_link_includes_table
202 {
203   struct bfd_hash_table root;
204 };
205 
206 /* A linked list of totals that we have found for a particular header
207    file.  */
208 
209 struct aout_link_includes_totals
210 {
211   struct aout_link_includes_totals *next;
212   bfd_vma total;
213 };
214 
215 /* An entry in the header file hash table.  */
216 
217 struct aout_link_includes_entry
218 {
219   struct bfd_hash_entry root;
220   /* List of totals we have found for this file.  */
221   struct aout_link_includes_totals *totals;
222 };
223 
224 /* During the final link step we need to pass around a bunch of
225    information, so we do it in an instance of this structure.  */
226 
227 struct aout_final_link_info
228 {
229   /* General link information.  */
230   struct bfd_link_info *info;
231   /* Output bfd.  */
232   bfd *output_bfd;
233   /* Reloc file positions.  */
234   file_ptr treloff, dreloff;
235   /* File position of symbols.  */
236   file_ptr symoff;
237   /* String table.  */
238   struct bfd_strtab_hash *strtab;
239   /* Header file hash table.  */
240   struct aout_link_includes_table includes;
241   /* A buffer large enough to hold the contents of any section.  */
242   bfd_byte *contents;
243   /* A buffer large enough to hold the relocs of any section.  */
244   void * relocs;
245   /* A buffer large enough to hold the symbol map of any input BFD.  */
246   int *symbol_map;
247   /* A buffer large enough to hold output symbols of any input BFD.  */
248   struct external_nlist *output_syms;
249 };
250 
251 reloc_howto_type howto_table_pdp11[] =
252 {
253   /* type              rs size bsz  pcrel bitpos ovrf                     sf name     part_inpl readmask  setmask    pcdone */
254 HOWTO( 0,	       0,  1,  16,  FALSE, 0, complain_overflow_signed,0,"16",	TRUE, 0x0000ffff,0x0000ffff, FALSE),
255 HOWTO( 1,	       0,  1,  16,  TRUE,  0, complain_overflow_signed,0,"DISP16",	TRUE, 0x0000ffff,0x0000ffff, FALSE),
256 };
257 
258 #define TABLE_SIZE(TABLE)	(sizeof(TABLE)/sizeof(TABLE[0]))
259 
260 
261 static bfd_boolean aout_link_check_archive_element (bfd *, struct bfd_link_info *, bfd_boolean *);
262 static bfd_boolean aout_link_add_object_symbols    (bfd *, struct bfd_link_info *);
263 static bfd_boolean aout_link_add_symbols           (bfd *, struct bfd_link_info *);
264 static bfd_boolean aout_link_write_symbols         (struct aout_final_link_info *, bfd *);
265 
266 
267 reloc_howto_type *
268 NAME (aout, reloc_type_lookup) (bfd * abfd ATTRIBUTE_UNUSED,
269 				bfd_reloc_code_real_type code)
270 {
271   switch (code)
272     {
273     case BFD_RELOC_16:
274       return &howto_table_pdp11[0];
275     case BFD_RELOC_16_PCREL:
276       return &howto_table_pdp11[1];
277     default:
278       return NULL;
279     }
280 }
281 
282 reloc_howto_type *
283 NAME (aout, reloc_name_lookup) (bfd *abfd ATTRIBUTE_UNUSED,
284 				      const char *r_name)
285 {
286   unsigned int i;
287 
288   for (i = 0;
289        i < sizeof (howto_table_pdp11) / sizeof (howto_table_pdp11[0]);
290        i++)
291     if (howto_table_pdp11[i].name != NULL
292 	&& strcasecmp (howto_table_pdp11[i].name, r_name) == 0)
293       return &howto_table_pdp11[i];
294 
295   return NULL;
296 }
297 
298 static int
299 pdp11_aout_write_headers (bfd *abfd, struct internal_exec *execp)
300 {
301   struct external_exec exec_bytes;
302   bfd_size_type text_size;
303   file_ptr text_end;
304 
305   if (adata(abfd).magic == undecided_magic)
306     NAME (aout, adjust_sizes_and_vmas) (abfd, &text_size, &text_end);
307 
308   execp->a_syms = bfd_get_symcount (abfd) * EXTERNAL_NLIST_SIZE;
309   execp->a_entry = bfd_get_start_address (abfd);
310 
311   if (obj_textsec (abfd)->reloc_count > 0
312       || obj_datasec (abfd)->reloc_count > 0)
313     {
314       execp->a_trsize = execp->a_text;
315       execp->a_drsize = execp->a_data;
316     }
317   else
318     {
319       execp->a_trsize = 0;
320       execp->a_drsize = 0;
321     }
322 
323   NAME (aout, swap_exec_header_out) (abfd, execp, & exec_bytes);
324 
325   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
326     return FALSE;
327 
328   if (bfd_bwrite ((void *) &exec_bytes, (bfd_size_type) EXEC_BYTES_SIZE, abfd)
329       != EXEC_BYTES_SIZE)
330     return FALSE;
331 
332   /* Now write out reloc info, followed by syms and strings.  */
333   if (bfd_get_outsymbols (abfd) != NULL
334       && bfd_get_symcount (abfd) != 0)
335     {
336       if (bfd_seek (abfd, (file_ptr) (N_SYMOFF(*execp)), SEEK_SET) != 0)
337 	return FALSE;
338 
339       if (! NAME (aout, write_syms) (abfd))
340 	return FALSE;
341     }
342 
343   if (obj_textsec (abfd)->reloc_count > 0
344       || obj_datasec (abfd)->reloc_count > 0)
345     {
346       if (bfd_seek (abfd, (file_ptr) (N_TRELOFF(*execp)), SEEK_SET) != 0
347 	  || !NAME (aout, squirt_out_relocs) (abfd, obj_textsec (abfd))
348 	  || bfd_seek (abfd, (file_ptr) (N_DRELOFF(*execp)), SEEK_SET) != 0
349 	  || !NAME (aout, squirt_out_relocs) (abfd, obj_datasec (abfd)))
350 	return FALSE;
351     }
352 
353   return TRUE;
354 }
355 
356 /* Write an object file.
357    Section contents have already been written.  We write the
358    file header, symbols, and relocation.  */
359 
360 static bfd_boolean
361 MY(write_object_contents) (bfd *abfd)
362 {
363   struct internal_exec *execp = exec_hdr (abfd);
364 
365   /* We must make certain that the magic number has been set.  This
366      will normally have been done by set_section_contents, but only if
367      there actually are some section contents.  */
368   if (! abfd->output_has_begun)
369     {
370       bfd_size_type text_size;
371       file_ptr text_end;
372 
373       NAME (aout, adjust_sizes_and_vmas) (abfd, &text_size, &text_end);
374     }
375 
376   obj_reloc_entry_size (abfd) = RELOC_SIZE;
377 
378   return WRITE_HEADERS (abfd, execp);
379 }
380 
381 /* Swap the information in an executable header @var{raw_bytes} taken
382    from a raw byte stream memory image into the internal exec header
383    structure "execp".  */
384 
385 #ifndef NAME_swap_exec_header_in
386 void
387 NAME (aout, swap_exec_header_in) (bfd *abfd,
388 				  struct external_exec *bytes,
389 				  struct internal_exec *execp)
390 {
391   /* The internal_exec structure has some fields that are unused in this
392      configuration (IE for i960), so ensure that all such uninitialized
393      fields are zero'd out.  There are places where two of these structs
394      are memcmp'd, and thus the contents do matter.  */
395   memset ((void *) execp, 0, sizeof (struct internal_exec));
396   /* Now fill in fields in the execp, from the bytes in the raw data.  */
397   execp->a_info   = GET_MAGIC (abfd, bytes->e_info);
398   execp->a_text   = GET_WORD (abfd, bytes->e_text);
399   execp->a_data   = GET_WORD (abfd, bytes->e_data);
400   execp->a_bss    = GET_WORD (abfd, bytes->e_bss);
401   execp->a_syms   = GET_WORD (abfd, bytes->e_syms);
402   execp->a_entry  = GET_WORD (abfd, bytes->e_entry);
403 
404   if (GET_WORD (abfd, bytes->e_flag) & A_FLAG_RELOC_STRIPPED)
405     {
406       execp->a_trsize = 0;
407       execp->a_drsize = 0;
408     }
409   else
410     {
411       execp->a_trsize = execp->a_text;
412       execp->a_drsize = execp->a_data;
413     }
414 }
415 #define NAME_swap_exec_header_in NAME (aout, swap_exec_header_in)
416 #endif
417 
418 /*  Swap the information in an internal exec header structure
419     "execp" into the buffer "bytes" ready for writing to disk.  */
420 void
421 NAME (aout, swap_exec_header_out) (bfd *abfd,
422 				   struct internal_exec *execp,
423 				   struct external_exec *bytes)
424 {
425   /* Now fill in fields in the raw data, from the fields in the exec struct.  */
426   PUT_MAGIC (abfd, execp->a_info,		bytes->e_info);
427   PUT_WORD (abfd, execp->a_text,		bytes->e_text);
428   PUT_WORD (abfd, execp->a_data,		bytes->e_data);
429   PUT_WORD (abfd, execp->a_bss,			bytes->e_bss);
430   PUT_WORD (abfd, execp->a_syms,		bytes->e_syms);
431   PUT_WORD (abfd, execp->a_entry,		bytes->e_entry);
432   PUT_WORD (abfd, 0,				bytes->e_unused);
433 
434   if ((execp->a_trsize == 0 || execp->a_text == 0)
435       && (execp->a_drsize == 0 || execp->a_data == 0))
436     PUT_WORD (abfd, A_FLAG_RELOC_STRIPPED, bytes->e_flag);
437   else if (execp->a_trsize == execp->a_text
438 	   && execp->a_drsize == execp->a_data)
439     PUT_WORD (abfd, 0, bytes->e_flag);
440   else
441     {
442       /* TODO: print a proper warning message.  */
443       fprintf (stderr, "BFD:%s:%d: internal error\n", __FILE__, __LINE__);
444       PUT_WORD (abfd, 0,			bytes->e_flag);
445     }
446 }
447 
448 /* Make all the section for an a.out file.  */
449 
450 bfd_boolean
451 NAME (aout, make_sections) (bfd *abfd)
452 {
453   if (obj_textsec (abfd) == NULL && bfd_make_section (abfd, ".text") == NULL)
454     return FALSE;
455   if (obj_datasec (abfd) == NULL && bfd_make_section (abfd, ".data") == NULL)
456     return FALSE;
457   if (obj_bsssec (abfd) == NULL  && bfd_make_section (abfd, ".bss") == NULL)
458     return FALSE;
459   return TRUE;
460 }
461 
462 /* Some a.out variant thinks that the file open in ABFD
463    checking is an a.out file.  Do some more checking, and set up
464    for access if it really is.  Call back to the calling
465    environment's "finish up" function just before returning, to
466    handle any last-minute setup.  */
467 
468 const bfd_target *
469 NAME (aout, some_aout_object_p) (bfd *abfd,
470 				 struct internal_exec *execp,
471 				 const bfd_target *(*callback_to_real_object_p) (bfd *))
472 {
473   struct aout_data_struct *rawptr, *oldrawptr;
474   const bfd_target *result;
475   bfd_size_type amt = sizeof (struct aout_data_struct);
476 
477   rawptr = bfd_zalloc (abfd, amt);
478   if (rawptr == NULL)
479     return 0;
480 
481   oldrawptr = abfd->tdata.aout_data;
482   abfd->tdata.aout_data = rawptr;
483 
484   /* Copy the contents of the old tdata struct.
485      In particular, we want the subformat, since for hpux it was set in
486      hp300hpux.c:swap_exec_header_in and will be used in
487      hp300hpux.c:callback.  */
488   if (oldrawptr != NULL)
489     *abfd->tdata.aout_data = *oldrawptr;
490 
491   abfd->tdata.aout_data->a.hdr = &rawptr->e;
492   *(abfd->tdata.aout_data->a.hdr) = *execp;	/* Copy in the internal_exec struct.  */
493   execp = abfd->tdata.aout_data->a.hdr;
494 
495   /* Set the file flags.  */
496   abfd->flags = BFD_NO_FLAGS;
497   if (execp->a_drsize || execp->a_trsize)
498     abfd->flags |= HAS_RELOC;
499   /* Setting of EXEC_P has been deferred to the bottom of this function.  */
500   if (execp->a_syms)
501     abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS;
502   if (N_DYNAMIC(*execp))
503     abfd->flags |= DYNAMIC;
504 
505   if (N_MAGIC (*execp) == ZMAGIC)
506     {
507       abfd->flags |= D_PAGED | WP_TEXT;
508       adata (abfd).magic = z_magic;
509     }
510   else if (N_MAGIC (*execp) == QMAGIC)
511     {
512       abfd->flags |= D_PAGED | WP_TEXT;
513       adata (abfd).magic = z_magic;
514       adata (abfd).subformat = q_magic_format;
515     }
516   else if (N_MAGIC (*execp) == NMAGIC)
517     {
518       abfd->flags |= WP_TEXT;
519       adata (abfd).magic = n_magic;
520     }
521   else if (N_MAGIC (*execp) == OMAGIC
522 	   || N_MAGIC (*execp) == BMAGIC)
523     adata (abfd).magic = o_magic;
524   else
525     {
526       /* Should have been checked with N_BADMAG before this routine
527 	 was called.  */
528       abort ();
529     }
530 
531   bfd_get_start_address (abfd) = execp->a_entry;
532 
533   obj_aout_symbols (abfd) = NULL;
534   bfd_get_symcount (abfd) = execp->a_syms / sizeof (struct external_nlist);
535 
536   /* The default relocation entry size is that of traditional V7 Unix.  */
537   obj_reloc_entry_size (abfd) = RELOC_SIZE;
538 
539   /* The default symbol entry size is that of traditional Unix.  */
540   obj_symbol_entry_size (abfd) = EXTERNAL_NLIST_SIZE;
541 
542 #ifdef USE_MMAP
543   bfd_init_window (&obj_aout_sym_window (abfd));
544   bfd_init_window (&obj_aout_string_window (abfd));
545 #endif
546 
547   obj_aout_external_syms (abfd) = NULL;
548   obj_aout_external_strings (abfd) = NULL;
549   obj_aout_sym_hashes (abfd) = NULL;
550 
551   if (! NAME (aout, make_sections) (abfd))
552     return NULL;
553 
554   obj_datasec (abfd)->size = execp->a_data;
555   obj_bsssec (abfd)->size = execp->a_bss;
556 
557   obj_textsec (abfd)->flags =
558     (execp->a_trsize != 0
559      ? (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_RELOC)
560      : (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS));
561   obj_datasec (abfd)->flags =
562     (execp->a_drsize != 0
563      ? (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS | SEC_RELOC)
564      : (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS));
565   obj_bsssec (abfd)->flags = SEC_ALLOC;
566 
567 #ifdef THIS_IS_ONLY_DOCUMENTATION
568   /* The common code can't fill in these things because they depend
569      on either the start address of the text segment, the rounding
570      up of virtual addresses between segments, or the starting file
571      position of the text segment -- all of which varies among different
572      versions of a.out.  */
573 
574   /* Call back to the format-dependent code to fill in the rest of the
575      fields and do any further cleanup.  Things that should be filled
576      in by the callback:  */
577   struct exec *execp = exec_hdr (abfd);
578 
579   obj_textsec (abfd)->size = N_TXTSIZE(*execp);
580   /* Data and bss are already filled in since they're so standard.  */
581 
582   /* The virtual memory addresses of the sections.  */
583   obj_textsec (abfd)->vma = N_TXTADDR(*execp);
584   obj_datasec (abfd)->vma = N_DATADDR(*execp);
585   obj_bsssec  (abfd)->vma = N_BSSADDR(*execp);
586 
587   /* The file offsets of the sections.  */
588   obj_textsec (abfd)->filepos = N_TXTOFF(*execp);
589   obj_datasec (abfd)->filepos = N_DATOFF(*execp);
590 
591   /* The file offsets of the relocation info.  */
592   obj_textsec (abfd)->rel_filepos = N_TRELOFF(*execp);
593   obj_datasec (abfd)->rel_filepos = N_DRELOFF(*execp);
594 
595   /* The file offsets of the string table and symbol table.  */
596   obj_str_filepos (abfd) = N_STROFF (*execp);
597   obj_sym_filepos (abfd) = N_SYMOFF (*execp);
598 
599   /* Determine the architecture and machine type of the object file.  */
600   abfd->obj_arch = bfd_arch_obscure;
601 
602   adata(abfd)->page_size = TARGET_PAGE_SIZE;
603   adata(abfd)->segment_size = SEGMENT_SIZE;
604   adata(abfd)->exec_bytes_size = EXEC_BYTES_SIZE;
605 
606   return abfd->xvec;
607 
608   /* The architecture is encoded in various ways in various a.out variants,
609      or is not encoded at all in some of them.  The relocation size depends
610      on the architecture and the a.out variant.  Finally, the return value
611      is the bfd_target vector in use.  If an error occurs, return zero and
612      set bfd_error to the appropriate error code.
613 
614      Formats such as b.out, which have additional fields in the a.out
615      header, should cope with them in this callback as well.  */
616 #endif	/* DOCUMENTATION */
617 
618   result = (*callback_to_real_object_p)(abfd);
619 
620   /* Now that the segment addresses have been worked out, take a better
621      guess at whether the file is executable.  If the entry point
622      is within the text segment, assume it is.  (This makes files
623      executable even if their entry point address is 0, as long as
624      their text starts at zero.).
625 
626      This test had to be changed to deal with systems where the text segment
627      runs at a different location than the default.  The problem is that the
628      entry address can appear to be outside the text segment, thus causing an
629      erroneous conclusion that the file isn't executable.
630 
631      To fix this, we now accept any non-zero entry point as an indication of
632      executability.  This will work most of the time, since only the linker
633      sets the entry point, and that is likely to be non-zero for most systems. */
634 
635   if (execp->a_entry != 0
636       || (execp->a_entry >= obj_textsec(abfd)->vma
637 	  && execp->a_entry < obj_textsec(abfd)->vma + obj_textsec(abfd)->size))
638     abfd->flags |= EXEC_P;
639 #ifdef STAT_FOR_EXEC
640   else
641     {
642       struct stat stat_buf;
643 
644       /* The original heuristic doesn't work in some important cases.
645         The a.out file has no information about the text start
646         address.  For files (like kernels) linked to non-standard
647         addresses (ld -Ttext nnn) the entry point may not be between
648         the default text start (obj_textsec(abfd)->vma) and
649         (obj_textsec(abfd)->vma) + text size.  This is not just a mach
650         issue.  Many kernels are loaded at non standard addresses.  */
651       if (abfd->iostream != NULL
652 	  && (abfd->flags & BFD_IN_MEMORY) == 0
653 	  && (fstat(fileno((FILE *) (abfd->iostream)), &stat_buf) == 0)
654 	  && ((stat_buf.st_mode & 0111) != 0))
655 	abfd->flags |= EXEC_P;
656     }
657 #endif /* STAT_FOR_EXEC */
658 
659   if (!result)
660     {
661       free (rawptr);
662       abfd->tdata.aout_data = oldrawptr;
663     }
664   return result;
665 }
666 
667 /* Initialize ABFD for use with a.out files.  */
668 
669 bfd_boolean
670 NAME (aout, mkobject) (bfd *abfd)
671 {
672   struct aout_data_struct  *rawptr;
673   bfd_size_type amt = sizeof (struct aout_data_struct);
674 
675   bfd_set_error (bfd_error_system_call);
676 
677   /* Use an intermediate variable for clarity.  */
678   rawptr = bfd_zalloc (abfd, amt);
679 
680   if (rawptr == NULL)
681     return FALSE;
682 
683   abfd->tdata.aout_data = rawptr;
684   exec_hdr (abfd) = &(rawptr->e);
685 
686   obj_textsec (abfd) = NULL;
687   obj_datasec (abfd) = NULL;
688   obj_bsssec (abfd)  = NULL;
689 
690   return TRUE;
691 }
692 
693 /* Keep track of machine architecture and machine type for
694    a.out's. Return the <<machine_type>> for a particular
695    architecture and machine, or <<M_UNKNOWN>> if that exact architecture
696    and machine can't be represented in a.out format.
697 
698    If the architecture is understood, machine type 0 (default)
699    is always understood.  */
700 
701 enum machine_type
702 NAME (aout, machine_type) (enum bfd_architecture arch,
703 			   unsigned long machine,
704 			   bfd_boolean *unknown)
705 {
706   enum machine_type arch_flags;
707 
708   arch_flags = M_UNKNOWN;
709   *unknown = TRUE;
710 
711   switch (arch)
712     {
713     case bfd_arch_sparc:
714       if (machine == 0
715 	  || machine == bfd_mach_sparc
716 	  || machine == bfd_mach_sparc_sparclite
717 	  || machine == bfd_mach_sparc_v9)
718 	arch_flags = M_SPARC;
719       else if (machine == bfd_mach_sparc_sparclet)
720 	arch_flags = M_SPARCLET;
721       break;
722 
723     case bfd_arch_m68k:
724       switch (machine)
725 	{
726 	case 0:		      arch_flags = M_68010; break;
727 	case bfd_mach_m68000: arch_flags = M_UNKNOWN; *unknown = FALSE; break;
728 	case bfd_mach_m68010: arch_flags = M_68010; break;
729 	case bfd_mach_m68020: arch_flags = M_68020; break;
730 	default:	      arch_flags = M_UNKNOWN; break;
731 	}
732       break;
733 
734     case bfd_arch_i386:
735       if (machine == 0
736 	  || machine == bfd_mach_i386_i386
737 	  || machine == bfd_mach_i386_i386_intel_syntax)
738 	arch_flags = M_386;
739       break;
740 
741     case bfd_arch_arm:
742       if (machine == 0)	arch_flags = M_ARM;
743       break;
744 
745     case bfd_arch_mips:
746       switch (machine)
747 	{
748 	case 0:
749 	case 2000:
750 	case bfd_mach_mips3000:
751           arch_flags = M_MIPS1;
752 	  break;
753 	case bfd_mach_mips4000: /* MIPS3 */
754 	case bfd_mach_mips4400:
755 	case bfd_mach_mips8000: /* MIPS4 */
756 	case bfd_mach_mips6000: /* Real MIPS2: */
757           arch_flags = M_MIPS2;
758 	  break;
759 	default:
760 	  arch_flags = M_UNKNOWN;
761 	  break;
762 	}
763       break;
764 
765     case bfd_arch_ns32k:
766       switch (machine)
767 	{
768 	case 0:    		arch_flags = M_NS32532; break;
769 	case 32032:		arch_flags = M_NS32032; break;
770 	case 32532:		arch_flags = M_NS32532; break;
771 	default:		arch_flags = M_UNKNOWN; break;
772 	}
773       break;
774 
775     case bfd_arch_pdp11:
776       /* TODO: arch_flags = M_PDP11; */
777       *unknown = FALSE;
778       break;
779 
780     case bfd_arch_vax:
781       *unknown = FALSE;
782       break;
783 
784     default:
785       arch_flags = M_UNKNOWN;
786     }
787 
788   if (arch_flags != M_UNKNOWN)
789     *unknown = FALSE;
790 
791   return arch_flags;
792 }
793 
794 /* Set the architecture and the machine of the ABFD to the
795    values ARCH and MACHINE.  Verify that @ABFD's format
796    can support the architecture required.  */
797 
798 bfd_boolean
799 NAME (aout, set_arch_mach) (bfd *abfd,
800 			    enum bfd_architecture arch,
801 			    unsigned long machine)
802 {
803   if (! bfd_default_set_arch_mach (abfd, arch, machine))
804     return FALSE;
805 
806   if (arch != bfd_arch_unknown)
807     {
808       bfd_boolean unknown;
809 
810       NAME (aout, machine_type) (arch, machine, &unknown);
811       if (unknown)
812 	return FALSE;
813     }
814 
815   obj_reloc_entry_size (abfd) = RELOC_SIZE;
816 
817   return (*aout_backend_info(abfd)->set_sizes) (abfd);
818 }
819 
820 static void
821 adjust_o_magic (bfd *abfd, struct internal_exec *execp)
822 {
823   file_ptr pos = adata (abfd).exec_bytes_size;
824   bfd_vma vma = 0;
825   int pad = 0;
826 
827   /* Text.  */
828   obj_textsec (abfd)->filepos = pos;
829   if (! obj_textsec (abfd)->user_set_vma)
830     obj_textsec (abfd)->vma = vma;
831   else
832     vma = obj_textsec (abfd)->vma;
833 
834   pos += obj_textsec (abfd)->size;
835   vma += obj_textsec (abfd)->size;
836 
837   /* Data.  */
838   if (!obj_datasec (abfd)->user_set_vma)
839     {
840       obj_textsec (abfd)->size += pad;
841       pos += pad;
842       vma += pad;
843       obj_datasec (abfd)->vma = vma;
844     }
845   else
846     vma = obj_datasec (abfd)->vma;
847   obj_datasec (abfd)->filepos = pos;
848   pos += obj_datasec (abfd)->size;
849   vma += obj_datasec (abfd)->size;
850 
851   /* BSS.  */
852   if (! obj_bsssec (abfd)->user_set_vma)
853     {
854       obj_datasec (abfd)->size += pad;
855       pos += pad;
856       vma += pad;
857       obj_bsssec (abfd)->vma = vma;
858     }
859   else
860     {
861       /* The VMA of the .bss section is set by the VMA of the
862          .data section plus the size of the .data section.  We may
863          need to add padding bytes to make this true.  */
864       pad = obj_bsssec (abfd)->vma - vma;
865       if (pad > 0)
866 	{
867 	  obj_datasec (abfd)->size += pad;
868 	  pos += pad;
869 	}
870     }
871   obj_bsssec (abfd)->filepos = pos;
872 
873   /* Fix up the exec header.  */
874   execp->a_text = obj_textsec (abfd)->size;
875   execp->a_data = obj_datasec (abfd)->size;
876   execp->a_bss  = obj_bsssec (abfd)->size;
877   N_SET_MAGIC (*execp, OMAGIC);
878 }
879 
880 static void
881 adjust_z_magic (bfd *abfd, struct internal_exec *execp)
882 {
883   bfd_size_type data_pad, text_pad;
884   file_ptr text_end;
885   const struct aout_backend_data *abdp;
886   int ztih;			/* Nonzero if text includes exec header.  */
887 
888   abdp = aout_backend_info (abfd);
889 
890   /* Text.  */
891   ztih = (abdp != NULL
892 	  && (abdp->text_includes_header
893 	      || obj_aout_subformat (abfd) == q_magic_format));
894   obj_textsec(abfd)->filepos = (ztih
895 				? adata(abfd).exec_bytes_size
896 				: adata(abfd).zmagic_disk_block_size);
897   if (! obj_textsec(abfd)->user_set_vma)
898     {
899       /* ?? Do we really need to check for relocs here?  */
900       obj_textsec(abfd)->vma = ((abfd->flags & HAS_RELOC)
901 				? 0
902 				: (ztih
903 				   ? (abdp->default_text_vma
904 				      + adata (abfd).exec_bytes_size)
905 				   : abdp->default_text_vma));
906       text_pad = 0;
907     }
908   else
909     {
910       /* The .text section is being loaded at an unusual address.  We
911          may need to pad it such that the .data section starts at a page
912          boundary.  */
913       if (ztih)
914 	text_pad = ((obj_textsec (abfd)->filepos - obj_textsec (abfd)->vma)
915 		    & (adata (abfd).page_size - 1));
916       else
917 	text_pad = ((- obj_textsec (abfd)->vma)
918 		    & (adata (abfd).page_size - 1));
919     }
920 
921   /* Find start of data.  */
922   if (ztih)
923     {
924       text_end = obj_textsec (abfd)->filepos + obj_textsec (abfd)->size;
925       text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end;
926     }
927   else
928     {
929       /* Note that if page_size == zmagic_disk_block_size, then
930 	 filepos == page_size, and this case is the same as the ztih
931 	 case.  */
932       text_end = obj_textsec (abfd)->size;
933       text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end;
934       text_end += obj_textsec (abfd)->filepos;
935     }
936 
937   obj_textsec (abfd)->size += text_pad;
938   text_end += text_pad;
939 
940   /* Data.  */
941   if (!obj_datasec(abfd)->user_set_vma)
942     {
943       bfd_vma vma;
944       vma = obj_textsec(abfd)->vma + obj_textsec(abfd)->size;
945       obj_datasec(abfd)->vma = BFD_ALIGN (vma, adata(abfd).segment_size);
946     }
947   if (abdp && abdp->zmagic_mapped_contiguous)
948     {
949       text_pad = (obj_datasec(abfd)->vma
950 		  - obj_textsec(abfd)->vma
951 		  - obj_textsec(abfd)->size);
952       obj_textsec(abfd)->size += text_pad;
953     }
954   obj_datasec (abfd)->filepos = (obj_textsec (abfd)->filepos
955 				+ obj_textsec (abfd)->size);
956 
957   /* Fix up exec header while we're at it.  */
958   execp->a_text = obj_textsec(abfd)->size;
959   if (ztih && (!abdp || (abdp && !abdp->exec_header_not_counted)))
960     execp->a_text += adata(abfd).exec_bytes_size;
961   if (obj_aout_subformat (abfd) == q_magic_format)
962     N_SET_MAGIC (*execp, QMAGIC);
963   else
964     N_SET_MAGIC (*execp, ZMAGIC);
965 
966   /* Spec says data section should be rounded up to page boundary.  */
967   obj_datasec(abfd)->size
968     = align_power (obj_datasec(abfd)->size,
969 		   obj_bsssec(abfd)->alignment_power);
970   execp->a_data = BFD_ALIGN (obj_datasec(abfd)->size,
971 			     adata(abfd).page_size);
972   data_pad = execp->a_data - obj_datasec(abfd)->size;
973 
974   /* BSS.  */
975   if (!obj_bsssec(abfd)->user_set_vma)
976     obj_bsssec(abfd)->vma = (obj_datasec(abfd)->vma
977 			     + obj_datasec(abfd)->size);
978   /* If the BSS immediately follows the data section and extra space
979      in the page is left after the data section, fudge data
980      in the header so that the bss section looks smaller by that
981      amount.  We'll start the bss section there, and lie to the OS.
982      (Note that a linker script, as well as the above assignment,
983      could have explicitly set the BSS vma to immediately follow
984      the data section.)  */
985   if (align_power (obj_bsssec(abfd)->vma, obj_bsssec(abfd)->alignment_power)
986       == obj_datasec(abfd)->vma + obj_datasec(abfd)->size)
987     execp->a_bss = (data_pad > obj_bsssec(abfd)->size) ? 0 :
988       obj_bsssec(abfd)->size - data_pad;
989   else
990     execp->a_bss = obj_bsssec(abfd)->size;
991 }
992 
993 static void
994 adjust_n_magic (bfd *abfd, struct internal_exec *execp)
995 {
996   file_ptr pos = adata(abfd).exec_bytes_size;
997   bfd_vma vma = 0;
998   int pad;
999 
1000   /* Text.  */
1001   obj_textsec(abfd)->filepos = pos;
1002   if (!obj_textsec(abfd)->user_set_vma)
1003     obj_textsec(abfd)->vma = vma;
1004   else
1005     vma = obj_textsec(abfd)->vma;
1006   pos += obj_textsec(abfd)->size;
1007   vma += obj_textsec(abfd)->size;
1008 
1009   /* Data.  */
1010   obj_datasec(abfd)->filepos = pos;
1011   if (!obj_datasec(abfd)->user_set_vma)
1012     obj_datasec(abfd)->vma = BFD_ALIGN (vma, adata(abfd).segment_size);
1013   vma = obj_datasec(abfd)->vma;
1014 
1015   /* Since BSS follows data immediately, see if it needs alignment.  */
1016   vma += obj_datasec(abfd)->size;
1017   pad = align_power (vma, obj_bsssec(abfd)->alignment_power) - vma;
1018   obj_datasec(abfd)->size += pad;
1019   pos += obj_datasec(abfd)->size;
1020 
1021   /* BSS.  */
1022   if (!obj_bsssec(abfd)->user_set_vma)
1023     obj_bsssec(abfd)->vma = vma;
1024   else
1025     vma = obj_bsssec(abfd)->vma;
1026 
1027   /* Fix up exec header.  */
1028   execp->a_text = obj_textsec(abfd)->size;
1029   execp->a_data = obj_datasec(abfd)->size;
1030   execp->a_bss = obj_bsssec(abfd)->size;
1031   N_SET_MAGIC (*execp, NMAGIC);
1032 }
1033 
1034 bfd_boolean
1035 NAME (aout, adjust_sizes_and_vmas) (bfd *abfd,
1036 				    bfd_size_type *text_size,
1037 				    file_ptr * text_end ATTRIBUTE_UNUSED)
1038 {
1039   struct internal_exec *execp = exec_hdr (abfd);
1040 
1041   if (! NAME (aout, make_sections) (abfd))
1042     return FALSE;
1043 
1044   if (adata(abfd).magic != undecided_magic)
1045     return TRUE;
1046 
1047   obj_textsec(abfd)->size =
1048     align_power(obj_textsec(abfd)->size,
1049 		obj_textsec(abfd)->alignment_power);
1050 
1051   *text_size = obj_textsec (abfd)->size;
1052   /* Rule (heuristic) for when to pad to a new page.  Note that there
1053      are (at least) two ways demand-paged (ZMAGIC) files have been
1054      handled.  Most Berkeley-based systems start the text segment at
1055      (TARGET_PAGE_SIZE).  However, newer versions of SUNOS start the text
1056      segment right after the exec header; the latter is counted in the
1057      text segment size, and is paged in by the kernel with the rest of
1058      the text. */
1059 
1060   /* This perhaps isn't the right way to do this, but made it simpler for me
1061      to understand enough to implement it.  Better would probably be to go
1062      right from BFD flags to alignment/positioning characteristics.  But the
1063      old code was sloppy enough about handling the flags, and had enough
1064      other magic, that it was a little hard for me to understand.  I think
1065      I understand it better now, but I haven't time to do the cleanup this
1066      minute.  */
1067 
1068   if (abfd->flags & WP_TEXT)
1069     adata(abfd).magic = n_magic;
1070   else
1071     adata(abfd).magic = o_magic;
1072 
1073 #ifdef BFD_AOUT_DEBUG /* requires gcc2 */
1074 #if __GNUC__ >= 2
1075   fprintf (stderr, "%s text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x,%x>\n",
1076 	   ({ char *str;
1077 	      switch (adata(abfd).magic) {
1078 	      case n_magic: str = "NMAGIC"; break;
1079 	      case o_magic: str = "OMAGIC"; break;
1080 	      case z_magic: str = "ZMAGIC"; break;
1081 	      default: abort ();
1082 	      }
1083 	      str;
1084 	    }),
1085 	   obj_textsec(abfd)->vma, obj_textsec(abfd)->size,
1086 	   	obj_textsec(abfd)->alignment_power,
1087 	   obj_datasec(abfd)->vma, obj_datasec(abfd)->size,
1088 	   	obj_datasec(abfd)->alignment_power,
1089 	   obj_bsssec(abfd)->vma, obj_bsssec(abfd)->size,
1090 	   	obj_bsssec(abfd)->alignment_power);
1091 #endif
1092 #endif
1093 
1094   switch (adata(abfd).magic)
1095     {
1096     case o_magic:
1097       adjust_o_magic (abfd, execp);
1098       break;
1099     case z_magic:
1100       adjust_z_magic (abfd, execp);
1101       break;
1102     case n_magic:
1103       adjust_n_magic (abfd, execp);
1104       break;
1105     default:
1106       abort ();
1107     }
1108 
1109 #ifdef BFD_AOUT_DEBUG
1110   fprintf (stderr, "       text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x>\n",
1111 	   obj_textsec(abfd)->vma, obj_textsec(abfd)->size,
1112 	   	obj_textsec(abfd)->filepos,
1113 	   obj_datasec(abfd)->vma, obj_datasec(abfd)->size,
1114 	   	obj_datasec(abfd)->filepos,
1115 	   obj_bsssec(abfd)->vma, obj_bsssec(abfd)->size);
1116 #endif
1117 
1118   return TRUE;
1119 }
1120 
1121 /* Called by the BFD in response to a bfd_make_section request.  */
1122 
1123 bfd_boolean
1124 NAME (aout, new_section_hook) (bfd *abfd, asection *newsect)
1125 {
1126   /* Align to double at least.  */
1127   newsect->alignment_power = bfd_get_arch_info(abfd)->section_align_power;
1128 
1129   if (bfd_get_format (abfd) == bfd_object)
1130     {
1131       if (obj_textsec (abfd) == NULL
1132 	  && !strcmp (newsect->name, ".text"))
1133 	{
1134 	  obj_textsec(abfd)= newsect;
1135 	  newsect->target_index = N_TEXT;
1136 	}
1137       else if (obj_datasec (abfd) == NULL
1138 	       && !strcmp (newsect->name, ".data"))
1139 	{
1140 	  obj_datasec (abfd) = newsect;
1141 	  newsect->target_index = N_DATA;
1142 	}
1143       else if (obj_bsssec (abfd) == NULL
1144 	       && !strcmp (newsect->name, ".bss"))
1145 	{
1146 	  obj_bsssec (abfd) = newsect;
1147 	  newsect->target_index = N_BSS;
1148 	}
1149     }
1150 
1151   /* We allow more than three sections internally.  */
1152   return _bfd_generic_new_section_hook (abfd, newsect);
1153 }
1154 
1155 bfd_boolean
1156 NAME (aout, set_section_contents) (bfd *abfd,
1157 				   sec_ptr section,
1158 				   const void * location,
1159 				   file_ptr offset,
1160 				   bfd_size_type count)
1161 {
1162   file_ptr text_end;
1163   bfd_size_type text_size;
1164 
1165   if (! abfd->output_has_begun)
1166     {
1167       if (! NAME (aout, adjust_sizes_and_vmas) (abfd, & text_size, & text_end))
1168 	return FALSE;
1169     }
1170 
1171   if (section == obj_bsssec (abfd))
1172     {
1173       bfd_set_error (bfd_error_no_contents);
1174       return FALSE;
1175     }
1176 
1177   if (section != obj_textsec (abfd)
1178       && section != obj_datasec (abfd))
1179     {
1180       (*_bfd_error_handler)
1181 	("%s: can not represent section `%s' in a.out object file format",
1182 	 bfd_get_filename (abfd), bfd_get_section_name (abfd, section));
1183       bfd_set_error (bfd_error_nonrepresentable_section);
1184       return FALSE;
1185     }
1186 
1187   if (count != 0)
1188     {
1189       if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
1190 	  || bfd_bwrite (location, count, abfd) != count)
1191 	return FALSE;
1192     }
1193 
1194   return TRUE;
1195 }
1196 
1197 /* Read the external symbols from an a.out file.  */
1198 
1199 static bfd_boolean
1200 aout_get_external_symbols (bfd *abfd)
1201 {
1202   if (obj_aout_external_syms (abfd) == NULL)
1203     {
1204       bfd_size_type count;
1205       struct external_nlist *syms;
1206 
1207       count = exec_hdr (abfd)->a_syms / EXTERNAL_NLIST_SIZE;
1208 
1209 #ifdef USE_MMAP
1210       if (! bfd_get_file_window (abfd, obj_sym_filepos (abfd),
1211 				 exec_hdr (abfd)->a_syms,
1212 				 &obj_aout_sym_window (abfd), TRUE))
1213 	return FALSE;
1214       syms = (struct external_nlist *) obj_aout_sym_window (abfd).data;
1215 #else
1216       /* We allocate using malloc to make the values easy to free
1217 	 later on.  If we put them on the objalloc it might not be
1218 	 possible to free them.  */
1219       syms = bfd_malloc (count * EXTERNAL_NLIST_SIZE);
1220       if (syms == NULL && count != 0)
1221 	return FALSE;
1222 
1223       if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1224 	  || (bfd_bread (syms, exec_hdr (abfd)->a_syms, abfd)
1225 	      != exec_hdr (abfd)->a_syms))
1226 	{
1227 	  free (syms);
1228 	  return FALSE;
1229 	}
1230 #endif
1231 
1232       obj_aout_external_syms (abfd) = syms;
1233       obj_aout_external_sym_count (abfd) = count;
1234     }
1235 
1236   if (obj_aout_external_strings (abfd) == NULL
1237       && exec_hdr (abfd)->a_syms != 0)
1238     {
1239       unsigned char string_chars[BYTES_IN_LONG];
1240       bfd_size_type stringsize;
1241       char *strings;
1242 
1243       /* Get the size of the strings.  */
1244       if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
1245 	  || (bfd_bread ((void *) string_chars, (bfd_size_type) BYTES_IN_LONG,
1246 			abfd) != BYTES_IN_LONG))
1247 	return FALSE;
1248       stringsize = H_GET_32 (abfd, string_chars);
1249 
1250 #ifdef USE_MMAP
1251       if (! bfd_get_file_window (abfd, obj_str_filepos (abfd), stringsize,
1252 				 &obj_aout_string_window (abfd), TRUE))
1253 	return FALSE;
1254       strings = (char *) obj_aout_string_window (abfd).data;
1255 #else
1256       strings = bfd_malloc (stringsize + 1);
1257       if (strings == NULL)
1258 	return FALSE;
1259 
1260       /* Skip space for the string count in the buffer for convenience
1261 	 when using indexes.  */
1262       if (bfd_bread (strings + 4, stringsize - 4, abfd) != stringsize - 4)
1263 	{
1264 	  free (strings);
1265 	  return FALSE;
1266 	}
1267 #endif
1268       /* Ensure that a zero index yields an empty string.  */
1269       strings[0] = '\0';
1270 
1271       strings[stringsize - 1] = 0;
1272 
1273       obj_aout_external_strings (abfd) = strings;
1274       obj_aout_external_string_size (abfd) = stringsize;
1275     }
1276 
1277   return TRUE;
1278 }
1279 
1280 /* Translate an a.out symbol into a BFD symbol.  The desc, other, type
1281    and symbol->value fields of CACHE_PTR will be set from the a.out
1282    nlist structure.  This function is responsible for setting
1283    symbol->flags and symbol->section, and adjusting symbol->value.  */
1284 
1285 static bfd_boolean
1286 translate_from_native_sym_flags (bfd *abfd,
1287 				 aout_symbol_type *cache_ptr)
1288 {
1289   flagword visible;
1290 
1291   if (cache_ptr->type == N_FN)
1292     {
1293       asection *sec;
1294 
1295       /* This is a debugging symbol.  */
1296       cache_ptr->symbol.flags = BSF_DEBUGGING;
1297 
1298       /* Work out the symbol section.  */
1299       switch (cache_ptr->type & N_TYPE)
1300 	{
1301 	case N_TEXT:
1302 	case N_FN:
1303 	  sec = obj_textsec (abfd);
1304 	  break;
1305 	case N_DATA:
1306 	  sec = obj_datasec (abfd);
1307 	  break;
1308 	case N_BSS:
1309 	  sec = obj_bsssec (abfd);
1310 	  break;
1311 	default:
1312 	case N_ABS:
1313 	  sec = bfd_abs_section_ptr;
1314 	  break;
1315 	}
1316 
1317       cache_ptr->symbol.section = sec;
1318       cache_ptr->symbol.value -= sec->vma;
1319 
1320       return TRUE;
1321     }
1322 
1323   /* Get the default visibility.  This does not apply to all types, so
1324      we just hold it in a local variable to use if wanted.  */
1325   if ((cache_ptr->type & N_EXT) == 0)
1326     visible = BSF_LOCAL;
1327   else
1328     visible = BSF_GLOBAL;
1329 
1330   switch (cache_ptr->type)
1331     {
1332     default:
1333     case N_ABS: case N_ABS | N_EXT:
1334       cache_ptr->symbol.section = bfd_abs_section_ptr;
1335       cache_ptr->symbol.flags = visible;
1336       break;
1337 
1338     case N_UNDF | N_EXT:
1339       if (cache_ptr->symbol.value != 0)
1340 	{
1341 	  /* This is a common symbol.  */
1342 	  cache_ptr->symbol.flags = BSF_GLOBAL;
1343 	  cache_ptr->symbol.section = bfd_com_section_ptr;
1344 	}
1345       else
1346 	{
1347 	  cache_ptr->symbol.flags = 0;
1348 	  cache_ptr->symbol.section = bfd_und_section_ptr;
1349 	}
1350       break;
1351 
1352     case N_TEXT: case N_TEXT | N_EXT:
1353       cache_ptr->symbol.section = obj_textsec (abfd);
1354       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1355       cache_ptr->symbol.flags = visible;
1356       break;
1357 
1358     case N_DATA: case N_DATA | N_EXT:
1359       cache_ptr->symbol.section = obj_datasec (abfd);
1360       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1361       cache_ptr->symbol.flags = visible;
1362       break;
1363 
1364     case N_BSS: case N_BSS | N_EXT:
1365       cache_ptr->symbol.section = obj_bsssec (abfd);
1366       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1367       cache_ptr->symbol.flags = visible;
1368       break;
1369     }
1370 
1371   return TRUE;
1372 }
1373 
1374 /* Set the fields of SYM_POINTER according to CACHE_PTR.  */
1375 
1376 static bfd_boolean
1377 translate_to_native_sym_flags (bfd *abfd,
1378 			       asymbol *cache_ptr,
1379 			       struct external_nlist *sym_pointer)
1380 {
1381   bfd_vma value = cache_ptr->value;
1382   asection *sec;
1383   bfd_vma off;
1384 
1385   /* Mask out any existing type bits in case copying from one section
1386      to another.  */
1387   sym_pointer->e_type[0] &= ~N_TYPE;
1388 
1389   sec = bfd_get_section (cache_ptr);
1390   off = 0;
1391 
1392   if (sec == NULL)
1393     {
1394       /* This case occurs, e.g., for the *DEBUG* section of a COFF
1395 	 file.  */
1396       (*_bfd_error_handler)
1397 	("%B: can not represent section for symbol `%s' in a.out object file format",
1398 	 abfd, cache_ptr->name != NULL ? cache_ptr->name : "*unknown*");
1399       bfd_set_error (bfd_error_nonrepresentable_section);
1400       return FALSE;
1401     }
1402 
1403   if (sec->output_section != NULL)
1404     {
1405       off = sec->output_offset;
1406       sec = sec->output_section;
1407     }
1408 
1409   if (bfd_is_abs_section (sec))
1410     sym_pointer->e_type[0] |= N_ABS;
1411   else if (sec == obj_textsec (abfd))
1412     sym_pointer->e_type[0] |= N_TEXT;
1413   else if (sec == obj_datasec (abfd))
1414     sym_pointer->e_type[0] |= N_DATA;
1415   else if (sec == obj_bsssec (abfd))
1416     sym_pointer->e_type[0] |= N_BSS;
1417   else if (bfd_is_und_section (sec))
1418     sym_pointer->e_type[0] = N_UNDF | N_EXT;
1419   else if (bfd_is_com_section (sec))
1420     sym_pointer->e_type[0] = N_UNDF | N_EXT;
1421   else
1422     {
1423       (*_bfd_error_handler)
1424 	("%B: can not represent section `%A' in a.out object file format",
1425 	 abfd, sec);
1426       bfd_set_error (bfd_error_nonrepresentable_section);
1427       return FALSE;
1428     }
1429 
1430   /* Turn the symbol from section relative to absolute again */
1431   value += sec->vma + off;
1432 
1433   if ((cache_ptr->flags & BSF_DEBUGGING) != 0)
1434     sym_pointer->e_type[0] = ((aout_symbol_type *) cache_ptr)->type;
1435   else if ((cache_ptr->flags & BSF_GLOBAL) != 0)
1436     sym_pointer->e_type[0] |= N_EXT;
1437 
1438   PUT_WORD(abfd, value, sym_pointer->e_value);
1439 
1440   return TRUE;
1441 }
1442 
1443 /* Native-level interface to symbols. */
1444 
1445 asymbol *
1446 NAME (aout, make_empty_symbol) (bfd *abfd)
1447 {
1448   bfd_size_type amt = sizeof (aout_symbol_type);
1449   aout_symbol_type *new = bfd_zalloc (abfd, amt);
1450 
1451   if (!new)
1452     return NULL;
1453   new->symbol.the_bfd = abfd;
1454 
1455   return &new->symbol;
1456 }
1457 
1458 /* Translate a set of internal symbols into external symbols.  */
1459 
1460 bfd_boolean
1461 NAME (aout, translate_symbol_table) (bfd *abfd,
1462 				     aout_symbol_type *in,
1463 				     struct external_nlist *ext,
1464 				     bfd_size_type count,
1465 				     char *str,
1466 				     bfd_size_type strsize,
1467 				     bfd_boolean dynamic)
1468 {
1469   struct external_nlist *ext_end;
1470 
1471   ext_end = ext + count;
1472   for (; ext < ext_end; ext++, in++)
1473     {
1474       bfd_vma x;
1475 
1476       x = GET_WORD (abfd, ext->e_strx);
1477       in->symbol.the_bfd = abfd;
1478 
1479       /* For the normal symbols, the zero index points at the number
1480 	 of bytes in the string table but is to be interpreted as the
1481 	 null string.  For the dynamic symbols, the number of bytes in
1482 	 the string table is stored in the __DYNAMIC structure and the
1483 	 zero index points at an actual string.  */
1484       if (x == 0 && ! dynamic)
1485 	in->symbol.name = "";
1486       else if (x < strsize)
1487 	in->symbol.name = str + x;
1488       else
1489 	return FALSE;
1490 
1491       in->symbol.value = GET_SWORD (abfd,  ext->e_value);
1492       /* TODO: is 0 a safe value here?  */
1493       in->desc = 0;
1494       in->other = 0;
1495       in->type = H_GET_8 (abfd,  ext->e_type);
1496       in->symbol.udata.p = NULL;
1497 
1498       if (! translate_from_native_sym_flags (abfd, in))
1499 	return FALSE;
1500 
1501       if (dynamic)
1502 	in->symbol.flags |= BSF_DYNAMIC;
1503     }
1504 
1505   return TRUE;
1506 }
1507 
1508 /* We read the symbols into a buffer, which is discarded when this
1509    function exits.  We read the strings into a buffer large enough to
1510    hold them all plus all the cached symbol entries.  */
1511 
1512 bfd_boolean
1513 NAME (aout, slurp_symbol_table) (bfd *abfd)
1514 {
1515   struct external_nlist *old_external_syms;
1516   aout_symbol_type *cached;
1517   bfd_size_type cached_size;
1518 
1519   /* If there's no work to be done, don't do any.  */
1520   if (obj_aout_symbols (abfd) != NULL)
1521     return TRUE;
1522 
1523   old_external_syms = obj_aout_external_syms (abfd);
1524 
1525   if (! aout_get_external_symbols (abfd))
1526     return FALSE;
1527 
1528   cached_size = obj_aout_external_sym_count (abfd);
1529   cached_size *= sizeof (aout_symbol_type);
1530   cached = bfd_zmalloc (cached_size);
1531   if (cached == NULL && cached_size != 0)
1532     return FALSE;
1533 
1534   /* Convert from external symbol information to internal.  */
1535   if (! (NAME (aout, translate_symbol_table)
1536 	 (abfd, cached,
1537 	  obj_aout_external_syms (abfd),
1538 	  obj_aout_external_sym_count (abfd),
1539 	  obj_aout_external_strings (abfd),
1540 	  obj_aout_external_string_size (abfd),
1541 	  FALSE)))
1542     {
1543       free (cached);
1544       return FALSE;
1545     }
1546 
1547   bfd_get_symcount (abfd) = obj_aout_external_sym_count (abfd);
1548 
1549   obj_aout_symbols (abfd) = cached;
1550 
1551   /* It is very likely that anybody who calls this function will not
1552      want the external symbol information, so if it was allocated
1553      because of our call to aout_get_external_symbols, we free it up
1554      right away to save space.  */
1555   if (old_external_syms == NULL
1556       && obj_aout_external_syms (abfd) != NULL)
1557     {
1558 #ifdef USE_MMAP
1559       bfd_free_window (&obj_aout_sym_window (abfd));
1560 #else
1561       free (obj_aout_external_syms (abfd));
1562 #endif
1563       obj_aout_external_syms (abfd) = NULL;
1564     }
1565 
1566   return TRUE;
1567 }
1568 
1569 /* We use a hash table when writing out symbols so that we only write
1570    out a particular string once.  This helps particularly when the
1571    linker writes out stabs debugging entries, because each different
1572    contributing object file tends to have many duplicate stabs
1573    strings.
1574 
1575    This hash table code breaks dbx on SunOS 4.1.3, so we don't do it
1576    if BFD_TRADITIONAL_FORMAT is set.  */
1577 
1578 /* Get the index of a string in a strtab, adding it if it is not
1579    already present.  */
1580 
1581 static INLINE bfd_size_type
1582 add_to_stringtab (bfd *abfd,
1583 		  struct bfd_strtab_hash *tab,
1584 		  const char *str,
1585 		  bfd_boolean copy)
1586 {
1587   bfd_boolean hash;
1588   bfd_size_type index;
1589 
1590   /* An index of 0 always means the empty string.  */
1591   if (str == 0 || *str == '\0')
1592     return 0;
1593 
1594   /* Don't hash if BFD_TRADITIONAL_FORMAT is set, because SunOS dbx
1595      doesn't understand a hashed string table.  */
1596   hash = TRUE;
1597   if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
1598     hash = FALSE;
1599 
1600   index = _bfd_stringtab_add (tab, str, hash, copy);
1601 
1602   if (index != (bfd_size_type) -1)
1603     /* Add BYTES_IN_LONG to the return value to account for the
1604        space taken up by the string table size.  */
1605     index += BYTES_IN_LONG;
1606 
1607   return index;
1608 }
1609 
1610 /* Write out a strtab.  ABFD is already at the right location in the
1611    file.  */
1612 
1613 static bfd_boolean
1614 emit_stringtab (bfd *abfd, struct bfd_strtab_hash *tab)
1615 {
1616   bfd_byte buffer[BYTES_IN_LONG];
1617 
1618   /* The string table starts with the size.  */
1619   H_PUT_32 (abfd, _bfd_stringtab_size (tab) + BYTES_IN_LONG, buffer);
1620   if (bfd_bwrite ((void *) buffer, (bfd_size_type) BYTES_IN_LONG, abfd)
1621       != BYTES_IN_LONG)
1622     return FALSE;
1623 
1624   return _bfd_stringtab_emit (abfd, tab);
1625 }
1626 
1627 bfd_boolean
1628 NAME (aout, write_syms) (bfd *abfd)
1629 {
1630   unsigned int count ;
1631   asymbol **generic = bfd_get_outsymbols (abfd);
1632   struct bfd_strtab_hash *strtab;
1633 
1634   strtab = _bfd_stringtab_init ();
1635   if (strtab == NULL)
1636     return FALSE;
1637 
1638   for (count = 0; count < bfd_get_symcount (abfd); count++)
1639     {
1640       asymbol *g = generic[count];
1641       bfd_size_type indx;
1642       struct external_nlist nsp;
1643 
1644       PUT_WORD (abfd, 0, nsp.e_unused);
1645 
1646       indx = add_to_stringtab (abfd, strtab, g->name, FALSE);
1647       if (indx == (bfd_size_type) -1)
1648 	goto error_return;
1649       PUT_WORD (abfd, indx, nsp.e_strx);
1650 
1651       if (bfd_asymbol_flavour(g) == abfd->xvec->flavour)
1652 	H_PUT_8 (abfd, aout_symbol(g)->type,  nsp.e_type);
1653       else
1654 	H_PUT_8 (abfd, 0, nsp.e_type);
1655 
1656       if (! translate_to_native_sym_flags (abfd, g, &nsp))
1657 	goto error_return;
1658 
1659       H_PUT_8 (abfd, 0, nsp.e_ovly);
1660 
1661       if (bfd_bwrite ((void *)&nsp, (bfd_size_type) EXTERNAL_NLIST_SIZE, abfd)
1662 	  != EXTERNAL_NLIST_SIZE)
1663 	goto error_return;
1664 
1665       /* NB: `KEEPIT' currently overlays `udata.p', so set this only
1666 	 here, at the end.  */
1667       g->KEEPIT = count;
1668     }
1669 
1670   if (! emit_stringtab (abfd, strtab))
1671     goto error_return;
1672 
1673   _bfd_stringtab_free (strtab);
1674 
1675   return TRUE;
1676 
1677 error_return:
1678   _bfd_stringtab_free (strtab);
1679   return FALSE;
1680 }
1681 
1682 
1683 long
1684 NAME (aout, canonicalize_symtab) (bfd *abfd, asymbol **location)
1685 {
1686   unsigned int counter = 0;
1687   aout_symbol_type *symbase;
1688 
1689   if (!NAME (aout, slurp_symbol_table) (abfd))
1690     return -1;
1691 
1692   for (symbase = obj_aout_symbols (abfd); counter++ < bfd_get_symcount (abfd);)
1693     *(location++) = (asymbol *)(symbase++);
1694   *location++ =0;
1695   return bfd_get_symcount (abfd);
1696 }
1697 
1698 
1699 /* Output extended relocation information to a file in target byte order.  */
1700 
1701 static void
1702 pdp11_aout_swap_reloc_out (bfd *abfd, arelent *g, bfd_byte *natptr)
1703 {
1704   int r_index;
1705   int r_pcrel;
1706   int reloc_entry;
1707   int r_type;
1708   asymbol *sym = *(g->sym_ptr_ptr);
1709   asection *output_section = sym->section->output_section;
1710 
1711   if (g->addend != 0)
1712     fprintf (stderr, "BFD: can't do this reloc addend stuff\n");
1713 
1714   r_pcrel = g->howto->pc_relative;
1715 
1716   if (bfd_is_abs_section (output_section))
1717     r_type = RABS;
1718   else if (output_section == obj_textsec (abfd))
1719     r_type = RTEXT;
1720   else if (output_section == obj_datasec (abfd))
1721     r_type = RDATA;
1722   else if (output_section == obj_bsssec (abfd))
1723     r_type = RBSS;
1724   else if (bfd_is_und_section (output_section))
1725     r_type = REXT;
1726   else if (bfd_is_com_section (output_section))
1727     r_type = REXT;
1728   else
1729     r_type = -1;
1730 
1731   BFD_ASSERT (r_type != -1);
1732 
1733   if (r_type == RABS)
1734     r_index = 0;
1735   else
1736     r_index = (*(g->sym_ptr_ptr))->KEEPIT;
1737 
1738   reloc_entry = r_index << 4 | r_type | r_pcrel;
1739 
1740   PUT_WORD (abfd, reloc_entry, natptr);
1741 }
1742 
1743 /* BFD deals internally with all things based from the section they're
1744    in. so, something in 10 bytes into a text section  with a base of
1745    50 would have a symbol (.text+10) and know .text vma was 50.
1746 
1747    Aout keeps all it's symbols based from zero, so the symbol would
1748    contain 60. This macro subs the base of each section from the value
1749    to give the true offset from the section */
1750 
1751 
1752 #define MOVE_ADDRESS(ad)       						\
1753   if (r_extern) 							\
1754     {									\
1755       /* Undefined symbol.  */						\
1756       cache_ptr->sym_ptr_ptr = symbols + r_index;			\
1757       cache_ptr->addend = ad;						\
1758     }									\
1759   else									\
1760     {									\
1761       /* Defined, section relative. replace symbol with pointer to    	\
1762 	 symbol which points to section.  */				\
1763       switch (r_index)							\
1764 	{								\
1765 	case N_TEXT:							\
1766 	case N_TEXT | N_EXT:						\
1767 	  cache_ptr->sym_ptr_ptr  = obj_textsec (abfd)->symbol_ptr_ptr;	\
1768 	  cache_ptr->addend = ad  - su->textsec->vma;			\
1769 	  break;							\
1770 	case N_DATA:							\
1771 	case N_DATA | N_EXT:						\
1772 	  cache_ptr->sym_ptr_ptr  = obj_datasec (abfd)->symbol_ptr_ptr;	\
1773 	  cache_ptr->addend = ad - su->datasec->vma;			\
1774 	  break;							\
1775 	case N_BSS:							\
1776 	case N_BSS | N_EXT:						\
1777 	  cache_ptr->sym_ptr_ptr  = obj_bsssec (abfd)->symbol_ptr_ptr;	\
1778 	  cache_ptr->addend = ad - su->bsssec->vma;			\
1779 	  break;							\
1780 	default:							\
1781 	case N_ABS:							\
1782 	case N_ABS | N_EXT:						\
1783 	  cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;	\
1784 	  cache_ptr->addend = ad;					\
1785 	  break;							\
1786 	}								\
1787     }
1788 
1789 static void
1790 pdp11_aout_swap_reloc_in (bfd *          abfd,
1791 			  bfd_byte *     bytes,
1792 			  arelent *      cache_ptr,
1793 			  bfd_size_type  offset,
1794 			  asymbol **     symbols,
1795 			  bfd_size_type  symcount)
1796 {
1797   struct aoutdata *su = &(abfd->tdata.aout_data->a);
1798   unsigned int r_index;
1799   int reloc_entry;
1800   int r_extern;
1801   int r_pcrel;
1802 
1803   reloc_entry = GET_WORD (abfd, (void *) bytes);
1804 
1805   r_pcrel = reloc_entry & RELFLG;
1806 
1807   cache_ptr->address = offset;
1808   cache_ptr->howto = howto_table_pdp11 + (r_pcrel ? 1 : 0);
1809 
1810   if ((reloc_entry & RTYPE) == RABS)
1811     r_index = N_ABS;
1812   else
1813     r_index = RINDEX (reloc_entry);
1814 
1815   /* r_extern reflects whether the symbol the reloc is against is
1816      local or global.  */
1817   r_extern = (reloc_entry & RTYPE) == REXT;
1818 
1819   if (r_extern && r_index > symcount)
1820     {
1821       /* We could arrange to return an error, but it might be useful
1822          to see the file even if it is bad.  */
1823       r_extern = 0;
1824       r_index = N_ABS;
1825     }
1826 
1827   MOVE_ADDRESS(0);
1828 }
1829 
1830 /* Read and swap the relocs for a section.  */
1831 
1832 bfd_boolean
1833 NAME (aout, slurp_reloc_table) (bfd *abfd, sec_ptr asect, asymbol **symbols)
1834 {
1835   bfd_byte *rptr;
1836   bfd_size_type count;
1837   bfd_size_type reloc_size;
1838   void * relocs;
1839   arelent *reloc_cache;
1840   size_t each_size;
1841   unsigned int counter = 0;
1842   arelent *cache_ptr;
1843 
1844   if (asect->relocation)
1845     return TRUE;
1846 
1847   if (asect->flags & SEC_CONSTRUCTOR)
1848     return TRUE;
1849 
1850   if (asect == obj_datasec (abfd))
1851     reloc_size = exec_hdr(abfd)->a_drsize;
1852   else if (asect == obj_textsec (abfd))
1853     reloc_size = exec_hdr(abfd)->a_trsize;
1854   else if (asect == obj_bsssec (abfd))
1855     reloc_size = 0;
1856   else
1857     {
1858       bfd_set_error (bfd_error_invalid_operation);
1859       return FALSE;
1860     }
1861 
1862   if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0)
1863     return FALSE;
1864 
1865   each_size = obj_reloc_entry_size (abfd);
1866 
1867   relocs = bfd_malloc (reloc_size);
1868   if (relocs == NULL && reloc_size != 0)
1869     return FALSE;
1870 
1871   if (bfd_bread (relocs, reloc_size, abfd) != reloc_size)
1872     {
1873       free (relocs);
1874       return FALSE;
1875     }
1876 
1877   count = reloc_size / each_size;
1878 
1879   /* Count the number of NON-ZERO relocs, this is the count we want.  */
1880   {
1881     unsigned int real_count = 0;
1882 
1883     for (counter = 0; counter < count; counter++)
1884       {
1885 	int x;
1886 
1887 	x = GET_WORD (abfd, (char *) relocs + each_size * counter);
1888 	if (x != 0)
1889 	  real_count++;
1890       }
1891 
1892     count = real_count;
1893   }
1894 
1895   reloc_cache = bfd_zmalloc (count * sizeof (arelent));
1896   if (reloc_cache == NULL && count != 0)
1897     return FALSE;
1898 
1899   cache_ptr = reloc_cache;
1900 
1901   rptr = relocs;
1902   for (counter = 0;
1903        counter < count;
1904        counter++, rptr += RELOC_SIZE, cache_ptr++)
1905     {
1906       while (GET_WORD (abfd, (void *) rptr) == 0)
1907 	{
1908 	  rptr += RELOC_SIZE;
1909 	  if ((char *) rptr >= (char *) relocs + reloc_size)
1910 	    goto done;
1911 	}
1912 
1913       pdp11_aout_swap_reloc_in (abfd, rptr, cache_ptr,
1914 				(bfd_size_type) ((char *) rptr - (char *) relocs),
1915 				symbols,
1916 				(bfd_size_type) bfd_get_symcount (abfd));
1917     }
1918  done:
1919   /* Just in case, if rptr >= relocs + reloc_size should happen
1920      too early.  */
1921   BFD_ASSERT (counter == count);
1922 
1923   free (relocs);
1924 
1925   asect->relocation = reloc_cache;
1926   asect->reloc_count = cache_ptr - reloc_cache;
1927 
1928   return TRUE;
1929 }
1930 
1931 /* Write out a relocation section into an object file.  */
1932 
1933 bfd_boolean
1934 NAME (aout, squirt_out_relocs) (bfd *abfd, asection *section)
1935 {
1936   arelent **generic;
1937   unsigned char *native;
1938   unsigned int count = section->reloc_count;
1939   bfd_size_type natsize;
1940 
1941   natsize = section->size;
1942   native = bfd_zalloc (abfd, natsize);
1943   if (!native)
1944     return FALSE;
1945 
1946   generic = section->orelocation;
1947   if (generic != NULL)
1948     {
1949       while (count > 0)
1950 	{
1951 	  bfd_byte *r;
1952 
1953 	  r = native + (*generic)->address;
1954 	  pdp11_aout_swap_reloc_out (abfd, *generic, r);
1955 	  count--;
1956 	  generic++;
1957 	}
1958     }
1959 
1960   if (bfd_bwrite ((void *) native, natsize, abfd) != natsize)
1961     {
1962       bfd_release (abfd, native);
1963       return FALSE;
1964     }
1965 
1966   bfd_release (abfd, native);
1967   return TRUE;
1968 }
1969 
1970 /* This is stupid.  This function should be a boolean predicate.  */
1971 
1972 long
1973 NAME (aout, canonicalize_reloc) (bfd *abfd,
1974 				 sec_ptr section,
1975 				 arelent **relptr,
1976 				 asymbol **symbols)
1977 {
1978   arelent *tblptr = section->relocation;
1979   unsigned int count;
1980 
1981   if (section == obj_bsssec (abfd))
1982     {
1983       *relptr = NULL;
1984       return 0;
1985     }
1986 
1987   if (!(tblptr || NAME (aout, slurp_reloc_table)(abfd, section, symbols)))
1988     return -1;
1989 
1990   if (section->flags & SEC_CONSTRUCTOR)
1991     {
1992       arelent_chain *chain = section->constructor_chain;
1993 
1994       for (count = 0; count < section->reloc_count; count ++)
1995 	{
1996 	  *relptr ++ = &chain->relent;
1997 	  chain = chain->next;
1998 	}
1999     }
2000   else
2001     {
2002       tblptr = section->relocation;
2003 
2004       for (count = 0; count++ < section->reloc_count;)
2005 	*relptr++ = tblptr++;
2006     }
2007 
2008   *relptr = 0;
2009 
2010   return section->reloc_count;
2011 }
2012 
2013 long
2014 NAME (aout, get_reloc_upper_bound) (bfd *abfd, sec_ptr asect)
2015 {
2016   if (bfd_get_format (abfd) != bfd_object)
2017     {
2018       bfd_set_error (bfd_error_invalid_operation);
2019       return -1;
2020     }
2021 
2022   if (asect->flags & SEC_CONSTRUCTOR)
2023     return (sizeof (arelent *) * (asect->reloc_count + 1));
2024 
2025   if (asect == obj_datasec (abfd))
2026     return (sizeof (arelent *)
2027 	    * ((exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd))
2028 	       + 1));
2029 
2030   if (asect == obj_textsec (abfd))
2031     return (sizeof (arelent *)
2032 	    * ((exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd))
2033 	       + 1));
2034 
2035   /* TODO: why are there two if statements for obj_bsssec()? */
2036 
2037   if (asect == obj_bsssec (abfd))
2038     return sizeof (arelent *);
2039 
2040   if (asect == obj_bsssec (abfd))
2041     return 0;
2042 
2043   bfd_set_error (bfd_error_invalid_operation);
2044   return -1;
2045 }
2046 
2047 
2048 long
2049 NAME (aout, get_symtab_upper_bound) (bfd *abfd)
2050 {
2051   if (!NAME (aout, slurp_symbol_table) (abfd))
2052     return -1;
2053 
2054   return (bfd_get_symcount (abfd) + 1) * (sizeof (aout_symbol_type *));
2055 }
2056 
2057 alent *
2058 NAME (aout, get_lineno) (bfd * abfd ATTRIBUTE_UNUSED,
2059 			 asymbol * symbol ATTRIBUTE_UNUSED)
2060 {
2061   return NULL;
2062 }
2063 
2064 void
2065 NAME (aout, get_symbol_info) (bfd * abfd ATTRIBUTE_UNUSED,
2066 			      asymbol *symbol,
2067 			      symbol_info *ret)
2068 {
2069   bfd_symbol_info (symbol, ret);
2070 
2071   if (ret->type == '?')
2072     {
2073       int type_code = aout_symbol(symbol)->type & 0xff;
2074       const char *stab_name = bfd_get_stab_name (type_code);
2075       static char buf[10];
2076 
2077       if (stab_name == NULL)
2078 	{
2079 	  sprintf(buf, "(%d)", type_code);
2080 	  stab_name = buf;
2081 	}
2082       ret->type = '-';
2083       ret->stab_type  = type_code;
2084       ret->stab_other = (unsigned) (aout_symbol(symbol)->other & 0xff);
2085       ret->stab_desc  = (unsigned) (aout_symbol(symbol)->desc & 0xffff);
2086       ret->stab_name  = stab_name;
2087     }
2088 }
2089 
2090 void
2091 NAME (aout, print_symbol) (bfd * abfd,
2092 			   void * afile,
2093 			   asymbol *symbol,
2094 			   bfd_print_symbol_type how)
2095 {
2096   FILE *file = (FILE *) afile;
2097 
2098   switch (how)
2099     {
2100     case bfd_print_symbol_name:
2101       if (symbol->name)
2102 	fprintf(file,"%s", symbol->name);
2103       break;
2104     case bfd_print_symbol_more:
2105       fprintf(file,"%4x %2x %2x",
2106 	      (unsigned) (aout_symbol (symbol)->desc & 0xffff),
2107 	      (unsigned) (aout_symbol (symbol)->other & 0xff),
2108 	      (unsigned) (aout_symbol (symbol)->type));
2109       break;
2110     case bfd_print_symbol_all:
2111       {
2112 	const char *section_name = symbol->section->name;
2113 
2114 	bfd_print_symbol_vandf (abfd, (void *) file, symbol);
2115 
2116 	fprintf (file," %-5s %04x %02x %02x",
2117 		 section_name,
2118 		 (unsigned) (aout_symbol (symbol)->desc & 0xffff),
2119 		 (unsigned) (aout_symbol (symbol)->other & 0xff),
2120 		 (unsigned) (aout_symbol (symbol)->type  & 0xff));
2121 	if (symbol->name)
2122 	  fprintf(file," %s", symbol->name);
2123       }
2124       break;
2125     }
2126 }
2127 
2128 /* If we don't have to allocate more than 1MB to hold the generic
2129    symbols, we use the generic minisymbol method: it's faster, since
2130    it only translates the symbols once, not multiple times.  */
2131 #define MINISYM_THRESHOLD (1000000 / sizeof (asymbol))
2132 
2133 /* Read minisymbols.  For minisymbols, we use the unmodified a.out
2134    symbols.  The minisymbol_to_symbol function translates these into
2135    BFD asymbol structures.  */
2136 
2137 long
2138 NAME (aout, read_minisymbols) (bfd *abfd,
2139 			       bfd_boolean dynamic,
2140 			       void * *minisymsp,
2141 			       unsigned int *sizep)
2142 {
2143   if (dynamic)
2144     /* We could handle the dynamic symbols here as well, but it's
2145        easier to hand them off.  */
2146     return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
2147 
2148   if (! aout_get_external_symbols (abfd))
2149     return -1;
2150 
2151   if (obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
2152     return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
2153 
2154   *minisymsp = (void *) obj_aout_external_syms (abfd);
2155 
2156   /* By passing the external symbols back from this routine, we are
2157      giving up control over the memory block.  Clear
2158      obj_aout_external_syms, so that we do not try to free it
2159      ourselves.  */
2160   obj_aout_external_syms (abfd) = NULL;
2161 
2162   *sizep = EXTERNAL_NLIST_SIZE;
2163   return obj_aout_external_sym_count (abfd);
2164 }
2165 
2166 /* Convert a minisymbol to a BFD asymbol.  A minisymbol is just an
2167    unmodified a.out symbol.  The SYM argument is a structure returned
2168    by bfd_make_empty_symbol, which we fill in here.  */
2169 
2170 asymbol *
2171 NAME (aout, minisymbol_to_symbol) (bfd *abfd,
2172 				   bfd_boolean dynamic,
2173 				   const void * minisym,
2174 				   asymbol *sym)
2175 {
2176   if (dynamic
2177       || obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
2178     return _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym);
2179 
2180   memset (sym, 0, sizeof (aout_symbol_type));
2181 
2182   /* We call translate_symbol_table to translate a single symbol.  */
2183   if (! (NAME (aout, translate_symbol_table)
2184 	 (abfd,
2185 	  (aout_symbol_type *) sym,
2186 	  (struct external_nlist *) minisym,
2187 	  (bfd_size_type) 1,
2188 	  obj_aout_external_strings (abfd),
2189 	  obj_aout_external_string_size (abfd),
2190 	  FALSE)))
2191     return NULL;
2192 
2193   return sym;
2194 }
2195 
2196 /* Provided a BFD, a section and an offset into the section, calculate
2197    and return the name of the source file and the line nearest to the
2198    wanted location.  */
2199 
2200 bfd_boolean
2201 NAME (aout, find_nearest_line) (bfd *abfd,
2202 				asection *section,
2203 				asymbol **symbols,
2204 				bfd_vma offset,
2205 				const char **filename_ptr,
2206 				const char **functionname_ptr,
2207 				unsigned int *line_ptr)
2208 {
2209   /* Run down the file looking for the filename, function and linenumber.  */
2210   asymbol **p;
2211   const char *directory_name = NULL;
2212   const char *main_file_name = NULL;
2213   const char *current_file_name = NULL;
2214   const char *line_file_name = NULL; /* Value of current_file_name at line number.  */
2215   bfd_vma low_line_vma = 0;
2216   bfd_vma low_func_vma = 0;
2217   asymbol *func = 0;
2218   size_t filelen, funclen;
2219   char *buf;
2220 
2221   *filename_ptr = abfd->filename;
2222   *functionname_ptr = 0;
2223   *line_ptr = 0;
2224 
2225   if (symbols != NULL)
2226     {
2227       for (p = symbols; *p; p++)
2228 	{
2229 	  aout_symbol_type  *q = (aout_symbol_type *)(*p);
2230 	next:
2231 	  switch (q->type)
2232 	    {
2233 	    case N_TEXT:
2234 	      /* If this looks like a file name symbol, and it comes after
2235 		 the line number we have found so far, but before the
2236 		 offset, then we have probably not found the right line
2237 		 number.  */
2238 	      if (q->symbol.value <= offset
2239 		  && ((q->symbol.value > low_line_vma
2240 		       && (line_file_name != NULL
2241 			   || *line_ptr != 0))
2242 		      || (q->symbol.value > low_func_vma
2243 			  && func != NULL)))
2244 		{
2245 		  const char * symname;
2246 
2247 		  symname = q->symbol.name;
2248 		  if (strcmp (symname + strlen (symname) - 2, ".o") == 0)
2249 		    {
2250 		      if (q->symbol.value > low_line_vma)
2251 			{
2252 			  *line_ptr = 0;
2253 			  line_file_name = NULL;
2254 			}
2255 		      if (q->symbol.value > low_func_vma)
2256 			func = NULL;
2257 		    }
2258 		}
2259 	      break;
2260 
2261 	    case N_SO:
2262 	      /* If this symbol is less than the offset, but greater than
2263 		 the line number we have found so far, then we have not
2264 		 found the right line number.  */
2265 	      if (q->symbol.value <= offset)
2266 		{
2267 		  if (q->symbol.value > low_line_vma)
2268 		    {
2269 		      *line_ptr = 0;
2270 		      line_file_name = NULL;
2271 		    }
2272 		  if (q->symbol.value > low_func_vma)
2273 		    func = NULL;
2274 		}
2275 
2276 	      main_file_name = current_file_name = q->symbol.name;
2277 	      /* Look ahead to next symbol to check if that too is an N_SO.  */
2278 	      p++;
2279 	      if (*p == NULL)
2280 		break;
2281 	      q = (aout_symbol_type *)(*p);
2282 	      if (q->type != (int) N_SO)
2283 		goto next;
2284 
2285 	      /* Found a second N_SO  First is directory; second is filename.  */
2286 	      directory_name = current_file_name;
2287 	      main_file_name = current_file_name = q->symbol.name;
2288 	      if (obj_textsec(abfd) != section)
2289 		goto done;
2290 	      break;
2291 	    case N_SOL:
2292 	      current_file_name = q->symbol.name;
2293 	      break;
2294 
2295 	    case N_SLINE:
2296 	    case N_DSLINE:
2297 	    case N_BSLINE:
2298 	      /* We'll keep this if it resolves nearer than the one we have
2299 		 already.  */
2300 	      if (q->symbol.value >= low_line_vma
2301 		  && q->symbol.value <= offset)
2302 		{
2303 		  *line_ptr = q->desc;
2304 		  low_line_vma = q->symbol.value;
2305 		  line_file_name = current_file_name;
2306 		}
2307 	      break;
2308 
2309 	    case N_FUN:
2310 	      {
2311 		/* We'll keep this if it is nearer than the one we have already.  */
2312 		if (q->symbol.value >= low_func_vma &&
2313 		    q->symbol.value <= offset)
2314 		  {
2315 		    low_func_vma = q->symbol.value;
2316 		    func = (asymbol *) q;
2317 		  }
2318 		else if (q->symbol.value > offset)
2319 		  goto done;
2320 	      }
2321 	      break;
2322 	    }
2323 	}
2324     }
2325 
2326  done:
2327   if (*line_ptr != 0)
2328     main_file_name = line_file_name;
2329 
2330   if (main_file_name == NULL
2331       || main_file_name[0] == '/'
2332       || directory_name == NULL)
2333     filelen = 0;
2334   else
2335     filelen = strlen (directory_name) + strlen (main_file_name);
2336   if (func == NULL)
2337     funclen = 0;
2338   else
2339     funclen = strlen (bfd_asymbol_name (func));
2340 
2341   if (adata (abfd).line_buf != NULL)
2342     free (adata (abfd).line_buf);
2343   if (filelen + funclen == 0)
2344     adata (abfd).line_buf = buf = NULL;
2345   else
2346     {
2347       buf = bfd_malloc ((bfd_size_type) filelen + funclen + 3);
2348       adata (abfd).line_buf = buf;
2349       if (buf == NULL)
2350 	return FALSE;
2351     }
2352 
2353   if (main_file_name != NULL)
2354     {
2355       if (main_file_name[0] == '/' || directory_name == NULL)
2356 	*filename_ptr = main_file_name;
2357       else
2358 	{
2359 	  sprintf (buf, "%s%s", directory_name, main_file_name);
2360 	  *filename_ptr = buf;
2361 	  buf += filelen + 1;
2362 	}
2363     }
2364 
2365   if (func)
2366     {
2367       const char *function = func->name;
2368       char *colon;
2369 
2370       /* The caller expects a symbol name.  We actually have a
2371 	 function name, without the leading underscore.  Put the
2372 	 underscore back in, so that the caller gets a symbol name.  */
2373       if (bfd_get_symbol_leading_char (abfd) == '\0')
2374 	strcpy (buf, function);
2375       else
2376 	{
2377 	  buf[0] = bfd_get_symbol_leading_char (abfd);
2378 	  strcpy (buf + 1, function);
2379 	}
2380 
2381       /* Have to remove : stuff.  */
2382       colon = strchr (buf, ':');
2383       if (colon != NULL)
2384 	*colon = '\0';
2385       *functionname_ptr = buf;
2386     }
2387 
2388   return TRUE;
2389 }
2390 
2391 int
2392 NAME (aout, sizeof_headers) (bfd *abfd,
2393 			     struct bfd_link_info *info ATTRIBUTE_UNUSED)
2394 {
2395   return adata (abfd).exec_bytes_size;
2396 }
2397 
2398 /* Free all information we have cached for this BFD.  We can always
2399    read it again later if we need it.  */
2400 
2401 bfd_boolean
2402 NAME (aout, bfd_free_cached_info) (bfd *abfd)
2403 {
2404   asection *o;
2405 
2406   if (bfd_get_format (abfd) != bfd_object)
2407     return TRUE;
2408 
2409 #define BFCI_FREE(x) if (x != NULL) { free (x); x = NULL; }
2410   BFCI_FREE (obj_aout_symbols (abfd));
2411 
2412 #ifdef USE_MMAP
2413   obj_aout_external_syms (abfd) = 0;
2414   bfd_free_window (&obj_aout_sym_window (abfd));
2415   bfd_free_window (&obj_aout_string_window (abfd));
2416   obj_aout_external_strings (abfd) = 0;
2417 #else
2418   BFCI_FREE (obj_aout_external_syms (abfd));
2419   BFCI_FREE (obj_aout_external_strings (abfd));
2420 #endif
2421   for (o = abfd->sections; o != NULL; o = o->next)
2422     BFCI_FREE (o->relocation);
2423 #undef BFCI_FREE
2424 
2425   return TRUE;
2426 }
2427 
2428 /* Routine to create an entry in an a.out link hash table.  */
2429 
2430 struct bfd_hash_entry *
2431 NAME (aout, link_hash_newfunc) (struct bfd_hash_entry *entry,
2432 				struct bfd_hash_table *table,
2433 				const char *string)
2434 {
2435   struct aout_link_hash_entry *ret = (struct aout_link_hash_entry *) entry;
2436 
2437   /* Allocate the structure if it has not already been allocated by a
2438      subclass.  */
2439   if (ret == NULL)
2440     ret = bfd_hash_allocate (table, sizeof (* ret));
2441   if (ret == NULL)
2442     return NULL;
2443 
2444   /* Call the allocation method of the superclass.  */
2445   ret = (struct aout_link_hash_entry *)
2446 	 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
2447   if (ret)
2448     {
2449       /* Set local fields.  */
2450       ret->written = FALSE;
2451       ret->indx = -1;
2452     }
2453 
2454   return (struct bfd_hash_entry *) ret;
2455 }
2456 
2457 /* Initialize an a.out link hash table.  */
2458 
2459 bfd_boolean
2460 NAME (aout, link_hash_table_init) (struct aout_link_hash_table *table,
2461 				   bfd *abfd,
2462 				   struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *,
2463 								     struct bfd_hash_table *,
2464 								     const char *),
2465 				   unsigned int entsize)
2466 {
2467   return _bfd_link_hash_table_init (&table->root, abfd, newfunc, entsize);
2468 }
2469 
2470 /* Create an a.out link hash table.  */
2471 
2472 struct bfd_link_hash_table *
2473 NAME (aout, link_hash_table_create) (bfd *abfd)
2474 {
2475   struct aout_link_hash_table *ret;
2476   bfd_size_type amt = sizeof (struct aout_link_hash_table);
2477 
2478   ret = bfd_alloc (abfd, amt);
2479   if (ret == NULL)
2480     return NULL;
2481   if (! NAME (aout, link_hash_table_init) (ret, abfd,
2482 					   NAME (aout, link_hash_newfunc),
2483 					   sizeof (struct aout_link_hash_entry)))
2484     {
2485       free (ret);
2486       return NULL;
2487     }
2488   return &ret->root;
2489 }
2490 
2491 /* Free up the internal symbols read from an a.out file.  */
2492 
2493 static bfd_boolean
2494 aout_link_free_symbols (bfd *abfd)
2495 {
2496   if (obj_aout_external_syms (abfd) != NULL)
2497     {
2498 #ifdef USE_MMAP
2499       bfd_free_window (&obj_aout_sym_window (abfd));
2500 #else
2501       free ((void *) obj_aout_external_syms (abfd));
2502 #endif
2503       obj_aout_external_syms (abfd) = NULL;
2504     }
2505 
2506   if (obj_aout_external_strings (abfd) != NULL)
2507     {
2508 #ifdef USE_MMAP
2509       bfd_free_window (&obj_aout_string_window (abfd));
2510 #else
2511       free ((void *) obj_aout_external_strings (abfd));
2512 #endif
2513       obj_aout_external_strings (abfd) = NULL;
2514     }
2515   return TRUE;
2516 }
2517 
2518 /* Given an a.out BFD, add symbols to the global hash table as
2519    appropriate.  */
2520 
2521 bfd_boolean
2522 NAME (aout, link_add_symbols) (bfd *abfd, struct bfd_link_info *info)
2523 {
2524   switch (bfd_get_format (abfd))
2525     {
2526     case bfd_object:
2527       return aout_link_add_object_symbols (abfd, info);
2528     case bfd_archive:
2529       return _bfd_generic_link_add_archive_symbols
2530 	(abfd, info, aout_link_check_archive_element);
2531     default:
2532       bfd_set_error (bfd_error_wrong_format);
2533       return FALSE;
2534     }
2535 }
2536 
2537 /* Add symbols from an a.out object file.  */
2538 
2539 static bfd_boolean
2540 aout_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
2541 {
2542   if (! aout_get_external_symbols (abfd))
2543     return FALSE;
2544   if (! aout_link_add_symbols (abfd, info))
2545     return FALSE;
2546   if (! info->keep_memory)
2547     {
2548       if (! aout_link_free_symbols (abfd))
2549 	return FALSE;
2550     }
2551   return TRUE;
2552 }
2553 
2554 /* Look through the internal symbols to see if this object file should
2555    be included in the link.  We should include this object file if it
2556    defines any symbols which are currently undefined.  If this object
2557    file defines a common symbol, then we may adjust the size of the
2558    known symbol but we do not include the object file in the link
2559    (unless there is some other reason to include it).  */
2560 
2561 static bfd_boolean
2562 aout_link_check_ar_symbols (bfd *abfd,
2563 			    struct bfd_link_info *info,
2564 			    bfd_boolean *pneeded)
2565 {
2566   struct external_nlist *p;
2567   struct external_nlist *pend;
2568   char *strings;
2569 
2570   *pneeded = FALSE;
2571 
2572   /* Look through all the symbols.  */
2573   p = obj_aout_external_syms (abfd);
2574   pend = p + obj_aout_external_sym_count (abfd);
2575   strings = obj_aout_external_strings (abfd);
2576   for (; p < pend; p++)
2577     {
2578       int type = H_GET_8 (abfd, p->e_type);
2579       const char *name;
2580       struct bfd_link_hash_entry *h;
2581 
2582       /* Ignore symbols that are not externally visible.  This is an
2583 	 optimization only, as we check the type more thoroughly
2584 	 below.  */
2585       if ((type & N_EXT) == 0
2586 	  || type == N_FN)
2587 	continue;
2588 
2589       name = strings + GET_WORD (abfd, p->e_strx);
2590       h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
2591 
2592       /* We are only interested in symbols that are currently
2593 	 undefined or common.  */
2594       if (h == NULL
2595 	  || (h->type != bfd_link_hash_undefined
2596 	      && h->type != bfd_link_hash_common))
2597 	continue;
2598 
2599       if (type == (N_TEXT | N_EXT)
2600 	  || type == (N_DATA | N_EXT)
2601 	  || type == (N_BSS | N_EXT)
2602 	  || type == (N_ABS | N_EXT))
2603 	{
2604 	  /* This object file defines this symbol.  We must link it
2605 	     in.  This is true regardless of whether the current
2606 	     definition of the symbol is undefined or common.  If the
2607 	     current definition is common, we have a case in which we
2608 	     have already seen an object file including
2609 	         int a;
2610 	     and this object file from the archive includes
2611 	         int a = 5;
2612 	     In such a case we must include this object file.
2613 
2614 	     FIXME: The SunOS 4.1.3 linker will pull in the archive
2615 	     element if the symbol is defined in the .data section,
2616 	     but not if it is defined in the .text section.  That
2617 	     seems a bit crazy to me, and I haven't implemented it.
2618 	     However, it might be correct.  */
2619 	  if (! (*info->callbacks->add_archive_element) (info, abfd, name))
2620 	    return FALSE;
2621 	  *pneeded = TRUE;
2622 	  return TRUE;
2623 	}
2624 
2625       if (type == (N_UNDF | N_EXT))
2626 	{
2627 	  bfd_vma value;
2628 
2629 	  value = GET_WORD (abfd, p->e_value);
2630 	  if (value != 0)
2631 	    {
2632 	      /* This symbol is common in the object from the archive
2633 		 file.  */
2634 	      if (h->type == bfd_link_hash_undefined)
2635 		{
2636 		  bfd *symbfd;
2637 		  unsigned int power;
2638 
2639 		  symbfd = h->u.undef.abfd;
2640 		  if (symbfd == NULL)
2641 		    {
2642 		      /* This symbol was created as undefined from
2643 			 outside BFD.  We assume that we should link
2644 			 in the object file.  This is done for the -u
2645 			 option in the linker.  */
2646 		      if (! (*info->callbacks->add_archive_element)
2647 			  (info, abfd, name))
2648 			return FALSE;
2649 		      *pneeded = TRUE;
2650 		      return TRUE;
2651 		    }
2652 		  /* Turn the current link symbol into a common
2653 		     symbol.  It is already on the undefs list.  */
2654 		  h->type = bfd_link_hash_common;
2655 		  h->u.c.p = bfd_hash_allocate (&info->hash->table,
2656 						sizeof (struct bfd_link_hash_common_entry));
2657 		  if (h->u.c.p == NULL)
2658 		    return FALSE;
2659 
2660 		  h->u.c.size = value;
2661 
2662 		  /* FIXME: This isn't quite right.  The maximum
2663 		     alignment of a common symbol should be set by the
2664 		     architecture of the output file, not of the input
2665 		     file.  */
2666 		  power = bfd_log2 (value);
2667 		  if (power > bfd_get_arch_info (abfd)->section_align_power)
2668 		    power = bfd_get_arch_info (abfd)->section_align_power;
2669 		  h->u.c.p->alignment_power = power;
2670 
2671 		  h->u.c.p->section = bfd_make_section_old_way (symbfd,
2672 								"COMMON");
2673 		}
2674 	      else
2675 		{
2676 		  /* Adjust the size of the common symbol if
2677 		     necessary.  */
2678 		  if (value > h->u.c.size)
2679 		    h->u.c.size = value;
2680 		}
2681 	    }
2682 	}
2683     }
2684 
2685   /* We do not need this object file.  */
2686   return TRUE;
2687 }
2688 
2689 /* Check a single archive element to see if we need to include it in
2690    the link.  *PNEEDED is set according to whether this element is
2691    needed in the link or not.  This is called from
2692    _bfd_generic_link_add_archive_symbols.  */
2693 
2694 static bfd_boolean
2695 aout_link_check_archive_element (bfd *abfd,
2696 				 struct bfd_link_info *info,
2697 				 bfd_boolean *pneeded)
2698 {
2699   if (! aout_get_external_symbols (abfd))
2700     return FALSE;
2701 
2702   if (! aout_link_check_ar_symbols (abfd, info, pneeded))
2703     return FALSE;
2704 
2705   if (*pneeded)
2706     {
2707       if (! aout_link_add_symbols (abfd, info))
2708 	return FALSE;
2709     }
2710 
2711   if (! info->keep_memory || ! *pneeded)
2712     {
2713       if (! aout_link_free_symbols (abfd))
2714 	return FALSE;
2715     }
2716 
2717   return TRUE;
2718 }
2719 
2720 /* Add all symbols from an object file to the hash table.  */
2721 
2722 static bfd_boolean
2723 aout_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
2724 {
2725   bfd_boolean (*add_one_symbol)
2726     (struct bfd_link_info *, bfd *, const char *, flagword, asection *,
2727      bfd_vma, const char *, bfd_boolean, bfd_boolean,
2728      struct bfd_link_hash_entry **);
2729   struct external_nlist *syms;
2730   bfd_size_type sym_count;
2731   char *strings;
2732   bfd_boolean copy;
2733   struct aout_link_hash_entry **sym_hash;
2734   struct external_nlist *p;
2735   struct external_nlist *pend;
2736 
2737   syms = obj_aout_external_syms (abfd);
2738   sym_count = obj_aout_external_sym_count (abfd);
2739   strings = obj_aout_external_strings (abfd);
2740   if (info->keep_memory)
2741     copy = FALSE;
2742   else
2743     copy = TRUE;
2744 
2745   if (aout_backend_info (abfd)->add_dynamic_symbols != NULL)
2746     {
2747       if (! ((*aout_backend_info (abfd)->add_dynamic_symbols)
2748 	     (abfd, info, &syms, &sym_count, &strings)))
2749 	return FALSE;
2750     }
2751 
2752   /* We keep a list of the linker hash table entries that correspond
2753      to particular symbols.  We could just look them up in the hash
2754      table, but keeping the list is more efficient.  Perhaps this
2755      should be conditional on info->keep_memory.  */
2756   sym_hash = bfd_alloc (abfd,
2757 			sym_count * sizeof (struct aout_link_hash_entry *));
2758   if (sym_hash == NULL && sym_count != 0)
2759     return FALSE;
2760   obj_aout_sym_hashes (abfd) = sym_hash;
2761 
2762   add_one_symbol = aout_backend_info (abfd)->add_one_symbol;
2763   if (add_one_symbol == NULL)
2764     add_one_symbol = _bfd_generic_link_add_one_symbol;
2765 
2766   p = syms;
2767   pend = p + sym_count;
2768   for (; p < pend; p++, sym_hash++)
2769     {
2770       int type;
2771       const char *name;
2772       bfd_vma value;
2773       asection *section;
2774       flagword flags;
2775       const char *string;
2776 
2777       *sym_hash = NULL;
2778 
2779       type = H_GET_8 (abfd, p->e_type);
2780 
2781       name = strings + GET_WORD (abfd, p->e_strx);
2782       value = GET_WORD (abfd, p->e_value);
2783       flags = BSF_GLOBAL;
2784       string = NULL;
2785       switch (type)
2786 	{
2787 	default:
2788 	  abort ();
2789 
2790 	case N_UNDF:
2791 	case N_ABS:
2792 	case N_TEXT:
2793 	case N_DATA:
2794 	case N_BSS:
2795 	case N_REG:
2796 	case N_FN:
2797 	  /* Ignore symbols that are not externally visible.  */
2798 	  continue;
2799 
2800 	case N_UNDF | N_EXT:
2801 	  if (value == 0)
2802 	    {
2803 	      section = bfd_und_section_ptr;
2804 	      flags = 0;
2805 	    }
2806 	  else
2807 	    section = bfd_com_section_ptr;
2808 	  break;
2809 	case N_ABS | N_EXT:
2810 	  section = bfd_abs_section_ptr;
2811 	  break;
2812 	case N_TEXT | N_EXT:
2813 	  section = obj_textsec (abfd);
2814 	  value -= bfd_get_section_vma (abfd, section);
2815 	  break;
2816 	case N_DATA | N_EXT:
2817 	  /* Treat N_SETV symbols as N_DATA symbol; see comment in
2818 	     translate_from_native_sym_flags.  */
2819 	  section = obj_datasec (abfd);
2820 	  value -= bfd_get_section_vma (abfd, section);
2821 	  break;
2822 	case N_BSS | N_EXT:
2823 	  section = obj_bsssec (abfd);
2824 	  value -= bfd_get_section_vma (abfd, section);
2825 	  break;
2826 	}
2827 
2828       if (! ((*add_one_symbol)
2829 	     (info, abfd, name, flags, section, value, string, copy, FALSE,
2830 	      (struct bfd_link_hash_entry **) sym_hash)))
2831 	return FALSE;
2832 
2833       /* Restrict the maximum alignment of a common symbol based on
2834 	 the architecture, since a.out has no way to represent
2835 	 alignment requirements of a section in a .o file.  FIXME:
2836 	 This isn't quite right: it should use the architecture of the
2837 	 output file, not the input files.  */
2838       if ((*sym_hash)->root.type == bfd_link_hash_common
2839 	  && ((*sym_hash)->root.u.c.p->alignment_power >
2840 	      bfd_get_arch_info (abfd)->section_align_power))
2841 	(*sym_hash)->root.u.c.p->alignment_power =
2842 	  bfd_get_arch_info (abfd)->section_align_power;
2843 
2844       /* If this is a set symbol, and we are not building sets, then
2845 	 it is possible for the hash entry to not have been set.  In
2846 	 such a case, treat the symbol as not globally defined.  */
2847       if ((*sym_hash)->root.type == bfd_link_hash_new)
2848 	{
2849 	  BFD_ASSERT ((flags & BSF_CONSTRUCTOR) != 0);
2850 	  *sym_hash = NULL;
2851 	}
2852     }
2853 
2854   return TRUE;
2855 }
2856 
2857 /* Look up an entry in an the header file hash table.  */
2858 
2859 #define aout_link_includes_lookup(table, string, create, copy) \
2860   ((struct aout_link_includes_entry *) \
2861    bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
2862 
2863 /* The function to create a new entry in the header file hash table.  */
2864 
2865 static struct bfd_hash_entry *
2866 aout_link_includes_newfunc (struct bfd_hash_entry *entry,
2867 			    struct bfd_hash_table *table,
2868 			    const char *string)
2869 {
2870   struct aout_link_includes_entry * ret =
2871     (struct aout_link_includes_entry *) entry;
2872 
2873   /* Allocate the structure if it has not already been allocated by a
2874      subclass.  */
2875   if (ret == NULL)
2876     ret = bfd_hash_allocate (table,
2877 			     sizeof (struct aout_link_includes_entry));
2878   if (ret == NULL)
2879     return NULL;
2880 
2881   /* Call the allocation method of the superclass.  */
2882   ret = ((struct aout_link_includes_entry *)
2883 	 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
2884   if (ret)
2885     /* Set local fields.  */
2886     ret->totals = NULL;
2887 
2888   return (struct bfd_hash_entry *) ret;
2889 }
2890 
2891 static bfd_boolean
2892 aout_link_write_other_symbol (struct aout_link_hash_entry *h, void * data)
2893 {
2894   struct aout_final_link_info *finfo = (struct aout_final_link_info *) data;
2895   bfd *output_bfd;
2896   int type;
2897   bfd_vma val;
2898   struct external_nlist outsym;
2899   bfd_size_type indx;
2900   bfd_size_type amt;
2901 
2902   if (h->root.type == bfd_link_hash_warning)
2903     {
2904       h = (struct aout_link_hash_entry *) h->root.u.i.link;
2905       if (h->root.type == bfd_link_hash_new)
2906 	return TRUE;
2907     }
2908 
2909   output_bfd = finfo->output_bfd;
2910 
2911   if (aout_backend_info (output_bfd)->write_dynamic_symbol != NULL)
2912     {
2913       if (! ((*aout_backend_info (output_bfd)->write_dynamic_symbol)
2914 	     (output_bfd, finfo->info, h)))
2915 	{
2916 	  /* FIXME: No way to handle errors.  */
2917 	  abort ();
2918 	}
2919     }
2920 
2921   if (h->written)
2922     return TRUE;
2923 
2924   h->written = TRUE;
2925 
2926   /* An indx of -2 means the symbol must be written.  */
2927   if (h->indx != -2
2928       && (finfo->info->strip == strip_all
2929 	  || (finfo->info->strip == strip_some
2930 	      && bfd_hash_lookup (finfo->info->keep_hash, h->root.root.string,
2931 				  FALSE, FALSE) == NULL)))
2932     return TRUE;
2933 
2934   switch (h->root.type)
2935     {
2936     default:
2937       abort ();
2938       /* Avoid variable not initialized warnings.  */
2939       return TRUE;
2940     case bfd_link_hash_new:
2941       /* This can happen for set symbols when sets are not being
2942          built.  */
2943       return TRUE;
2944     case bfd_link_hash_undefined:
2945       type = N_UNDF | N_EXT;
2946       val = 0;
2947       break;
2948     case bfd_link_hash_defined:
2949     case bfd_link_hash_defweak:
2950       {
2951 	asection *sec;
2952 
2953 	sec = h->root.u.def.section->output_section;
2954 	BFD_ASSERT (bfd_is_abs_section (sec)
2955 		    || sec->owner == output_bfd);
2956 	if (sec == obj_textsec (output_bfd))
2957 	  type = h->root.type == bfd_link_hash_defined ? N_TEXT : N_WEAKT;
2958 	else if (sec == obj_datasec (output_bfd))
2959 	  type = h->root.type == bfd_link_hash_defined ? N_DATA : N_WEAKD;
2960 	else if (sec == obj_bsssec (output_bfd))
2961 	  type = h->root.type == bfd_link_hash_defined ? N_BSS : N_WEAKB;
2962 	else
2963 	  type = h->root.type == bfd_link_hash_defined ? N_ABS : N_WEAKA;
2964 	type |= N_EXT;
2965 	val = (h->root.u.def.value
2966 	       + sec->vma
2967 	       + h->root.u.def.section->output_offset);
2968       }
2969       break;
2970     case bfd_link_hash_common:
2971       type = N_UNDF | N_EXT;
2972       val = h->root.u.c.size;
2973       break;
2974     case bfd_link_hash_undefweak:
2975       type = N_WEAKU;
2976       val = 0;
2977     case bfd_link_hash_indirect:
2978     case bfd_link_hash_warning:
2979       /* FIXME: Ignore these for now.  The circumstances under which
2980 	 they should be written out are not clear to me.  */
2981       return TRUE;
2982     }
2983 
2984   H_PUT_8 (output_bfd, type, outsym.e_type);
2985   indx = add_to_stringtab (output_bfd, finfo->strtab, h->root.root.string,
2986 			   FALSE);
2987   if (indx == (bfd_size_type) -1)
2988     /* FIXME: No way to handle errors.  */
2989     abort ();
2990 
2991   PUT_WORD (output_bfd, indx, outsym.e_strx);
2992   PUT_WORD (output_bfd, val, outsym.e_value);
2993 
2994   amt = EXTERNAL_NLIST_SIZE;
2995   if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0
2996       || bfd_bwrite ((void *) &outsym, amt, output_bfd) != amt)
2997     /* FIXME: No way to handle errors.  */
2998     abort ();
2999 
3000   finfo->symoff += amt;
3001   h->indx = obj_aout_external_sym_count (output_bfd);
3002   ++obj_aout_external_sym_count (output_bfd);
3003 
3004   return TRUE;
3005 }
3006 
3007 /* Handle a link order which is supposed to generate a reloc.  */
3008 
3009 static bfd_boolean
3010 aout_link_reloc_link_order (struct aout_final_link_info *finfo,
3011 			    asection *o,
3012 			    struct bfd_link_order *p)
3013 {
3014   struct bfd_link_order_reloc *pr;
3015   int r_index;
3016   int r_extern;
3017   reloc_howto_type *howto;
3018   file_ptr *reloff_ptr;
3019   struct reloc_std_external srel;
3020   void * rel_ptr;
3021   bfd_size_type rel_size;
3022 
3023   pr = p->u.reloc.p;
3024 
3025   if (p->type == bfd_section_reloc_link_order)
3026     {
3027       r_extern = 0;
3028       if (bfd_is_abs_section (pr->u.section))
3029 	r_index = N_ABS | N_EXT;
3030       else
3031 	{
3032 	  BFD_ASSERT (pr->u.section->owner == finfo->output_bfd);
3033 	  r_index = pr->u.section->target_index;
3034 	}
3035     }
3036   else
3037     {
3038       struct aout_link_hash_entry *h;
3039 
3040       BFD_ASSERT (p->type == bfd_symbol_reloc_link_order);
3041       r_extern = 1;
3042       h = ((struct aout_link_hash_entry *)
3043 	   bfd_wrapped_link_hash_lookup (finfo->output_bfd, finfo->info,
3044 					 pr->u.name, FALSE, FALSE, TRUE));
3045       if (h != NULL
3046 	  && h->indx >= 0)
3047 	r_index = h->indx;
3048       else if (h != NULL)
3049 	{
3050 	  /* We decided to strip this symbol, but it turns out that we
3051 	     can't.  Note that we lose the other and desc information
3052 	     here.  I don't think that will ever matter for a global
3053 	     symbol.  */
3054 	  h->indx = -2;
3055 	  h->written = FALSE;
3056 	  if (! aout_link_write_other_symbol (h, (void *) finfo))
3057 	    return FALSE;
3058 	  r_index = h->indx;
3059 	}
3060       else
3061 	{
3062 	  if (! ((*finfo->info->callbacks->unattached_reloc)
3063 		 (finfo->info, pr->u.name, NULL, NULL, (bfd_vma) 0)))
3064 	    return FALSE;
3065 	  r_index = 0;
3066 	}
3067     }
3068 
3069   howto = bfd_reloc_type_lookup (finfo->output_bfd, pr->reloc);
3070   if (howto == 0)
3071     {
3072       bfd_set_error (bfd_error_bad_value);
3073       return FALSE;
3074     }
3075 
3076   if (o == obj_textsec (finfo->output_bfd))
3077     reloff_ptr = &finfo->treloff;
3078   else if (o == obj_datasec (finfo->output_bfd))
3079     reloff_ptr = &finfo->dreloff;
3080   else
3081     abort ();
3082 
3083 #ifdef MY_put_reloc
3084   MY_put_reloc(finfo->output_bfd, r_extern, r_index, p->offset, howto,
3085 	       &srel);
3086 #else
3087   {
3088     int r_pcrel;
3089     int r_baserel;
3090     int r_jmptable;
3091     int r_relative;
3092     int r_length;
3093 
3094     fprintf (stderr, "TODO: line %d in bfd/pdp11.c\n", __LINE__);
3095 
3096     r_pcrel = howto->pc_relative;
3097     r_baserel = (howto->type & 8) != 0;
3098     r_jmptable = (howto->type & 16) != 0;
3099     r_relative = (howto->type & 32) != 0;
3100     r_length = howto->size;
3101 
3102     PUT_WORD (finfo->output_bfd, p->offset, srel.r_address);
3103     if (bfd_header_big_endian (finfo->output_bfd))
3104       {
3105 	srel.r_index[0] = r_index >> 16;
3106 	srel.r_index[1] = r_index >> 8;
3107 	srel.r_index[2] = r_index;
3108 	srel.r_type[0] =
3109 	  ((r_extern ?     RELOC_STD_BITS_EXTERN_BIG : 0)
3110 	   | (r_pcrel ?    RELOC_STD_BITS_PCREL_BIG : 0)
3111 	   | (r_baserel ?  RELOC_STD_BITS_BASEREL_BIG : 0)
3112 	   | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0)
3113 	   | (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0)
3114 	   | (r_length <<  RELOC_STD_BITS_LENGTH_SH_BIG));
3115       }
3116     else
3117       {
3118 	srel.r_index[2] = r_index >> 16;
3119 	srel.r_index[1] = r_index >> 8;
3120 	srel.r_index[0] = r_index;
3121 	srel.r_type[0] =
3122 	  ((r_extern ?     RELOC_STD_BITS_EXTERN_LITTLE : 0)
3123 	   | (r_pcrel ?    RELOC_STD_BITS_PCREL_LITTLE : 0)
3124 	   | (r_baserel ?  RELOC_STD_BITS_BASEREL_LITTLE : 0)
3125 	   | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0)
3126 	   | (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0)
3127 	   | (r_length <<  RELOC_STD_BITS_LENGTH_SH_LITTLE));
3128       }
3129   }
3130 #endif
3131   rel_ptr = (void *) &srel;
3132 
3133   /* We have to write the addend into the object file, since
3134      standard a.out relocs are in place.  It would be more
3135      reliable if we had the current contents of the file here,
3136      rather than assuming zeroes, but we can't read the file since
3137      it was opened using bfd_openw.  */
3138   if (pr->addend != 0)
3139     {
3140       bfd_size_type size;
3141       bfd_reloc_status_type r;
3142       bfd_byte *buf;
3143       bfd_boolean ok;
3144 
3145       size = bfd_get_reloc_size (howto);
3146       buf = bfd_zmalloc (size);
3147       if (buf == NULL)
3148 	return FALSE;
3149       r = MY_relocate_contents (howto, finfo->output_bfd,
3150 				pr->addend, buf);
3151       switch (r)
3152 	{
3153 	case bfd_reloc_ok:
3154 	  break;
3155 	default:
3156 	case bfd_reloc_outofrange:
3157 	  abort ();
3158 	case bfd_reloc_overflow:
3159 	  if (! ((*finfo->info->callbacks->reloc_overflow)
3160 		 (finfo->info, NULL,
3161 		  (p->type == bfd_section_reloc_link_order
3162 		   ? bfd_section_name (finfo->output_bfd,
3163 				       pr->u.section)
3164 		   : pr->u.name),
3165 		  howto->name, pr->addend, NULL,
3166 		  (asection *) NULL, (bfd_vma) 0)))
3167 	    {
3168 	      free (buf);
3169 	      return FALSE;
3170 	    }
3171 	  break;
3172 	}
3173       ok = bfd_set_section_contents (finfo->output_bfd, o,
3174 				     (void *) buf,
3175 				     (file_ptr) p->offset,
3176 				     size);
3177       free (buf);
3178       if (! ok)
3179 	return FALSE;
3180     }
3181 
3182   rel_size = obj_reloc_entry_size (finfo->output_bfd);
3183   if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0
3184       || bfd_bwrite (rel_ptr, rel_size, finfo->output_bfd) != rel_size)
3185     return FALSE;
3186 
3187   *reloff_ptr += rel_size;
3188 
3189   /* Assert that the relocs have not run into the symbols, and that n
3190      the text relocs have not run into the data relocs.  */
3191   BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd)
3192 	      && (reloff_ptr != &finfo->treloff
3193 		  || (*reloff_ptr
3194 		      <= obj_datasec (finfo->output_bfd)->rel_filepos)));
3195 
3196   return TRUE;
3197 }
3198 
3199 /* Get the section corresponding to a reloc index.  */
3200 
3201 static inline asection *
3202 aout_reloc_type_to_section (bfd *abfd, int type)
3203 {
3204   switch (type)
3205     {
3206     case RTEXT:	return obj_textsec (abfd);
3207     case RDATA: return obj_datasec (abfd);
3208     case RBSS:  return obj_bsssec (abfd);
3209     case RABS:  return bfd_abs_section_ptr;
3210     case REXT:  return bfd_und_section_ptr;
3211     default:    abort ();
3212     }
3213 }
3214 
3215 static bfd_boolean
3216 pdp11_aout_link_input_section (struct aout_final_link_info *finfo,
3217 			       bfd *input_bfd,
3218 			       asection *input_section,
3219 			       bfd_byte *relocs,
3220 			       bfd_size_type rel_size,
3221 			       bfd_byte *contents)
3222 {
3223   bfd_boolean (*check_dynamic_reloc)
3224     (struct bfd_link_info *, bfd *, asection *,
3225      struct aout_link_hash_entry *, void *, bfd_byte *, bfd_boolean *,
3226      bfd_vma *);
3227   bfd *output_bfd;
3228   bfd_boolean relocatable;
3229   struct external_nlist *syms;
3230   char *strings;
3231   struct aout_link_hash_entry **sym_hashes;
3232   int *symbol_map;
3233   bfd_size_type reloc_count;
3234   bfd_byte *rel;
3235   bfd_byte *rel_end;
3236 
3237   output_bfd = finfo->output_bfd;
3238   check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc;
3239 
3240   BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_SIZE);
3241   BFD_ASSERT (input_bfd->xvec->header_byteorder
3242 	      == output_bfd->xvec->header_byteorder);
3243 
3244   relocatable = finfo->info->relocatable;
3245   syms = obj_aout_external_syms (input_bfd);
3246   strings = obj_aout_external_strings (input_bfd);
3247   sym_hashes = obj_aout_sym_hashes (input_bfd);
3248   symbol_map = finfo->symbol_map;
3249 
3250   reloc_count = rel_size / RELOC_SIZE;
3251   rel = relocs;
3252   rel_end = rel + rel_size;
3253   for (; rel < rel_end; rel += RELOC_SIZE)
3254     {
3255       bfd_vma r_addr;
3256       int r_index;
3257       int r_type;
3258       int r_pcrel;
3259       int r_extern;
3260       reloc_howto_type *howto;
3261       struct aout_link_hash_entry *h = NULL;
3262       bfd_vma relocation;
3263       bfd_reloc_status_type r;
3264       int reloc_entry;
3265 
3266       reloc_entry = GET_WORD (input_bfd, (void *) rel);
3267       if (reloc_entry == 0)
3268 	continue;
3269 
3270       {
3271 	unsigned int howto_idx;
3272 
3273 	r_index = (reloc_entry & RIDXMASK) >> 4;
3274 	r_type = reloc_entry & RTYPE;
3275 	r_pcrel = reloc_entry & RELFLG;
3276 	r_addr = (char *) rel - (char *) relocs;
3277 
3278 	r_extern = (r_type == REXT);
3279 
3280 	howto_idx = r_pcrel;
3281 	BFD_ASSERT (howto_idx < TABLE_SIZE (howto_table_pdp11));
3282 	howto = howto_table_pdp11 + howto_idx;
3283       }
3284 
3285       if (relocatable)
3286 	{
3287 	  /* We are generating a relocatable output file, and must
3288 	     modify the reloc accordingly.  */
3289 	  if (r_extern)
3290 	    {
3291 	      /* If we know the symbol this relocation is against,
3292 		 convert it into a relocation against a section.  This
3293 		 is what the native linker does.  */
3294 	      h = sym_hashes[r_index];
3295 	      if (h != NULL
3296 		  && (h->root.type == bfd_link_hash_defined
3297 		      || h->root.type == bfd_link_hash_defweak))
3298 		{
3299 		  asection *output_section;
3300 
3301 		  /* Compute a new r_index.  */
3302 		  output_section = h->root.u.def.section->output_section;
3303 		  if (output_section == obj_textsec (output_bfd))
3304 		    r_type = N_TEXT;
3305 		  else if (output_section == obj_datasec (output_bfd))
3306 		    r_type = N_DATA;
3307 		  else if (output_section == obj_bsssec (output_bfd))
3308 		    r_type = N_BSS;
3309 		  else
3310 		    r_type = N_ABS;
3311 
3312 		  /* Add the symbol value and the section VMA to the
3313 		     addend stored in the contents.  */
3314 		  relocation = (h->root.u.def.value
3315 				+ output_section->vma
3316 				+ h->root.u.def.section->output_offset);
3317 		}
3318 	      else
3319 		{
3320 		  /* We must change r_index according to the symbol
3321 		     map.  */
3322 		  r_index = symbol_map[r_index];
3323 
3324 		  if (r_index == -1)
3325 		    {
3326 		      if (h != NULL)
3327 			{
3328 			  /* We decided to strip this symbol, but it
3329                              turns out that we can't.  Note that we
3330                              lose the other and desc information here.
3331                              I don't think that will ever matter for a
3332                              global symbol.  */
3333 			  if (h->indx < 0)
3334 			    {
3335 			      h->indx = -2;
3336 			      h->written = FALSE;
3337 			      if (! aout_link_write_other_symbol (h,
3338 								  (void *) finfo))
3339 				return FALSE;
3340 			    }
3341 			  r_index = h->indx;
3342 			}
3343 		      else
3344 			{
3345 			  const char *name;
3346 
3347 			  name = strings + GET_WORD (input_bfd,
3348 						     syms[r_index].e_strx);
3349 			  if (! ((*finfo->info->callbacks->unattached_reloc)
3350 				 (finfo->info, name, input_bfd, input_section,
3351 				  r_addr)))
3352 			    return FALSE;
3353 			  r_index = 0;
3354 			}
3355 		    }
3356 
3357 		  relocation = 0;
3358 		}
3359 
3360 	      /* Write out the new r_index value.  */
3361 	      reloc_entry = GET_WORD (input_bfd, rel);
3362 	      reloc_entry &= RIDXMASK;
3363 	      reloc_entry |= r_index << 4;
3364 	      PUT_WORD (input_bfd, reloc_entry, rel);
3365 	    }
3366 	  else
3367 	    {
3368 	      asection *section;
3369 
3370 	      /* This is a relocation against a section.  We must
3371 		 adjust by the amount that the section moved.  */
3372 	      section = aout_reloc_type_to_section (input_bfd, r_type);
3373 	      relocation = (section->output_section->vma
3374 			    + section->output_offset
3375 			    - section->vma);
3376 	    }
3377 
3378 	  /* Change the address of the relocation.  */
3379 	  fprintf (stderr, "TODO: change the address of the relocation\n");
3380 
3381 	  /* Adjust a PC relative relocation by removing the reference
3382 	     to the original address in the section and including the
3383 	     reference to the new address.  */
3384 	  if (r_pcrel)
3385 	    relocation -= (input_section->output_section->vma
3386 			   + input_section->output_offset
3387 			   - input_section->vma);
3388 
3389 #ifdef MY_relocatable_reloc
3390 	  MY_relocatable_reloc (howto, output_bfd, rel, relocation, r_addr);
3391 #endif
3392 
3393 	  if (relocation == 0)
3394 	    r = bfd_reloc_ok;
3395 	  else
3396 	    r = MY_relocate_contents (howto,
3397 				      input_bfd, relocation,
3398 				      contents + r_addr);
3399 	}
3400       else
3401 	{
3402 	  bfd_boolean hundef;
3403 
3404 	  /* We are generating an executable, and must do a full
3405 	     relocation.  */
3406 	  hundef = FALSE;
3407 	  if (r_extern)
3408 	    {
3409 	      h = sym_hashes[r_index];
3410 
3411 	      if (h != NULL
3412 		  && (h->root.type == bfd_link_hash_defined
3413 		      || h->root.type == bfd_link_hash_defweak))
3414 		{
3415 		  relocation = (h->root.u.def.value
3416 				+ h->root.u.def.section->output_section->vma
3417 				+ h->root.u.def.section->output_offset);
3418 		}
3419 	      else if (h != NULL
3420 		       && h->root.type == bfd_link_hash_undefweak)
3421 		relocation = 0;
3422 	      else
3423 		{
3424 		  hundef = TRUE;
3425 		  relocation = 0;
3426 		}
3427 	    }
3428 	  else
3429 	    {
3430 	      asection *section;
3431 
3432 	      section = aout_reloc_type_to_section (input_bfd, r_type);
3433 	      relocation = (section->output_section->vma
3434 			    + section->output_offset
3435 			    - section->vma);
3436 	      if (r_pcrel)
3437 		relocation += input_section->vma;
3438 	    }
3439 
3440 	  if (check_dynamic_reloc != NULL)
3441 	    {
3442 	      bfd_boolean skip;
3443 
3444 	      if (! ((*check_dynamic_reloc)
3445 		     (finfo->info, input_bfd, input_section, h,
3446 		      (void *) rel, contents, &skip, &relocation)))
3447 		return FALSE;
3448 	      if (skip)
3449 		continue;
3450 	    }
3451 
3452 	  /* Now warn if a global symbol is undefined.  We could not
3453              do this earlier, because check_dynamic_reloc might want
3454              to skip this reloc.  */
3455 	  if (hundef && ! finfo->info->shared)
3456 	    {
3457 	      const char *name;
3458 
3459 	      if (h != NULL)
3460 		name = h->root.root.string;
3461 	      else
3462 		name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
3463 	      if (! ((*finfo->info->callbacks->undefined_symbol)
3464 		     (finfo->info, name, input_bfd, input_section,
3465 		      r_addr, TRUE)))
3466 		return FALSE;
3467 	    }
3468 
3469 	  r = MY_final_link_relocate (howto,
3470 				      input_bfd, input_section,
3471 				      contents, r_addr, relocation,
3472 				      (bfd_vma) 0);
3473 	}
3474 
3475       if (r != bfd_reloc_ok)
3476 	{
3477 	  switch (r)
3478 	    {
3479 	    default:
3480 	    case bfd_reloc_outofrange:
3481 	      abort ();
3482 	    case bfd_reloc_overflow:
3483 	      {
3484 		const char *name;
3485 
3486 		if (h != NULL)
3487 		  name = NULL;
3488 		else if (r_extern)
3489 		  name = strings + GET_WORD (input_bfd,
3490 					     syms[r_index].e_strx);
3491 		else
3492 		  {
3493 		    asection *s;
3494 
3495 		    s = aout_reloc_type_to_section (input_bfd, r_type);
3496 		    name = bfd_section_name (input_bfd, s);
3497 		  }
3498 		if (! ((*finfo->info->callbacks->reloc_overflow)
3499 		       (finfo->info, (h ? &h->root : NULL), name,
3500 			howto->name, (bfd_vma) 0, input_bfd,
3501 			input_section, r_addr)))
3502 		  return FALSE;
3503 	      }
3504 	      break;
3505 	    }
3506 	}
3507     }
3508 
3509   return TRUE;
3510 }
3511 
3512 /* Link an a.out section into the output file.  */
3513 
3514 static bfd_boolean
3515 aout_link_input_section (struct aout_final_link_info *finfo,
3516 			 bfd *input_bfd,
3517 			 asection *input_section,
3518 			 file_ptr *reloff_ptr,
3519 			 bfd_size_type rel_size)
3520 {
3521   bfd_size_type input_size;
3522   void * relocs;
3523 
3524   /* Get the section contents.  */
3525   input_size = input_section->size;
3526   if (! bfd_get_section_contents (input_bfd, input_section,
3527 				  (void *) finfo->contents,
3528 				  (file_ptr) 0, input_size))
3529     return FALSE;
3530 
3531   /* Read in the relocs if we haven't already done it.  */
3532   if (aout_section_data (input_section) != NULL
3533       && aout_section_data (input_section)->relocs != NULL)
3534     relocs = aout_section_data (input_section)->relocs;
3535   else
3536     {
3537       relocs = finfo->relocs;
3538       if (rel_size > 0)
3539 	{
3540 	  if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
3541 	      || bfd_bread (relocs, rel_size, input_bfd) != rel_size)
3542 	    return FALSE;
3543 	}
3544     }
3545 
3546   /* Relocate the section contents.  */
3547   if (! pdp11_aout_link_input_section (finfo, input_bfd, input_section,
3548 				       (bfd_byte *) relocs,
3549 				       rel_size, finfo->contents))
3550     return FALSE;
3551 
3552   /* Write out the section contents.  */
3553   if (! bfd_set_section_contents (finfo->output_bfd,
3554 				  input_section->output_section,
3555 				  (void *) finfo->contents,
3556 				  (file_ptr) input_section->output_offset,
3557 				  input_size))
3558     return FALSE;
3559 
3560   /* If we are producing relocatable output, the relocs were
3561      modified, and we now write them out.  */
3562   if (finfo->info->relocatable && rel_size > 0)
3563     {
3564       if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0)
3565 	return FALSE;
3566       if (bfd_bwrite (relocs, rel_size, finfo->output_bfd) != rel_size)
3567 	return FALSE;
3568       *reloff_ptr += rel_size;
3569 
3570       /* Assert that the relocs have not run into the symbols, and
3571 	 that if these are the text relocs they have not run into the
3572 	 data relocs.  */
3573       BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd)
3574 		  && (reloff_ptr != &finfo->treloff
3575 		      || (*reloff_ptr
3576 			  <= obj_datasec (finfo->output_bfd)->rel_filepos)));
3577     }
3578 
3579   return TRUE;
3580 }
3581 
3582 /* Link an a.out input BFD into the output file.  */
3583 
3584 static bfd_boolean
3585 aout_link_input_bfd (struct aout_final_link_info *finfo, bfd *input_bfd)
3586 {
3587   bfd_size_type sym_count;
3588 
3589   BFD_ASSERT (bfd_get_format (input_bfd) == bfd_object);
3590 
3591   /* If this is a dynamic object, it may need special handling.  */
3592   if ((input_bfd->flags & DYNAMIC) != 0
3593       && aout_backend_info (input_bfd)->link_dynamic_object != NULL)
3594     return ((*aout_backend_info (input_bfd)->link_dynamic_object)
3595 	    (finfo->info, input_bfd));
3596 
3597   /* Get the symbols.  We probably have them already, unless
3598      finfo->info->keep_memory is FALSE.  */
3599   if (! aout_get_external_symbols (input_bfd))
3600     return FALSE;
3601 
3602   sym_count = obj_aout_external_sym_count (input_bfd);
3603 
3604   /* Write out the symbols and get a map of the new indices.  The map
3605      is placed into finfo->symbol_map.  */
3606   if (! aout_link_write_symbols (finfo, input_bfd))
3607     return FALSE;
3608 
3609   /* Relocate and write out the sections.  These functions use the
3610      symbol map created by aout_link_write_symbols.  The linker_mark
3611      field will be set if these sections are to be included in the
3612      link, which will normally be the case.  */
3613   if (obj_textsec (input_bfd)->linker_mark)
3614     {
3615       if (! aout_link_input_section (finfo, input_bfd,
3616 				     obj_textsec (input_bfd),
3617 				     &finfo->treloff,
3618 				     exec_hdr (input_bfd)->a_trsize))
3619 	return FALSE;
3620     }
3621   if (obj_datasec (input_bfd)->linker_mark)
3622     {
3623       if (! aout_link_input_section (finfo, input_bfd,
3624 				     obj_datasec (input_bfd),
3625 				     &finfo->dreloff,
3626 				     exec_hdr (input_bfd)->a_drsize))
3627 	return FALSE;
3628     }
3629 
3630   /* If we are not keeping memory, we don't need the symbols any
3631      longer.  We still need them if we are keeping memory, because the
3632      strings in the hash table point into them.  */
3633   if (! finfo->info->keep_memory)
3634     {
3635       if (! aout_link_free_symbols (input_bfd))
3636 	return FALSE;
3637     }
3638 
3639   return TRUE;
3640 }
3641 
3642 /* Do the final link step.  This is called on the output BFD.  The
3643    INFO structure should point to a list of BFDs linked through the
3644    link_next field which can be used to find each BFD which takes part
3645    in the output.  Also, each section in ABFD should point to a list
3646    of bfd_link_order structures which list all the input sections for
3647    the output section.  */
3648 
3649 bfd_boolean
3650 NAME (aout, final_link) (bfd *abfd,
3651 			 struct bfd_link_info *info,
3652 			 void (*callback) (bfd *, file_ptr *, file_ptr *, file_ptr *))
3653 {
3654   struct aout_final_link_info aout_info;
3655   bfd_boolean includes_hash_initialized = FALSE;
3656   bfd *sub;
3657   bfd_size_type trsize, drsize;
3658   bfd_size_type max_contents_size;
3659   bfd_size_type max_relocs_size;
3660   bfd_size_type max_sym_count;
3661   bfd_size_type text_size;
3662   file_ptr text_end;
3663   struct bfd_link_order *p;
3664   asection *o;
3665   bfd_boolean have_link_order_relocs;
3666 
3667   if (info->shared)
3668     abfd->flags |= DYNAMIC;
3669 
3670   aout_info.info = info;
3671   aout_info.output_bfd = abfd;
3672   aout_info.contents = NULL;
3673   aout_info.relocs = NULL;
3674   aout_info.symbol_map = NULL;
3675   aout_info.output_syms = NULL;
3676 
3677   if (!bfd_hash_table_init_n (&aout_info.includes.root,
3678 			      aout_link_includes_newfunc,
3679 			      sizeof (struct aout_link_includes_entry),
3680 			      251))
3681     goto error_return;
3682   includes_hash_initialized = TRUE;
3683 
3684   /* Figure out the largest section size.  Also, if generating
3685      relocatable output, count the relocs.  */
3686   trsize = 0;
3687   drsize = 0;
3688   max_contents_size = 0;
3689   max_relocs_size = 0;
3690   max_sym_count = 0;
3691   for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
3692     {
3693       size_t sz;
3694 
3695       if (info->relocatable)
3696 	{
3697 	  if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
3698 	    {
3699 	      trsize += exec_hdr (sub)->a_trsize;
3700 	      drsize += exec_hdr (sub)->a_drsize;
3701 	    }
3702 	  else
3703 	    {
3704 	      /* FIXME: We need to identify the .text and .data sections
3705 		 and call get_reloc_upper_bound and canonicalize_reloc to
3706 		 work out the number of relocs needed, and then multiply
3707 		 by the reloc size.  */
3708 	      (*_bfd_error_handler)
3709 		("%s: relocatable link from %s to %s not supported",
3710 		 bfd_get_filename (abfd),
3711 		 sub->xvec->name, abfd->xvec->name);
3712 	      bfd_set_error (bfd_error_invalid_operation);
3713 	      goto error_return;
3714 	    }
3715 	}
3716 
3717       if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
3718 	{
3719 	  sz = obj_textsec (sub)->size;
3720 	  if (sz > max_contents_size)
3721 	    max_contents_size = sz;
3722 	  sz = obj_datasec (sub)->size;
3723 	  if (sz > max_contents_size)
3724 	    max_contents_size = sz;
3725 
3726 	  sz = exec_hdr (sub)->a_trsize;
3727 	  if (sz > max_relocs_size)
3728 	    max_relocs_size = sz;
3729 	  sz = exec_hdr (sub)->a_drsize;
3730 	  if (sz > max_relocs_size)
3731 	    max_relocs_size = sz;
3732 
3733 	  sz = obj_aout_external_sym_count (sub);
3734 	  if (sz > max_sym_count)
3735 	    max_sym_count = sz;
3736 	}
3737     }
3738 
3739   if (info->relocatable)
3740     {
3741       if (obj_textsec (abfd) != NULL)
3742 	trsize += (_bfd_count_link_order_relocs (obj_textsec (abfd)
3743 						 ->map_head.link_order)
3744 		   * obj_reloc_entry_size (abfd));
3745       if (obj_datasec (abfd) != NULL)
3746 	drsize += (_bfd_count_link_order_relocs (obj_datasec (abfd)
3747 						 ->map_head.link_order)
3748 		   * obj_reloc_entry_size (abfd));
3749     }
3750 
3751   exec_hdr (abfd)->a_trsize = trsize;
3752   exec_hdr (abfd)->a_drsize = drsize;
3753   exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd);
3754 
3755   /* Adjust the section sizes and vmas according to the magic number.
3756      This sets a_text, a_data and a_bss in the exec_hdr and sets the
3757      filepos for each section.  */
3758   if (! NAME (aout, adjust_sizes_and_vmas) (abfd, &text_size, &text_end))
3759     goto error_return;
3760 
3761   /* The relocation and symbol file positions differ among a.out
3762      targets.  We are passed a callback routine from the backend
3763      specific code to handle this.
3764      FIXME: At this point we do not know how much space the symbol
3765      table will require.  This will not work for any (nonstandard)
3766      a.out target that needs to know the symbol table size before it
3767      can compute the relocation file positions.  This may or may not
3768      be the case for the hp300hpux target, for example.  */
3769   (*callback) (abfd, &aout_info.treloff, &aout_info.dreloff,
3770 	       &aout_info.symoff);
3771   obj_textsec (abfd)->rel_filepos = aout_info.treloff;
3772   obj_datasec (abfd)->rel_filepos = aout_info.dreloff;
3773   obj_sym_filepos (abfd) = aout_info.symoff;
3774 
3775   /* We keep a count of the symbols as we output them.  */
3776   obj_aout_external_sym_count (abfd) = 0;
3777 
3778   /* We accumulate the string table as we write out the symbols.  */
3779   aout_info.strtab = _bfd_stringtab_init ();
3780   if (aout_info.strtab == NULL)
3781     goto error_return;
3782 
3783   /* Allocate buffers to hold section contents and relocs.  */
3784   aout_info.contents = bfd_malloc (max_contents_size);
3785   aout_info.relocs = bfd_malloc (max_relocs_size);
3786   aout_info.symbol_map = bfd_malloc (max_sym_count * sizeof (int *));
3787   aout_info.output_syms = bfd_malloc ((max_sym_count + 1)
3788 				      * sizeof (struct external_nlist));
3789   if ((aout_info.contents == NULL && max_contents_size != 0)
3790       || (aout_info.relocs == NULL && max_relocs_size != 0)
3791       || (aout_info.symbol_map == NULL && max_sym_count != 0)
3792       || aout_info.output_syms == NULL)
3793     goto error_return;
3794 
3795   /* If we have a symbol named __DYNAMIC, force it out now.  This is
3796      required by SunOS.  Doing this here rather than in sunos.c is a
3797      hack, but it's easier than exporting everything which would be
3798      needed.  */
3799   {
3800     struct aout_link_hash_entry *h;
3801 
3802     h = aout_link_hash_lookup (aout_hash_table (info), "__DYNAMIC",
3803 			       FALSE, FALSE, FALSE);
3804     if (h != NULL)
3805       aout_link_write_other_symbol (h, &aout_info);
3806   }
3807 
3808   /* The most time efficient way to do the link would be to read all
3809      the input object files into memory and then sort out the
3810      information into the output file.  Unfortunately, that will
3811      probably use too much memory.  Another method would be to step
3812      through everything that composes the text section and write it
3813      out, and then everything that composes the data section and write
3814      it out, and then write out the relocs, and then write out the
3815      symbols.  Unfortunately, that requires reading stuff from each
3816      input file several times, and we will not be able to keep all the
3817      input files open simultaneously, and reopening them will be slow.
3818 
3819      What we do is basically process one input file at a time.  We do
3820      everything we need to do with an input file once--copy over the
3821      section contents, handle the relocation information, and write
3822      out the symbols--and then we throw away the information we read
3823      from it.  This approach requires a lot of lseeks of the output
3824      file, which is unfortunate but still faster than reopening a lot
3825      of files.
3826 
3827      We use the output_has_begun field of the input BFDs to see
3828      whether we have already handled it.  */
3829   for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
3830     sub->output_has_begun = FALSE;
3831 
3832   /* Mark all sections which are to be included in the link.  This
3833      will normally be every section.  We need to do this so that we
3834      can identify any sections which the linker has decided to not
3835      include.  */
3836   for (o = abfd->sections; o != NULL; o = o->next)
3837     {
3838       for (p = o->map_head.link_order; p != NULL; p = p->next)
3839 	if (p->type == bfd_indirect_link_order)
3840 	  p->u.indirect.section->linker_mark = TRUE;
3841     }
3842 
3843   have_link_order_relocs = FALSE;
3844   for (o = abfd->sections; o != NULL; o = o->next)
3845     {
3846       for (p = o->map_head.link_order;
3847 	   p != NULL;
3848 	   p = p->next)
3849 	{
3850 	  if (p->type == bfd_indirect_link_order
3851 	      && (bfd_get_flavour (p->u.indirect.section->owner)
3852 		  == bfd_target_aout_flavour))
3853 	    {
3854 	      bfd *input_bfd;
3855 
3856 	      input_bfd = p->u.indirect.section->owner;
3857 	      if (! input_bfd->output_has_begun)
3858 		{
3859 		  if (! aout_link_input_bfd (&aout_info, input_bfd))
3860 		    goto error_return;
3861 		  input_bfd->output_has_begun = TRUE;
3862 		}
3863 	    }
3864 	  else if (p->type == bfd_section_reloc_link_order
3865 		   || p->type == bfd_symbol_reloc_link_order)
3866 	    /* These are handled below.  */
3867 	    have_link_order_relocs = TRUE;
3868 	  else
3869 	    {
3870 	      if (! _bfd_default_link_order (abfd, info, o, p))
3871 		goto error_return;
3872 	    }
3873 	}
3874     }
3875 
3876   /* Write out any symbols that we have not already written out.  */
3877   aout_link_hash_traverse (aout_hash_table (info),
3878 			   aout_link_write_other_symbol,
3879 			   (void *) &aout_info);
3880 
3881   /* Now handle any relocs we were asked to create by the linker.
3882      These did not come from any input file.  We must do these after
3883      we have written out all the symbols, so that we know the symbol
3884      indices to use.  */
3885   if (have_link_order_relocs)
3886     {
3887       for (o = abfd->sections; o != NULL; o = o->next)
3888 	{
3889 	  for (p = o->map_head.link_order;
3890 	       p != NULL;
3891 	       p = p->next)
3892 	    {
3893 	      if (p->type == bfd_section_reloc_link_order
3894 		  || p->type == bfd_symbol_reloc_link_order)
3895 		{
3896 		  if (! aout_link_reloc_link_order (&aout_info, o, p))
3897 		    goto error_return;
3898 		}
3899 	    }
3900 	}
3901     }
3902 
3903   if (aout_info.contents != NULL)
3904     {
3905       free (aout_info.contents);
3906       aout_info.contents = NULL;
3907     }
3908   if (aout_info.relocs != NULL)
3909     {
3910       free (aout_info.relocs);
3911       aout_info.relocs = NULL;
3912     }
3913   if (aout_info.symbol_map != NULL)
3914     {
3915       free (aout_info.symbol_map);
3916       aout_info.symbol_map = NULL;
3917     }
3918   if (aout_info.output_syms != NULL)
3919     {
3920       free (aout_info.output_syms);
3921       aout_info.output_syms = NULL;
3922     }
3923   if (includes_hash_initialized)
3924     {
3925       bfd_hash_table_free (&aout_info.includes.root);
3926       includes_hash_initialized = FALSE;
3927     }
3928 
3929   /* Finish up any dynamic linking we may be doing.  */
3930   if (aout_backend_info (abfd)->finish_dynamic_link != NULL)
3931     {
3932       if (! (*aout_backend_info (abfd)->finish_dynamic_link) (abfd, info))
3933 	goto error_return;
3934     }
3935 
3936   /* Update the header information.  */
3937   abfd->symcount = obj_aout_external_sym_count (abfd);
3938   exec_hdr (abfd)->a_syms = abfd->symcount * EXTERNAL_NLIST_SIZE;
3939   obj_str_filepos (abfd) = obj_sym_filepos (abfd) + exec_hdr (abfd)->a_syms;
3940   obj_textsec (abfd)->reloc_count =
3941     exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd);
3942   obj_datasec (abfd)->reloc_count =
3943     exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd);
3944 
3945   /* Write out the string table, unless there are no symbols.  */
3946   if (abfd->symcount > 0)
3947     {
3948       if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
3949 	  || ! emit_stringtab (abfd, aout_info.strtab))
3950 	goto error_return;
3951     }
3952   else if (obj_textsec (abfd)->reloc_count == 0
3953 	   && obj_datasec (abfd)->reloc_count == 0)
3954     {
3955       bfd_byte b;
3956 
3957       b = 0;
3958       if (bfd_seek (abfd,
3959 		    (file_ptr) (obj_datasec (abfd)->filepos
3960 				+ exec_hdr (abfd)->a_data
3961 				- 1),
3962 		    SEEK_SET) != 0
3963 	  || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
3964 	goto error_return;
3965     }
3966 
3967   return TRUE;
3968 
3969  error_return:
3970   if (aout_info.contents != NULL)
3971     free (aout_info.contents);
3972   if (aout_info.relocs != NULL)
3973     free (aout_info.relocs);
3974   if (aout_info.symbol_map != NULL)
3975     free (aout_info.symbol_map);
3976   if (aout_info.output_syms != NULL)
3977     free (aout_info.output_syms);
3978   if (includes_hash_initialized)
3979     bfd_hash_table_free (&aout_info.includes.root);
3980   return FALSE;
3981 }
3982 
3983 /* Adjust and write out the symbols for an a.out file.  Set the new
3984    symbol indices into a symbol_map.  */
3985 
3986 static bfd_boolean
3987 aout_link_write_symbols (struct aout_final_link_info *finfo, bfd *input_bfd)
3988 {
3989   bfd *output_bfd;
3990   bfd_size_type sym_count;
3991   char *strings;
3992   enum bfd_link_strip strip;
3993   enum bfd_link_discard discard;
3994   struct external_nlist *outsym;
3995   bfd_size_type strtab_index;
3996   struct external_nlist *sym;
3997   struct external_nlist *sym_end;
3998   struct aout_link_hash_entry **sym_hash;
3999   int *symbol_map;
4000   bfd_boolean pass;
4001   bfd_boolean skip_next;
4002 
4003   output_bfd = finfo->output_bfd;
4004   sym_count = obj_aout_external_sym_count (input_bfd);
4005   strings = obj_aout_external_strings (input_bfd);
4006   strip = finfo->info->strip;
4007   discard = finfo->info->discard;
4008   outsym = finfo->output_syms;
4009 
4010   /* First write out a symbol for this object file, unless we are
4011      discarding such symbols.  */
4012   if (strip != strip_all
4013       && (strip != strip_some
4014 	  || bfd_hash_lookup (finfo->info->keep_hash, input_bfd->filename,
4015 			      FALSE, FALSE) != NULL)
4016       && discard != discard_all)
4017     {
4018       H_PUT_8 (output_bfd, N_TEXT, outsym->e_type);
4019       strtab_index = add_to_stringtab (output_bfd, finfo->strtab,
4020 				       input_bfd->filename, FALSE);
4021       if (strtab_index == (bfd_size_type) -1)
4022 	return FALSE;
4023       PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
4024       PUT_WORD (output_bfd,
4025 		(bfd_get_section_vma (output_bfd,
4026 				      obj_textsec (input_bfd)->output_section)
4027 		 + obj_textsec (input_bfd)->output_offset),
4028 		outsym->e_value);
4029       ++obj_aout_external_sym_count (output_bfd);
4030       ++outsym;
4031     }
4032 
4033   pass = FALSE;
4034   skip_next = FALSE;
4035   sym = obj_aout_external_syms (input_bfd);
4036   sym_end = sym + sym_count;
4037   sym_hash = obj_aout_sym_hashes (input_bfd);
4038   symbol_map = finfo->symbol_map;
4039   memset (symbol_map, 0, (size_t) sym_count * sizeof *symbol_map);
4040   for (; sym < sym_end; sym++, sym_hash++, symbol_map++)
4041     {
4042       const char *name;
4043       int type;
4044       struct aout_link_hash_entry *h;
4045       bfd_boolean skip;
4046       asection *symsec;
4047       bfd_vma val = 0;
4048       bfd_boolean copy;
4049 
4050       /* We set *symbol_map to 0 above for all symbols.  If it has
4051          already been set to -1 for this symbol, it means that we are
4052          discarding it because it appears in a duplicate header file.
4053          See the N_BINCL code below.  */
4054       if (*symbol_map == -1)
4055 	continue;
4056 
4057       /* Initialize *symbol_map to -1, which means that the symbol was
4058          not copied into the output file.  We will change it later if
4059          we do copy the symbol over.  */
4060       *symbol_map = -1;
4061 
4062       type = H_GET_8 (input_bfd, sym->e_type);
4063       name = strings + GET_WORD (input_bfd, sym->e_strx);
4064 
4065       h = NULL;
4066 
4067       if (pass)
4068 	{
4069 	  /* Pass this symbol through.  It is the target of an
4070 	     indirect or warning symbol.  */
4071 	  val = GET_WORD (input_bfd, sym->e_value);
4072 	  pass = FALSE;
4073 	}
4074       else if (skip_next)
4075 	{
4076 	  /* Skip this symbol, which is the target of an indirect
4077 	     symbol that we have changed to no longer be an indirect
4078 	     symbol.  */
4079 	  skip_next = FALSE;
4080 	  continue;
4081 	}
4082       else
4083 	{
4084 	  struct aout_link_hash_entry *hresolve;
4085 
4086 	  /* We have saved the hash table entry for this symbol, if
4087 	     there is one.  Note that we could just look it up again
4088 	     in the hash table, provided we first check that it is an
4089 	     external symbol. */
4090 	  h = *sym_hash;
4091 
4092 	  /* Use the name from the hash table, in case the symbol was
4093              wrapped.  */
4094 	  if (h != NULL)
4095 	    name = h->root.root.string;
4096 
4097 	  /* If this is an indirect or warning symbol, then change
4098 	     hresolve to the base symbol.  We also change *sym_hash so
4099 	     that the relocation routines relocate against the real
4100 	     symbol.  */
4101 	  hresolve = h;
4102 	  if (h != NULL
4103 	      && (h->root.type == bfd_link_hash_indirect
4104 		  || h->root.type == bfd_link_hash_warning))
4105 	    {
4106 	      hresolve = (struct aout_link_hash_entry *) h->root.u.i.link;
4107 	      while (hresolve->root.type == bfd_link_hash_indirect
4108 		     || hresolve->root.type == bfd_link_hash_warning)
4109 		hresolve = ((struct aout_link_hash_entry *)
4110 			    hresolve->root.u.i.link);
4111 	      *sym_hash = hresolve;
4112 	    }
4113 
4114 	  /* If the symbol has already been written out, skip it.  */
4115 	  if (h != NULL
4116 	      && h->root.type != bfd_link_hash_warning
4117 	      && h->written)
4118 	    {
4119 	      if ((type & N_TYPE) == N_INDR
4120 		  || type == N_WARNING)
4121 		skip_next = TRUE;
4122 	      *symbol_map = h->indx;
4123 	      continue;
4124 	    }
4125 
4126 	  /* See if we are stripping this symbol.  */
4127 	  skip = FALSE;
4128 	  switch (strip)
4129 	    {
4130 	    case strip_none:
4131 	      break;
4132 	    case strip_debugger:
4133 	      if ((type & N_STAB) != 0)
4134 		skip = TRUE;
4135 	      break;
4136 	    case strip_some:
4137 	      if (bfd_hash_lookup (finfo->info->keep_hash, name, FALSE, FALSE)
4138 		  == NULL)
4139 		skip = TRUE;
4140 	      break;
4141 	    case strip_all:
4142 	      skip = TRUE;
4143 	      break;
4144 	    }
4145 	  if (skip)
4146 	    {
4147 	      if (h != NULL)
4148 		h->written = TRUE;
4149 	      continue;
4150 	    }
4151 
4152 	  /* Get the value of the symbol.  */
4153 	  if ((type & N_TYPE) == N_TEXT
4154 	      || type == N_WEAKT)
4155 	    symsec = obj_textsec (input_bfd);
4156 	  else if ((type & N_TYPE) == N_DATA
4157 		   || type == N_WEAKD)
4158 	    symsec = obj_datasec (input_bfd);
4159 	  else if ((type & N_TYPE) == N_BSS
4160 		   || type == N_WEAKB)
4161 	    symsec = obj_bsssec (input_bfd);
4162 	  else if ((type & N_TYPE) == N_ABS
4163 		   || type == N_WEAKA)
4164 	    symsec = bfd_abs_section_ptr;
4165 	  else if (((type & N_TYPE) == N_INDR
4166 		    && (hresolve == NULL
4167 			|| (hresolve->root.type != bfd_link_hash_defined
4168 			    && hresolve->root.type != bfd_link_hash_defweak
4169 			    && hresolve->root.type != bfd_link_hash_common)))
4170 		   || type == N_WARNING)
4171 	    {
4172 	      /* Pass the next symbol through unchanged.  The
4173 		 condition above for indirect symbols is so that if
4174 		 the indirect symbol was defined, we output it with
4175 		 the correct definition so the debugger will
4176 		 understand it.  */
4177 	      pass = TRUE;
4178 	      val = GET_WORD (input_bfd, sym->e_value);
4179 	      symsec = NULL;
4180 	    }
4181 	  else if ((type & N_STAB) != 0)
4182 	    {
4183 	      val = GET_WORD (input_bfd, sym->e_value);
4184 	      symsec = NULL;
4185 	    }
4186 	  else
4187 	    {
4188 	      /* If we get here with an indirect symbol, it means that
4189 		 we are outputting it with a real definition.  In such
4190 		 a case we do not want to output the next symbol,
4191 		 which is the target of the indirection.  */
4192 	      if ((type & N_TYPE) == N_INDR)
4193 		skip_next = TRUE;
4194 
4195 	      symsec = NULL;
4196 
4197 	      /* We need to get the value from the hash table.  We use
4198 		 hresolve so that if we have defined an indirect
4199 		 symbol we output the final definition.  */
4200 	      if (h == NULL)
4201 		{
4202 		  switch (type & N_TYPE)
4203 		    {
4204 		    case N_SETT:
4205 		      symsec = obj_textsec (input_bfd);
4206 		      break;
4207 		    case N_SETD:
4208 		      symsec = obj_datasec (input_bfd);
4209 		      break;
4210 		    case N_SETB:
4211 		      symsec = obj_bsssec (input_bfd);
4212 		      break;
4213 		    case N_SETA:
4214 		      symsec = bfd_abs_section_ptr;
4215 		      break;
4216 		    default:
4217 		      val = 0;
4218 		      break;
4219 		    }
4220 		}
4221 	      else if (hresolve->root.type == bfd_link_hash_defined
4222 		       || hresolve->root.type == bfd_link_hash_defweak)
4223 		{
4224 		  asection *input_section;
4225 		  asection *output_section;
4226 
4227 		  /* This case usually means a common symbol which was
4228 		     turned into a defined symbol.  */
4229 		  input_section = hresolve->root.u.def.section;
4230 		  output_section = input_section->output_section;
4231 		  BFD_ASSERT (bfd_is_abs_section (output_section)
4232 			      || output_section->owner == output_bfd);
4233 		  val = (hresolve->root.u.def.value
4234 			 + bfd_get_section_vma (output_bfd, output_section)
4235 			 + input_section->output_offset);
4236 
4237 		  /* Get the correct type based on the section.  If
4238 		     this is a constructed set, force it to be
4239 		     globally visible.  */
4240 		  if (type == N_SETT
4241 		      || type == N_SETD
4242 		      || type == N_SETB
4243 		      || type == N_SETA)
4244 		    type |= N_EXT;
4245 
4246 		  type &=~ N_TYPE;
4247 
4248 		  if (output_section == obj_textsec (output_bfd))
4249 		    type |= (hresolve->root.type == bfd_link_hash_defined
4250 			     ? N_TEXT
4251 			     : N_WEAKT);
4252 		  else if (output_section == obj_datasec (output_bfd))
4253 		    type |= (hresolve->root.type == bfd_link_hash_defined
4254 			     ? N_DATA
4255 			     : N_WEAKD);
4256 		  else if (output_section == obj_bsssec (output_bfd))
4257 		    type |= (hresolve->root.type == bfd_link_hash_defined
4258 			     ? N_BSS
4259 			     : N_WEAKB);
4260 		  else
4261 		    type |= (hresolve->root.type == bfd_link_hash_defined
4262 			     ? N_ABS
4263 			     : N_WEAKA);
4264 		}
4265 	      else if (hresolve->root.type == bfd_link_hash_common)
4266 		val = hresolve->root.u.c.size;
4267 	      else if (hresolve->root.type == bfd_link_hash_undefweak)
4268 		{
4269 		  val = 0;
4270 		  type = N_WEAKU;
4271 		}
4272 	      else
4273 		val = 0;
4274 	    }
4275 	  if (symsec != NULL)
4276 	    val = (symsec->output_section->vma
4277 		   + symsec->output_offset
4278 		   + (GET_WORD (input_bfd, sym->e_value)
4279 		      - symsec->vma));
4280 
4281 	  /* If this is a global symbol set the written flag, and if
4282 	     it is a local symbol see if we should discard it.  */
4283 	  if (h != NULL)
4284 	    {
4285 	      h->written = TRUE;
4286 	      h->indx = obj_aout_external_sym_count (output_bfd);
4287 	    }
4288 	  else if ((type & N_TYPE) != N_SETT
4289 		   && (type & N_TYPE) != N_SETD
4290 		   && (type & N_TYPE) != N_SETB
4291 		   && (type & N_TYPE) != N_SETA)
4292 	    {
4293 	      switch (discard)
4294 		{
4295 		case discard_none:
4296 		case discard_sec_merge:
4297 		  break;
4298 		case discard_l:
4299 		  if ((type & N_STAB) == 0
4300 		      && bfd_is_local_label_name (input_bfd, name))
4301 		    skip = TRUE;
4302 		  break;
4303 		case discard_all:
4304 		  skip = TRUE;
4305 		  break;
4306 		}
4307 	      if (skip)
4308 		{
4309 		  pass = FALSE;
4310 		  continue;
4311 		}
4312 	    }
4313 
4314 	  /* An N_BINCL symbol indicates the start of the stabs
4315 	     entries for a header file.  We need to scan ahead to the
4316 	     next N_EINCL symbol, ignoring nesting, adding up all the
4317 	     characters in the symbol names, not including the file
4318 	     numbers in types (the first number after an open
4319 	     parenthesis).  */
4320 	  if (type == N_BINCL)
4321 	    {
4322 	      struct external_nlist *incl_sym;
4323 	      int nest;
4324 	      struct aout_link_includes_entry *incl_entry;
4325 	      struct aout_link_includes_totals *t;
4326 
4327 	      val = 0;
4328 	      nest = 0;
4329 	      for (incl_sym = sym + 1; incl_sym < sym_end; incl_sym++)
4330 		{
4331 		  int incl_type;
4332 
4333 		  incl_type = H_GET_8 (input_bfd, incl_sym->e_type);
4334 		  if (incl_type == N_EINCL)
4335 		    {
4336 		      if (nest == 0)
4337 			break;
4338 		      --nest;
4339 		    }
4340 		  else if (incl_type == N_BINCL)
4341 		    ++nest;
4342 		  else if (nest == 0)
4343 		    {
4344 		      const char *s;
4345 
4346 		      s = strings + GET_WORD (input_bfd, incl_sym->e_strx);
4347 		      for (; *s != '\0'; s++)
4348 			{
4349 			  val += *s;
4350 			  if (*s == '(')
4351 			    {
4352 			      /* Skip the file number.  */
4353 			      ++s;
4354 			      while (ISDIGIT (*s))
4355 				++s;
4356 			      --s;
4357 			    }
4358 			}
4359 		    }
4360 		}
4361 
4362 	      /* If we have already included a header file with the
4363                  same value, then replace this one with an N_EXCL
4364                  symbol.  */
4365 	      copy = ! finfo->info->keep_memory;
4366 	      incl_entry = aout_link_includes_lookup (&finfo->includes,
4367 						      name, TRUE, copy);
4368 	      if (incl_entry == NULL)
4369 		return FALSE;
4370 	      for (t = incl_entry->totals; t != NULL; t = t->next)
4371 		if (t->total == val)
4372 		  break;
4373 	      if (t == NULL)
4374 		{
4375 		  /* This is the first time we have seen this header
4376                      file with this set of stabs strings.  */
4377 		  t = bfd_hash_allocate (&finfo->includes.root,
4378 					 sizeof *t);
4379 		  if (t == NULL)
4380 		    return FALSE;
4381 		  t->total = val;
4382 		  t->next = incl_entry->totals;
4383 		  incl_entry->totals = t;
4384 		}
4385 	      else
4386 		{
4387 		  int *incl_map;
4388 
4389 		  /* This is a duplicate header file.  We must change
4390                      it to be an N_EXCL entry, and mark all the
4391                      included symbols to prevent outputting them.  */
4392 		  type = N_EXCL;
4393 
4394 		  nest = 0;
4395 		  for (incl_sym = sym + 1, incl_map = symbol_map + 1;
4396 		       incl_sym < sym_end;
4397 		       incl_sym++, incl_map++)
4398 		    {
4399 		      int incl_type;
4400 
4401 		      incl_type = H_GET_8 (input_bfd, incl_sym->e_type);
4402 		      if (incl_type == N_EINCL)
4403 			{
4404 			  if (nest == 0)
4405 			    {
4406 			      *incl_map = -1;
4407 			      break;
4408 			    }
4409 			  --nest;
4410 			}
4411 		      else if (incl_type == N_BINCL)
4412 			++nest;
4413 		      else if (nest == 0)
4414 			*incl_map = -1;
4415 		    }
4416 		}
4417 	    }
4418 	}
4419 
4420       /* Copy this symbol into the list of symbols we are going to
4421 	 write out.  */
4422       H_PUT_8 (output_bfd, type, outsym->e_type);
4423       copy = FALSE;
4424       if (! finfo->info->keep_memory)
4425 	{
4426 	  /* name points into a string table which we are going to
4427 	     free.  If there is a hash table entry, use that string.
4428 	     Otherwise, copy name into memory.  */
4429 	  if (h != NULL)
4430 	    name = h->root.root.string;
4431 	  else
4432 	    copy = TRUE;
4433 	}
4434       strtab_index = add_to_stringtab (output_bfd, finfo->strtab,
4435 				       name, copy);
4436       if (strtab_index == (bfd_size_type) -1)
4437 	return FALSE;
4438       PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
4439       PUT_WORD (output_bfd, val, outsym->e_value);
4440       *symbol_map = obj_aout_external_sym_count (output_bfd);
4441       ++obj_aout_external_sym_count (output_bfd);
4442       ++outsym;
4443     }
4444 
4445   /* Write out the output symbols we have just constructed.  */
4446   if (outsym > finfo->output_syms)
4447     {
4448       bfd_size_type size;
4449 
4450       if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0)
4451 	return FALSE;
4452       size = outsym - finfo->output_syms;
4453       size *= EXTERNAL_NLIST_SIZE;
4454       if (bfd_bwrite ((void *) finfo->output_syms, size, output_bfd) != size)
4455 	return FALSE;
4456       finfo->symoff += size;
4457     }
4458 
4459   return TRUE;
4460 }
4461 
4462 /* Write out a symbol that was not associated with an a.out input
4463    object.  */
4464 
4465 static bfd_vma
4466 bfd_getp32 (const void *p)
4467 {
4468   const bfd_byte *addr = p;
4469   unsigned long v;
4470 
4471   v = (unsigned long) addr[1] << 24;
4472   v |= (unsigned long) addr[0] << 16;
4473   v |= (unsigned long) addr[3] << 8;
4474   v |= (unsigned long) addr[2];
4475   return v;
4476 }
4477 
4478 #define COERCE32(x) (((bfd_signed_vma) (x) ^ 0x80000000) - 0x80000000)
4479 
4480 static bfd_signed_vma
4481 bfd_getp_signed_32 (const void *p)
4482 {
4483   const bfd_byte *addr = p;
4484   unsigned long v;
4485 
4486   v = (unsigned long) addr[1] << 24;
4487   v |= (unsigned long) addr[0] << 16;
4488   v |= (unsigned long) addr[3] << 8;
4489   v |= (unsigned long) addr[2];
4490   return COERCE32 (v);
4491 }
4492 
4493 static void
4494 bfd_putp32 (bfd_vma data, void *p)
4495 {
4496   bfd_byte *addr = p;
4497 
4498   addr[0] = (data >> 16) & 0xff;
4499   addr[1] = (data >> 24) & 0xff;
4500   addr[2] = (data >> 0) & 0xff;
4501   addr[3] = (data >> 8) & 0xff;
4502 }
4503 
4504 const bfd_target MY (vec) =
4505 {
4506   TARGETNAME,			/* Name.  */
4507   bfd_target_aout_flavour,
4508   BFD_ENDIAN_LITTLE,		/* Target byte order (little).  */
4509   BFD_ENDIAN_LITTLE,		/* Target headers byte order (little).  */
4510   (HAS_RELOC | EXEC_P |		/* Object flags.  */
4511    HAS_LINENO | HAS_DEBUG |
4512    HAS_SYMS | HAS_LOCALS | WP_TEXT),
4513   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA),
4514   MY_symbol_leading_char,
4515   AR_PAD_CHAR,			/* AR_pad_char.  */
4516   15,				/* AR_max_namelen.  */
4517   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
4518      bfd_getp32, bfd_getp_signed_32, bfd_putp32,
4519      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data.  */
4520   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
4521      bfd_getp32, bfd_getp_signed_32, bfd_putp32,
4522      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Headers.  */
4523     {_bfd_dummy_target, MY_object_p, 		/* bfd_check_format.  */
4524        bfd_generic_archive_p, MY_core_file_p},
4525     {bfd_false, MY_mkobject,			/* bfd_set_format.  */
4526        _bfd_generic_mkarchive, bfd_false},
4527     {bfd_false, MY_write_object_contents, 	/* bfd_write_contents.  */
4528        _bfd_write_archive_contents, bfd_false},
4529 
4530      BFD_JUMP_TABLE_GENERIC (MY),
4531      BFD_JUMP_TABLE_COPY (MY),
4532      BFD_JUMP_TABLE_CORE (MY),
4533      BFD_JUMP_TABLE_ARCHIVE (MY),
4534      BFD_JUMP_TABLE_SYMBOLS (MY),
4535      BFD_JUMP_TABLE_RELOCS (MY),
4536      BFD_JUMP_TABLE_WRITE (MY),
4537      BFD_JUMP_TABLE_LINK (MY),
4538      BFD_JUMP_TABLE_DYNAMIC (MY),
4539 
4540   /* Alternative_target.  */
4541   NULL,
4542 
4543   (void *) MY_backend_data
4544 };
4545