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