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