Coverage Report

Created: 2023-06-29 07:06

/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
872
#define BYTES_IN_LONG 4
39
#define ARCH_SIZE 16
40
#undef TARGET_IS_BIG_ENDIAN_P
41
42
1.04k
#define TARGET_PAGE_SIZE  8192
43
#define SEGMENT__SIZE TARGET_PAGE_SIZE
44
45
546
#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
546
#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
87
#define TEXT_START_ADDR   0
58
59
/* The header is not included in the text segment.  */
60
174
#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
21.8k
#define N_BADMAG(x) (N_MAGIC(x) != OMAGIC  \
67
21.8k
         && N_MAGIC(x) != NMAGIC  \
68
21.8k
         && N_MAGIC(x) != IMAGIC  \
69
21.8k
         && 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
25.6k
#define EXEC_BYTES_SIZE (8 * 2)
90
91
#define A_MAGIC1  OMAGIC
92
44.7k
#define OMAGIC    0407  /* ...object file or impure executable.  */
93
#define A_MAGIC2  NMAGIC
94
43.9k
#define NMAGIC    0410  /* Pure executable.  */
95
25.6k
#define ZMAGIC    0413  /* Demand-paged executable.  */
96
44.5k
#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
2.54k
#define QMAGIC    0
102
#define BMAGIC    0
103
104
546
#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
1.24k
#define EXTERNAL_NLIST_SIZE 8
130
131
3.27k
#define N_TXTOFF(x) (EXEC_BYTES_SIZE)
132
2.73k
#define N_DATOFF(x) (N_TXTOFF(x) + (x)->a_text)
133
2.18k
#define N_TRELOFF(x)  (N_DATOFF(x) + (x)->a_data)
134
1.63k
#define N_DRELOFF(x)  (N_TRELOFF(x) + (x)->a_trsize)
135
1.09k
#define N_SYMOFF(x) (N_DRELOFF(x) + (x)->a_drsize)
136
546
#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
22.3k
#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
91
#define N_UNDF    0x00  /* Undefined.  */
188
85.5k
#define N_ABS   0x01  /* Absolute.  */
189
2.30k
#define N_TEXT    0x02  /* Text segment.  */
190
1.02k
#define N_DATA    0x03  /* Data segment.  */
191
1.15k
#define N_BSS   0x04  /* Bss segment.  */
192
0
#define N_REG   0x14  /* Register symbol.  */
193
90
#define N_FN    0x1f  /* File name.  */
194
37.2k
#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
69.2k
#define RELOC_SIZE 2
203
204
33.6k
#define RELFLG    0x0001  /* PC-relative flag.  */
205
67.3k
#define RTYPE   0x000e  /* Type mask.  */
206
0
#define RIDXMASK  0xfff0  /* Index mask.  */
207
208
33.6k
#define RABS    0x00  /* Absolute.  */
209
0
#define RTEXT   0x02  /* Text.  */
210
0
#define RDATA   0x04  /* Data.  */
211
0
#define RBSS    0x06  /* Bss.  */
212
33.6k
#define REXT    0x08  /* External.  */
213
214
16.7k
#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
2.76k
{
340
2.76k
  if (type == N_GSYM || type == N_FUN)
341
169
    return strchr (name, ':') != NULL;
342
2.59k
  return type > N_FUN;
343
2.76k
}
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
546
{
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
546
  memset ((void *) execp, 0, sizeof (struct internal_exec));
436
  /* Now fill in fields in the execp, from the bytes in the raw data.  */
437
546
  execp->a_info   = GET_MAGIC (abfd, bytes->e_info);
438
546
  execp->a_text   = GET_WORD (abfd, bytes->e_text);
439
546
  execp->a_data   = GET_WORD (abfd, bytes->e_data);
440
546
  execp->a_bss    = GET_WORD (abfd, bytes->e_bss);
441
546
  execp->a_syms   = GET_WORD (abfd, bytes->e_syms);
442
546
  execp->a_entry  = GET_WORD (abfd, bytes->e_entry);
443
444
546
  if (GET_WORD (abfd, bytes->e_flag) & A_FLAG_RELOC_STRIPPED)
445
166
    {
446
166
      execp->a_trsize = 0;
447
166
      execp->a_drsize = 0;
448
166
    }
449
380
  else
450
380
    {
451
380
      execp->a_trsize = execp->a_text;
452
380
      execp->a_drsize = execp->a_data;
453
380
    }
454
546
}
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
546
{
493
546
  if (obj_textsec (abfd) == NULL && bfd_make_section (abfd, ".text") == NULL)
494
0
    return false;
495
546
  if (obj_datasec (abfd) == NULL && bfd_make_section (abfd, ".data") == NULL)
496
0
    return false;
497
546
  if (obj_bsssec (abfd) == NULL  && bfd_make_section (abfd, ".bss") == NULL)
498
0
    return false;
499
546
  return true;
500
546
}
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
546
{
513
546
  struct aout_data_struct *rawptr, *oldrawptr;
514
546
  bfd_cleanup cleanup;
515
546
  size_t amt = sizeof (struct aout_data_struct);
516
517
546
  rawptr = bfd_zalloc (abfd, amt);
518
546
  if (rawptr == NULL)
519
0
    return 0;
520
521
546
  oldrawptr = abfd->tdata.aout_data;
522
546
  abfd->tdata.aout_data = rawptr;
523
524
  /* Copy the contents of the old tdata struct.  */
525
546
  if (oldrawptr != NULL)
526
0
    *abfd->tdata.aout_data = *oldrawptr;
527
528
546
  abfd->tdata.aout_data->a.hdr = &rawptr->e;
529
546
  *(abfd->tdata.aout_data->a.hdr) = *execp; /* Copy in the internal_exec struct.  */
530
546
  execp = abfd->tdata.aout_data->a.hdr;
531
532
  /* Set the file flags.  */
533
546
  abfd->flags = BFD_NO_FLAGS;
534
546
  if (execp->a_drsize || execp->a_trsize)
535
346
    abfd->flags |= HAS_RELOC;
536
  /* Setting of EXEC_P has been deferred to the bottom of this function.  */
537
546
  if (execp->a_syms)
538
463
    abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS;
539
546
  if (N_DYNAMIC (execp))
540
0
    abfd->flags |= DYNAMIC;
541
542
546
  if (N_MAGIC (execp) == ZMAGIC)
543
29
    {
544
29
      abfd->flags |= D_PAGED | WP_TEXT;
545
29
      adata (abfd).magic = z_magic;
546
29
    }
547
517
  else if (N_MAGIC (execp) == NMAGIC)
548
141
    {
549
141
      abfd->flags |= WP_TEXT;
550
141
      adata (abfd).magic = n_magic;
551
141
    }
552
376
  else if (N_MAGIC (execp) == OMAGIC)
553
193
    adata (abfd).magic = o_magic;
554
183
  else if (N_MAGIC (execp) == IMAGIC)
555
183
    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
546
  abfd->start_address = execp->a_entry;
564
565
546
  obj_aout_symbols (abfd) = NULL;
566
546
  abfd->symcount = execp->a_syms / sizeof (struct external_nlist);
567
568
  /* The default relocation entry size is that of traditional V7 Unix.  */
569
546
  obj_reloc_entry_size (abfd) = RELOC_SIZE;
570
571
  /* The default symbol entry size is that of traditional Unix.  */
572
546
  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
546
  obj_aout_external_syms (abfd) = NULL;
580
546
  obj_aout_external_strings (abfd) = NULL;
581
546
  obj_aout_sym_hashes (abfd) = NULL;
582
583
546
  if (! NAME (aout, make_sections) (abfd))
584
0
    return NULL;
585
586
546
  obj_datasec (abfd)->size = execp->a_data;
587
546
  obj_bsssec (abfd)->size = execp->a_bss;
588
589
546
  obj_textsec (abfd)->flags =
590
546
    (execp->a_trsize != 0
591
546
     ? (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_RELOC)
592
546
     : (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS));
593
546
  obj_datasec (abfd)->flags =
594
546
    (execp->a_drsize != 0
595
546
     ? (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS | SEC_RELOC)
596
546
     : (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS));
597
546
  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
546
  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
546
  if (execp->a_entry != 0
668
546
      || (execp->a_entry >= obj_textsec (abfd)->vma
669
179
    && execp->a_entry < (obj_textsec (abfd)->vma
670
179
             + obj_textsec (abfd)->size)
671
179
    && execp->a_trsize == 0
672
179
    && execp->a_drsize == 0))
673
386
    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
546
  if (!cleanup)
695
0
    {
696
0
      free (rawptr);
697
0
      abfd->tdata.aout_data = oldrawptr;
698
0
    }
699
546
  return cleanup;
700
546
}
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
1.63k
{
1185
  /* Align to double at least.  */
1186
1.63k
  newsect->alignment_power = bfd_get_arch_info(abfd)->section_align_power;
1187
1188
1.63k
  if (bfd_get_format (abfd) == bfd_object)
1189
1.63k
    {
1190
1.63k
      if (obj_textsec (abfd) == NULL
1191
1.63k
    && !strcmp (newsect->name, ".text"))
1192
546
  {
1193
546
    obj_textsec(abfd)= newsect;
1194
546
    newsect->target_index = N_TEXT;
1195
546
  }
1196
1.09k
      else if (obj_datasec (abfd) == NULL
1197
1.09k
         && !strcmp (newsect->name, ".data"))
1198
546
  {
1199
546
    obj_datasec (abfd) = newsect;
1200
546
    newsect->target_index = N_DATA;
1201
546
  }
1202
546
      else if (obj_bsssec (abfd) == NULL
1203
546
         && !strcmp (newsect->name, ".bss"))
1204
546
  {
1205
546
    obj_bsssec (abfd) = newsect;
1206
546
    newsect->target_index = N_BSS;
1207
546
  }
1208
1.63k
    }
1209
1210
  /* We allow more than three sections internally.  */
1211
1.63k
  return _bfd_generic_new_section_hook (abfd, newsect);
1212
1.63k
}
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
376
{
1259
376
  if (obj_aout_external_syms (abfd) == NULL)
1260
237
    {
1261
237
      bfd_size_type count;
1262
237
      struct external_nlist *syms;
1263
1264
237
      count = exec_hdr (abfd)->a_syms / EXTERNAL_NLIST_SIZE;
1265
1266
      /* PR 17512: file: 011f5a08.  */
1267
237
      if (count == 0)
1268
8
  {
1269
8
    obj_aout_external_syms (abfd) = NULL;
1270
8
    obj_aout_external_sym_count (abfd) = count;
1271
8
    return true;
1272
8
  }
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
229
      if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
1285
0
  return false;
1286
229
      syms = (struct external_nlist *)
1287
229
  _bfd_malloc_and_read (abfd, count * EXTERNAL_NLIST_SIZE,
1288
229
            count * EXTERNAL_NLIST_SIZE);
1289
229
      if (syms == NULL)
1290
50
  return false;
1291
179
#endif
1292
1293
179
      obj_aout_external_syms (abfd) = syms;
1294
179
      obj_aout_external_sym_count (abfd) = count;
1295
179
    }
1296
1297
318
  if (obj_aout_external_strings (abfd) == NULL
1298
318
      && exec_hdr (abfd)->a_syms != 0)
1299
179
    {
1300
179
      unsigned char string_chars[BYTES_IN_LONG];
1301
179
      bfd_size_type stringsize;
1302
179
      char *strings;
1303
179
      bfd_size_type amt = BYTES_IN_LONG;
1304
1305
      /* Get the size of the strings.  */
1306
179
      if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0
1307
179
    || bfd_bread ((void *) string_chars, amt, abfd) != amt)
1308
2
  return false;
1309
177
      stringsize = H_GET_32 (abfd, string_chars);
1310
177
      if (stringsize == 0)
1311
65
  stringsize = 1;
1312
112
      else if (stringsize < BYTES_IN_LONG
1313
112
         || (size_t) stringsize != stringsize)
1314
2
  {
1315
2
    bfd_set_error (bfd_error_bad_value);
1316
2
    return false;
1317
2
  }
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
175
  {
1330
175
    strings = (char *) bfd_malloc (stringsize + 1);
1331
175
    if (strings == NULL)
1332
0
      return false;
1333
1334
175
    if (stringsize >= BYTES_IN_LONG)
1335
110
      {
1336
110
        amt = stringsize - BYTES_IN_LONG;
1337
110
        if (bfd_bread (strings + BYTES_IN_LONG, amt, abfd) != amt)
1338
36
    {
1339
36
      free (strings);
1340
36
      return false;
1341
36
    }
1342
110
      }
1343
175
  }
1344
      /* Ensure that a zero index yields an empty string.  */
1345
139
      if (stringsize >= BYTES_IN_WORD)
1346
74
  memset (strings, 0, BYTES_IN_LONG);
1347
1348
      /* Ensure that the string buffer is NUL terminated.  */
1349
139
      strings[stringsize] = 0;
1350
1351
139
      obj_aout_external_strings (abfd) = strings;
1352
139
      obj_aout_external_string_size (abfd) = stringsize;
1353
139
    }
