Coverage Report

Created: 2023-06-29 07:09

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