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