1354
1355
278
  return true;
1356
318
}
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
2.76k
{
1367
2.76k
  flagword visible;
1368
1369
2.76k
  if (is_stab (cache_ptr->type, cache_ptr->symbol.name))
1370
275
    {
1371
275
      asection *sec;
1372
1373
      /* This is a debugging symbol.  */
1374
275
      cache_ptr->symbol.flags = BSF_DEBUGGING;
1375
1376
      /* Work out the symbol section.  */
1377
275
      switch (cache_ptr->type)
1378
275
  {
1379
54
  case N_SO:
1380
61
  case N_SOL:
1381
65
  case N_FUN:
1382
73
  case N_ENTRY:
1383
90
  case N_SLINE:
1384
90
  case N_FN:
1385
90
    sec = obj_textsec (abfd);
1386
90
    break;
1387
14
  case N_STSYM:
1388
34
  case N_DSLINE:
1389
34
    sec = obj_datasec (abfd);
1390
34
    break;
1391
1
  case N_LCSYM:
1392
11
  case N_BSLINE:
1393
11
    sec = obj_bsssec (abfd);
1394
11
    break;
1395
140
  default:
1396
140
    sec = bfd_abs_section_ptr;
1397
140
    break;
1398
275
  }
1399
1400
275
      cache_ptr->symbol.section = sec;
1401
275
      cache_ptr->symbol.value -= sec->vma;
1402
1403
275
      return true;
1404
275
    }
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
2.49k
  if ((cache_ptr->type & N_EXT) == 0)
1409
2.23k
    visible = BSF_LOCAL;
1410
256
  else
1411
256
    visible = BSF_GLOBAL;
1412
1413
2.49k
  switch (cache_ptr->type)
1414
2.49k
    {
1415
2.04k
    default:
1416
2.12k
    case N_ABS: case N_ABS | N_EXT:
1417
2.12k
      cache_ptr->symbol.section = bfd_abs_section_ptr;
1418
2.12k
      cache_ptr->symbol.flags = visible;
1419
2.12k
      break;
1420
1421
91
    case N_UNDF | N_EXT:
1422
91
      if (cache_ptr->symbol.value != 0)
1423
23
  {
1424
    /* This is a common symbol.  */
1425
23
    cache_ptr->symbol.flags = BSF_GLOBAL;
1426
23
    cache_ptr->symbol.section = bfd_com_section_ptr;
1427
23
  }
1428
68
      else
1429
68
  {
1430
68
    cache_ptr->symbol.flags = 0;
1431
68
    cache_ptr->symbol.section = bfd_und_section_ptr;
1432
68
  }
1433
91
      break;
1434
1435
128
    case N_TEXT: case N_TEXT | N_EXT:
1436
128
      cache_ptr->symbol.section = obj_textsec (abfd);
1437
128
      cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1438
128
      cache_ptr->symbol.flags = visible;
1439
128
      break;
1440
1441
62
    case N_DATA: case N_DATA | N_EXT:
1442
62
      cache_ptr->symbol.section = obj_datasec (abfd);
1443
62
      cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1444
62
      cache_ptr->symbol.flags = visible;
1445
62
      break;
1446
1447
90
    case N_BSS: case N_BSS | N_EXT:
1448
90
      cache_ptr->symbol.section = obj_bsssec (abfd);
1449
90
      cache_ptr->symbol.value -= cache_ptr->symbol.section->vma;
1450
90
      cache_ptr->symbol.flags = visible;
1451
90
      break;
1452
2.49k
    }
1453
1454
2.49k
  return true;
1455
2.49k
}
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
2.10k
{
1535
2.10k
  size_t amt = sizeof (aout_symbol_type);
1536
2.10k
  aout_symbol_type *new_symbol_type = bfd_zalloc (abfd, amt);
1537
1538
2.10k
  if (!new_symbol_type)
1539
0
    return NULL;
1540
2.10k
  new_symbol_type->symbol.the_bfd = abfd;
1541
1542
2.10k
  return &new_symbol_type->symbol;
1543
2.10k
}
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
143
{
1556
143
  struct external_nlist *ext_end;
1557
1558
143
  ext_end = ext + count;
1559
2.90k
  for (; ext < ext_end; ext++, in++)
1560
2.78k
    {
1561
2.78k
      bfd_vma x;
1562
2.78k
      int ovly;
1563
1564
2.78k
      x = GET_WORD (abfd, ext->e_strx);
1565
2.78k
      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
2.78k
      if (x == 0 && ! dynamic)
1573
2.53k
  in->symbol.name = "";
1574
254
      else if (x < strsize)
1575
236
  in->symbol.name = str + x;
1576
18
      else
1577
18
  {
1578
18
    _bfd_error_handler
1579
18
      (_("%pB: invalid string offset %" PRIu64 " >= %" PRIu64),
1580
18
       abfd, (uint64_t) x, (uint64_t) strsize);
1581
18
    bfd_set_error (bfd_error_bad_value);
1582
18
    return false;
1583
18
  }
1584
1585
2.77k
      ovly = H_GET_8 (abfd, ext->e_ovly);
1586
2.77k
      if (ovly != 0)
1587
5
  {
1588
5
    _bfd_error_handler
1589
5
      (_("%pB: symbol indicates overlay (not supported)"), abfd);
1590
5
    bfd_set_error (bfd_error_bad_value);
1591
5
    return false;
1592
5
  }
1593
1594
2.76k
      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
2.76k
      in->desc = H_GET_16 (abfd, ext->e_desc);
1598
2.76k
      in->other = 0;
1599
2.76k
      in->type = H_GET_8 (abfd,  ext->e_type);
1600
2.76k
      in->symbol.udata.p = NULL;
1601
1602
2.76k
      if (! translate_from_native_sym_flags (abfd, in))
1603
0
  return false;
1604
1605
2.76k
      if (dynamic)
1606
0
  in->symbol.flags |= BSF_DYNAMIC;
1607
2.76k
    }
1608
1609
120
  return true;
1610
143
}
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
489
{
1619
489
  struct external_nlist *old_external_syms;
1620
489
  aout_symbol_type *cached;
1621
489
  bfd_size_type cached_size;
1622
1623
  /* If there's no work to be done, don't do any.  */
1624
489
  if (obj_aout_symbols (abfd) != NULL)
1625
346
    return true;
1626
1627
143
  old_external_syms = obj_aout_external_syms (abfd);
1628
1629
143
  if (! aout_get_external_symbols (abfd))
1630
0
    return false;
1631
1632
143
  cached_size = obj_aout_external_sym_count (abfd);
1633
143
  cached_size *= sizeof (aout_symbol_type);
1634
143
  cached = bfd_zmalloc (cached_size);
1635
143
  if (cached == NULL && cached_size != 0)
1636
0
    return false;
1637
1638
  /* Convert from external symbol information to internal.  */
1639
143
  if (! (NAME (aout, translate_symbol_table)
1640
143
   (abfd, cached,
1641
143
    obj_aout_external_syms (abfd),
1642
143
    obj_aout_external_sym_count (abfd),
1643
143
    obj_aout_external_strings (abfd),
1644
143
    obj_aout_external_string_size (abfd),
1645
143
    false)))
1646
23
    {
1647
23
      free (cached);
1648
23
      return false;
1649
23
    }
1650
1651
120
  abfd->symcount = obj_aout_external_sym_count (abfd);
1652
1653
120
  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
120
  if (old_external_syms == NULL
1660
120
      && 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
120
  return true;
1671
143
}
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
233
{
1794
233
  unsigned int counter = 0;
1795
233
  aout_symbol_type *symbase;
1796
1797
233
  if (!NAME (aout, slurp_symbol_table) (abfd))
1798
0
    return -1;
1799
1800
4.71k
  for (symbase = obj_aout_symbols (abfd); counter++ < bfd_get_symcount (abfd);)
1801
4.48k
    *(location++) = (asymbol *)(symbase++);
1802
233
  *location++ =0;
1803
233
  return bfd_get_symcount (abfd);
1804
233
}
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
33.6k
  if (r_extern)               \
1862
33.6k
    {                 \
1863
1.45k
      /* Undefined symbol.  */            \
1864
1.45k
      if (symbols != NULL && r_index < bfd_get_symcount (abfd))   \
1865
1.45k
  cache_ptr->sym_ptr_ptr = symbols + r_index;     \
1866
1.45k
      else                \
1867
1.45k
  cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; \
1868
1.45k
      cache_ptr->addend = ad;           \
1869
1.45k
    }                  \
1870
33.6k
  else                  \
1871
33.6k
    {                 \
1872
32.2k
      /* Defined, section relative. replace symbol with pointer to  \
1873
32.2k
   symbol which points to section.  */        \
1874
32.2k
      switch (r_index)              \
1875
32.2k
  {               \
1876
603
  case N_TEXT:             \
1877
621
  case N_TEXT | N_EXT:           \
1878
621
    cache_ptr->sym_ptr_ptr  = obj_textsec (abfd)->symbol_ptr_ptr;  \
1879
621
    cache_ptr->addend = ad  - su->textsec->vma;     \
1880
621
    break;             \
1881
603
  case N_DATA:             \
1882
213
  case N_DATA | N_EXT:           \
1883
213
    cache_ptr->sym_ptr_ptr  = obj_datasec (abfd)->symbol_ptr_ptr;  \
1884
213
    cache_ptr->addend = ad - su->datasec->vma;      \
1885
213
    break;             \
1886
240
  case N_BSS:             \
1887
259
  case N_BSS | N_EXT:           \
1888
259
    cache_ptr->sym_ptr_ptr  = obj_bsssec (abfd)->symbol_ptr_ptr;  \
1889
259
    cache_ptr->addend = ad - su->bsssec->vma;     \
1890
259
    break;             \
1891
10.9k
  default:              \
1892
31.0k
  case N_ABS:             \
1893
31.1k
  case N_ABS | N_EXT:           \
1894
31.1k
    cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; \
1895
31.1k
    cache_ptr->addend = ad;         \
1896
31.1k
    break;             \
1897
32.2k
  }               \
1898
32.2k
    }
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
33.6k
{
1908
33.6k
  struct aoutdata *su = &(abfd->tdata.aout_data->a);
1909
33.6k
  unsigned int r_index;
1910
33.6k
  int reloc_entry;
1911
33.6k
  int r_extern;
1912
33.6k
  int r_pcrel;
1913
1914
33.6k
  reloc_entry = GET_WORD (abfd, (void *) bytes);
1915
1916
33.6k
  r_pcrel = reloc_entry & RELFLG;
1917
1918
33.6k
  cache_ptr->address = offset;
1919
33.6k
  cache_ptr->howto = howto_table_pdp11 + (r_pcrel ? 1 : 0);
1920
1921
33.6k
  if ((reloc_entry & RTYPE) == RABS)
1922
16.8k
    r_index = N_ABS;
1923
16.7k
  else
1924
16.7k
    r_index = RINDEX (reloc_entry);
1925
1926
  /* r_extern reflects whether the symbol the reloc is against is
1927
     local or global.  */
1928
33.6k
  r_extern = (reloc_entry & RTYPE) == REXT;
1929
1930
33.6k
  if (r_extern && r_index >= symcount)
1931
2.29k
    {
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
2.29k
      r_extern = 0;
1937
2.29k
      r_index = N_ABS;
1938
2.29k
    }
1939
1940
33.6k
  MOVE_ADDRESS(0);
1941
33.6k
}
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
63
{
1948
63
  bfd_byte *rptr;
1949
63
  bfd_size_type count;
1950
63
  bfd_size_type reloc_size;
1951
63
  void * relocs;
1952
63
  arelent *reloc_cache;
1953
63
  size_t each_size;
1954
63
  unsigned int counter = 0;
1955
63
  arelent *cache_ptr;
1956
1957
63
  if (asect->relocation)
1958
0
    return true;
1959
1960
63
  if (asect->flags & SEC_CONSTRUCTOR)
1961
0
    return true;
1962
1963
63
  if (asect == obj_datasec (abfd))
1964
39
    reloc_size = exec_hdr(abfd)->a_drsize;
1965
24
  else if (asect == obj_textsec (abfd))
1966
24
    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
63
  if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0)
1976
0
    return false;
1977
63
  relocs = _bfd_malloc_and_read (abfd, reloc_size, reloc_size);
1978
63
  if (relocs == NULL && reloc_size != 0)
1979
0
    return false;
1980
1981
63
  each_size = obj_reloc_entry_size (abfd);
1982
63
  count = reloc_size / each_size;
1983
1984
  /* Count the number of NON-ZERO relocs, this is the count we want.  */
1985
63
  {
1986
63
    unsigned int real_count = 0;
1987
1988
68.8k
    for (counter = 0; counter < count; counter++)
1989
68.7k
      {
1990
68.7k
  int x;
1991
1992
68.7k
  x = GET_WORD (abfd, (char *) relocs + each_size * counter);
1993
68.7k
  if (x != 0)
1994
33.6k
    real_count++;
1995
68.7k
      }
1996
1997
63
    count = real_count;
1998
63
  }
1999
2000
63
  reloc_cache = bfd_zmalloc (count * sizeof (arelent));
2001
63
  if (reloc_cache == NULL && count != 0)
2002
0
    return false;
2003
2004
63
  cache_ptr = reloc_cache;
2005
2006
63
  rptr = relocs;
2007
63
  for (counter = 0;
2008
33.7k
       counter < count;
2009
33.6k
       counter++, rptr += RELOC_SIZE, cache_ptr++)
2010
33.6k
    {
2011
68.6k
      while (GET_WORD (abfd, (void *) rptr) == 0)
2012
35.0k
  {
2013
35.0k
    rptr += RELOC_SIZE;
2014
35.0k
    if ((char *) rptr >= (char *) relocs + reloc_size)
2015
0
      goto done;
2016
35.0k
  }
2017
2018
33.6k
      pdp11_aout_swap_reloc_in (abfd, rptr, cache_ptr,
2019
33.6k
        (bfd_size_type) ((char *) rptr - (char *) relocs),
2020
33.6k
        symbols,
2021
33.6k
        (bfd_size_type) bfd_get_symcount (abfd));
2022
33.6k
    }
2023
63
 done:
2024
  /* Just in case, if rptr >= relocs + reloc_size should happen
2025
     too early.  */
2026
63
  BFD_ASSERT (counter == count);
2027
2028
63
  free (relocs);
2029
2030
63
  asect->relocation = reloc_cache;
2031
63
  asect->reloc_count = cache_ptr - reloc_cache;
2032
2033
63
  return true;
2034
63
}
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
63
{
2092
63
  arelent *tblptr = section->relocation;
2093
63
  unsigned int count;
2094
2095
63
  if (section == obj_bsssec (abfd))
2096
0
    {
2097
0
      *relptr = NULL;
2098
0
      return 0;
2099
0
    }
2100
2101
63
  if (!(tblptr || NAME (aout, slurp_reloc_table)(abfd, section, symbols)))
2102
0
    return -1;
2103
2104
63
  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
63
  else
2115
63
    {
2116
63
      tblptr = section->relocation;
2117
2118
33.7k
      for (count = 0; count++ < section->reloc_count;)
2119
33.6k
  *relptr++ = tblptr++;
2120
63
    }
2121
2122
63
  *relptr = 0;
2123
2124
63
  return section->reloc_count;
2125
63
}
2126
2127
long
2128
NAME (aout, get_reloc_upper_bound) (bfd *abfd, sec_ptr asect)
2129
63
{
2130
63
  size_t count, raw;
2131
2132
63
  if (asect->flags & SEC_CONSTRUCTOR)
2133
0
    count = asect->reloc_count;
2134
63
  else if (asect == obj_datasec (abfd))
2135
39
    count = exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd);
