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