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