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