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