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