2136
24
  else if (asect == obj_textsec (abfd))
2137
24
    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
63
  if (count >= LONG_MAX / sizeof (arelent *)
2147
63
      || _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
63
  if (!bfd_write_p (abfd))
2153
63
    {
2154
63
      ufile_ptr filesize = bfd_get_file_size (abfd);
2155
63
      if (filesize != 0 && raw > filesize)
2156
0
  {
2157
0
    bfd_set_error (bfd_error_file_truncated);
2158
0
    return -1;
2159
0
  }
2160
63
    }
2161
63
  return (count + 1) * sizeof (arelent *);
2162
63
}
2163
2164

2165
long
2166
NAME (aout, get_symtab_upper_bound) (bfd *abfd)
2167
256
{
2168
256
  if (!NAME (aout, slurp_symbol_table) (abfd))
2169
23
    return -1;
2170
2171
233
  return (bfd_get_symcount (abfd) + 1) * (sizeof (aout_symbol_type *));
2172
256
}
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
2.05k
{
2186
2.05k
  bfd_symbol_info (symbol, ret);
2187
2188
2.05k
  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
2.05k
}
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
33.5k
#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
233
{
2260
233
  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
233
  if (! aout_get_external_symbols (abfd))
2266
90
    return -1;
2267
2268
143
  if (obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
2269
143
    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
143
}
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
33.4k
{
2293
33.4k
  if (dynamic
2294
33.4k
      || obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD)
2295
33.4k
    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
269
{
2327
  /* Run down the file looking for the filename, function and linenumber.  */
2328
269
  asymbol **p;
2329
269
  const char *directory_name = NULL;
2330
269
  const char *main_file_name = NULL;
2331
269
  const char *current_file_name = NULL;
2332
269
  const char *line_file_name = NULL; /* Value of current_file_name at line number.  */
2333
269
  bfd_vma low_line_vma = 0;
2334
269
  bfd_vma low_func_vma = 0;
2335
269
  asymbol *func = 0;
2336
269
  size_t filelen, funclen;
2337
269
  char *buf;
2338
2339
269
  *filename_ptr = bfd_get_filename (abfd);
2340
269
  *functionname_ptr = NULL;
2341
269
  *line_ptr = 0;
2342
269
  if (discriminator_ptr)
2343
0
    *discriminator_ptr = 0;
2344
2345
269
  if (symbols != NULL)
2346
269
    {
2347
10.4k
      for (p = symbols; *p; p++)
2348
10.2k
  {
2349
10.2k
    aout_symbol_type  *q = (aout_symbol_type *)(*p);
2350
10.3k
  next:
2351
10.3k
    switch (q->type)
2352
10.3k
      {
2353
280
      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
280
        if (q->symbol.value <= offset
2359
280
      && ((q->symbol.value > low_line_vma
2360
213
           && (line_file_name != NULL
2361
169
         || *line_ptr != 0))
2362
213
          || (q->symbol.value > low_func_vma
2363
174
        && func != NULL)))
2364
61
    {
2365
61
      const char * symname;
2366
2367
61
      symname = q->symbol.name;
2368
2369
61
      if (symname != NULL
2370
61
          && strlen (symname) > 2
2371
61
          && strcmp (symname + strlen (symname) - 2, ".o") == 0)
2372
12
        {
2373
12
          if (q->symbol.value > low_line_vma)
2374
12
      {
2375
12
        *line_ptr = 0;
2376
12
        line_file_name = NULL;
2377
12
      }
2378
12
          if (q->symbol.value > low_func_vma)
2379
6
      func = NULL;
2380
12
        }
2381
61
    }
2382
280
        break;
2383
2384
101
      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
101
        if (q->symbol.value <= offset)
2389
78
    {
2390
78
      if (q->symbol.value > low_line_vma)
2391
54
        {
2392
54
          *line_ptr = 0;
2393
54
          line_file_name = NULL;
2394
54
        }
2395
78
      if (q->symbol.value > low_func_vma)
2396
38
        func = NULL;
2397
78
    }
2398
2399
101
        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
101
        p++;
2402
101
        if (*p == NULL)
2403
22
    goto done;
2404
79
        q = (aout_symbol_type *)(*p);
2405
79
        if (q->type != (int) N_SO)
2406
58
    goto next;
2407
2408
        /* Found a second N_SO  First is directory; second is filename.  */
2409
21
        directory_name = current_file_name;
2410
21
        main_file_name = current_file_name = q->symbol.name;
2411
21
        if (obj_textsec(abfd) != section)
2412
15
    goto done;
2413
6
        break;
2414
12
      case N_SOL:
2415
12
        current_file_name = q->symbol.name;
2416
12
        break;
2417
2418
21
      case N_SLINE:
2419
57
      case N_DSLINE:
2420
82
      case N_BSLINE:
2421
        /* We'll keep this if it resolves nearer than the one we have
2422
     already.  */
2423
82
        if (q->symbol.value >= low_line_vma
2424
82
      && q->symbol.value <= offset)
2425
61
    {
2426
61
      *line_ptr = q->desc;
2427
61
      low_line_vma = q->symbol.value;
2428
61
      line_file_name = current_file_name;
2429
61
    }
2430
82
        break;
2431
2432
201
      case N_FUN:
2433
201
        {
2434
    /* We'll keep this if it is nearer than the one we have already.  */
2435
201
    if (q->symbol.value >= low_func_vma &&
2436
201
        q->symbol.value <= offset)
2437
142
      {
2438
142
        low_func_vma = q->symbol.value;
2439
142
        func = (asymbol *) q;
2440
142
      }
2441
59
    else if (q->symbol.value > offset)
2442
31
      goto done;
2443
201
        }
2444
170
        break;
2445
10.3k
      }
2446
10.3k
  }
2447
269
    }
2448
2449
269
 done:
2450
269
  if (*line_ptr != 0)
2451
27
    main_file_name = line_file_name;
2452
2453
269
  if (main_file_name == NULL
2454
269
      || main_file_name[0] == '/'
2455
269
      || directory_name == NULL)
2456
248
    filelen = 0;
2457
21
  else
2458
21
    filelen = strlen (directory_name) + strlen (main_file_name);
2459
269
  if (func == NULL)
2460
185
    funclen = 0;
2461
84
  else
2462
84
    funclen = strlen (bfd_asymbol_name (func));
2463
2464
269
  free (adata (abfd).line_buf);
2465
269
  if (filelen + funclen == 0)
2466
238
    adata (abfd).line_buf = buf = NULL;
2467
31
  else
2468
31
    {
2469
31
      buf = bfd_malloc ((bfd_size_type) filelen + funclen + 3);
2470
31
      adata (abfd).line_buf = buf;
2471
31
      if (buf == NULL)
2472
0
  return false;
2473
31
    }
2474
2475
269
  if (main_file_name != NULL)
2476
84
    {
2477
84
      if (main_file_name[0] == '/' || directory_name == NULL)
2478
63
  *filename_ptr = main_file_name;
2479
21
      else
2480
21
  {
2481
21
    if (buf == NULL)
2482
      /* PR binutils/20891: In a corrupt input file both
2483
         main_file_name and directory_name can be empty...  */
2484
12
      * filename_ptr = NULL;
2485
9
    else
2486
9
      {
2487
9
        snprintf (buf, filelen + 1, "%s%s", directory_name,
2488
9
      main_file_name);
2489
9
        *filename_ptr = buf;
2490
9
        buf += filelen + 1;
2491
9
      }
2492
21
  }
2493
84
    }
2494
2495
269
  if (func)
2496
84
    {
2497
84
      const char *function = func->name;
2498
84
      char *colon;
2499
2500
84
      if (buf == NULL)
2501
56
  {
2502
    /* PR binutils/20892: In a corrupt input file func can be empty.  */
2503
56
    * functionname_ptr = NULL;
2504
56
    return true;
2505
56
  }
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
28
      if (bfd_get_symbol_leading_char (abfd) == '\0')
2510
0
  strcpy (buf, function);
2511
28
      else
2512
28
  {
2513
28
    buf[0] = bfd_get_symbol_leading_char (abfd);
2514
28
    strcpy (buf + 1, function);
2515
28
  }
2516
2517
      /* Have to remove : stuff.  */
2518
28
      colon = strchr (buf, ':');
2519
28
      if (colon != NULL)
2520
6
  *colon = '\0';
2521
28
      *functionname_ptr = buf;
2522
28
    }
2523
2524
213
  return true;
2525
269
}
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
252
{
2539
252
  if ((bfd_get_format (abfd) == bfd_object
2540
252
       || bfd_get_format (abfd) == bfd_core)
2541
252
      && abfd->tdata.aout_data != NULL)
2542
243
    {
2543
1.70k
#define BFCI_FREE(x) do { free (x); x = NULL; } while (0)
2544
243
      BFCI_FREE (adata (abfd).line_buf);
2545
243
      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
243
      BFCI_FREE (obj_aout_external_syms (abfd));
2553
243
      BFCI_FREE (obj_aout_external_strings (abfd));
2554
243
#endif
2555
972
      for (asection *o = abfd->sections; o != NULL; o = o->next)
2556
729
  BFCI_FREE (o->relocation);
2557
243
#undef BFCI_FREE
2558
243
    }
2559
2560
252
  return _bfd_generic_bfd_free_cached_info (abfd);
2561
252
}
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
290
{
4647
290
  const bfd_byte *addr = p;
4648
290
  unsigned long v;
4649
4650
290
  v = (unsigned long) addr[1] << 24;
4651
290
  v |= (unsigned long) addr[0] << 16;
4652
290
  v |= (unsigned long) addr[3] << 8;
4653
290
  v |= (unsigned long) addr[2];
4654
290
  return v;
4655
290
}
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
};