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