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