1 /* BFD back-end for PDP-11 a.out binaries.
2    Copyright (C) 2001-2018 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 	/* xgettext:c-format */
1152 	(_("%B: can not represent section `%A' in a.out object file format"),
1153 	 abfd, section);
1154       bfd_set_error (bfd_error_nonrepresentable_section);
1155       return FALSE;
1156     }
1157 
1158   if (count != 0)
1159     {
1160       if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
1161 	  || bfd_bwrite (location, count, abfd) != count)
1162 	return FALSE;
1163 
1164       /* If necessary, pad the section to its aligned size.  */
1165       if ((section == obj_datasec (abfd)
1166 	   || section == obj_textsec (abfd))
1167 	  && count < section->size
1168 	  && (bfd_seek (abfd, section->filepos + offset + section->size - 1, SEEK_SET) != 0
1169 	      || bfd_bwrite ("", 1, abfd) != 1))
1170 	return FALSE;
1171     }
1172 
1173   return TRUE;
1174 }
1175 
1176 /* Read the external symbols from an a.out file.  */
1177 
1178 static bfd_boolean
aout_get_external_symbols(bfd * abfd)1179 aout_get_external_symbols (bfd *abfd)
1180 {
1181   if (obj_aout_external_syms (abfd) == NULL)
1182     {
1183       bfd_size_type count;
1184       struct external_nlist *syms;
1185 
1186       count = exec_hdr (abfd)->a_syms / EXTERNAL_NLIST_SIZE;
1187 
1188       /* PR 17512: file: 011f5a08.  */
1189       if (count == 0)
1190 	{
1191 	  obj_aout_external_syms (abfd) = NULL;
1192 	  obj_aout_external_sym_count (abfd) = count;
1193 	  return TRUE;
1194 	}
1195 
1196 #ifdef USE_MMAP
1197       if (! bfd_get_file_window (abfd, obj_sym_filepos (abfd),
1198 				 exec_hdr (abfd)->a_syms,
1199 				 &obj_aout_sym_window (abfd), TRUE))
1200 	return FALSE;
1201       syms = (struct external_nlist *) obj_aout_sym_window (abfd).data;
1202 #else
1203       /* We allocate using malloc to make the values easy to free
1204 	 later on.  If we put them on the objalloc it might not be
1205 	 possible to free them.  */
1206       syms = bfd_malloc (count * EXTERNAL_NLIST_SIZE);
1207       if (syms == NULL && count != 0)
1208 	return FALSE;
1209 
1210       if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1211 	  || (bfd_bread (syms, exec_hdr (abfd)->a_syms, abfd)
1212 	      != exec_hdr (abfd)->a_syms))
1213 	{
1214 	  free (syms);
1215 	  return FALSE;
1216 	}
1217 #endif
1218 
1219       obj_aout_external_syms (abfd) = syms;
1220       obj_aout_external_sym_count (abfd) = count;
1221     }
1222 
1223   if (obj_aout_external_strings (abfd) == NULL
1224       && exec_hdr (abfd)->a_syms != 0)
1225     {
1226       unsigned char string_chars[BYTES_IN_LONG];
1227       bfd_size_type stringsize;
1228       char *strings;
1229 
1230       /* Get the size of the strings.  */
1231       if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
1232 	  || (bfd_bread ((void *) string_chars, (bfd_size_type) BYTES_IN_LONG,
1233 			abfd) != BYTES_IN_LONG))
1234 	return FALSE;
1235       stringsize = H_GET_32 (abfd, string_chars);
1236 
1237 #ifdef USE_MMAP
1238       if (! bfd_get_file_window (abfd, obj_str_filepos (abfd), stringsize,
1239 				 &obj_aout_string_window (abfd), TRUE))
1240 	return FALSE;
1241       strings = (char *) obj_aout_string_window (abfd).data;
1242 #else
1243       strings = bfd_malloc (stringsize + 1);
1244       if (strings == NULL)
1245 	return FALSE;
1246 
1247       /* Skip space for the string count in the buffer for convenience
1248 	 when using indexes.  */
1249       if (bfd_bread (strings + 4, stringsize - 4, abfd) != stringsize - 4)
1250 	{
1251 	  free (strings);
1252 	  return FALSE;
1253 	}
1254 #endif
1255       /* Ensure that a zero index yields an empty string.  */
1256       strings[0] = '\0';
1257 
1258       strings[stringsize - 1] = 0;
1259 
1260       obj_aout_external_strings (abfd) = strings;
1261       obj_aout_external_string_size (abfd) = stringsize;
1262     }
1263 
1264   return TRUE;
1265 }
1266 
1267 /* Translate an a.out symbol into a BFD symbol.  The desc, other, type
1268    and symbol->value fields of CACHE_PTR will be set from the a.out
1269    nlist structure.  This function is responsible for setting
1270    symbol->flags and symbol->section, and adjusting symbol->value.  */
1271 
1272 static bfd_boolean
translate_from_native_sym_flags(bfd * abfd,aout_symbol_type * cache_ptr)1273 translate_from_native_sym_flags (bfd *abfd,
1274 				 aout_symbol_type *cache_ptr)
1275 {
1276   flagword visible;
1277 
1278   if (cache_ptr->type == N_FN)
1279     {
1280       asection *sec;
1281 
1282       /* This is a debugging symbol.  */
1283       cache_ptr->symbol.flags = BSF_DEBUGGING;
1284 
1285       /* Work out the symbol section.  */
1286       switch (cache_ptr->type & N_TYPE)
1287 	{
1288 	case N_TEXT:
1289 	case N_FN:
1290 	  sec = obj_textsec (abfd);
1291 	  break;
1292 	case N_DATA:
1293 	  sec = obj_datasec (abfd);
1294 	  break;
1295 	case N_BSS:
1296 	  sec = obj_bsssec (abfd);
1297 	  break;
1298 	default:
1299 	case N_ABS:
1300 	  sec = bfd_abs_section_ptr;
1301 	  break;
1302 	}
1303 
1304       cache_ptr->symbol.section = sec;
1305       cache_ptr->symbol.value -= sec->vma;
1306 
1307       return TRUE;
1308     }
1309 
1310   /* Get the default visibility.  This does not apply to all types, so
1311      we just hold it in a local variable to use if wanted.  */
1312   if ((cache_ptr->type & N_EXT) == 0)
1313     visible = BSF_LOCAL;
1314   else
1315     visible = BSF_GLOBAL;
1316 
1317   switch (cache_ptr->type)
1318     {
1319     default:
1320     case N_ABS: case N_ABS | N_EXT:
1321       cache_ptr->symbol.section = bfd_abs_section_ptr;
1322       cache_ptr->symbol.flags = visible;
1323       break;
1324 
1325     case N_UNDF | N_EXT:
1326       if (cache_ptr->symbol.value != 0)
1327 	{
1328 	  /* This is a common symbol.  */
1329 	  cache_ptr->symbol.flags = BSF_GLOBAL;
1330 	  cache_ptr->symbol.section = bfd_com_section_ptr;
1331 	}
1332       else
1333 	{
1334 	  cache_ptr->symbol.flags = 0;
1335 	  cache_ptr->symbol.section = bfd_und_section_ptr;
1336 	}
1337       break;
1338 
1339     case N_TEXT: case N_TEXT | N_EXT:
1340       cache_ptr->symbol.section = obj_textsec (abfd);
1341       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1342       cache_ptr->symbol.flags = visible;
1343       break;
1344 
1345     case N_DATA: case N_DATA | N_EXT:
1346       cache_ptr->symbol.section = obj_datasec (abfd);
1347       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1348       cache_ptr->symbol.flags = visible;
1349       break;
1350 
1351     case N_BSS: case N_BSS | N_EXT:
1352       cache_ptr->symbol.section = obj_bsssec (abfd);
1353       cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1354       cache_ptr->symbol.flags = visible;
1355       break;
1356     }
1357 
1358   return TRUE;
1359 }
1360 
1361 /* Set the fields of SYM_POINTER according to CACHE_PTR.  */
1362 
1363 static bfd_boolean
translate_to_native_sym_flags(bfd * abfd,asymbol * cache_ptr,struct external_nlist * sym_pointer)1364 translate_to_native_sym_flags (bfd *abfd,
1365 			       asymbol *cache_ptr,
1366 			       struct external_nlist *sym_pointer)
1367 {
1368   bfd_vma value = cache_ptr->value;
1369   asection *sec;
1370   bfd_vma off;
1371 
1372   /* Mask out any existing type bits in case copying from one section
1373      to another.  */
1374   sym_pointer->e_type[0] &= ~N_TYPE;
1375 
1376   sec = bfd_get_section (cache_ptr);
1377   off = 0;
1378 
1379   if (sec == NULL)
1380     {
1381       /* This case occurs, e.g., for the *DEBUG* section of a COFF
1382 	 file.  */
1383       _bfd_error_handler
1384 	/* xgettext:c-format */
1385 	(_("%B: can not represent section for symbol `%s' in a.out object file format"),
1386 	 abfd, cache_ptr->name != NULL ? cache_ptr->name : "*unknown*");
1387       bfd_set_error (bfd_error_nonrepresentable_section);
1388       return FALSE;
1389     }
1390 
1391   if (sec->output_section != NULL)
1392     {
1393       off = sec->output_offset;
1394       sec = sec->output_section;
1395     }
1396 
1397   if (bfd_is_abs_section (sec))
1398     sym_pointer->e_type[0] |= N_ABS;
1399   else if (sec == obj_textsec (abfd))
1400     sym_pointer->e_type[0] |= N_TEXT;
1401   else if (sec == obj_datasec (abfd))
1402     sym_pointer->e_type[0] |= N_DATA;
1403   else if (sec == obj_bsssec (abfd))
1404     sym_pointer->e_type[0] |= N_BSS;
1405   else if (bfd_is_und_section (sec))
1406     sym_pointer->e_type[0] = N_UNDF | N_EXT;
1407   else if (bfd_is_com_section (sec))
1408     sym_pointer->e_type[0] = N_UNDF | N_EXT;
1409   else
1410     {
1411       _bfd_error_handler
1412 	/* xgettext:c-format */
1413 	(_("%B: can not represent section `%A' in a.out object file format"),
1414 	 abfd, sec);
1415       bfd_set_error (bfd_error_nonrepresentable_section);
1416       return FALSE;
1417     }
1418 
1419   /* Turn the symbol from section relative to absolute again */
1420   value += sec->vma + off;
1421 
1422   if ((cache_ptr->flags & BSF_DEBUGGING) != 0)
1423     sym_pointer->e_type[0] = ((aout_symbol_type *) cache_ptr)->type;
1424   else if ((cache_ptr->flags & BSF_GLOBAL) != 0)
1425     sym_pointer->e_type[0] |= N_EXT;
1426 
1427   PUT_WORD(abfd, value, sym_pointer->e_value);
1428 
1429   return TRUE;
1430 }
1431 
1432 /* Native-level interface to symbols. */
1433 
1434 asymbol *
NAME(aout,make_empty_symbol)1435 NAME (aout, make_empty_symbol) (bfd *abfd)
1436 {
1437   bfd_size_type amt = sizeof (aout_symbol_type);
1438   aout_symbol_type *new_symbol_type = bfd_zalloc (abfd, amt);
1439 
1440   if (!new_symbol_type)
1441     return NULL;
1442   new_symbol_type->symbol.the_bfd = abfd;
1443 
1444   return &new_symbol_type->symbol;
1445 }
1446 
1447 /* Translate a set of internal symbols into external symbols.  */
1448 
1449 bfd_boolean
NAME(aout,translate_symbol_table)1450 NAME (aout, translate_symbol_table) (bfd *abfd,
1451 				     aout_symbol_type *in,
1452 				     struct external_nlist *ext,
1453 				     bfd_size_type count,
1454 				     char *str,
1455 				     bfd_size_type strsize,
1456 				     bfd_boolean dynamic)
1457 {
1458   struct external_nlist *ext_end;
1459 
1460   ext_end = ext + count;
1461   for (; ext < ext_end; ext++, in++)
1462     {
1463       bfd_vma x;
1464 
1465       x = GET_WORD (abfd, ext->e_strx);
1466       in->symbol.the_bfd = abfd;
1467 
1468       /* For the normal symbols, the zero index points at the number
1469 	 of bytes in the string table but is to be interpreted as the
1470 	 null string.  For the dynamic symbols, the number of bytes in
1471 	 the string table is stored in the __DYNAMIC structure and the
1472 	 zero index points at an actual string.  */
1473       if (x == 0 && ! dynamic)
1474 	in->symbol.name = "";
1475       else if (x < strsize)
1476 	in->symbol.name = str + x;
1477       else
1478 	return FALSE;
1479 
1480       in->symbol.value = GET_SWORD (abfd,  ext->e_value);
1481       /* TODO: is 0 a safe value here?  */
1482       in->desc = 0;
1483       in->other = 0;
1484       in->type = H_GET_8 (abfd,  ext->e_type);
1485       in->symbol.udata.p = NULL;
1486 
1487       if (! translate_from_native_sym_flags (abfd, in))
1488 	return FALSE;
1489 
1490       if (dynamic)
1491 	in->symbol.flags |= BSF_DYNAMIC;
1492     }
1493 
1494   return TRUE;
1495 }
1496 
1497 /* We read the symbols into a buffer, which is discarded when this
1498    function exits.  We read the strings into a buffer large enough to
1499    hold them all plus all the cached symbol entries.  */
1500 
1501 bfd_boolean
NAME(aout,slurp_symbol_table)1502 NAME (aout, slurp_symbol_table) (bfd *abfd)
1503 {
1504   struct external_nlist *old_external_syms;
1505   aout_symbol_type *cached;
1506   bfd_size_type cached_size;
1507 
1508   /* If there's no work to be done, don't do any.  */
1509   if (obj_aout_symbols (abfd) != NULL)
1510     return TRUE;
1511 
1512   old_external_syms = obj_aout_external_syms (abfd);
1513 
1514   if (! aout_get_external_symbols (abfd))
1515     return FALSE;
1516 
1517   cached_size = obj_aout_external_sym_count (abfd);
1518   cached_size *= sizeof (aout_symbol_type);
1519   cached = bfd_zmalloc (cached_size);
1520   if (cached == NULL && cached_size != 0)
1521     return FALSE;
1522 
1523   /* Convert from external symbol information to internal.  */
1524   if (! (NAME (aout, translate_symbol_table)
1525 	 (abfd, cached,
1526 	  obj_aout_external_syms (abfd),
1527 	  obj_aout_external_sym_count (abfd),
1528 	  obj_aout_external_strings (abfd),
1529 	  obj_aout_external_string_size (abfd),
1530 	  FALSE)))
1531     {
1532       free (cached);
1533       return FALSE;
1534     }
1535 
1536   bfd_get_symcount (abfd) = obj_aout_external_sym_count (abfd);
1537 
1538   obj_aout_symbols (abfd) = cached;
1539 
1540   /* It is very likely that anybody who calls this function will not
1541      want the external symbol information, so if it was allocated
1542      because of our call to aout_get_external_symbols, we free it up
1543      right away to save space.  */
1544   if (old_external_syms == NULL
1545       && obj_aout_external_syms (abfd) != NULL)
1546     {
1547 #ifdef USE_MMAP
1548       bfd_free_window (&obj_aout_sym_window (abfd));
1549 #else
1550       free (obj_aout_external_syms (abfd));
1551 #endif
1552       obj_aout_external_syms (abfd) = NULL;
1553     }
1554 
1555   return TRUE;
1556 }
1557 
1558 /* We use a hash table when writing out symbols so that we only write
1559    out a particular string once.  This helps particularly when the
1560    linker writes out stabs debugging entries, because each different
1561    contributing object file tends to have many duplicate stabs
1562    strings.
1563 
1564    This hash table code breaks dbx on SunOS 4.1.3, so we don't do it
1565    if BFD_TRADITIONAL_FORMAT is set.  */
1566 
1567 /* Get the index of a string in a strtab, adding it if it is not
1568    already present.  */
1569 
1570 static INLINE bfd_size_type
add_to_stringtab(bfd * abfd,struct bfd_strtab_hash * tab,const char * str,bfd_boolean copy)1571 add_to_stringtab (bfd *abfd,
1572 		  struct bfd_strtab_hash *tab,
1573 		  const char *str,
1574 		  bfd_boolean copy)
1575 {
1576   bfd_boolean hash;
1577   bfd_size_type str_index;
1578 
1579   /* An index of 0 always means the empty string.  */
1580   if (str == 0 || *str == '\0')
1581     return 0;
1582 
1583   /* Don't hash if BFD_TRADITIONAL_FORMAT is set, because SunOS dbx
1584      doesn't understand a hashed string table.  */
1585   hash = TRUE;
1586   if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
1587     hash = FALSE;
1588 
1589   str_index = _bfd_stringtab_add (tab, str, hash, copy);
1590 
1591   if (str_index != (bfd_size_type) -1)
1592     /* Add BYTES_IN_LONG to the return value to account for the
1593        space taken up by the string table size.  */
1594     str_index += BYTES_IN_LONG;
1595 
1596   return str_index;
1597 }
1598 
1599 /* Write out a strtab.  ABFD is already at the right location in the
1600    file.  */
1601 
1602 static bfd_boolean
emit_stringtab(bfd * abfd,struct bfd_strtab_hash * tab)1603 emit_stringtab (bfd *abfd, struct bfd_strtab_hash *tab)
1604 {
1605   bfd_byte buffer[BYTES_IN_LONG];
1606 
1607   /* The string table starts with the size.  */
1608   H_PUT_32 (abfd, _bfd_stringtab_size (tab) + BYTES_IN_LONG, buffer);
1609   if (bfd_bwrite ((void *) buffer, (bfd_size_type) BYTES_IN_LONG, abfd)
1610       != BYTES_IN_LONG)
1611     return FALSE;
1612 
1613   return _bfd_stringtab_emit (abfd, tab);
1614 }
1615 
1616 bfd_boolean
NAME(aout,write_syms)1617 NAME (aout, write_syms) (bfd *abfd)
1618 {
1619   unsigned int count ;
1620   asymbol **generic = bfd_get_outsymbols (abfd);
1621   struct bfd_strtab_hash *strtab;
1622 
1623   strtab = _bfd_stringtab_init ();
1624   if (strtab == NULL)
1625     return FALSE;
1626 
1627   for (count = 0; count < bfd_get_symcount (abfd); count++)
1628     {
1629       asymbol *g = generic[count];
1630       bfd_size_type indx;
1631       struct external_nlist nsp;
1632 
1633       PUT_WORD (abfd, 0, nsp.e_unused);
1634 
1635       indx = add_to_stringtab (abfd, strtab, g->name, FALSE);
1636       if (indx == (bfd_size_type) -1)
1637 	goto error_return;
1638       PUT_WORD (abfd, indx, nsp.e_strx);
1639 
1640       if (bfd_asymbol_flavour(g) == abfd->xvec->flavour)
1641 	H_PUT_8 (abfd, aout_symbol(g)->type,  nsp.e_type);
1642       else
1643 	H_PUT_8 (abfd, 0, nsp.e_type);
1644 
1645       if (! translate_to_native_sym_flags (abfd, g, &nsp))
1646 	goto error_return;
1647 
1648       H_PUT_8 (abfd, 0, nsp.e_ovly);
1649 
1650       if (bfd_bwrite ((void *)&nsp, (bfd_size_type) EXTERNAL_NLIST_SIZE, abfd)
1651 	  != EXTERNAL_NLIST_SIZE)
1652 	goto error_return;
1653 
1654       /* NB: `KEEPIT' currently overlays `udata.p', so set this only
1655 	 here, at the end.  */
1656       g->KEEPIT = count;
1657     }
1658 
1659   if (! emit_stringtab (abfd, strtab))
1660     goto error_return;
1661 
1662   _bfd_stringtab_free (strtab);
1663 
1664   return TRUE;
1665 
1666 error_return:
1667   _bfd_stringtab_free (strtab);
1668   return FALSE;
1669 }
1670 
1671 
1672 long
NAME(aout,canonicalize_symtab)1673 NAME (aout, canonicalize_symtab) (bfd *abfd, asymbol **location)
1674 {
1675   unsigned int counter = 0;
1676   aout_symbol_type *symbase;
1677 
1678   if (!NAME (aout, slurp_symbol_table) (abfd))
1679     return -1;
1680 
1681   for (symbase = obj_aout_symbols (abfd); counter++ < bfd_get_symcount (abfd);)
1682     *(location++) = (asymbol *)(symbase++);
1683   *location++ =0;
1684   return bfd_get_symcount (abfd);
1685 }
1686 
1687 
1688 /* Output extended relocation information to a file in target byte order.  */
1689 
1690 static void
pdp11_aout_swap_reloc_out(bfd * abfd,arelent * g,bfd_byte * natptr)1691 pdp11_aout_swap_reloc_out (bfd *abfd, arelent *g, bfd_byte *natptr)
1692 {
1693   int r_index;
1694   int r_pcrel;
1695   int reloc_entry;
1696   int r_type;
1697   asymbol *sym = *(g->sym_ptr_ptr);
1698   asection *output_section = sym->section->output_section;
1699 
1700   if (g->addend != 0)
1701     fprintf (stderr, "BFD: can't do this reloc addend stuff\n");
1702 
1703   r_pcrel = g->howto->pc_relative;
1704 
1705   if (bfd_is_abs_section (output_section))
1706     r_type = RABS;
1707   else if (output_section == obj_textsec (abfd))
1708     r_type = RTEXT;
1709   else if (output_section == obj_datasec (abfd))
1710     r_type = RDATA;
1711   else if (output_section == obj_bsssec (abfd))
1712     r_type = RBSS;
1713   else if (bfd_is_und_section (output_section))
1714     r_type = REXT;
1715   else if (bfd_is_com_section (output_section))
1716     r_type = REXT;
1717   else
1718     r_type = -1;
1719 
1720   BFD_ASSERT (r_type != -1);
1721 
1722   if (r_type == RABS)
1723     r_index = 0;
1724   else
1725     r_index = (*(g->sym_ptr_ptr))->KEEPIT;
1726 
1727   reloc_entry = r_index << 4 | r_type | r_pcrel;
1728 
1729   PUT_WORD (abfd, reloc_entry, natptr);
1730 }
1731 
1732 /* BFD deals internally with all things based from the section they're
1733    in. so, something in 10 bytes into a text section  with a base of
1734    50 would have a symbol (.text+10) and know .text vma was 50.
1735 
1736    Aout keeps all it's symbols based from zero, so the symbol would
1737    contain 60. This macro subs the base of each section from the value
1738    to give the true offset from the section */
1739 
1740 
1741 #define MOVE_ADDRESS(ad)						\
1742   if (r_extern)								\
1743     {									\
1744       /* Undefined symbol.  */						\
1745       cache_ptr->sym_ptr_ptr = symbols + r_index;			\
1746       cache_ptr->addend = ad;						\
1747     }									\
1748   else									\
1749     {									\
1750       /* Defined, section relative. replace symbol with pointer to	\
1751 	 symbol which points to section.  */				\
1752       switch (r_index)							\
1753 	{								\
1754 	case N_TEXT:							\
1755 	case N_TEXT | N_EXT:						\
1756 	  cache_ptr->sym_ptr_ptr  = obj_textsec (abfd)->symbol_ptr_ptr;	\
1757 	  cache_ptr->addend = ad  - su->textsec->vma;			\
1758 	  break;							\
1759 	case N_DATA:							\
1760 	case N_DATA | N_EXT:						\
1761 	  cache_ptr->sym_ptr_ptr  = obj_datasec (abfd)->symbol_ptr_ptr;	\
1762 	  cache_ptr->addend = ad - su->datasec->vma;			\
1763 	  break;							\
1764 	case N_BSS:							\
1765 	case N_BSS | N_EXT:						\
1766 	  cache_ptr->sym_ptr_ptr  = obj_bsssec (abfd)->symbol_ptr_ptr;	\
1767 	  cache_ptr->addend = ad - su->bsssec->vma;			\
1768 	  break;							\
1769 	default:							\
1770 	case N_ABS:							\
1771 	case N_ABS | N_EXT:						\
1772 	  cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;	\
1773 	  cache_ptr->addend = ad;					\
1774 	  break;							\
1775 	}								\
1776     }
1777 
1778 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)1779 pdp11_aout_swap_reloc_in (bfd *		 abfd,
1780 			  bfd_byte *	 bytes,
1781 			  arelent *	 cache_ptr,
1782 			  bfd_size_type	 offset,
1783 			  asymbol **	 symbols,
1784 			  bfd_size_type	 symcount)
1785 {
1786   struct aoutdata *su = &(abfd->tdata.aout_data->a);
1787   unsigned int r_index;
1788   int reloc_entry;
1789   int r_extern;
1790   int r_pcrel;
1791 
1792   reloc_entry = GET_WORD (abfd, (void *) bytes);
1793 
1794   r_pcrel = reloc_entry & RELFLG;
1795 
1796   cache_ptr->address = offset;
1797   cache_ptr->howto = howto_table_pdp11 + (r_pcrel ? 1 : 0);
1798 
1799   if ((reloc_entry & RTYPE) == RABS)
1800     r_index = N_ABS;
1801   else
1802     r_index = RINDEX (reloc_entry);
1803 
1804   /* r_extern reflects whether the symbol the reloc is against is
1805      local or global.  */
1806   r_extern = (reloc_entry & RTYPE) == REXT;
1807 
1808   if (r_extern && r_index > symcount)
1809     {
1810       /* We could arrange to return an error, but it might be useful
1811 	 to see the file even if it is bad.  */
1812       r_extern = 0;
1813       r_index = N_ABS;
1814     }
1815 
1816   MOVE_ADDRESS(0);
1817 }
1818 
1819 /* Read and swap the relocs for a section.  */
1820 
1821 bfd_boolean
NAME(aout,slurp_reloc_table)1822 NAME (aout, slurp_reloc_table) (bfd *abfd, sec_ptr asect, asymbol **symbols)
1823 {
1824   bfd_byte *rptr;
1825   bfd_size_type count;
1826   bfd_size_type reloc_size;
1827   void * relocs;
1828   arelent *reloc_cache;
1829   size_t each_size;
1830   unsigned int counter = 0;
1831   arelent *cache_ptr;
1832 
1833   if (asect->relocation)
1834     return TRUE;
1835 
1836   if (asect->flags & SEC_CONSTRUCTOR)
1837     return TRUE;
1838 
1839   if (asect == obj_datasec (abfd))
1840     reloc_size = exec_hdr(abfd)->a_drsize;
1841   else if (asect == obj_textsec (abfd))
1842     reloc_size = exec_hdr(abfd)->a_trsize;
1843   else if (asect == obj_bsssec (abfd))
1844     reloc_size = 0;
1845   else
1846     {
1847       bfd_set_error (bfd_error_invalid_operation);
1848       return FALSE;
1849     }
1850 
1851   if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0)
1852     return FALSE;
1853 
1854   each_size = obj_reloc_entry_size (abfd);
1855 
1856   relocs = bfd_malloc (reloc_size);
1857   if (relocs == NULL && reloc_size != 0)
1858     return FALSE;
1859 
1860   if (bfd_bread (relocs, reloc_size, abfd) != reloc_size)
1861     {
1862       free (relocs);
1863       return FALSE;
1864     }
1865 
1866   count = reloc_size / each_size;
1867 
1868   /* Count the number of NON-ZERO relocs, this is the count we want.  */
1869   {
1870     unsigned int real_count = 0;
1871 
1872     for (counter = 0; counter < count; counter++)
1873       {
1874 	int x;
1875 
1876 	x = GET_WORD (abfd, (char *) relocs + each_size * counter);
1877 	if (x != 0)
1878 	  real_count++;
1879       }
1880 
1881     count = real_count;
1882   }
1883 
1884   reloc_cache = bfd_zmalloc (count * sizeof (arelent));
1885   if (reloc_cache == NULL && count != 0)
1886     return FALSE;
1887 
1888   cache_ptr = reloc_cache;
1889 
1890   rptr = relocs;
1891   for (counter = 0;
1892        counter < count;
1893        counter++, rptr += RELOC_SIZE, cache_ptr++)
1894     {
1895       while (GET_WORD (abfd, (void *) rptr) == 0)
1896 	{
1897 	  rptr += RELOC_SIZE;
1898 	  if ((char *) rptr >= (char *) relocs + reloc_size)
1899 	    goto done;
1900 	}
1901 
1902       pdp11_aout_swap_reloc_in (abfd, rptr, cache_ptr,
1903 				(bfd_size_type) ((char *) rptr - (char *) relocs),
1904 				symbols,
1905 				(bfd_size_type) bfd_get_symcount (abfd));
1906     }
1907  done:
1908   /* Just in case, if rptr >= relocs + reloc_size should happen
1909      too early.  */
1910   BFD_ASSERT (counter == count);
1911 
1912   free (relocs);
1913 
1914   asect->relocation = reloc_cache;
1915   asect->reloc_count = cache_ptr - reloc_cache;
1916 
1917   return TRUE;
1918 }
1919 
1920 /* Write out a relocation section into an object file.  */
1921 
1922 bfd_boolean
NAME(aout,squirt_out_relocs)1923 NAME (aout, squirt_out_relocs) (bfd *abfd, asection *section)
1924 {
1925   arelent **generic;
1926   unsigned char *native;
1927   unsigned int count = section->reloc_count;
1928   bfd_size_type natsize;
1929 
1930   natsize = section->size;
1931   native = bfd_zalloc (abfd, natsize);
1932   if (!native)
1933     return FALSE;
1934 
1935   generic = section->orelocation;
1936   if (generic != NULL)
1937     {
1938       while (count > 0)
1939 	{
1940 	  bfd_byte *r;
1941 
1942 	  r = native + (*generic)->address;
1943 	  pdp11_aout_swap_reloc_out (abfd, *generic, r);
1944 	  count--;
1945 	  generic++;
1946 	}
1947     }
1948 
1949   if (bfd_bwrite ((void *) native, natsize, abfd) != natsize)
1950     {
1951       bfd_release (abfd, native);
1952       return FALSE;
1953     }
1954 
1955   bfd_release (abfd, native);
1956   return TRUE;
1957 }
1958 
1959 /* This is stupid.  This function should be a boolean predicate.  */
1960 
1961 long
NAME(aout,canonicalize_reloc)1962 NAME (aout, canonicalize_reloc) (bfd *abfd,
1963 				 sec_ptr section,
1964 				 arelent **relptr,
1965 				 asymbol **symbols)
1966 {
1967   arelent *tblptr = section->relocation;
1968   unsigned int count;
1969 
1970   if (section == obj_bsssec (abfd))
1971     {
1972       *relptr = NULL;
1973       return 0;
1974     }
1975 
1976   if (!(tblptr || NAME (aout, slurp_reloc_table)(abfd, section, symbols)))
1977     return -1;
1978 
1979   if (section->flags & SEC_CONSTRUCTOR)
1980     {
1981       arelent_chain *chain = section->constructor_chain;
1982 
1983       for (count = 0; count < section->reloc_count; count ++)
1984 	{
1985 	  *relptr ++ = &chain->relent;
1986 	  chain = chain->next;
1987 	}
1988     }
1989   else
1990     {
1991       tblptr = section->relocation;
1992 
1993       for (count = 0; count++ < section->reloc_count;)
1994 	*relptr++ = tblptr++;
1995     }
1996 
1997   *relptr = 0;
1998 
1999   return section->reloc_count;
2000 }
2001 
2002 long
NAME(aout,get_reloc_upper_bound)2003 NAME (aout, get_reloc_upper_bound) (bfd *abfd, sec_ptr asect)
2004 {
2005   if (bfd_get_format (abfd) != bfd_object)
2006     {
2007       bfd_set_error (bfd_error_invalid_operation);
2008       return -1;
2009     }
2010 
2011   if (asect->flags & SEC_CONSTRUCTOR)
2012     return (sizeof (arelent *) * (asect->reloc_count + 1));
2013 
2014   if (asect == obj_datasec (abfd))
2015     return (sizeof (arelent *)
2016 	    * ((exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd))
2017 	       + 1));
2018 
2019   if (asect == obj_textsec (abfd))
2020     return (sizeof (arelent *)
2021 	    * ((exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd))
2022 	       + 1));
2023 
2024   /* TODO: why are there two if statements for obj_bsssec()? */
2025 
2026   if (asect == obj_bsssec (abfd))
2027     return sizeof (arelent *);
2028 
2029   if (asect == obj_bsssec (abfd))
2030     return 0;
2031 
2032   bfd_set_error (bfd_error_invalid_operation);
2033   return -1;
2034 }
2035 
2036 
2037 long
NAME(aout,get_symtab_upper_bound)2038 NAME (aout, get_symtab_upper_bound) (bfd *abfd)
2039 {
2040   if (!NAME (aout, slurp_symbol_table) (abfd))
2041     return -1;
2042 
2043   return (bfd_get_symcount (abfd) + 1) * (sizeof (aout_symbol_type *));
2044 }
2045 
2046 alent *
NAME(aout,get_lineno)2047 NAME (aout, get_lineno) (bfd * abfd ATTRIBUTE_UNUSED,
2048 			 asymbol * symbol ATTRIBUTE_UNUSED)
2049 {
2050   return NULL;
2051 }
2052 
2053 void
NAME(aout,get_symbol_info)2054 NAME (aout, get_symbol_info) (bfd * abfd ATTRIBUTE_UNUSED,
2055 			      asymbol *symbol,
2056 			      symbol_info *ret)
2057 {
2058   bfd_symbol_info (symbol, ret);
2059 
2060   if (ret->type == '?')
2061     {
2062       int type_code = aout_symbol(symbol)->type & 0xff;
2063       const char *stab_name = bfd_get_stab_name (type_code);
2064       static char buf[10];
2065 
2066       if (stab_name == NULL)
2067 	{
2068 	  sprintf(buf, "(%d)", type_code);
2069 	  stab_name = buf;
2070 	}
2071       ret->type = '-';
2072       ret->stab_type  = type_code;
2073       ret->stab_other = (unsigned) (aout_symbol(symbol)->other & 0xff);
2074       ret->stab_desc  = (unsigned) (aout_symbol(symbol)->desc & 0xffff);
2075       ret->stab_name  = stab_name;
2076     }
2077 }
2078 
2079 void
NAME(aout,print_symbol)2080 NAME (aout, print_symbol) (bfd * abfd,
2081 			   void * afile,
2082 			   asymbol *symbol,
2083 			   bfd_print_symbol_type how)
2084 {
2085   FILE *file = (FILE *) afile;
2086 
2087   switch (how)
2088     {
2089     case bfd_print_symbol_name:
2090       if (symbol->name)
2091 	fprintf(file,"%s", symbol->name);
2092       break;
2093     case bfd_print_symbol_more:
2094       fprintf(file,"%4x %2x %2x",
2095 	      (unsigned) (aout_symbol (symbol)->desc & 0xffff),
2096 	      (unsigned) (aout_symbol (symbol)->other & 0xff),
2097 	      (unsigned) (aout_symbol (symbol)->type));
2098       break;
2099     case bfd_print_symbol_all:
2100       {
2101 	const char *section_name = symbol->section->name;
2102 
2103 	bfd_print_symbol_vandf (abfd, (void *) file, symbol);
2104 
2105 	fprintf (file," %-5s %04x %02x %02x",
2106 		 section_name,
2107 		 (unsigned) (aout_symbol (symbol)->desc & 0xffff),
2108 		 (unsigned) (aout_symbol (symbol)->other & 0xff),
2109 		 (unsigned) (aout_symbol (symbol)->type  & 0xff));
2110 	if (symbol->name)
2111 	  fprintf(file," %s", symbol->name);
2112       }
2113       break;
2114     }
2115 }
2116 
2117 /* If we don't have to allocate more than 1MB to hold the generic
2118    symbols, we use the generic minisymbol method: it's faster, since
2119    it only translates the symbols once, not multiple times.  */
2120 #define MINISYM_THRESHOLD (1000000 / sizeof (asymbol))
2121 
2122 /* Read minisymbols.  For minisymbols, we use the unmodified a.out
2123    symbols.  The minisymbol_to_symbol function translates these into
2124    BFD asymbol structures.  */
2125 
2126 long
NAME(aout,read_minisymbols)2127 NAME (aout, read_minisymbols) (bfd *abfd,
2128 			       bfd_boolean dynamic,
2129 			       void * *minisymsp,
2130 			       unsigned int *sizep)
2131 {
2132   if (dynamic)
2133     /* We could handle the dynamic symbols here as well, but it's
2134        easier to hand them off.  */
2135     return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
2136 
2137   if (! aout_get_external_symbols (abfd))
2138     return -1;
2139 
2140   if (obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
2141     return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
2142 
2143   *minisymsp = (void *) obj_aout_external_syms (abfd);
2144 
2145   /* By passing the external symbols back from this routine, we are
2146      giving up control over the memory block.  Clear
2147      obj_aout_external_syms, so that we do not try to free it
2148      ourselves.  */
2149   obj_aout_external_syms (abfd) = NULL;
2150 
2151   *sizep = EXTERNAL_NLIST_SIZE;
2152   return obj_aout_external_sym_count (abfd);
2153 }
2154 
2155 /* Convert a minisymbol to a BFD asymbol.  A minisymbol is just an
2156    unmodified a.out symbol.  The SYM argument is a structure returned
2157    by bfd_make_empty_symbol, which we fill in here.  */
2158 
2159 asymbol *
NAME(aout,minisymbol_to_symbol)2160 NAME (aout, minisymbol_to_symbol) (bfd *abfd,
2161 				   bfd_boolean dynamic,
2162 				   const void * minisym,
2163 				   asymbol *sym)
2164 {
2165   if (dynamic
2166       || obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
2167     return _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym);
2168 
2169   memset (sym, 0, sizeof (aout_symbol_type));
2170 
2171   /* We call translate_symbol_table to translate a single symbol.  */
2172   if (! (NAME (aout, translate_symbol_table)
2173 	 (abfd,
2174 	  (aout_symbol_type *) sym,
2175 	  (struct external_nlist *) minisym,
2176 	  (bfd_size_type) 1,
2177 	  obj_aout_external_strings (abfd),
2178 	  obj_aout_external_string_size (abfd),
2179 	  FALSE)))
2180     return NULL;
2181 
2182   return sym;
2183 }
2184 
2185 /* Provided a BFD, a section and an offset into the section, calculate
2186    and return the name of the source file and the line nearest to the
2187    wanted location.  */
2188 
2189 bfd_boolean
NAME(aout,find_nearest_line)2190 NAME (aout, find_nearest_line) (bfd *abfd,
2191 				asymbol **symbols,
2192 				asection *section,
2193 				bfd_vma offset,
2194 				const char **filename_ptr,
2195 				const char **functionname_ptr,
2196 				unsigned int *line_ptr,
2197 				unsigned int *discriminator_ptr)
2198 {
2199   /* Run down the file looking for the filename, function and linenumber.  */
2200   asymbol **p;
2201   const char *directory_name = NULL;
2202   const char *main_file_name = NULL;
2203   const char *current_file_name = NULL;
2204   const char *line_file_name = NULL; /* Value of current_file_name at line number.  */
2205   bfd_vma low_line_vma = 0;
2206   bfd_vma low_func_vma = 0;
2207   asymbol *func = 0;
2208   size_t filelen, funclen;
2209   char *buf;
2210 
2211   *filename_ptr = abfd->filename;
2212   *functionname_ptr = 0;
2213   *line_ptr = 0;
2214   if (discriminator_ptr)
2215     *discriminator_ptr = 0;
2216 
2217   if (symbols != NULL)
2218     {
2219       for (p = symbols; *p; p++)
2220 	{
2221 	  aout_symbol_type  *q = (aout_symbol_type *)(*p);
2222 	next:
2223 	  switch (q->type)
2224 	    {
2225 	    case N_TEXT:
2226 	      /* If this looks like a file name symbol, and it comes after
2227 		 the line number we have found so far, but before the
2228 		 offset, then we have probably not found the right line
2229 		 number.  */
2230 	      if (q->symbol.value <= offset
2231 		  && ((q->symbol.value > low_line_vma
2232 		       && (line_file_name != NULL
2233 			   || *line_ptr != 0))
2234 		      || (q->symbol.value > low_func_vma
2235 			  && func != NULL)))
2236 		{
2237 		  const char * symname;
2238 
2239 		  symname = q->symbol.name;
2240 		  if (strcmp (symname + strlen (symname) - 2, ".o") == 0)
2241 		    {
2242 		      if (q->symbol.value > low_line_vma)
2243 			{
2244 			  *line_ptr = 0;
2245 			  line_file_name = NULL;
2246 			}
2247 		      if (q->symbol.value > low_func_vma)
2248 			func = NULL;
2249 		    }
2250 		}
2251 	      break;
2252 
2253 	    case N_SO:
2254 	      /* If this symbol is less than the offset, but greater than
2255 		 the line number we have found so far, then we have not
2256 		 found the right line number.  */
2257 	      if (q->symbol.value <= offset)
2258 		{
2259 		  if (q->symbol.value > low_line_vma)
2260 		    {
2261 		      *line_ptr = 0;
2262 		      line_file_name = NULL;
2263 		    }
2264 		  if (q->symbol.value > low_func_vma)
2265 		    func = NULL;
2266 		}
2267 
2268 	      main_file_name = current_file_name = q->symbol.name;
2269 	      /* Look ahead to next symbol to check if that too is an N_SO.  */
2270 	      p++;
2271 	      if (*p == NULL)
2272 		break;
2273 	      q = (aout_symbol_type *)(*p);
2274 	      if (q->type != (int) N_SO)
2275 		goto next;
2276 
2277 	      /* Found a second N_SO  First is directory; second is filename.  */
2278 	      directory_name = current_file_name;
2279 	      main_file_name = current_file_name = q->symbol.name;
2280 	      if (obj_textsec(abfd) != section)
2281 		goto done;
2282 	      break;
2283 	    case N_SOL:
2284 	      current_file_name = q->symbol.name;
2285 	      break;
2286 
2287 	    case N_SLINE:
2288 	    case N_DSLINE:
2289 	    case N_BSLINE:
2290 	      /* We'll keep this if it resolves nearer than the one we have
2291 		 already.  */
2292 	      if (q->symbol.value >= low_line_vma
2293 		  && q->symbol.value <= offset)
2294 		{
2295 		  *line_ptr = q->desc;
2296 		  low_line_vma = q->symbol.value;
2297 		  line_file_name = current_file_name;
2298 		}
2299 	      break;
2300 
2301 	    case N_FUN:
2302 	      {
2303 		/* We'll keep this if it is nearer than the one we have already.  */
2304 		if (q->symbol.value >= low_func_vma &&
2305 		    q->symbol.value <= offset)
2306 		  {
2307 		    low_func_vma = q->symbol.value;
2308 		    func = (asymbol *) q;
2309 		  }
2310 		else if (q->symbol.value > offset)
2311 		  goto done;
2312 	      }
2313 	      break;
2314 	    }
2315 	}
2316     }
2317 
2318  done:
2319   if (*line_ptr != 0)
2320     main_file_name = line_file_name;
2321 
2322   if (main_file_name == NULL
2323       || main_file_name[0] == '/'
2324       || directory_name == NULL)
2325     filelen = 0;
2326   else
2327     filelen = strlen (directory_name) + strlen (main_file_name);
2328   if (func == NULL)
2329     funclen = 0;
2330   else
2331     funclen = strlen (bfd_asymbol_name (func));
2332 
2333   if (adata (abfd).line_buf != NULL)
2334     free (adata (abfd).line_buf);
2335   if (filelen + funclen == 0)
2336     adata (abfd).line_buf = buf = NULL;
2337   else
2338     {
2339       buf = bfd_malloc ((bfd_size_type) filelen + funclen + 3);
2340       adata (abfd).line_buf = buf;
2341       if (buf == NULL)
2342 	return FALSE;
2343     }
2344 
2345   if (main_file_name != NULL)
2346     {
2347       if (main_file_name[0] == '/' || directory_name == NULL)
2348 	*filename_ptr = main_file_name;
2349       else
2350 	{
2351 	  sprintf (buf, "%s%s", directory_name, main_file_name);
2352 	  *filename_ptr = buf;
2353 	  buf += filelen + 1;
2354 	}
2355     }
2356 
2357   if (func)
2358     {
2359       const char *function = func->name;
2360       char *colon;
2361 
2362       /* The caller expects a symbol name.  We actually have a
2363 	 function name, without the leading underscore.  Put the
2364 	 underscore back in, so that the caller gets a symbol name.  */
2365       if (bfd_get_symbol_leading_char (abfd) == '\0')
2366 	strcpy (buf, function);
2367       else
2368 	{
2369 	  buf[0] = bfd_get_symbol_leading_char (abfd);
2370 	  strcpy (buf + 1, function);
2371 	}
2372 
2373       /* Have to remove : stuff.  */
2374       colon = strchr (buf, ':');
2375       if (colon != NULL)
2376 	*colon = '\0';
2377       *functionname_ptr = buf;
2378     }
2379 
2380   return TRUE;
2381 }
2382 
2383 int
NAME(aout,sizeof_headers)2384 NAME (aout, sizeof_headers) (bfd *abfd,
2385 			     struct bfd_link_info *info ATTRIBUTE_UNUSED)
2386 {
2387   return adata (abfd).exec_bytes_size;
2388 }
2389 
2390 /* Free all information we have cached for this BFD.  We can always
2391    read it again later if we need it.  */
2392 
2393 bfd_boolean
NAME(aout,bfd_free_cached_info)2394 NAME (aout, bfd_free_cached_info) (bfd *abfd)
2395 {
2396   asection *o;
2397 
2398   if (bfd_get_format (abfd) != bfd_object)
2399     return TRUE;
2400 
2401 #define BFCI_FREE(x) if (x != NULL) { free (x); x = NULL; }
2402   BFCI_FREE (obj_aout_symbols (abfd));
2403 
2404 #ifdef USE_MMAP
2405   obj_aout_external_syms (abfd) = 0;
2406   bfd_free_window (&obj_aout_sym_window (abfd));
2407   bfd_free_window (&obj_aout_string_window (abfd));
2408   obj_aout_external_strings (abfd) = 0;
2409 #else
2410   BFCI_FREE (obj_aout_external_syms (abfd));
2411   BFCI_FREE (obj_aout_external_strings (abfd));
2412 #endif
2413   for (o = abfd->sections; o != NULL; o = o->next)
2414     BFCI_FREE (o->relocation);
2415 #undef BFCI_FREE
2416 
2417   return TRUE;
2418 }
2419 
2420 /* Routine to create an entry in an a.out link hash table.  */
2421 
2422 struct bfd_hash_entry *
NAME(aout,link_hash_newfunc)2423 NAME (aout, link_hash_newfunc) (struct bfd_hash_entry *entry,
2424 				struct bfd_hash_table *table,
2425 				const char *string)
2426 {
2427   struct aout_link_hash_entry *ret = (struct aout_link_hash_entry *) entry;
2428 
2429   /* Allocate the structure if it has not already been allocated by a
2430      subclass.  */
2431   if (ret == NULL)
2432     ret = bfd_hash_allocate (table, sizeof (* ret));
2433   if (ret == NULL)
2434     return NULL;
2435 
2436   /* Call the allocation method of the superclass.  */
2437   ret = (struct aout_link_hash_entry *)
2438 	 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
2439   if (ret)
2440     {
2441       /* Set local fields.  */
2442       ret->written = FALSE;
2443       ret->indx = -1;
2444     }
2445 
2446   return (struct bfd_hash_entry *) ret;
2447 }
2448 
2449 /* Initialize an a.out link hash table.  */
2450 
2451 bfd_boolean
NAME(aout,link_hash_table_init)2452 NAME (aout, link_hash_table_init) (struct aout_link_hash_table *table,
2453 				   bfd *abfd,
2454 				   struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *,
2455 								     struct bfd_hash_table *,
2456 								     const char *),
2457 				   unsigned int entsize)
2458 {
2459   return _bfd_link_hash_table_init (&table->root, abfd, newfunc, entsize);
2460 }
2461 
2462 /* Create an a.out link hash table.  */
2463 
2464 struct bfd_link_hash_table *
NAME(aout,link_hash_table_create)2465 NAME (aout, link_hash_table_create) (bfd *abfd)
2466 {
2467   struct aout_link_hash_table *ret;
2468   bfd_size_type amt = sizeof (struct aout_link_hash_table);
2469 
2470   ret = bfd_malloc (amt);
2471   if (ret == NULL)
2472     return NULL;
2473   if (! NAME (aout, link_hash_table_init) (ret, abfd,
2474 					   NAME (aout, link_hash_newfunc),
2475 					   sizeof (struct aout_link_hash_entry)))
2476     {
2477       free (ret);
2478       return NULL;
2479     }
2480   return &ret->root;
2481 }
2482 
2483 /* Free up the internal symbols read from an a.out file.  */
2484 
2485 static bfd_boolean
aout_link_free_symbols(bfd * abfd)2486 aout_link_free_symbols (bfd *abfd)
2487 {
2488   if (obj_aout_external_syms (abfd) != NULL)
2489     {
2490 #ifdef USE_MMAP
2491       bfd_free_window (&obj_aout_sym_window (abfd));
2492 #else
2493       free ((void *) obj_aout_external_syms (abfd));
2494 #endif
2495       obj_aout_external_syms (abfd) = NULL;
2496     }
2497 
2498   if (obj_aout_external_strings (abfd) != NULL)
2499     {
2500 #ifdef USE_MMAP
2501       bfd_free_window (&obj_aout_string_window (abfd));
2502 #else
2503       free ((void *) obj_aout_external_strings (abfd));
2504 #endif
2505       obj_aout_external_strings (abfd) = NULL;
2506     }
2507   return TRUE;
2508 }
2509 
2510 /* Given an a.out BFD, add symbols to the global hash table as
2511    appropriate.  */
2512 
2513 bfd_boolean
NAME(aout,link_add_symbols)2514 NAME (aout, link_add_symbols) (bfd *abfd, struct bfd_link_info *info)
2515 {
2516   switch (bfd_get_format (abfd))
2517     {
2518     case bfd_object:
2519       return aout_link_add_object_symbols (abfd, info);
2520     case bfd_archive:
2521       return _bfd_generic_link_add_archive_symbols
2522 	(abfd, info, aout_link_check_archive_element);
2523     default:
2524       bfd_set_error (bfd_error_wrong_format);
2525       return FALSE;
2526     }
2527 }
2528 
2529 /* Add symbols from an a.out object file.  */
2530 
2531 static bfd_boolean
aout_link_add_object_symbols(bfd * abfd,struct bfd_link_info * info)2532 aout_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
2533 {
2534   if (! aout_get_external_symbols (abfd))
2535     return FALSE;
2536   if (! aout_link_add_symbols (abfd, info))
2537     return FALSE;
2538   if (! info->keep_memory)
2539     {
2540       if (! aout_link_free_symbols (abfd))
2541 	return FALSE;
2542     }
2543   return TRUE;
2544 }
2545 
2546 /* Look through the internal symbols to see if this object file should
2547    be included in the link.  We should include this object file if it
2548    defines any symbols which are currently undefined.  If this object
2549    file defines a common symbol, then we may adjust the size of the
2550    known symbol but we do not include the object file in the link
2551    (unless there is some other reason to include it).  */
2552 
2553 static bfd_boolean
aout_link_check_ar_symbols(bfd * abfd,struct bfd_link_info * info,bfd_boolean * pneeded,bfd ** subsbfd)2554 aout_link_check_ar_symbols (bfd *abfd,
2555 			    struct bfd_link_info *info,
2556 			    bfd_boolean *pneeded,
2557 			    bfd **subsbfd)
2558 {
2559   struct external_nlist *p;
2560   struct external_nlist *pend;
2561   char *strings;
2562 
2563   *pneeded = FALSE;
2564 
2565   /* Look through all the symbols.  */
2566   p = obj_aout_external_syms (abfd);
2567   pend = p + obj_aout_external_sym_count (abfd);
2568   strings = obj_aout_external_strings (abfd);
2569   for (; p < pend; p++)
2570     {
2571       int type = H_GET_8 (abfd, p->e_type);
2572       const char *name;
2573       struct bfd_link_hash_entry *h;
2574 
2575       /* Ignore symbols that are not externally visible.  This is an
2576 	 optimization only, as we check the type more thoroughly
2577 	 below.  */
2578       if ((type & N_EXT) == 0
2579 	  || type == N_FN)
2580 	continue;
2581 
2582       name = strings + GET_WORD (abfd, p->e_strx);
2583       h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
2584 
2585       /* We are only interested in symbols that are currently
2586 	 undefined or common.  */
2587       if (h == NULL
2588 	  || (h->type != bfd_link_hash_undefined
2589 	      && h->type != bfd_link_hash_common))
2590 	continue;
2591 
2592       if (type == (N_TEXT | N_EXT)
2593 	  || type == (N_DATA | N_EXT)
2594 	  || type == (N_BSS | N_EXT)
2595 	  || type == (N_ABS | N_EXT))
2596 	{
2597 	  /* This object file defines this symbol.  We must link it
2598 	     in.  This is true regardless of whether the current
2599 	     definition of the symbol is undefined or common.  If the
2600 	     current definition is common, we have a case in which we
2601 	     have already seen an object file including
2602 		 int a;
2603 	     and this object file from the archive includes
2604 		 int a = 5;
2605 	     In such a case we must include this object file.
2606 
2607 	     FIXME: The SunOS 4.1.3 linker will pull in the archive
2608 	     element if the symbol is defined in the .data section,
2609 	     but not if it is defined in the .text section.  That
2610 	     seems a bit crazy to me, and I haven't implemented it.
2611 	     However, it might be correct.  */
2612 	  if (!(*info->callbacks
2613 		->add_archive_element) (info, abfd, name, subsbfd))
2614 	    continue;
2615 	  *pneeded = TRUE;
2616 	  return TRUE;
2617 	}
2618 
2619       if (type == (N_UNDF | N_EXT))
2620 	{
2621 	  bfd_vma value;
2622 
2623 	  value = GET_WORD (abfd, p->e_value);
2624 	  if (value != 0)
2625 	    {
2626 	      /* This symbol is common in the object from the archive
2627 		 file.  */
2628 	      if (h->type == bfd_link_hash_undefined)
2629 		{
2630 		  bfd *symbfd;
2631 		  unsigned int power;
2632 
2633 		  symbfd = h->u.undef.abfd;
2634 		  if (symbfd == NULL)
2635 		    {
2636 		      /* This symbol was created as undefined from
2637 			 outside BFD.  We assume that we should link
2638 			 in the object file.  This is done for the -u
2639 			 option in the linker.  */
2640 		      if (!(*info->callbacks
2641 			    ->add_archive_element) (info, abfd, name, subsbfd))
2642 			return FALSE;
2643 		      *pneeded = TRUE;
2644 		      return TRUE;
2645 		    }
2646 		  /* Turn the current link symbol into a common
2647 		     symbol.  It is already on the undefs list.  */
2648 		  h->type = bfd_link_hash_common;
2649 		  h->u.c.p = bfd_hash_allocate (&info->hash->table,
2650 						sizeof (struct bfd_link_hash_common_entry));
2651 		  if (h->u.c.p == NULL)
2652 		    return FALSE;
2653 
2654 		  h->u.c.size = value;
2655 
2656 		  /* FIXME: This isn't quite right.  The maximum
2657 		     alignment of a common symbol should be set by the
2658 		     architecture of the output file, not of the input
2659 		     file.  */
2660 		  power = bfd_log2 (value);
2661 		  if (power > bfd_get_arch_info (abfd)->section_align_power)
2662 		    power = bfd_get_arch_info (abfd)->section_align_power;
2663 		  h->u.c.p->alignment_power = power;
2664 
2665 		  h->u.c.p->section = bfd_make_section_old_way (symbfd,
2666 								"COMMON");
2667 		}
2668 	      else
2669 		{
2670 		  /* Adjust the size of the common symbol if
2671 		     necessary.  */
2672 		  if (value > h->u.c.size)
2673 		    h->u.c.size = value;
2674 		}
2675 	    }
2676 	}
2677     }
2678 
2679   /* We do not need this object file.  */
2680   return TRUE;
2681 }
2682 
2683 /* Check a single archive element to see if we need to include it in
2684    the link.  *PNEEDED is set according to whether this element is
2685    needed in the link or not.  This is called from
2686    _bfd_generic_link_add_archive_symbols.  */
2687 
2688 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)2689 aout_link_check_archive_element (bfd *abfd,
2690 				 struct bfd_link_info *info,
2691 				 struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
2692 				 const char *name ATTRIBUTE_UNUSED,
2693 				 bfd_boolean *pneeded)
2694 {
2695   bfd *oldbfd;
2696   bfd_boolean needed;
2697 
2698   if (!aout_get_external_symbols (abfd))
2699     return FALSE;
2700 
2701   oldbfd = abfd;
2702   if (!aout_link_check_ar_symbols (abfd, info, pneeded, &abfd))
2703     return FALSE;
2704 
2705   needed = *pneeded;
2706   if (needed)
2707     {
2708       /* Potentially, the add_archive_element hook may have set a
2709 	 substitute BFD for us.  */
2710       if (abfd != oldbfd)
2711 	{
2712 	  if (!info->keep_memory
2713 	      && !aout_link_free_symbols (oldbfd))
2714 	    return FALSE;
2715 	  if (!aout_get_external_symbols (abfd))
2716 	    return FALSE;
2717 	}
2718       if (!aout_link_add_symbols (abfd, info))
2719 	return FALSE;
2720     }
2721 
2722   if (!info->keep_memory || !needed)
2723     {
2724       if (!aout_link_free_symbols (abfd))
2725 	return FALSE;
2726     }
2727 
2728   return TRUE;
2729 }
2730 
2731 /* Add all symbols from an object file to the hash table.  */
2732 
2733 static bfd_boolean
aout_link_add_symbols(bfd * abfd,struct bfd_link_info * info)2734 aout_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
2735 {
2736   bfd_boolean (*add_one_symbol)
2737     (struct bfd_link_info *, bfd *, const char *, flagword, asection *,
2738      bfd_vma, const char *, bfd_boolean, bfd_boolean,
2739      struct bfd_link_hash_entry **);
2740   struct external_nlist *syms;
2741   bfd_size_type sym_count;
2742   char *strings;
2743   bfd_boolean copy;
2744   struct aout_link_hash_entry **sym_hash;
2745   struct external_nlist *p;
2746   struct external_nlist *pend;
2747 
2748   syms = obj_aout_external_syms (abfd);
2749   sym_count = obj_aout_external_sym_count (abfd);
2750   strings = obj_aout_external_strings (abfd);
2751   if (info->keep_memory)
2752     copy = FALSE;
2753   else
2754     copy = TRUE;
2755 
2756   if (aout_backend_info (abfd)->add_dynamic_symbols != NULL)
2757     {
2758       if (! ((*aout_backend_info (abfd)->add_dynamic_symbols)
2759 	     (abfd, info, &syms, &sym_count, &strings)))
2760 	return FALSE;
2761     }
2762 
2763   /* We keep a list of the linker hash table entries that correspond
2764      to particular symbols.  We could just look them up in the hash
2765      table, but keeping the list is more efficient.  Perhaps this
2766      should be conditional on info->keep_memory.  */
2767   sym_hash = bfd_alloc (abfd,
2768 			sym_count * sizeof (struct aout_link_hash_entry *));
2769   if (sym_hash == NULL && sym_count != 0)
2770     return FALSE;
2771   obj_aout_sym_hashes (abfd) = sym_hash;
2772 
2773   add_one_symbol = aout_backend_info (abfd)->add_one_symbol;
2774   if (add_one_symbol == NULL)
2775     add_one_symbol = _bfd_generic_link_add_one_symbol;
2776 
2777   p = syms;
2778   pend = p + sym_count;
2779   for (; p < pend; p++, sym_hash++)
2780     {
2781       int type;
2782       const char *name;
2783       bfd_vma value;
2784       asection *section;
2785       flagword flags;
2786       const char *string;
2787 
2788       *sym_hash = NULL;
2789 
2790       type = H_GET_8 (abfd, p->e_type);
2791 
2792       name = strings + GET_WORD (abfd, p->e_strx);
2793       value = GET_WORD (abfd, p->e_value);
2794       flags = BSF_GLOBAL;
2795       string = NULL;
2796       switch (type)
2797 	{
2798 	default:
2799 	  /* Anything else should be a debugging symbol.  */
2800 	  BFD_ASSERT ((type & N_STAB) != 0);
2801 	  continue;
2802 
2803 	case N_UNDF:
2804 	case N_ABS:
2805 	case N_TEXT:
2806 	case N_DATA:
2807 	case N_BSS:
2808 	case N_REG:
2809 	case N_FN:
2810 	  /* Ignore symbols that are not externally visible.  */
2811 	  continue;
2812 
2813 	case N_UNDF | N_EXT:
2814 	  if (value == 0)
2815 	    {
2816 	      section = bfd_und_section_ptr;
2817 	      flags = 0;
2818 	    }
2819 	  else
2820 	    section = bfd_com_section_ptr;
2821 	  break;
2822 	case N_ABS | N_EXT:
2823 	  section = bfd_abs_section_ptr;
2824 	  break;
2825 	case N_TEXT | N_EXT:
2826 	  section = obj_textsec (abfd);
2827 	  value -= bfd_get_section_vma (abfd, section);
2828 	  break;
2829 	case N_DATA | N_EXT:
2830 	  /* Treat N_SETV symbols as N_DATA symbol; see comment in
2831 	     translate_from_native_sym_flags.  */
2832 	  section = obj_datasec (abfd);
2833 	  value -= bfd_get_section_vma (abfd, section);
2834 	  break;
2835 	case N_BSS | N_EXT:
2836 	  section = obj_bsssec (abfd);
2837 	  value -= bfd_get_section_vma (abfd, section);
2838 	  break;
2839 	}
2840 
2841       if (! ((*add_one_symbol)
2842 	     (info, abfd, name, flags, section, value, string, copy, FALSE,
2843 	      (struct bfd_link_hash_entry **) sym_hash)))
2844 	return FALSE;
2845 
2846       /* Restrict the maximum alignment of a common symbol based on
2847 	 the architecture, since a.out has no way to represent
2848 	 alignment requirements of a section in a .o file.  FIXME:
2849 	 This isn't quite right: it should use the architecture of the
2850 	 output file, not the input files.  */
2851       if ((*sym_hash)->root.type == bfd_link_hash_common
2852 	  && ((*sym_hash)->root.u.c.p->alignment_power >
2853 	      bfd_get_arch_info (abfd)->section_align_power))
2854 	(*sym_hash)->root.u.c.p->alignment_power =
2855 	  bfd_get_arch_info (abfd)->section_align_power;
2856 
2857       /* If this is a set symbol, and we are not building sets, then
2858 	 it is possible for the hash entry to not have been set.  In
2859 	 such a case, treat the symbol as not globally defined.  */
2860       if ((*sym_hash)->root.type == bfd_link_hash_new)
2861 	{
2862 	  BFD_ASSERT ((flags & BSF_CONSTRUCTOR) != 0);
2863 	  *sym_hash = NULL;
2864 	}
2865     }
2866 
2867   return TRUE;
2868 }
2869 
2870 /* Look up an entry in an the header file hash table.  */
2871 
2872 #define aout_link_includes_lookup(table, string, create, copy) \
2873   ((struct aout_link_includes_entry *) \
2874    bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
2875 
2876 /* The function to create a new entry in the header file hash table.  */
2877 
2878 static struct bfd_hash_entry *
aout_link_includes_newfunc(struct bfd_hash_entry * entry,struct bfd_hash_table * table,const char * string)2879 aout_link_includes_newfunc (struct bfd_hash_entry *entry,
2880 			    struct bfd_hash_table *table,
2881 			    const char *string)
2882 {
2883   struct aout_link_includes_entry * ret =
2884     (struct aout_link_includes_entry *) entry;
2885 
2886   /* Allocate the structure if it has not already been allocated by a
2887      subclass.  */
2888   if (ret == NULL)
2889     ret = bfd_hash_allocate (table,
2890 			     sizeof (struct aout_link_includes_entry));
2891   if (ret == NULL)
2892     return NULL;
2893 
2894   /* Call the allocation method of the superclass.  */
2895   ret = ((struct aout_link_includes_entry *)
2896 	 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
2897   if (ret)
2898     /* Set local fields.  */
2899     ret->totals = NULL;
2900 
2901   return (struct bfd_hash_entry *) ret;
2902 }
2903 
2904 static bfd_boolean
aout_link_write_other_symbol(struct bfd_hash_entry * bh,void * data)2905 aout_link_write_other_symbol (struct bfd_hash_entry *bh, void *data)
2906 {
2907   struct aout_link_hash_entry *h = (struct aout_link_hash_entry *) bh;
2908   struct aout_final_link_info *flaginfo = (struct aout_final_link_info *) data;
2909   bfd *output_bfd;
2910   int type;
2911   bfd_vma val;
2912   struct external_nlist outsym;
2913   bfd_size_type indx;
2914   bfd_size_type amt;
2915 
2916   if (h->root.type == bfd_link_hash_warning)
2917     {
2918       h = (struct aout_link_hash_entry *) h->root.u.i.link;
2919       if (h->root.type == bfd_link_hash_new)
2920 	return TRUE;
2921     }
2922 
2923   output_bfd = flaginfo->output_bfd;
2924 
2925   if (aout_backend_info (output_bfd)->write_dynamic_symbol != NULL)
2926     {
2927       if (! ((*aout_backend_info (output_bfd)->write_dynamic_symbol)
2928 	     (output_bfd, flaginfo->info, h)))
2929 	{
2930 	  /* FIXME: No way to handle errors.  */
2931 	  abort ();
2932 	}
2933     }
2934 
2935   if (h->written)
2936     return TRUE;
2937 
2938   h->written = TRUE;
2939 
2940   /* An indx of -2 means the symbol must be written.  */
2941   if (h->indx != -2
2942       && (flaginfo->info->strip == strip_all
2943 	  || (flaginfo->info->strip == strip_some
2944 	      && bfd_hash_lookup (flaginfo->info->keep_hash, h->root.root.string,
2945 				  FALSE, FALSE) == NULL)))
2946     return TRUE;
2947 
2948   switch (h->root.type)
2949     {
2950     default:
2951       abort ();
2952       /* Avoid variable not initialized warnings.  */
2953       return TRUE;
2954     case bfd_link_hash_new:
2955       /* This can happen for set symbols when sets are not being
2956 	 built.  */
2957       return TRUE;
2958     case bfd_link_hash_undefined:
2959       type = N_UNDF | N_EXT;
2960       val = 0;
2961       break;
2962     case bfd_link_hash_defined:
2963     case bfd_link_hash_defweak:
2964       {
2965 	asection *sec;
2966 
2967 	sec = h->root.u.def.section->output_section;
2968 	BFD_ASSERT (bfd_is_abs_section (sec)
2969 		    || sec->owner == output_bfd);
2970 	if (sec == obj_textsec (output_bfd))
2971 	  type = h->root.type == bfd_link_hash_defined ? N_TEXT : N_WEAKT;
2972 	else if (sec == obj_datasec (output_bfd))
2973 	  type = h->root.type == bfd_link_hash_defined ? N_DATA : N_WEAKD;
2974 	else if (sec == obj_bsssec (output_bfd))
2975 	  type = h->root.type == bfd_link_hash_defined ? N_BSS : N_WEAKB;
2976 	else
2977 	  type = h->root.type == bfd_link_hash_defined ? N_ABS : N_WEAKA;
2978 	type |= N_EXT;
2979 	val = (h->root.u.def.value
2980 	       + sec->vma
2981 	       + h->root.u.def.section->output_offset);
2982       }
2983       break;
2984     case bfd_link_hash_common:
2985       type = N_UNDF | N_EXT;
2986       val = h->root.u.c.size;
2987       break;
2988     case bfd_link_hash_undefweak:
2989       type = N_WEAKU;
2990       val = 0;
2991       /* Fall through.  */
2992     case bfd_link_hash_indirect:
2993     case bfd_link_hash_warning:
2994       /* FIXME: Ignore these for now.  The circumstances under which
2995 	 they should be written out are not clear to me.  */
2996       return TRUE;
2997     }
2998 
2999   H_PUT_8 (output_bfd, type, outsym.e_type);
3000   indx = add_to_stringtab (output_bfd, flaginfo->strtab, h->root.root.string,
3001 			   FALSE);
3002   if (indx == (bfd_size_type) -1)
3003     /* FIXME: No way to handle errors.  */
3004     abort ();
3005 
3006   PUT_WORD (output_bfd, indx, outsym.e_strx);
3007   PUT_WORD (output_bfd, val, outsym.e_value);
3008 
3009   amt = EXTERNAL_NLIST_SIZE;
3010   if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0
3011       || bfd_bwrite ((void *) &outsym, amt, output_bfd) != amt)
3012     /* FIXME: No way to handle errors.  */
3013     abort ();
3014 
3015   flaginfo->symoff += amt;
3016   h->indx = obj_aout_external_sym_count (output_bfd);
3017   ++obj_aout_external_sym_count (output_bfd);
3018 
3019   return TRUE;
3020 }
3021 
3022 /* Handle a link order which is supposed to generate a reloc.  */
3023 
3024 static bfd_boolean
aout_link_reloc_link_order(struct aout_final_link_info * flaginfo,asection * o,struct bfd_link_order * p)3025 aout_link_reloc_link_order (struct aout_final_link_info *flaginfo,
3026 			    asection *o,
3027 			    struct bfd_link_order *p)
3028 {
3029   struct bfd_link_order_reloc *pr;
3030   int r_index;
3031   int r_extern;
3032   reloc_howto_type *howto;
3033   file_ptr *reloff_ptr;
3034   struct reloc_std_external srel;
3035   void * rel_ptr;
3036   bfd_size_type rel_size;
3037 
3038   pr = p->u.reloc.p;
3039 
3040   if (p->type == bfd_section_reloc_link_order)
3041     {
3042       r_extern = 0;
3043       if (bfd_is_abs_section (pr->u.section))
3044 	r_index = N_ABS | N_EXT;
3045       else
3046 	{
3047 	  BFD_ASSERT (pr->u.section->owner == flaginfo->output_bfd);
3048 	  r_index = pr->u.section->target_index;
3049 	}
3050     }
3051   else
3052     {
3053       struct aout_link_hash_entry *h;
3054 
3055       BFD_ASSERT (p->type == bfd_symbol_reloc_link_order);
3056       r_extern = 1;
3057       h = ((struct aout_link_hash_entry *)
3058 	   bfd_wrapped_link_hash_lookup (flaginfo->output_bfd, flaginfo->info,
3059 					 pr->u.name, FALSE, FALSE, TRUE));
3060       if (h != NULL
3061 	  && h->indx >= 0)
3062 	r_index = h->indx;
3063       else if (h != NULL)
3064 	{
3065 	  /* We decided to strip this symbol, but it turns out that we
3066 	     can't.  Note that we lose the other and desc information
3067 	     here.  I don't think that will ever matter for a global
3068 	     symbol.  */
3069 	  h->indx = -2;
3070 	  h->written = FALSE;
3071 	  if (!aout_link_write_other_symbol (&h->root.root, flaginfo))
3072 	    return FALSE;
3073 	  r_index = h->indx;
3074 	}
3075       else
3076 	{
3077 	  (*flaginfo->info->callbacks->unattached_reloc)
3078 	    (flaginfo->info, pr->u.name, NULL, NULL, (bfd_vma) 0);
3079 	  r_index = 0;
3080 	}
3081     }
3082 
3083   howto = bfd_reloc_type_lookup (flaginfo->output_bfd, pr->reloc);
3084   if (howto == 0)
3085     {
3086       bfd_set_error (bfd_error_bad_value);
3087       return FALSE;
3088     }
3089 
3090   if (o == obj_textsec (flaginfo->output_bfd))
3091     reloff_ptr = &flaginfo->treloff;
3092   else if (o == obj_datasec (flaginfo->output_bfd))
3093     reloff_ptr = &flaginfo->dreloff;
3094   else
3095     abort ();
3096 
3097 #ifdef MY_put_reloc
3098   MY_put_reloc(flaginfo->output_bfd, r_extern, r_index, p->offset, howto,
3099 	       &srel);
3100 #else
3101   {
3102     int r_pcrel;
3103     int r_baserel;
3104     int r_jmptable;
3105     int r_relative;
3106     int r_length;
3107 
3108     fprintf (stderr, "TODO: line %d in bfd/pdp11.c\n", __LINE__);
3109 
3110     r_pcrel = howto->pc_relative;
3111     r_baserel = (howto->type & 8) != 0;
3112     r_jmptable = (howto->type & 16) != 0;
3113     r_relative = (howto->type & 32) != 0;
3114     r_length = howto->size;
3115 
3116     PUT_WORD (flaginfo->output_bfd, p->offset, srel.r_address);
3117     if (bfd_header_big_endian (flaginfo->output_bfd))
3118       {
3119 	srel.r_index[0] = r_index >> 16;
3120 	srel.r_index[1] = r_index >> 8;
3121 	srel.r_index[2] = r_index;
3122 	srel.r_type[0] =
3123 	  ((r_extern ?     RELOC_STD_BITS_EXTERN_BIG : 0)
3124 	   | (r_pcrel ?    RELOC_STD_BITS_PCREL_BIG : 0)
3125 	   | (r_baserel ?  RELOC_STD_BITS_BASEREL_BIG : 0)
3126 	   | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0)
3127 	   | (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0)
3128 	   | (r_length <<  RELOC_STD_BITS_LENGTH_SH_BIG));
3129       }
3130     else
3131       {
3132 	srel.r_index[2] = r_index >> 16;
3133 	srel.r_index[1] = r_index >> 8;
3134 	srel.r_index[0] = r_index;
3135 	srel.r_type[0] =
3136 	  ((r_extern ?     RELOC_STD_BITS_EXTERN_LITTLE : 0)
3137 	   | (r_pcrel ?    RELOC_STD_BITS_PCREL_LITTLE : 0)
3138 	   | (r_baserel ?  RELOC_STD_BITS_BASEREL_LITTLE : 0)
3139 	   | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0)
3140 	   | (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0)
3141 	   | (r_length <<  RELOC_STD_BITS_LENGTH_SH_LITTLE));
3142       }
3143   }
3144 #endif
3145   rel_ptr = (void *) &srel;
3146 
3147   /* We have to write the addend into the object file, since
3148      standard a.out relocs are in place.  It would be more
3149      reliable if we had the current contents of the file here,
3150      rather than assuming zeroes, but we can't read the file since
3151      it was opened using bfd_openw.  */
3152   if (pr->addend != 0)
3153     {
3154       bfd_size_type size;
3155       bfd_reloc_status_type r;
3156       bfd_byte *buf;
3157       bfd_boolean ok;
3158 
3159       size = bfd_get_reloc_size (howto);
3160       buf = bfd_zmalloc (size);
3161       if (buf == NULL && size != 0)
3162 	return FALSE;
3163       r = MY_relocate_contents (howto, flaginfo->output_bfd,
3164 				pr->addend, buf);
3165       switch (r)
3166 	{
3167 	case bfd_reloc_ok:
3168 	  break;
3169 	default:
3170 	case bfd_reloc_outofrange:
3171 	  abort ();
3172 	case bfd_reloc_overflow:
3173 	  (*flaginfo->info->callbacks->reloc_overflow)
3174 	    (flaginfo->info, NULL,
3175 	     (p->type == bfd_section_reloc_link_order
3176 	      ? bfd_section_name (flaginfo->output_bfd,
3177 				  pr->u.section)
3178 	      : pr->u.name),
3179 	     howto->name, pr->addend, NULL,
3180 	     (asection *) NULL, (bfd_vma) 0);
3181 	  break;
3182 	}
3183       ok = bfd_set_section_contents (flaginfo->output_bfd, o,
3184 				     (void *) buf,
3185 				     (file_ptr) p->offset,
3186 				     size);
3187       free (buf);
3188       if (! ok)
3189 	return FALSE;
3190     }
3191 
3192   rel_size = obj_reloc_entry_size (flaginfo->output_bfd);
3193   if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0
3194       || bfd_bwrite (rel_ptr, rel_size, flaginfo->output_bfd) != rel_size)
3195     return FALSE;
3196 
3197   *reloff_ptr += rel_size;
3198 
3199   /* Assert that the relocs have not run into the symbols, and that n
3200      the text relocs have not run into the data relocs.  */
3201   BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd)
3202 	      && (reloff_ptr != &flaginfo->treloff
3203 		  || (*reloff_ptr
3204 		      <= obj_datasec (flaginfo->output_bfd)->rel_filepos)));
3205 
3206   return TRUE;
3207 }
3208 
3209 /* Get the section corresponding to a reloc index.  */
3210 
3211 static inline asection *
aout_reloc_type_to_section(bfd * abfd,int type)3212 aout_reloc_type_to_section (bfd *abfd, int type)
3213 {
3214   switch (type)
3215     {
3216     case RTEXT:	return obj_textsec (abfd);
3217     case RDATA: return obj_datasec (abfd);
3218     case RBSS:  return obj_bsssec (abfd);
3219     case RABS:  return bfd_abs_section_ptr;
3220     case REXT:  return bfd_und_section_ptr;
3221     default:    abort ();
3222     }
3223 }
3224 
3225 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)3226 pdp11_aout_link_input_section (struct aout_final_link_info *flaginfo,
3227 			       bfd *input_bfd,
3228 			       asection *input_section,
3229 			       bfd_byte *relocs,
3230 			       bfd_size_type rel_size,
3231 			       bfd_byte *contents)
3232 {
3233   bfd_boolean (*check_dynamic_reloc)
3234     (struct bfd_link_info *, bfd *, asection *,
3235      struct aout_link_hash_entry *, void *, bfd_byte *, bfd_boolean *,
3236      bfd_vma *);
3237   bfd *output_bfd;
3238   bfd_boolean relocatable;
3239   struct external_nlist *syms;
3240   char *strings;
3241   struct aout_link_hash_entry **sym_hashes;
3242   int *symbol_map;
3243   bfd_byte *rel;
3244   bfd_byte *rel_end;
3245 
3246   output_bfd = flaginfo->output_bfd;
3247   check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc;
3248 
3249   BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_SIZE);
3250   BFD_ASSERT (input_bfd->xvec->header_byteorder
3251 	      == output_bfd->xvec->header_byteorder);
3252 
3253   relocatable = bfd_link_relocatable (flaginfo->info);
3254   syms = obj_aout_external_syms (input_bfd);
3255   strings = obj_aout_external_strings (input_bfd);
3256   sym_hashes = obj_aout_sym_hashes (input_bfd);
3257   symbol_map = flaginfo->symbol_map;
3258 
3259   rel = relocs;
3260   rel_end = rel + rel_size;
3261   for (; rel < rel_end; rel += RELOC_SIZE)
3262     {
3263       bfd_vma r_addr;
3264       int r_index;
3265       int r_type;
3266       int r_pcrel;
3267       int r_extern;
3268       reloc_howto_type *howto;
3269       struct aout_link_hash_entry *h = NULL;
3270       bfd_vma relocation;
3271       bfd_reloc_status_type r;
3272       int reloc_entry;
3273 
3274       reloc_entry = GET_WORD (input_bfd, (void *) rel);
3275       if (reloc_entry == 0)
3276 	continue;
3277 
3278       {
3279 	unsigned int howto_idx;
3280 
3281 	r_index = (reloc_entry & RIDXMASK) >> 4;
3282 	r_type = reloc_entry & RTYPE;
3283 	r_pcrel = reloc_entry & RELFLG;
3284 	r_addr = (char *) rel - (char *) relocs;
3285 
3286 	r_extern = (r_type == REXT);
3287 
3288 	howto_idx = r_pcrel;
3289 	BFD_ASSERT (howto_idx < TABLE_SIZE (howto_table_pdp11));
3290 	howto = howto_table_pdp11 + howto_idx;
3291       }
3292 
3293       if (relocatable)
3294 	{
3295 	  /* We are generating a relocatable output file, and must
3296 	     modify the reloc accordingly.  */
3297 	  if (r_extern)
3298 	    {
3299 	      /* If we know the symbol this relocation is against,
3300 		 convert it into a relocation against a section.  This
3301 		 is what the native linker does.  */
3302 	      h = sym_hashes[r_index];
3303 	      if (h != NULL
3304 		  && (h->root.type == bfd_link_hash_defined
3305 		      || h->root.type == bfd_link_hash_defweak))
3306 		{
3307 		  asection *output_section;
3308 
3309 		  /* Compute a new r_index.  */
3310 		  output_section = h->root.u.def.section->output_section;
3311 		  if (output_section == obj_textsec (output_bfd))
3312 		    r_type = N_TEXT;
3313 		  else if (output_section == obj_datasec (output_bfd))
3314 		    r_type = N_DATA;
3315 		  else if (output_section == obj_bsssec (output_bfd))
3316 		    r_type = N_BSS;
3317 		  else
3318 		    r_type = N_ABS;
3319 
3320 		  /* Add the symbol value and the section VMA to the
3321 		     addend stored in the contents.  */
3322 		  relocation = (h->root.u.def.value
3323 				+ output_section->vma
3324 				+ h->root.u.def.section->output_offset);
3325 		}
3326 	      else
3327 		{
3328 		  /* We must change r_index according to the symbol
3329 		     map.  */
3330 		  r_index = symbol_map[r_index];
3331 
3332 		  if (r_index == -1)
3333 		    {
3334 		      if (h != NULL)
3335 			{
3336 			  /* We decided to strip this symbol, but it
3337 			     turns out that we can't.  Note that we
3338 			     lose the other and desc information here.
3339 			     I don't think that will ever matter for a
3340 			     global symbol.  */
3341 			  if (h->indx < 0)
3342 			    {
3343 			      h->indx = -2;
3344 			      h->written = FALSE;
3345 			      if (!aout_link_write_other_symbol (&h->root.root,
3346 								 flaginfo))
3347 				return FALSE;
3348 			    }
3349 			  r_index = h->indx;
3350 			}
3351 		      else
3352 			{
3353 			  const char *name;
3354 
3355 			  name = strings + GET_WORD (input_bfd,
3356 						     syms[r_index].e_strx);
3357 			  (*flaginfo->info->callbacks->unattached_reloc)
3358 			    (flaginfo->info, name, input_bfd, input_section,
3359 			     r_addr);
3360 			  r_index = 0;
3361 			}
3362 		    }
3363 
3364 		  relocation = 0;
3365 		}
3366 
3367 	      /* Write out the new r_index value.  */
3368 	      reloc_entry = GET_WORD (input_bfd, rel);
3369 	      reloc_entry &= RIDXMASK;
3370 	      reloc_entry |= r_index << 4;
3371 	      PUT_WORD (input_bfd, reloc_entry, rel);
3372 	    }
3373 	  else
3374 	    {
3375 	      asection *section;
3376 
3377 	      /* This is a relocation against a section.  We must
3378 		 adjust by the amount that the section moved.  */
3379 	      section = aout_reloc_type_to_section (input_bfd, r_type);
3380 	      relocation = (section->output_section->vma
3381 			    + section->output_offset
3382 			    - section->vma);
3383 	    }
3384 
3385 	  /* Change the address of the relocation.  */
3386 	  fprintf (stderr, "TODO: change the address of the relocation\n");
3387 
3388 	  /* Adjust a PC relative relocation by removing the reference
3389 	     to the original address in the section and including the
3390 	     reference to the new address.  */
3391 	  if (r_pcrel)
3392 	    relocation -= (input_section->output_section->vma
3393 			   + input_section->output_offset
3394 			   - input_section->vma);
3395 
3396 #ifdef MY_relocatable_reloc
3397 	  MY_relocatable_reloc (howto, output_bfd, rel, relocation, r_addr);
3398 #endif
3399 
3400 	  if (relocation == 0)
3401 	    r = bfd_reloc_ok;
3402 	  else
3403 	    r = MY_relocate_contents (howto,
3404 				      input_bfd, relocation,
3405 				      contents + r_addr);
3406 	}
3407       else
3408 	{
3409 	  bfd_boolean hundef;
3410 
3411 	  /* We are generating an executable, and must do a full
3412 	     relocation.  */
3413 	  hundef = FALSE;
3414 	  if (r_extern)
3415 	    {
3416 	      h = sym_hashes[r_index];
3417 
3418 	      if (h != NULL
3419 		  && (h->root.type == bfd_link_hash_defined
3420 		      || h->root.type == bfd_link_hash_defweak))
3421 		{
3422 		  relocation = (h->root.u.def.value
3423 				+ h->root.u.def.section->output_section->vma
3424 				+ h->root.u.def.section->output_offset);
3425 		}
3426 	      else if (h != NULL
3427 		       && h->root.type == bfd_link_hash_undefweak)
3428 		relocation = 0;
3429 	      else
3430 		{
3431 		  hundef = TRUE;
3432 		  relocation = 0;
3433 		}
3434 	    }
3435 	  else
3436 	    {
3437 	      asection *section;
3438 
3439 	      section = aout_reloc_type_to_section (input_bfd, r_type);
3440 	      relocation = (section->output_section->vma
3441 			    + section->output_offset
3442 			    - section->vma);
3443 	      if (r_pcrel)
3444 		relocation += input_section->vma;
3445 	    }
3446 
3447 	  if (check_dynamic_reloc != NULL)
3448 	    {
3449 	      bfd_boolean skip;
3450 
3451 	      if (! ((*check_dynamic_reloc)
3452 		     (flaginfo->info, input_bfd, input_section, h,
3453 		      (void *) rel, contents, &skip, &relocation)))
3454 		return FALSE;
3455 	      if (skip)
3456 		continue;
3457 	    }
3458 
3459 	  /* Now warn if a global symbol is undefined.  We could not
3460 	     do this earlier, because check_dynamic_reloc might want
3461 	     to skip this reloc.  */
3462 	  if (hundef && ! bfd_link_pic (flaginfo->info))
3463 	    {
3464 	      const char *name;
3465 
3466 	      if (h != NULL)
3467 		name = h->root.root.string;
3468 	      else
3469 		name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
3470 	      (*flaginfo->info->callbacks->undefined_symbol)
3471 		(flaginfo->info, name, input_bfd, input_section,
3472 		 r_addr, TRUE);
3473 	    }
3474 
3475 	  r = MY_final_link_relocate (howto,
3476 				      input_bfd, input_section,
3477 				      contents, r_addr, relocation,
3478 				      (bfd_vma) 0);
3479 	}
3480 
3481       if (r != bfd_reloc_ok)
3482 	{
3483 	  switch (r)
3484 	    {
3485 	    default:
3486 	    case bfd_reloc_outofrange:
3487 	      abort ();
3488 	    case bfd_reloc_overflow:
3489 	      {
3490 		const char *name;
3491 
3492 		if (h != NULL)
3493 		  name = NULL;
3494 		else if (r_extern)
3495 		  name = strings + GET_WORD (input_bfd,
3496 					     syms[r_index].e_strx);
3497 		else
3498 		  {
3499 		    asection *s;
3500 
3501 		    s = aout_reloc_type_to_section (input_bfd, r_type);
3502 		    name = bfd_section_name (input_bfd, s);
3503 		  }
3504 		(*flaginfo->info->callbacks->reloc_overflow)
3505 		  (flaginfo->info, (h ? &h->root : NULL), name, howto->name,
3506 		   (bfd_vma) 0, input_bfd, input_section, r_addr);
3507 	      }
3508 	      break;
3509 	    }
3510 	}
3511     }
3512 
3513   return TRUE;
3514 }
3515 
3516 /* Link an a.out section into the output file.  */
3517 
3518 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)3519 aout_link_input_section (struct aout_final_link_info *flaginfo,
3520 			 bfd *input_bfd,
3521 			 asection *input_section,
3522 			 file_ptr *reloff_ptr,
3523 			 bfd_size_type rel_size)
3524 {
3525   bfd_size_type input_size;
3526   void * relocs;
3527 
3528   /* Get the section contents.  */
3529   input_size = input_section->size;
3530   if (! bfd_get_section_contents (input_bfd, input_section,
3531 				  (void *) flaginfo->contents,
3532 				  (file_ptr) 0, input_size))
3533     return FALSE;
3534 
3535   /* Read in the relocs if we haven't already done it.  */
3536   if (aout_section_data (input_section) != NULL
3537       && aout_section_data (input_section)->relocs != NULL)
3538     relocs = aout_section_data (input_section)->relocs;
3539   else
3540     {
3541       relocs = flaginfo->relocs;
3542       if (rel_size > 0)
3543 	{
3544 	  if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
3545 	      || bfd_bread (relocs, rel_size, input_bfd) != rel_size)
3546 	    return FALSE;
3547 	}
3548     }
3549 
3550   /* Relocate the section contents.  */
3551   if (! pdp11_aout_link_input_section (flaginfo, input_bfd, input_section,
3552 				       (bfd_byte *) relocs,
3553 				       rel_size, flaginfo->contents))
3554     return FALSE;
3555 
3556   /* Write out the section contents.  */
3557   if (! bfd_set_section_contents (flaginfo->output_bfd,
3558 				  input_section->output_section,
3559 				  (void *) flaginfo->contents,
3560 				  (file_ptr) input_section->output_offset,
3561 				  input_size))
3562     return FALSE;
3563 
3564   /* If we are producing relocatable output, the relocs were
3565      modified, and we now write them out.  */
3566   if (bfd_link_relocatable (flaginfo->info) && rel_size > 0)
3567     {
3568       if (bfd_seek (flaginfo->output_bfd, *reloff_ptr, SEEK_SET) != 0)
3569 	return FALSE;
3570       if (bfd_bwrite (relocs, rel_size, flaginfo->output_bfd) != rel_size)
3571 	return FALSE;
3572       *reloff_ptr += rel_size;
3573 
3574       /* Assert that the relocs have not run into the symbols, and
3575 	 that if these are the text relocs they have not run into the
3576 	 data relocs.  */
3577       BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (flaginfo->output_bfd)
3578 		  && (reloff_ptr != &flaginfo->treloff
3579 		      || (*reloff_ptr
3580 			  <= obj_datasec (flaginfo->output_bfd)->rel_filepos)));
3581     }
3582 
3583   return TRUE;
3584 }
3585 
3586 /* Link an a.out input BFD into the output file.  */
3587 
3588 static bfd_boolean
aout_link_input_bfd(struct aout_final_link_info * flaginfo,bfd * input_bfd)3589 aout_link_input_bfd (struct aout_final_link_info *flaginfo, bfd *input_bfd)
3590 {
3591   BFD_ASSERT (bfd_get_format (input_bfd) == bfd_object);
3592 
3593   /* If this is a dynamic object, it may need special handling.  */
3594   if ((input_bfd->flags & DYNAMIC) != 0
3595       && aout_backend_info (input_bfd)->link_dynamic_object != NULL)
3596     return ((*aout_backend_info (input_bfd)->link_dynamic_object)
3597 	    (flaginfo->info, input_bfd));
3598 
3599   /* Get the symbols.  We probably have them already, unless
3600      flaginfo->info->keep_memory is FALSE.  */
3601   if (! aout_get_external_symbols (input_bfd))
3602     return FALSE;
3603 
3604   /* Write out the symbols and get a map of the new indices.  The map
3605      is placed into flaginfo->symbol_map.  */
3606   if (! aout_link_write_symbols (flaginfo, input_bfd))
3607     return FALSE;
3608 
3609   /* Relocate and write out the sections.  These functions use the
3610      symbol map created by aout_link_write_symbols.  The linker_mark
3611      field will be set if these sections are to be included in the
3612      link, which will normally be the case.  */
3613   if (obj_textsec (input_bfd)->linker_mark)
3614     {
3615       if (! aout_link_input_section (flaginfo, input_bfd,
3616 				     obj_textsec (input_bfd),
3617 				     &flaginfo->treloff,
3618 				     exec_hdr (input_bfd)->a_trsize))
3619 	return FALSE;
3620     }
3621   if (obj_datasec (input_bfd)->linker_mark)
3622     {
3623       if (! aout_link_input_section (flaginfo, input_bfd,
3624 				     obj_datasec (input_bfd),
3625 				     &flaginfo->dreloff,
3626 				     exec_hdr (input_bfd)->a_drsize))
3627 	return FALSE;
3628     }
3629 
3630   /* If we are not keeping memory, we don't need the symbols any
3631      longer.  We still need them if we are keeping memory, because the
3632      strings in the hash table point into them.  */
3633   if (! flaginfo->info->keep_memory)
3634     {
3635       if (! aout_link_free_symbols (input_bfd))
3636 	return FALSE;
3637     }
3638 
3639   return TRUE;
3640 }
3641 
3642 /* Do the final link step.  This is called on the output BFD.  The
3643    INFO structure should point to a list of BFDs linked through the
3644    link.next field which can be used to find each BFD which takes part
3645    in the output.  Also, each section in ABFD should point to a list
3646    of bfd_link_order structures which list all the input sections for
3647    the output section.  */
3648 
3649 bfd_boolean
NAME(aout,final_link)3650 NAME (aout, final_link) (bfd *abfd,
3651 			 struct bfd_link_info *info,
3652 			 void (*callback) (bfd *, file_ptr *, file_ptr *, file_ptr *))
3653 {
3654   struct aout_final_link_info aout_info;
3655   bfd_boolean includes_hash_initialized = FALSE;
3656   bfd *sub;
3657   bfd_size_type trsize, drsize;
3658   bfd_size_type max_contents_size;
3659   bfd_size_type max_relocs_size;
3660   bfd_size_type max_sym_count;
3661   struct bfd_link_order *p;
3662   asection *o;
3663   bfd_boolean have_link_order_relocs;
3664 
3665   if (bfd_link_pic (info))
3666     abfd->flags |= DYNAMIC;
3667 
3668   aout_info.info = info;
3669   aout_info.output_bfd = abfd;
3670   aout_info.contents = NULL;
3671   aout_info.relocs = NULL;
3672   aout_info.symbol_map = NULL;
3673   aout_info.output_syms = NULL;
3674 
3675   if (!bfd_hash_table_init_n (&aout_info.includes.root,
3676 			      aout_link_includes_newfunc,
3677 			      sizeof (struct aout_link_includes_entry),
3678 			      251))
3679     goto error_return;
3680   includes_hash_initialized = TRUE;
3681 
3682   /* Figure out the largest section size.  Also, if generating
3683      relocatable output, count the relocs.  */
3684   trsize = 0;
3685   drsize = 0;
3686   max_contents_size = 0;
3687   max_relocs_size = 0;
3688   max_sym_count = 0;
3689   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3690     {
3691       size_t sz;
3692 
3693       if (bfd_link_relocatable (info))
3694 	{
3695 	  if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
3696 	    {
3697 	      trsize += exec_hdr (sub)->a_trsize;
3698 	      drsize += exec_hdr (sub)->a_drsize;
3699 	    }
3700 	  else
3701 	    {
3702 	      /* FIXME: We need to identify the .text and .data sections
3703 		 and call get_reloc_upper_bound and canonicalize_reloc to
3704 		 work out the number of relocs needed, and then multiply
3705 		 by the reloc size.  */
3706 	      _bfd_error_handler
3707 		/* xgettext:c-format */
3708 		(_("%B: relocatable link from %s to %s not supported"),
3709 		 abfd, sub->xvec->name, abfd->xvec->name);
3710 	      bfd_set_error (bfd_error_invalid_operation);
3711 	      goto error_return;
3712 	    }
3713 	}
3714 
3715       if (bfd_get_flavour (sub) == bfd_target_aout_flavour)
3716 	{
3717 	  sz = obj_textsec (sub)->size;
3718 	  if (sz > max_contents_size)
3719 	    max_contents_size = sz;
3720 	  sz = obj_datasec (sub)->size;
3721 	  if (sz > max_contents_size)
3722 	    max_contents_size = sz;
3723 
3724 	  sz = exec_hdr (sub)->a_trsize;
3725 	  if (sz > max_relocs_size)
3726 	    max_relocs_size = sz;
3727 	  sz = exec_hdr (sub)->a_drsize;
3728 	  if (sz > max_relocs_size)
3729 	    max_relocs_size = sz;
3730 
3731 	  sz = obj_aout_external_sym_count (sub);
3732 	  if (sz > max_sym_count)
3733 	    max_sym_count = sz;
3734 	}
3735     }
3736 
3737   if (bfd_link_relocatable (info))
3738     {
3739       if (obj_textsec (abfd) != NULL)
3740 	trsize += (_bfd_count_link_order_relocs (obj_textsec (abfd)
3741 						 ->map_head.link_order)
3742 		   * obj_reloc_entry_size (abfd));
3743       if (obj_datasec (abfd) != NULL)
3744 	drsize += (_bfd_count_link_order_relocs (obj_datasec (abfd)
3745 						 ->map_head.link_order)
3746 		   * obj_reloc_entry_size (abfd));
3747     }
3748 
3749   exec_hdr (abfd)->a_trsize = trsize;
3750   exec_hdr (abfd)->a_drsize = drsize;
3751   exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd);
3752 
3753   /* Adjust the section sizes and vmas according to the magic number.
3754      This sets a_text, a_data and a_bss in the exec_hdr and sets the
3755      filepos for each section.  */
3756   if (! NAME (aout, adjust_sizes_and_vmas) (abfd))
3757     goto error_return;
3758 
3759   /* The relocation and symbol file positions differ among a.out
3760      targets.  We are passed a callback routine from the backend
3761      specific code to handle this.
3762      FIXME: At this point we do not know how much space the symbol
3763      table will require.  This will not work for any (nonstandard)
3764      a.out target that needs to know the symbol table size before it
3765      can compute the relocation file positions.  This may or may not
3766      be the case for the hp300hpux target, for example.  */
3767   (*callback) (abfd, &aout_info.treloff, &aout_info.dreloff,
3768 	       &aout_info.symoff);
3769   obj_textsec (abfd)->rel_filepos = aout_info.treloff;
3770   obj_datasec (abfd)->rel_filepos = aout_info.dreloff;
3771   obj_sym_filepos (abfd) = aout_info.symoff;
3772 
3773   /* We keep a count of the symbols as we output them.  */
3774   obj_aout_external_sym_count (abfd) = 0;
3775 
3776   /* We accumulate the string table as we write out the symbols.  */
3777   aout_info.strtab = _bfd_stringtab_init ();
3778   if (aout_info.strtab == NULL)
3779     goto error_return;
3780 
3781   /* Allocate buffers to hold section contents and relocs.  */
3782   aout_info.contents = bfd_malloc (max_contents_size);
3783   aout_info.relocs = bfd_malloc (max_relocs_size);
3784   aout_info.symbol_map = bfd_malloc (max_sym_count * sizeof (int *));
3785   aout_info.output_syms = bfd_malloc ((max_sym_count + 1)
3786 				      * sizeof (struct external_nlist));
3787   if ((aout_info.contents == NULL && max_contents_size != 0)
3788       || (aout_info.relocs == NULL && max_relocs_size != 0)
3789       || (aout_info.symbol_map == NULL && max_sym_count != 0)
3790       || aout_info.output_syms == NULL)
3791     goto error_return;
3792 
3793   /* If we have a symbol named __DYNAMIC, force it out now.  This is
3794      required by SunOS.  Doing this here rather than in sunos.c is a
3795      hack, but it's easier than exporting everything which would be
3796      needed.  */
3797   {
3798     struct aout_link_hash_entry *h;
3799 
3800     h = aout_link_hash_lookup (aout_hash_table (info), "__DYNAMIC",
3801 			       FALSE, FALSE, FALSE);
3802     if (h != NULL)
3803       aout_link_write_other_symbol (&h->root.root, &aout_info);
3804   }
3805 
3806   /* The most time efficient way to do the link would be to read all
3807      the input object files into memory and then sort out the
3808      information into the output file.  Unfortunately, that will
3809      probably use too much memory.  Another method would be to step
3810      through everything that composes the text section and write it
3811      out, and then everything that composes the data section and write
3812      it out, and then write out the relocs, and then write out the
3813      symbols.  Unfortunately, that requires reading stuff from each
3814      input file several times, and we will not be able to keep all the
3815      input files open simultaneously, and reopening them will be slow.
3816 
3817      What we do is basically process one input file at a time.  We do
3818      everything we need to do with an input file once--copy over the
3819      section contents, handle the relocation information, and write
3820      out the symbols--and then we throw away the information we read
3821      from it.  This approach requires a lot of lseeks of the output
3822      file, which is unfortunate but still faster than reopening a lot
3823      of files.
3824 
3825      We use the output_has_begun field of the input BFDs to see
3826      whether we have already handled it.  */
3827   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3828     sub->output_has_begun = FALSE;
3829 
3830   /* Mark all sections which are to be included in the link.  This
3831      will normally be every section.  We need to do this so that we
3832      can identify any sections which the linker has decided to not
3833      include.  */
3834   for (o = abfd->sections; o != NULL; o = o->next)
3835     {
3836       for (p = o->map_head.link_order; p != NULL; p = p->next)
3837 	if (p->type == bfd_indirect_link_order)
3838 	  p->u.indirect.section->linker_mark = TRUE;
3839     }
3840 
3841   have_link_order_relocs = FALSE;
3842   for (o = abfd->sections; o != NULL; o = o->next)
3843     {
3844       for (p = o->map_head.link_order;
3845 	   p != NULL;
3846 	   p = p->next)
3847 	{
3848 	  if (p->type == bfd_indirect_link_order
3849 	      && (bfd_get_flavour (p->u.indirect.section->owner)
3850 		  == bfd_target_aout_flavour))
3851 	    {
3852 	      bfd *input_bfd;
3853 
3854 	      input_bfd = p->u.indirect.section->owner;
3855 	      if (! input_bfd->output_has_begun)
3856 		{
3857 		  if (! aout_link_input_bfd (&aout_info, input_bfd))
3858 		    goto error_return;
3859 		  input_bfd->output_has_begun = TRUE;
3860 		}
3861 	    }
3862 	  else if (p->type == bfd_section_reloc_link_order
3863 		   || p->type == bfd_symbol_reloc_link_order)
3864 	    /* These are handled below.  */
3865 	    have_link_order_relocs = TRUE;
3866 	  else
3867 	    {
3868 	      if (! _bfd_default_link_order (abfd, info, o, p))
3869 		goto error_return;
3870 	    }
3871 	}
3872     }
3873 
3874   /* Write out any symbols that we have not already written out.  */
3875   bfd_hash_traverse (&info->hash->table,
3876 		     aout_link_write_other_symbol,
3877 		     &aout_info);
3878 
3879   /* Now handle any relocs we were asked to create by the linker.
3880      These did not come from any input file.  We must do these after
3881      we have written out all the symbols, so that we know the symbol
3882      indices to use.  */
3883   if (have_link_order_relocs)
3884     {
3885       for (o = abfd->sections; o != NULL; o = o->next)
3886 	{
3887 	  for (p = o->map_head.link_order;
3888 	       p != NULL;
3889 	       p = p->next)
3890 	    {
3891 	      if (p->type == bfd_section_reloc_link_order
3892 		  || p->type == bfd_symbol_reloc_link_order)
3893 		{
3894 		  if (! aout_link_reloc_link_order (&aout_info, o, p))
3895 		    goto error_return;
3896 		}
3897 	    }
3898 	}
3899     }
3900 
3901   if (aout_info.contents != NULL)
3902     {
3903       free (aout_info.contents);
3904       aout_info.contents = NULL;
3905     }
3906   if (aout_info.relocs != NULL)
3907     {
3908       free (aout_info.relocs);
3909       aout_info.relocs = NULL;
3910     }
3911   if (aout_info.symbol_map != NULL)
3912     {
3913       free (aout_info.symbol_map);
3914       aout_info.symbol_map = NULL;
3915     }
3916   if (aout_info.output_syms != NULL)
3917     {
3918       free (aout_info.output_syms);
3919       aout_info.output_syms = NULL;
3920     }
3921   if (includes_hash_initialized)
3922     {
3923       bfd_hash_table_free (&aout_info.includes.root);
3924       includes_hash_initialized = FALSE;
3925     }
3926 
3927   /* Finish up any dynamic linking we may be doing.  */
3928   if (aout_backend_info (abfd)->finish_dynamic_link != NULL)
3929     {
3930       if (! (*aout_backend_info (abfd)->finish_dynamic_link) (abfd, info))
3931 	goto error_return;
3932     }
3933 
3934   /* Update the header information.  */
3935   abfd->symcount = obj_aout_external_sym_count (abfd);
3936   exec_hdr (abfd)->a_syms = abfd->symcount * EXTERNAL_NLIST_SIZE;
3937   obj_str_filepos (abfd) = obj_sym_filepos (abfd) + exec_hdr (abfd)->a_syms;
3938   obj_textsec (abfd)->reloc_count =
3939     exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd);
3940   obj_datasec (abfd)->reloc_count =
3941     exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd);
3942 
3943   /* Write out the string table, unless there are no symbols.  */
3944   if (abfd->symcount > 0)
3945     {
3946       if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
3947 	  || ! emit_stringtab (abfd, aout_info.strtab))
3948 	goto error_return;
3949     }
3950   else if (obj_textsec (abfd)->reloc_count == 0
3951 	   && obj_datasec (abfd)->reloc_count == 0)
3952     {
3953       bfd_byte b;
3954 
3955       b = 0;
3956       if (bfd_seek (abfd,
3957 		    (file_ptr) (obj_datasec (abfd)->filepos
3958 				+ exec_hdr (abfd)->a_data
3959 				- 1),
3960 		    SEEK_SET) != 0
3961 	  || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
3962 	goto error_return;
3963     }
3964 
3965   return TRUE;
3966 
3967  error_return:
3968   if (aout_info.contents != NULL)
3969     free (aout_info.contents);
3970   if (aout_info.relocs != NULL)
3971     free (aout_info.relocs);
3972   if (aout_info.symbol_map != NULL)
3973     free (aout_info.symbol_map);
3974   if (aout_info.output_syms != NULL)
3975     free (aout_info.output_syms);
3976   if (includes_hash_initialized)
3977     bfd_hash_table_free (&aout_info.includes.root);
3978   return FALSE;
3979 }
3980 
3981 /* Adjust and write out the symbols for an a.out file.  Set the new
3982    symbol indices into a symbol_map.  */
3983 
3984 static bfd_boolean
aout_link_write_symbols(struct aout_final_link_info * flaginfo,bfd * input_bfd)3985 aout_link_write_symbols (struct aout_final_link_info *flaginfo, bfd *input_bfd)
3986 {
3987   bfd *output_bfd;
3988   bfd_size_type sym_count;
3989   char *strings;
3990   enum bfd_link_strip strip;
3991   enum bfd_link_discard discard;
3992   struct external_nlist *outsym;
3993   bfd_size_type strtab_index;
3994   struct external_nlist *sym;
3995   struct external_nlist *sym_end;
3996   struct aout_link_hash_entry **sym_hash;
3997   int *symbol_map;
3998   bfd_boolean pass;
3999   bfd_boolean skip_next;
4000 
4001   output_bfd = flaginfo->output_bfd;
4002   sym_count = obj_aout_external_sym_count (input_bfd);
4003   strings = obj_aout_external_strings (input_bfd);
4004   strip = flaginfo->info->strip;
4005   discard = flaginfo->info->discard;
4006   outsym = flaginfo->output_syms;
4007 
4008   /* First write out a symbol for this object file, unless we are
4009      discarding such symbols.  */
4010   if (strip != strip_all
4011       && (strip != strip_some
4012 	  || bfd_hash_lookup (flaginfo->info->keep_hash, input_bfd->filename,
4013 			      FALSE, FALSE) != NULL)
4014       && discard != discard_all)
4015     {
4016       H_PUT_8 (output_bfd, N_TEXT, outsym->e_type);
4017       strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab,
4018 				       input_bfd->filename, FALSE);
4019       if (strtab_index == (bfd_size_type) -1)
4020 	return FALSE;
4021       PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
4022       PUT_WORD (output_bfd,
4023 		(bfd_get_section_vma (output_bfd,
4024 				      obj_textsec (input_bfd)->output_section)
4025 		 + obj_textsec (input_bfd)->output_offset),
4026 		outsym->e_value);
4027       ++obj_aout_external_sym_count (output_bfd);
4028       ++outsym;
4029     }
4030 
4031   pass = FALSE;
4032   skip_next = FALSE;
4033   sym = obj_aout_external_syms (input_bfd);
4034   sym_end = sym + sym_count;
4035   sym_hash = obj_aout_sym_hashes (input_bfd);
4036   symbol_map = flaginfo->symbol_map;
4037   memset (symbol_map, 0, (size_t) sym_count * sizeof *symbol_map);
4038   for (; sym < sym_end; sym++, sym_hash++, symbol_map++)
4039     {
4040       const char *name;
4041       int type;
4042       struct aout_link_hash_entry *h;
4043       bfd_boolean skip;
4044       asection *symsec;
4045       bfd_vma val = 0;
4046       bfd_boolean copy;
4047 
4048       /* We set *symbol_map to 0 above for all symbols.  If it has
4049 	 already been set to -1 for this symbol, it means that we are
4050 	 discarding it because it appears in a duplicate header file.
4051 	 See the N_BINCL code below.  */
4052       if (*symbol_map == -1)
4053 	continue;
4054 
4055       /* Initialize *symbol_map to -1, which means that the symbol was
4056 	 not copied into the output file.  We will change it later if
4057 	 we do copy the symbol over.  */
4058       *symbol_map = -1;
4059 
4060       type = H_GET_8 (input_bfd, sym->e_type);
4061       name = strings + GET_WORD (input_bfd, sym->e_strx);
4062 
4063       h = NULL;
4064 
4065       if (pass)
4066 	{
4067 	  /* Pass this symbol through.  It is the target of an
4068 	     indirect or warning symbol.  */
4069 	  val = GET_WORD (input_bfd, sym->e_value);
4070 	  pass = FALSE;
4071 	}
4072       else if (skip_next)
4073 	{
4074 	  /* Skip this symbol, which is the target of an indirect
4075 	     symbol that we have changed to no longer be an indirect
4076 	     symbol.  */
4077 	  skip_next = FALSE;
4078 	  continue;
4079 	}
4080       else
4081 	{
4082 	  struct aout_link_hash_entry *hresolve;
4083 
4084 	  /* We have saved the hash table entry for this symbol, if
4085 	     there is one.  Note that we could just look it up again
4086 	     in the hash table, provided we first check that it is an
4087 	     external symbol. */
4088 	  h = *sym_hash;
4089 
4090 	  /* Use the name from the hash table, in case the symbol was
4091 	     wrapped.  */
4092 	  if (h != NULL)
4093 	    name = h->root.root.string;
4094 
4095 	  /* If this is an indirect or warning symbol, then change
4096 	     hresolve to the base symbol.  We also change *sym_hash so
4097 	     that the relocation routines relocate against the real
4098 	     symbol.  */
4099 	  hresolve = h;
4100 	  if (h != NULL
4101 	      && (h->root.type == bfd_link_hash_indirect
4102 		  || h->root.type == bfd_link_hash_warning))
4103 	    {
4104 	      hresolve = (struct aout_link_hash_entry *) h->root.u.i.link;
4105 	      while (hresolve->root.type == bfd_link_hash_indirect
4106 		     || hresolve->root.type == bfd_link_hash_warning)
4107 		hresolve = ((struct aout_link_hash_entry *)
4108 			    hresolve->root.u.i.link);
4109 	      *sym_hash = hresolve;
4110 	    }
4111 
4112 	  /* If the symbol has already been written out, skip it.  */
4113 	  if (h != NULL
4114 	      && h->root.type != bfd_link_hash_warning
4115 	      && h->written)
4116 	    {
4117 	      if ((type & N_TYPE) == N_INDR
4118 		  || type == N_WARNING)
4119 		skip_next = TRUE;
4120 	      *symbol_map = h->indx;
4121 	      continue;
4122 	    }
4123 
4124 	  /* See if we are stripping this symbol.  */
4125 	  skip = FALSE;
4126 	  switch (strip)
4127 	    {
4128 	    case strip_none:
4129 	      break;
4130 	    case strip_debugger:
4131 	      if ((type & N_STAB) != 0)
4132 		skip = TRUE;
4133 	      break;
4134 	    case strip_some:
4135 	      if (bfd_hash_lookup (flaginfo->info->keep_hash, name, FALSE, FALSE)
4136 		  == NULL)
4137 		skip = TRUE;
4138 	      break;
4139 	    case strip_all:
4140 	      skip = TRUE;
4141 	      break;
4142 	    }
4143 	  if (skip)
4144 	    {
4145 	      if (h != NULL)
4146 		h->written = TRUE;
4147 	      continue;
4148 	    }
4149 
4150 	  /* Get the value of the symbol.  */
4151 	  if ((type & N_TYPE) == N_TEXT
4152 	      || type == N_WEAKT)
4153 	    symsec = obj_textsec (input_bfd);
4154 	  else if ((type & N_TYPE) == N_DATA
4155 		   || type == N_WEAKD)
4156 	    symsec = obj_datasec (input_bfd);
4157 	  else if ((type & N_TYPE) == N_BSS
4158 		   || type == N_WEAKB)
4159 	    symsec = obj_bsssec (input_bfd);
4160 	  else if ((type & N_TYPE) == N_ABS
4161 		   || type == N_WEAKA)
4162 	    symsec = bfd_abs_section_ptr;
4163 	  else if (((type & N_TYPE) == N_INDR
4164 		    && (hresolve == NULL
4165 			|| (hresolve->root.type != bfd_link_hash_defined
4166 			    && hresolve->root.type != bfd_link_hash_defweak
4167 			    && hresolve->root.type != bfd_link_hash_common)))
4168 		   || type == N_WARNING)
4169 	    {
4170 	      /* Pass the next symbol through unchanged.  The
4171 		 condition above for indirect symbols is so that if
4172 		 the indirect symbol was defined, we output it with
4173 		 the correct definition so the debugger will
4174 		 understand it.  */
4175 	      pass = TRUE;
4176 	      val = GET_WORD (input_bfd, sym->e_value);
4177 	      symsec = NULL;
4178 	    }
4179 	  else if ((type & N_STAB) != 0)
4180 	    {
4181 	      val = GET_WORD (input_bfd, sym->e_value);
4182 	      symsec = NULL;
4183 	    }
4184 	  else
4185 	    {
4186 	      /* If we get here with an indirect symbol, it means that
4187 		 we are outputting it with a real definition.  In such
4188 		 a case we do not want to output the next symbol,
4189 		 which is the target of the indirection.  */
4190 	      if ((type & N_TYPE) == N_INDR)
4191 		skip_next = TRUE;
4192 
4193 	      symsec = NULL;
4194 
4195 	      /* We need to get the value from the hash table.  We use
4196 		 hresolve so that if we have defined an indirect
4197 		 symbol we output the final definition.  */
4198 	      if (h == NULL)
4199 		{
4200 		  switch (type & N_TYPE)
4201 		    {
4202 		    case N_SETT:
4203 		      symsec = obj_textsec (input_bfd);
4204 		      break;
4205 		    case N_SETD:
4206 		      symsec = obj_datasec (input_bfd);
4207 		      break;
4208 		    case N_SETB:
4209 		      symsec = obj_bsssec (input_bfd);
4210 		      break;
4211 		    case N_SETA:
4212 		      symsec = bfd_abs_section_ptr;
4213 		      break;
4214 		    default:
4215 		      val = 0;
4216 		      break;
4217 		    }
4218 		}
4219 	      else if (hresolve->root.type == bfd_link_hash_defined
4220 		       || hresolve->root.type == bfd_link_hash_defweak)
4221 		{
4222 		  asection *input_section;
4223 		  asection *output_section;
4224 
4225 		  /* This case usually means a common symbol which was
4226 		     turned into a defined symbol.  */
4227 		  input_section = hresolve->root.u.def.section;
4228 		  output_section = input_section->output_section;
4229 		  BFD_ASSERT (bfd_is_abs_section (output_section)
4230 			      || output_section->owner == output_bfd);
4231 		  val = (hresolve->root.u.def.value
4232 			 + bfd_get_section_vma (output_bfd, output_section)
4233 			 + input_section->output_offset);
4234 
4235 		  /* Get the correct type based on the section.  If
4236 		     this is a constructed set, force it to be
4237 		     globally visible.  */
4238 		  if (type == N_SETT
4239 		      || type == N_SETD
4240 		      || type == N_SETB
4241 		      || type == N_SETA)
4242 		    type |= N_EXT;
4243 
4244 		  type &=~ N_TYPE;
4245 
4246 		  if (output_section == obj_textsec (output_bfd))
4247 		    type |= (hresolve->root.type == bfd_link_hash_defined
4248 			     ? N_TEXT
4249 			     : N_WEAKT);
4250 		  else if (output_section == obj_datasec (output_bfd))
4251 		    type |= (hresolve->root.type == bfd_link_hash_defined
4252 			     ? N_DATA
4253 			     : N_WEAKD);
4254 		  else if (output_section == obj_bsssec (output_bfd))
4255 		    type |= (hresolve->root.type == bfd_link_hash_defined
4256 			     ? N_BSS
4257 			     : N_WEAKB);
4258 		  else
4259 		    type |= (hresolve->root.type == bfd_link_hash_defined
4260 			     ? N_ABS
4261 			     : N_WEAKA);
4262 		}
4263 	      else if (hresolve->root.type == bfd_link_hash_common)
4264 		val = hresolve->root.u.c.size;
4265 	      else if (hresolve->root.type == bfd_link_hash_undefweak)
4266 		{
4267 		  val = 0;
4268 		  type = N_WEAKU;
4269 		}
4270 	      else
4271 		val = 0;
4272 	    }
4273 	  if (symsec != NULL)
4274 	    val = (symsec->output_section->vma
4275 		   + symsec->output_offset
4276 		   + (GET_WORD (input_bfd, sym->e_value)
4277 		      - symsec->vma));
4278 
4279 	  /* If this is a global symbol set the written flag, and if
4280 	     it is a local symbol see if we should discard it.  */
4281 	  if (h != NULL)
4282 	    {
4283 	      h->written = TRUE;
4284 	      h->indx = obj_aout_external_sym_count (output_bfd);
4285 	    }
4286 	  else if ((type & N_TYPE) != N_SETT
4287 		   && (type & N_TYPE) != N_SETD
4288 		   && (type & N_TYPE) != N_SETB
4289 		   && (type & N_TYPE) != N_SETA)
4290 	    {
4291 	      switch (discard)
4292 		{
4293 		case discard_none:
4294 		case discard_sec_merge:
4295 		  break;
4296 		case discard_l:
4297 		  if ((type & N_STAB) == 0
4298 		      && bfd_is_local_label_name (input_bfd, name))
4299 		    skip = TRUE;
4300 		  break;
4301 		case discard_all:
4302 		  skip = TRUE;
4303 		  break;
4304 		}
4305 	      if (skip)
4306 		{
4307 		  pass = FALSE;
4308 		  continue;
4309 		}
4310 	    }
4311 
4312 	  /* An N_BINCL symbol indicates the start of the stabs
4313 	     entries for a header file.  We need to scan ahead to the
4314 	     next N_EINCL symbol, ignoring nesting, adding up all the
4315 	     characters in the symbol names, not including the file
4316 	     numbers in types (the first number after an open
4317 	     parenthesis).  */
4318 	  if (type == N_BINCL)
4319 	    {
4320 	      struct external_nlist *incl_sym;
4321 	      int nest;
4322 	      struct aout_link_includes_entry *incl_entry;
4323 	      struct aout_link_includes_totals *t;
4324 
4325 	      val = 0;
4326 	      nest = 0;
4327 	      for (incl_sym = sym + 1; incl_sym < sym_end; incl_sym++)
4328 		{
4329 		  int incl_type;
4330 
4331 		  incl_type = H_GET_8 (input_bfd, incl_sym->e_type);
4332 		  if (incl_type == N_EINCL)
4333 		    {
4334 		      if (nest == 0)
4335 			break;
4336 		      --nest;
4337 		    }
4338 		  else if (incl_type == N_BINCL)
4339 		    ++nest;
4340 		  else if (nest == 0)
4341 		    {
4342 		      const char *s;
4343 
4344 		      s = strings + GET_WORD (input_bfd, incl_sym->e_strx);
4345 		      for (; *s != '\0'; s++)
4346 			{
4347 			  val += *s;
4348 			  if (*s == '(')
4349 			    {
4350 			      /* Skip the file number.  */
4351 			      ++s;
4352 			      while (ISDIGIT (*s))
4353 				++s;
4354 			      --s;
4355 			    }
4356 			}
4357 		    }
4358 		}
4359 
4360 	      /* If we have already included a header file with the
4361 		 same value, then replace this one with an N_EXCL
4362 		 symbol.  */
4363 	      copy = ! flaginfo->info->keep_memory;
4364 	      incl_entry = aout_link_includes_lookup (&flaginfo->includes,
4365 						      name, TRUE, copy);
4366 	      if (incl_entry == NULL)
4367 		return FALSE;
4368 	      for (t = incl_entry->totals; t != NULL; t = t->next)
4369 		if (t->total == val)
4370 		  break;
4371 	      if (t == NULL)
4372 		{
4373 		  /* This is the first time we have seen this header
4374 		     file with this set of stabs strings.  */
4375 		  t = bfd_hash_allocate (&flaginfo->includes.root,
4376 					 sizeof *t);
4377 		  if (t == NULL)
4378 		    return FALSE;
4379 		  t->total = val;
4380 		  t->next = incl_entry->totals;
4381 		  incl_entry->totals = t;
4382 		}
4383 	      else
4384 		{
4385 		  int *incl_map;
4386 
4387 		  /* This is a duplicate header file.  We must change
4388 		     it to be an N_EXCL entry, and mark all the
4389 		     included symbols to prevent outputting them.  */
4390 		  type = N_EXCL;
4391 
4392 		  nest = 0;
4393 		  for (incl_sym = sym + 1, incl_map = symbol_map + 1;
4394 		       incl_sym < sym_end;
4395 		       incl_sym++, incl_map++)
4396 		    {
4397 		      int incl_type;
4398 
4399 		      incl_type = H_GET_8 (input_bfd, incl_sym->e_type);
4400 		      if (incl_type == N_EINCL)
4401 			{
4402 			  if (nest == 0)
4403 			    {
4404 			      *incl_map = -1;
4405 			      break;
4406 			    }
4407 			  --nest;
4408 			}
4409 		      else if (incl_type == N_BINCL)
4410 			++nest;
4411 		      else if (nest == 0)
4412 			*incl_map = -1;
4413 		    }
4414 		}
4415 	    }
4416 	}
4417 
4418       /* Copy this symbol into the list of symbols we are going to
4419 	 write out.  */
4420       H_PUT_8 (output_bfd, type, outsym->e_type);
4421       copy = FALSE;
4422       if (! flaginfo->info->keep_memory)
4423 	{
4424 	  /* name points into a string table which we are going to
4425 	     free.  If there is a hash table entry, use that string.
4426 	     Otherwise, copy name into memory.  */
4427 	  if (h != NULL)
4428 	    name = h->root.root.string;
4429 	  else
4430 	    copy = TRUE;
4431 	}
4432       strtab_index = add_to_stringtab (output_bfd, flaginfo->strtab,
4433 				       name, copy);
4434       if (strtab_index == (bfd_size_type) -1)
4435 	return FALSE;
4436       PUT_WORD (output_bfd, strtab_index, outsym->e_strx);
4437       PUT_WORD (output_bfd, val, outsym->e_value);
4438       *symbol_map = obj_aout_external_sym_count (output_bfd);
4439       ++obj_aout_external_sym_count (output_bfd);
4440       ++outsym;
4441     }
4442 
4443   /* Write out the output symbols we have just constructed.  */
4444   if (outsym > flaginfo->output_syms)
4445     {
4446       bfd_size_type size;
4447 
4448       if (bfd_seek (output_bfd, flaginfo->symoff, SEEK_SET) != 0)
4449 	return FALSE;
4450       size = outsym - flaginfo->output_syms;
4451       size *= EXTERNAL_NLIST_SIZE;
4452       if (bfd_bwrite ((void *) flaginfo->output_syms, size, output_bfd) != size)
4453 	return FALSE;
4454       flaginfo->symoff += size;
4455     }
4456 
4457   return TRUE;
4458 }
4459 
4460 /* Write out a symbol that was not associated with an a.out input
4461    object.  */
4462 
4463 static bfd_vma
bfd_getp32(const void * p)4464 bfd_getp32 (const void *p)
4465 {
4466   const bfd_byte *addr = p;
4467   unsigned long v;
4468 
4469   v = (unsigned long) addr[1] << 24;
4470   v |= (unsigned long) addr[0] << 16;
4471   v |= (unsigned long) addr[3] << 8;
4472   v |= (unsigned long) addr[2];
4473   return v;
4474 }
4475 
4476 #define COERCE32(x) (((bfd_signed_vma) (x) ^ 0x80000000) - 0x80000000)
4477 
4478 static bfd_signed_vma
bfd_getp_signed_32(const void * p)4479 bfd_getp_signed_32 (const void *p)
4480 {
4481   const bfd_byte *addr = p;
4482   unsigned long v;
4483 
4484   v = (unsigned long) addr[1] << 24;
4485   v |= (unsigned long) addr[0] << 16;
4486   v |= (unsigned long) addr[3] << 8;
4487   v |= (unsigned long) addr[2];
4488   return COERCE32 (v);
4489 }
4490 
4491 static void
bfd_putp32(bfd_vma data,void * p)4492 bfd_putp32 (bfd_vma data, void *p)
4493 {
4494   bfd_byte *addr = p;
4495 
4496   addr[0] = (data >> 16) & 0xff;
4497   addr[1] = (data >> 24) & 0xff;
4498   addr[2] = (data >> 0) & 0xff;
4499   addr[3] = (data >> 8) & 0xff;
4500 }
4501 
4502 const bfd_target MY (vec) =
4503 {
4504   TARGETNAME,			/* Name.  */
4505   bfd_target_aout_flavour,
4506   BFD_ENDIAN_LITTLE,		/* Target byte order (little).  */
4507   BFD_ENDIAN_LITTLE,		/* Target headers byte order (little).  */
4508   (HAS_RELOC | EXEC_P |		/* Object flags.  */
4509    HAS_LINENO | HAS_DEBUG |
4510    HAS_SYMS | HAS_LOCALS | WP_TEXT),
4511   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA),
4512   MY_symbol_leading_char,
4513   AR_PAD_CHAR,			/* AR_pad_char.  */
4514   15,				/* AR_max_namelen.  */
4515   0,				/* match priority.  */
4516   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
4517      bfd_getp32, bfd_getp_signed_32, bfd_putp32,
4518      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data.  */
4519   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
4520      bfd_getp32, bfd_getp_signed_32, bfd_putp32,
4521      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Headers.  */
4522     {_bfd_dummy_target, MY_object_p,		/* bfd_check_format.  */
4523        bfd_generic_archive_p, MY_core_file_p},
4524     {bfd_false, MY_mkobject,			/* bfd_set_format.  */
4525        _bfd_generic_mkarchive, bfd_false},
4526     {bfd_false, MY_write_object_contents,	/* bfd_write_contents.  */
4527        _bfd_write_archive_contents, bfd_false},
4528 
4529      BFD_JUMP_TABLE_GENERIC (MY),
4530      BFD_JUMP_TABLE_COPY (MY),
4531      BFD_JUMP_TABLE_CORE (MY),
4532      BFD_JUMP_TABLE_ARCHIVE (MY),
4533      BFD_JUMP_TABLE_SYMBOLS (MY),
4534      BFD_JUMP_TABLE_RELOCS (MY),
4535      BFD_JUMP_TABLE_WRITE (MY),
4536      BFD_JUMP_TABLE_LINK (MY),
4537      BFD_JUMP_TABLE_DYNAMIC (MY),
4538 
4539   /* Alternative_target.  */
4540   NULL,
4541 
4542   (void *) MY_backend_data
4543 };
4544