Coverage Report

Created: 2026-03-10 08:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/bfd/xcofflink.c
Line
Count
Source
1
/* POWER/PowerPC XCOFF linker support.
2
   Copyright (C) 1995-2026 Free Software Foundation, Inc.
3
   Written by Ian Lance Taylor <ian@cygnus.com>, Cygnus Support.
4
5
   This file is part of BFD, the Binary File Descriptor library.
6
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
22
#include "sysdep.h"
23
#include "bfd.h"
24
#include "bfdlink.h"
25
#include "libbfd.h"
26
#include "coff/internal.h"
27
#include "coff/xcoff.h"
28
#include "libcoff.h"
29
#include "libxcoff.h"
30
#include "libiberty.h"
31
#include "xcofflink.h"
32
33
/* This file holds the XCOFF linker code.  */
34
35
#undef  STRING_SIZE_SIZE
36
0
#define STRING_SIZE_SIZE 4
37
38
/* The list of import files.  */
39
40
struct xcoff_import_file
41
{
42
  /* The next entry in the list.  */
43
  struct xcoff_import_file *next;
44
  /* The path.  */
45
  const char *path;
46
  /* The file name.  */
47
  const char *file;
48
  /* The member name.  */
49
  const char *member;
50
};
51
52
/* Information we keep for each section in the output file during the
53
   final link phase.  */
54
55
struct xcoff_link_section_info
56
{
57
  /* The relocs to be output.  */
58
  struct internal_reloc *relocs;
59
  /* For each reloc against a global symbol whose index was not known
60
     when the reloc was handled, the global hash table entry.  */
61
  struct xcoff_link_hash_entry **rel_hashes;
62
  /* If there is a TOC relative reloc against a global symbol, and the
63
     index of the TOC symbol is not known when the reloc was handled,
64
     an entry is added to this linked list.  This is not an array,
65
     like rel_hashes, because this case is quite uncommon.  */
66
  struct xcoff_toc_rel_hash
67
  {
68
    struct xcoff_toc_rel_hash *next;
69
    struct xcoff_link_hash_entry *h;
70
    struct internal_reloc *rel;
71
  } *toc_rel_hashes;
72
};
73
74
/* Information that the XCOFF linker collects about an archive.  */
75
struct xcoff_archive_info
76
{
77
  /* The archive described by this entry.  */
78
  bfd *archive;
79
80
  /* The import path and import filename to use when referring to
81
     this archive in the .loader section.  */
82
  const char *imppath;
83
  const char *impfile;
84
85
  /* True if the archive contains a dynamic object.  */
86
  unsigned int contains_shared_object_p : 1;
87
88
  /* True if the previous field is valid.  */
89
  unsigned int know_contains_shared_object_p : 1;
90
};
91
92
struct xcoff_link_hash_table
93
{
94
  struct bfd_link_hash_table root;
95
96
  /* The stub hash table.  */
97
  struct bfd_hash_table stub_hash_table;
98
99
  /* Info passed by the linker.  */
100
  struct bfd_xcoff_link_params *params;
101
102
  /* The .debug string hash table.  We need to compute this while
103
     reading the input files, so that we know how large the .debug
104
     section will be before we assign section positions.  */
105
  struct bfd_strtab_hash *debug_strtab;
106
107
  /* The .debug section we will use for the final output.  */
108
  asection *debug_section;
109
110
  /* The .loader section we will use for the final output.  */
111
  asection *loader_section;
112
113
  /* The structure holding information about the .loader section.  */
114
  struct xcoff_loader_info ldinfo;
115
116
  /* The .loader section header.  */
117
  struct internal_ldhdr ldhdr;
118
119
  /* The .gl section we use to hold global linkage code.  */
120
  asection *linkage_section;
121
122
  /* The .tc section we use to hold toc entries we build for global
123
     linkage code.  */
124
  asection *toc_section;
125
126
  /* The .ds section we use to hold function descriptors which we
127
     create for exported symbols.  */
128
  asection *descriptor_section;
129
130
  /* The list of import files.  */
131
  struct xcoff_import_file *imports;
132
133
  /* Required alignment of sections within the output file.  */
134
  unsigned long file_align;
135
136
  /* Whether the .text section must be read-only.  */
137
  bool textro;
138
139
  /* Whether -brtl was specified.  */
140
  bool rtld;
141
142
  /* Whether garbage collection was done.  */
143
  bool gc;
144
145
  /* A linked list of symbols for which we have size information.  */
146
  struct xcoff_link_size_list
147
  {
148
    struct xcoff_link_size_list *next;
149
    struct xcoff_link_hash_entry *h;
150
    bfd_size_type size;
151
  }
152
  *size_list;
153
154
  /* Information about archives.  */
155
  htab_t archive_info;
156
157
  /* Magic sections: _text, _etext, _data, _edata, _end, end. */
158
  asection *special_sections[XCOFF_NUMBER_OF_SPECIAL_SECTIONS];
159
};
160
161
/* Information that we pass around while doing the final link step.  */
162
163
struct xcoff_final_link_info
164
{
165
  /* General link information.  */
166
  struct bfd_link_info *info;
167
  /* Output BFD.  */
168
  bfd *output_bfd;
169
  /* Hash table for long symbol names.  */
170
  struct bfd_strtab_hash *strtab;
171
  /* Array of information kept for each output section, indexed by the
172
     target_index field.  */
173
  struct xcoff_link_section_info *section_info;
174
  /* Symbol index of last C_FILE symbol (-1 if none).  */
175
  long last_file_index;
176
  /* Contents of last C_FILE symbol.  */
177
  struct internal_syment last_file;
178
  /* Symbol index of TOC symbol.  */
179
  long toc_symindx;
180
  /* Start of .loader symbols.  */
181
  bfd_byte *ldsym;
182
  /* Next .loader reloc to swap out.  */
183
  bfd_byte *ldrel;
184
  /* File position of start of line numbers.  */
185
  file_ptr line_filepos;
186
  /* Buffer large enough to hold swapped symbols of any input file.  */
187
  struct internal_syment *internal_syms;
188
  /* Buffer large enough to hold output indices of symbols of any
189
     input file.  */
190
  long *sym_indices;
191
  /* Buffer large enough to hold output symbols for any input file.  */
192
  bfd_byte *outsyms;
193
  /* Buffer large enough to hold external line numbers for any input
194
     section.  */
195
  bfd_byte *linenos;
196
  /* Buffer large enough to hold any input section.  */
197
  bfd_byte *contents;
198
  /* Buffer large enough to hold external relocs of any input section.  */
199
  bfd_byte *external_relocs;
200
};
201
202
#define xcoff_stub_hash_entry(ent)    \
203
  ((struct xcoff_stub_hash_entry *)(ent))
204
205
#define xcoff_stub_hash_lookup(table, string, create, copy) \
206
0
  ((struct xcoff_stub_hash_entry *)       \
207
0
   bfd_hash_lookup ((table), (string), (create), (copy)))
208
209
static bool xcoff_mark (struct bfd_link_info *, asection *);
210
211

212
213
/* Routines to read XCOFF dynamic information.  This don't really
214
   belong here, but we already have the ldsym manipulation routines
215
   here.  */
216
217
/* Read the contents of a section.  */
218
219
static bfd_byte *
220
xcoff_get_section_contents (bfd *abfd, asection *sec)
221
0
{
222
0
  if (coff_section_data (abfd, sec) == NULL)
223
0
    {
224
0
      size_t amt = sizeof (struct coff_section_tdata);
225
226
0
      sec->used_by_bfd = bfd_zalloc (abfd, amt);
227
0
      if (sec->used_by_bfd == NULL)
228
0
       return NULL;
229
0
    }
230
231
0
  bfd_byte *contents = coff_section_data (abfd, sec)->contents;
232
0
  if (contents == NULL)
233
0
    {
234
0
      if (bfd_malloc_and_get_section (abfd, sec, &contents))
235
0
  coff_section_data (abfd, sec)->contents = contents;
236
0
      else
237
0
  {
238
0
    free (contents);
239
0
    contents = NULL;
240
0
  }
241
0
    }
242
243
0
  return contents;
244
0
}
245
246
/* Read .loader and swap in the header.  Sanity check to prevent
247
   buffer overflows.  Don't bother to check for overlap as that sort
248
   of insanity shouldn't lead to incorrect program behaviour.  */
249
250
static bfd_byte *
251
xcoff_get_ldhdr (bfd *abfd, asection *lsec, struct internal_ldhdr *ldhdr)
252
0
{
253
0
  bfd_byte *contents = xcoff_get_section_contents (abfd, lsec);
254
0
  if (contents)
255
0
    {
256
0
      bfd_xcoff_swap_ldhdr_in (abfd, contents, ldhdr);
257
0
      if (ldhdr->l_nsyms != 0)
258
0
  {
259
0
    bfd_vma symoff = bfd_xcoff_loader_symbol_offset (abfd, ldhdr);
260
0
    if (symoff > lsec->size)
261
0
      goto fail;
262
0
    bfd_size_type onesym = bfd_xcoff_ldsymsz (abfd);
263
0
    bfd_size_type syms;
264
0
    if (_bfd_mul_overflow (ldhdr->l_nsyms, onesym, &syms)
265
0
        || syms > lsec->size - symoff)
266
0
      goto fail;
267
0
  }
268
0
      if (ldhdr->l_stlen != 0
269
0
    && (ldhdr->l_stoff > lsec->size
270
0
        || ldhdr->l_stlen > lsec->size - ldhdr->l_stoff))
271
0
  goto fail;
272
0
      if (ldhdr->l_nreloc != 0)
273
0
  {
274
0
    bfd_vma reloff = bfd_xcoff_loader_reloc_offset (abfd, ldhdr);
275
0
    if (reloff > lsec->size)
276
0
      goto fail;
277
0
    bfd_size_type onerel = bfd_xcoff_ldrelsz (abfd);
278
0
    bfd_size_type rels;
279
0
    if (_bfd_mul_overflow (ldhdr->l_nreloc, onerel, &rels)
280
0
        || rels > lsec->size - reloff)
281
0
      goto fail;
282
0
  }
283
0
      if (ldhdr->l_nimpid != 0
284
0
    && (ldhdr->l_impoff > lsec->size
285
0
        || ldhdr->l_istlen > lsec->size - ldhdr->l_impoff))
286
0
  goto fail;
287
0
    }
288
0
  return contents;
289
290
0
 fail:
291
0
  bfd_set_error (bfd_error_file_truncated);
292
0
  return NULL;
293
0
}
294
295
/* Get the size required to hold the dynamic symbols.  */
296
297
long
298
_bfd_xcoff_get_dynamic_symtab_upper_bound (bfd *abfd)
299
70
{
300
70
  asection *lsec;
301
70
  bfd_byte *contents;
302
70
  struct internal_ldhdr ldhdr;
303
304
70
  if ((abfd->flags & DYNAMIC) == 0)
305
52
    {
306
52
      bfd_set_error (bfd_error_invalid_operation);
307
52
      return -1;
308
52
    }
309
310
18
  lsec = bfd_get_section_by_name (abfd, ".loader");
311
18
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
312
18
    {
313
18
      bfd_set_error (bfd_error_no_symbols);
314
18
      return -1;
315
18
    }
316
317
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
318
0
  if (!contents)
319
0
    return -1;
320
321
0
  return (ldhdr.l_nsyms + 1) * sizeof (asymbol *);
322
0
}
323
324
/* Get the dynamic symbols.  */
325
326
long
327
_bfd_xcoff_canonicalize_dynamic_symtab (bfd *abfd, asymbol **psyms)
328
0
{
329
0
  asection *lsec;
330
0
  bfd_byte *contents;
331
0
  struct internal_ldhdr ldhdr;
332
0
  const char *strings;
333
0
  bfd_byte *elsym, *elsymend;
334
0
  coff_symbol_type *symbuf;
335
336
0
  if ((abfd->flags & DYNAMIC) == 0)
337
0
    {
338
0
      bfd_set_error (bfd_error_invalid_operation);
339
0
      return -1;
340
0
    }
341
342
0
  lsec = bfd_get_section_by_name (abfd, ".loader");
343
0
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
344
0
    {
345
0
      bfd_set_error (bfd_error_no_symbols);
346
0
      return -1;
347
0
    }
348
349
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
350
0
  if (!contents)
351
0
    return -1;
352
353
0
  strings = (char *) contents + ldhdr.l_stoff;
354
355
0
  symbuf = bfd_zalloc (abfd, ldhdr.l_nsyms * sizeof (* symbuf));
356
0
  if (symbuf == NULL)
357
0
    return -1;
358
359
0
  elsym = contents + bfd_xcoff_loader_symbol_offset(abfd, &ldhdr);
360
361
0
  elsymend = elsym + ldhdr.l_nsyms * bfd_xcoff_ldsymsz(abfd);
362
0
  for (; elsym < elsymend; elsym += bfd_xcoff_ldsymsz(abfd), symbuf++, psyms++)
363
0
    {
364
0
      struct internal_ldsym ldsym;
365
366
0
      bfd_xcoff_swap_ldsym_in (abfd, elsym, &ldsym);
367
368
0
      symbuf->symbol.the_bfd = abfd;
369
370
0
      if (ldsym._l._l_l._l_zeroes != 0)
371
0
  {
372
0
    char *c;
373
374
0
    c = bfd_alloc (abfd, (bfd_size_type) SYMNMLEN + 1);
375
0
    if (c == NULL)
376
0
      return -1;
377
0
    memcpy (c, ldsym._l._l_name, SYMNMLEN);
378
0
    c[SYMNMLEN] = '\0';
379
0
    symbuf->symbol.name = c;
380
0
  }
381
0
      else if (ldsym._l._l_l._l_offset < ldhdr.l_stlen)
382
0
  symbuf->symbol.name = strings + ldsym._l._l_l._l_offset;
383
0
      else
384
0
  symbuf->symbol.name = _("<corrupt>");
385
386
0
      if (ldsym.l_smclas == XMC_XO)
387
0
  symbuf->symbol.section = bfd_abs_section_ptr;
388
0
      else
389
0
  symbuf->symbol.section = coff_section_from_bfd_index (abfd,
390
0
                    ldsym.l_scnum);
391
0
      symbuf->symbol.value = ldsym.l_value - symbuf->symbol.section->vma;
392
393
0
      symbuf->symbol.flags = BSF_NO_FLAGS;
394
0
      if ((ldsym.l_smtype & L_EXPORT) != 0)
395
0
  {
396
0
    if ((ldsym.l_smtype & L_WEAK) != 0)
397
0
      symbuf->symbol.flags |= BSF_WEAK;
398
0
    else
399
0
      symbuf->symbol.flags |= BSF_GLOBAL;
400
0
  }
401
402
      /* FIXME: We have no way to record the other information stored
403
   with the loader symbol.  */
404
0
      *psyms = (asymbol *) symbuf;
405
0
    }
406
407
0
  *psyms = NULL;
408
409
0
  return ldhdr.l_nsyms;
410
0
}
411
412
/* Get the size required to hold the dynamic relocs.  */
413
414
long
415
_bfd_xcoff_get_dynamic_reloc_upper_bound (bfd *abfd)
416
70
{
417
70
  asection *lsec;
418
70
  bfd_byte *contents;
419
70
  struct internal_ldhdr ldhdr;
420
421
70
  if ((abfd->flags & DYNAMIC) == 0)
422
52
    {
423
52
      bfd_set_error (bfd_error_invalid_operation);
424
52
      return -1;
425
52
    }
426
427
18
  lsec = bfd_get_section_by_name (abfd, ".loader");
428
18
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
429
18
    {
430
18
      bfd_set_error (bfd_error_no_symbols);
431
18
      return -1;
432
18
    }
433
434
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
435
0
  if (!contents)
436
0
    return -1;
437
438
0
  return (ldhdr.l_nreloc + 1) * sizeof (arelent *);
439
0
}
440
441
/* Get the dynamic relocs.  */
442
443
long
444
_bfd_xcoff_canonicalize_dynamic_reloc (bfd *abfd,
445
               arelent **prelocs,
446
               asymbol **syms)
447
0
{
448
0
  asection *lsec;
449
0
  bfd_byte *contents;
450
0
  struct internal_ldhdr ldhdr;
451
0
  arelent *relbuf;
452
0
  bfd_byte *elrel, *elrelend;
453
454
0
  if ((abfd->flags & DYNAMIC) == 0)
455
0
    {
456
0
      bfd_set_error (bfd_error_invalid_operation);
457
0
      return -1;
458
0
    }
459
460
0
  lsec = bfd_get_section_by_name (abfd, ".loader");
461
0
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
462
0
    {
463
0
      bfd_set_error (bfd_error_no_symbols);
464
0
      return -1;
465
0
    }
466
467
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
468
0
  if (!contents)
469
0
    return -1;
470
471
0
  relbuf = bfd_alloc (abfd, ldhdr.l_nreloc * sizeof (arelent));
472
0
  if (relbuf == NULL)
473
0
    return -1;
474
475
0
  elrel = contents + bfd_xcoff_loader_reloc_offset(abfd, &ldhdr);
476
477
0
  elrelend = elrel + ldhdr.l_nreloc * bfd_xcoff_ldrelsz(abfd);
478
0
  for (; elrel < elrelend; elrel += bfd_xcoff_ldrelsz(abfd), relbuf++,
479
0
   prelocs++)
480
0
    {
481
0
      struct internal_ldrel ldrel;
482
483
0
      bfd_xcoff_swap_ldrel_in (abfd, elrel, &ldrel);
484
485
0
      if (ldrel.l_symndx + 2 < 5)
486
0
  {
487
0
    static const char stdsec[5][8]
488
0
      = { ".tbss", ".tdata", ".text", ".data", ".bss" };
489
0
    const char *name = stdsec[ldrel.l_symndx + 2];
490
0
    asection *sec = bfd_get_section_by_name (abfd, name);
491
0
    if (sec == NULL)
492
0
      {
493
0
        bfd_set_error (bfd_error_bad_value);
494
0
        return -1;
495
0
      }
496
497
0
    relbuf->sym_ptr_ptr = &sec->symbol;
498
0
  }
499
0
      else if (ldrel.l_symndx - 3 < ldhdr.l_nsyms)
500
0
  relbuf->sym_ptr_ptr = syms + (ldrel.l_symndx - 3);
501
0
      else
502
0
  {
503
0
    _bfd_error_handler
504
      /* xgettext:c-format */
505
0
      (_("%pB: warning: illegal symbol index %lu in relocs"),
506
0
       abfd, (unsigned long) ldrel.l_symndx);
507
0
    relbuf->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
508
0
  }
509
510
0
      relbuf->address = ldrel.l_vaddr;
511
0
      relbuf->addend = 0;
512
513
      /* Most dynamic relocs have the same type.  FIXME: This is only
514
   correct if ldrel.l_rtype == 0.  In other cases, we should use
515
   a different howto.  */
516
0
      relbuf->howto = bfd_xcoff_dynamic_reloc_howto(abfd);
517
518
      /* FIXME: We have no way to record the l_rsecnm field.  */
519
520
0
      *prelocs = relbuf;
521
0
    }
522
523
0
  *prelocs = NULL;
524
525
0
  return ldhdr.l_nreloc;
526
0
}
527

528
/* Hash functions for xcoff_link_hash_table's archive_info.  */
529
530
static hashval_t
531
xcoff_archive_info_hash (const void *data)
532
0
{
533
0
  const struct xcoff_archive_info *info;
534
535
0
  info = (const struct xcoff_archive_info *) data;
536
0
  return htab_hash_pointer (info->archive);
537
0
}
538
539
static int
540
xcoff_archive_info_eq (const void *data1, const void *data2)
541
0
{
542
0
  const struct xcoff_archive_info *info1;
543
0
  const struct xcoff_archive_info *info2;
544
545
0
  info1 = (const struct xcoff_archive_info *) data1;
546
0
  info2 = (const struct xcoff_archive_info *) data2;
547
0
  return info1->archive == info2->archive;
548
0
}
549
550
/* Return information about archive ARCHIVE.  Return NULL on error.  */
551
552
static struct xcoff_archive_info *
553
xcoff_get_archive_info (struct bfd_link_info *info, bfd *archive)
554
0
{
555
0
  struct xcoff_link_hash_table *htab;
556
0
  struct xcoff_archive_info *entryp, entry;
557
0
  void **slot;
558
559
0
  htab = xcoff_hash_table (info);
560
0
  entry.archive = archive;
561
0
  slot = htab_find_slot (htab->archive_info, &entry, INSERT);
562
0
  if (!slot)
563
0
    return NULL;
564
565
0
  entryp = *slot;
566
0
  if (!entryp)
567
0
    {
568
0
      entryp = bfd_zalloc (info->output_bfd, sizeof (entry));
569
0
      if (!entryp)
570
0
  return NULL;
571
572
0
      entryp->archive = archive;
573
0
      *slot = entryp;
574
0
    }
575
0
  return entryp;
576
0
}
577

578
579
/* Initialize an entry in the stub hash table.  */
580
static struct bfd_hash_entry *
581
stub_hash_newfunc (struct bfd_hash_entry *entry,
582
       struct bfd_hash_table *table,
583
       const char *string)
584
0
{
585
  /* Allocate the structure if it has not already been allocated by a
586
     subclass.  */
587
0
  if (entry == NULL)
588
0
    {
589
0
      entry = bfd_hash_allocate (table,
590
0
         sizeof (struct xcoff_stub_hash_entry));
591
0
      if (entry == NULL)
592
0
  return entry;
593
0
    }
594
595
  /* Call the allocation method of the superclass.  */
596
0
  entry = bfd_hash_newfunc (entry, table, string);
597
0
  if (entry != NULL)
598
0
    {
599
0
      struct xcoff_stub_hash_entry *hsh;
600
601
      /* Initialize the local fields.  */
602
0
      hsh = (struct xcoff_stub_hash_entry *) entry;
603
0
      hsh->stub_type = xcoff_stub_none;
604
0
      hsh->hcsect = NULL;
605
0
      hsh->stub_offset = 0;
606
0
      hsh->target_section = NULL;
607
0
      hsh->htarget = NULL;
608
0
    }
609
610
0
  return entry;
611
0
}
612
613
/* Routine to create an entry in an XCOFF link hash table.  */
614
615
static struct bfd_hash_entry *
616
xcoff_link_hash_newfunc (struct bfd_hash_entry *entry,
617
       struct bfd_hash_table *table,
618
       const char *string)
619
0
{
620
0
  struct xcoff_link_hash_entry *ret = (struct xcoff_link_hash_entry *) entry;
621
622
  /* Allocate the structure if it has not already been allocated by a
623
     subclass.  */
624
0
  if (ret == NULL)
625
0
    ret = bfd_hash_allocate (table, sizeof (* ret));
626
0
  if (ret == NULL)
627
0
    return NULL;
628
629
  /* Call the allocation method of the superclass.  */
630
0
  ret = ((struct xcoff_link_hash_entry *)
631
0
   _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
632
0
         table, string));
633
0
  if (ret != NULL)
634
0
    {
635
      /* Set local fields.  */
636
0
      ret->indx = -1;
637
0
      ret->toc_section = NULL;
638
0
      ret->u.toc_indx = -1;
639
0
      ret->descriptor = NULL;
640
0
      ret->ldsym = NULL;
641
0
      ret->ldindx = -1;
642
0
      ret->flags = 0;
643
0
      ret->smclas = XMC_UA;
644
0
    }
645
646
0
  return (struct bfd_hash_entry *) ret;
647
0
}
648
649
/* Destroy an XCOFF link hash table.  */
650
651
static void
652
_bfd_xcoff_bfd_link_hash_table_free (bfd *obfd)
653
0
{
654
0
  struct xcoff_link_hash_table *ret;
655
656
0
  ret = (struct xcoff_link_hash_table *) obfd->link.hash;
657
0
  if (ret->archive_info)
658
0
    htab_delete (ret->archive_info);
659
0
  if (ret->debug_strtab)
660
0
    _bfd_stringtab_free (ret->debug_strtab);
661
662
0
  bfd_hash_table_free (&ret->stub_hash_table);
663
0
  _bfd_generic_link_hash_table_free (obfd);
664
0
}
665
666
/* Create an XCOFF link hash table.  */
667
668
struct bfd_link_hash_table *
669
_bfd_xcoff_bfd_link_hash_table_create (bfd *abfd)
670
0
{
671
0
  struct xcoff_link_hash_table *ret;
672
0
  bool isxcoff64 = false;
673
0
  size_t amt = sizeof (* ret);
674
675
0
  ret = bfd_zmalloc (amt);
676
0
  if (ret == NULL)
677
0
    return NULL;
678
0
  if (!_bfd_link_hash_table_init (&ret->root, abfd, xcoff_link_hash_newfunc,
679
0
          sizeof (struct xcoff_link_hash_entry)))
680
0
    {
681
0
      free (ret);
682
0
      return NULL;
683
0
    }
684
685
  /* Init the stub hash table too.  */
686
0
  if (!bfd_hash_table_init (&ret->stub_hash_table, stub_hash_newfunc,
687
0
          sizeof (struct xcoff_stub_hash_entry)))
688
0
    {
689
0
      _bfd_xcoff_bfd_link_hash_table_free (abfd);
690
0
      return NULL;
691
0
    }
692
693
0
  isxcoff64 = bfd_coff_debug_string_prefix_length (abfd) == 4;
694
695
0
  ret->debug_strtab = _bfd_xcoff_stringtab_init (isxcoff64);
696
0
  ret->archive_info = htab_create (37, xcoff_archive_info_hash,
697
0
           xcoff_archive_info_eq, NULL);
698
0
  if (!ret->debug_strtab || !ret->archive_info)
699
0
    {
700
0
      _bfd_xcoff_bfd_link_hash_table_free (abfd);
701
0
      return NULL;
702
0
    }
703
0
  ret->root.hash_table_free = _bfd_xcoff_bfd_link_hash_table_free;
704
705
  /* The linker will always generate a full a.out header.  We need to
706
     record that fact now, before the sizeof_headers routine could be
707
     called.  */
708
0
  xcoff_data (abfd)->full_aouthdr = true;
709
710
0
  return &ret->root;
711
0
}
712

713
/* Read internal relocs for an XCOFF csect.  This is a wrapper around
714
   bfd_coff_read_internal_relocs which tries to take advantage of any
715
   relocs which may have been cached for the enclosing section.  */
716
717
static struct internal_reloc *
718
xcoff_read_internal_relocs (bfd *abfd,
719
          asection *sec,
720
          bool cache,
721
          bfd_byte *external_relocs,
722
          bool require_internal,
723
          struct internal_reloc *internal_relocs)
724
0
{
725
0
  if (coff_section_data (abfd, sec) != NULL
726
0
      && coff_section_data (abfd, sec)->relocs == NULL
727
0
      && xcoff_section_data (abfd, sec) != NULL)
728
0
    {
729
0
      asection *enclosing;
730
731
0
      enclosing = xcoff_section_data (abfd, sec)->enclosing;
732
733
0
      if (enclosing != NULL
734
0
    && (coff_section_data (abfd, enclosing) == NULL
735
0
        || coff_section_data (abfd, enclosing)->relocs == NULL)
736
0
    && cache
737
0
    && enclosing->reloc_count > 0)
738
0
  {
739
0
    if (bfd_coff_read_internal_relocs (abfd, enclosing, true,
740
0
               external_relocs, false, NULL)
741
0
        == NULL)
742
0
      return NULL;
743
0
  }
744
745
0
      if (enclosing != NULL
746
0
    && coff_section_data (abfd, enclosing) != NULL
747
0
    && coff_section_data (abfd, enclosing)->relocs != NULL)
748
0
  {
749
0
    size_t off;
750
751
0
    off = ((sec->rel_filepos - enclosing->rel_filepos)
752
0
     / bfd_coff_relsz (abfd));
753
754
0
    if (! require_internal)
755
0
      return coff_section_data (abfd, enclosing)->relocs + off;
756
0
    memcpy (internal_relocs,
757
0
      coff_section_data (abfd, enclosing)->relocs + off,
758
0
      sec->reloc_count * sizeof (struct internal_reloc));
759
0
    return internal_relocs;
760
0
  }
761
0
    }
762
763
0
  return bfd_coff_read_internal_relocs (abfd, sec, cache, external_relocs,
764
0
          require_internal, internal_relocs);
765
0
}
766

767
/* Split FILENAME into an import path and an import filename,
768
   storing them in *IMPPATH and *IMPFILE respectively.  */
769
770
bool
771
bfd_xcoff_split_import_path (bfd *abfd, const char *filename,
772
           const char **imppath, const char **impfile)
773
0
{
774
0
  const char *base;
775
0
  size_t length;
776
0
  char *path;
777
778
0
  base = lbasename (filename);
779
0
  length = base - filename;
780
0
  if (length == 0)
781
    /* The filename has no directory component, so use an empty path.  */
782
0
    *imppath = "";
783
0
  else if (length == 1)
784
    /* The filename is in the root directory.  */
785
0
    *imppath = "/";
786
0
  else
787
0
    {
788
      /* Extract the (non-empty) directory part.  Note that we don't
789
   need to strip duplicate directory separators from any part
790
   of the string; the native linker doesn't do that either.  */
791
0
      path = bfd_alloc (abfd, length);
792
0
      if (path == NULL)
793
0
  return false;
794
0
      memcpy (path, filename, length - 1);
795
0
      path[length - 1] = 0;
796
0
      *imppath = path;
797
0
    }
798
0
  *impfile = base;
799
0
  return true;
800
0
}
801
802
/* Set ARCHIVE's import path as though its filename had been given
803
   as FILENAME.  */
804
805
bool
806
bfd_xcoff_set_archive_import_path (struct bfd_link_info *info,
807
           bfd *archive, const char *filename)
808
0
{
809
0
  struct xcoff_archive_info *archive_info;
810
811
0
  archive_info = xcoff_get_archive_info (info, archive);
812
0
  return (archive_info != NULL
813
0
    && bfd_xcoff_split_import_path (archive, filename,
814
0
            &archive_info->imppath,
815
0
            &archive_info->impfile));
816
0
}
817
818
/* H is an imported symbol.  Set the import module's path, file and member
819
   to IMPATH, IMPFILE and IMPMEMBER respectively.  All three are null if
820
   no specific import module is specified.  */
821
822
static bool
823
xcoff_set_import_path (struct bfd_link_info *info,
824
           struct xcoff_link_hash_entry *h,
825
           const char *imppath, const char *impfile,
826
           const char *impmember)
827
0
{
828
0
  unsigned int c;
829
0
  struct xcoff_import_file **pp;
830
831
  /* We overload the ldindx field to hold the l_ifile value for this
832
     symbol.  */
833
0
  BFD_ASSERT (h->ldsym == NULL);
834
0
  BFD_ASSERT ((h->flags & XCOFF_BUILT_LDSYM) == 0);
835
0
  if (imppath == NULL)
836
0
    h->ldindx = -1;
837
0
  else
838
0
    {
839
      /* We start c at 1 because the first entry in the import list is
840
   reserved for the library search path.  */
841
0
      for (pp = &xcoff_hash_table (info)->imports, c = 1;
842
0
     *pp != NULL;
843
0
     pp = &(*pp)->next, ++c)
844
0
  {
845
0
    if (filename_cmp ((*pp)->path, imppath) == 0
846
0
        && filename_cmp ((*pp)->file, impfile) == 0
847
0
        && filename_cmp ((*pp)->member, impmember) == 0)
848
0
      break;
849
0
  }
850
851
0
      if (*pp == NULL)
852
0
  {
853
0
    struct xcoff_import_file *n;
854
0
    size_t amt = sizeof (*n);
855
856
0
    n = bfd_alloc (info->output_bfd, amt);
857
0
    if (n == NULL)
858
0
      return false;
859
0
    n->next = NULL;
860
0
    n->path = imppath;
861
0
    n->file = impfile;
862
0
    n->member = impmember;
863
0
    *pp = n;
864
0
  }
865
0
      h->ldindx = c;
866
0
    }
867
0
  return true;
868
0
}
869

870
/* H is the bfd symbol associated with exported .loader symbol LDSYM.
871
   Return true if LDSYM defines H.  */
872
873
static bool
874
xcoff_dynamic_definition_p (struct xcoff_link_hash_entry *h,
875
          struct internal_ldsym *ldsym)
876
0
{
877
  /* If we didn't know about H before processing LDSYM, LDSYM
878
     definitely defines H.  */
879
0
  if (h->root.type == bfd_link_hash_new)
880
0
    return true;
881
882
  /* If H is currently a weak dynamic symbol, and if LDSYM is a strong
883
     dynamic symbol, LDSYM trumps the current definition of H.  */
884
0
  if ((ldsym->l_smtype & L_WEAK) == 0
885
0
      && (h->flags & XCOFF_DEF_DYNAMIC) != 0
886
0
      && (h->flags & XCOFF_DEF_REGULAR) == 0
887
0
      && (h->root.type == bfd_link_hash_defweak
888
0
    || h->root.type == bfd_link_hash_undefweak))
889
0
    return true;
890
891
  /* If H is currently undefined, LDSYM defines it.
892
     However, if H has a hidden visibility, LDSYM must not
893
     define it.  */
894
0
  if ((h->flags & XCOFF_DEF_DYNAMIC) == 0
895
0
      && (h->root.type == bfd_link_hash_undefined
896
0
    || h->root.type == bfd_link_hash_undefweak)
897
0
      && (h->visibility != SYM_V_HIDDEN
898
0
    && h->visibility != SYM_V_INTERNAL))
899
0
    return true;
900
901
0
  return false;
902
0
}
903
904
/* This function is used to add symbols from a dynamic object to the
905
   global symbol table.  */
906
907
static bool
908
xcoff_link_add_dynamic_symbols (bfd *abfd, struct bfd_link_info *info)
909
0
{
910
0
  asection *lsec;
911
0
  bfd_byte *contents;
912
0
  struct internal_ldhdr ldhdr;
913
0
  const char *strings;
914
0
  bfd_byte *elsym, *elsymend;
915
0
  struct xcoff_import_file *n;
916
0
  unsigned int c;
917
0
  struct xcoff_import_file **pp;
918
919
  /* We can only handle a dynamic object if we are generating an XCOFF
920
     output file.  */
921
0
   if (info->output_bfd->xvec != abfd->xvec)
922
0
    {
923
0
      _bfd_error_handler
924
0
  (_("%pB: XCOFF shared object when not producing XCOFF output"),
925
0
   abfd);
926
0
      bfd_set_error (bfd_error_invalid_operation);
927
0
      return false;
928
0
    }
929
930
  /* The symbols we use from a dynamic object are not the symbols in
931
     the normal symbol table, but, rather, the symbols in the export
932
     table.  If there is a global symbol in a dynamic object which is
933
     not in the export table, the loader will not be able to find it,
934
     so we don't want to find it either.  Also, on AIX 4.1.3, shr.o in
935
     libc.a has symbols in the export table which are not in the
936
     symbol table.  */
937
938
  /* Read in the .loader section.  FIXME: We should really use the
939
     o_snloader field in the a.out header, rather than grabbing the
940
     section by name.  */
941
0
  lsec = bfd_get_section_by_name (abfd, ".loader");
942
0
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
943
0
    {
944
0
      _bfd_error_handler
945
0
  (_("%pB: dynamic object with no .loader section"),
946
0
   abfd);
947
0
      bfd_set_error (bfd_error_no_symbols);
948
0
      return false;
949
0
    }
950
951
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
952
0
  if (!contents)
953
0
    return false;
954
955
  /* Remove the sections from this object, so that they do not get
956
     included in the link.  */
957
0
  bfd_section_list_clear (abfd);
958
959
0
  strings = (char *) contents + ldhdr.l_stoff;
960
961
0
  elsym = contents + bfd_xcoff_loader_symbol_offset(abfd, &ldhdr);
962
963
0
  elsymend = elsym + ldhdr.l_nsyms * bfd_xcoff_ldsymsz(abfd);
964
965
0
  for (; elsym < elsymend; elsym += bfd_xcoff_ldsymsz(abfd))
966
0
    {
967
0
      struct internal_ldsym ldsym;
968
0
      char nambuf[SYMNMLEN + 1];
969
0
      const char *name;
970
0
      struct xcoff_link_hash_entry *h;
971
972
0
      bfd_xcoff_swap_ldsym_in (abfd, elsym, &ldsym);
973
974
      /* We are only interested in exported symbols.  */
975
0
      if ((ldsym.l_smtype & L_EXPORT) == 0)
976
0
  continue;
977
978
0
      if (ldsym._l._l_l._l_zeroes != 0)
979
0
  {
980
0
    memcpy (nambuf, ldsym._l._l_name, SYMNMLEN);
981
0
    nambuf[SYMNMLEN] = '\0';
982
0
    name = nambuf;
983
0
  }
984
0
      else if (ldsym._l._l_l._l_offset < ldhdr.l_stlen)
985
0
  name = strings + ldsym._l._l_l._l_offset;
986
0
      else
987
0
  continue;
988
989
      /* Normally we could not call xcoff_link_hash_lookup in an add
990
   symbols routine, since we might not be using an XCOFF hash
991
   table.  However, we verified above that we are using an XCOFF
992
   hash table.  */
993
994
0
      h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, true,
995
0
          true, true);
996
0
      if (h == NULL)
997
0
  return false;
998
999
0
      if (!xcoff_dynamic_definition_p (h, &ldsym))
1000
0
  continue;
1001
1002
0
      h->flags |= XCOFF_DEF_DYNAMIC;
1003
0
      h->smclas = ldsym.l_smclas;
1004
0
      if (h->smclas == XMC_XO)
1005
0
  {
1006
    /* This symbol has an absolute value.  */
1007
0
    if ((ldsym.l_smtype & L_WEAK) != 0)
1008
0
      h->root.type = bfd_link_hash_defweak;
1009
0
    else
1010
0
      h->root.type = bfd_link_hash_defined;
1011
0
    h->root.u.def.section = bfd_abs_section_ptr;
1012
0
    h->root.u.def.value = ldsym.l_value;
1013
0
  }
1014
0
      else
1015
0
  {
1016
    /* Otherwise, we don't bother to actually define the symbol,
1017
       since we don't have a section to put it in anyhow.
1018
       We assume instead that an undefined XCOFF_DEF_DYNAMIC symbol
1019
       should be imported from the symbol's undef.abfd.  */
1020
0
    if ((ldsym.l_smtype & L_WEAK) != 0)
1021
0
      h->root.type = bfd_link_hash_undefweak;
1022
0
    else
1023
0
      h->root.type = bfd_link_hash_undefined;
1024
0
    h->root.u.undef.abfd = abfd;
1025
0
  }
1026
1027
      /* If this symbol defines a function descriptor, then it
1028
   implicitly defines the function code as well.  */
1029
0
      if (h->smclas == XMC_DS
1030
0
    || (h->smclas == XMC_XO && name[0] != '.'))
1031
0
  h->flags |= XCOFF_DESCRIPTOR;
1032
0
      if ((h->flags & XCOFF_DESCRIPTOR) != 0)
1033
0
  {
1034
0
    struct xcoff_link_hash_entry *hds;
1035
1036
0
    hds = h->descriptor;
1037
0
    if (hds == NULL)
1038
0
      {
1039
0
        char *dsnm;
1040
1041
0
        dsnm = bfd_malloc ((bfd_size_type) strlen (name) + 2);
1042
0
        if (dsnm == NULL)
1043
0
    return false;
1044
0
        dsnm[0] = '.';
1045
0
        strcpy (dsnm + 1, name);
1046
0
        hds = xcoff_link_hash_lookup (xcoff_hash_table (info), dsnm,
1047
0
              true, true, true);
1048
0
        free (dsnm);
1049
0
        if (hds == NULL)
1050
0
    return false;
1051
1052
0
        hds->descriptor = h;
1053
0
        h->descriptor = hds;
1054
0
      }
1055
1056
0
    if (xcoff_dynamic_definition_p (hds, &ldsym))
1057
0
      {
1058
0
        hds->root.type = h->root.type;
1059
0
        hds->flags |= XCOFF_DEF_DYNAMIC;
1060
0
        if (h->smclas == XMC_XO)
1061
0
    {
1062
      /* An absolute symbol appears to actually define code, not a
1063
         function descriptor.  This is how some math functions are
1064
         implemented on AIX 4.1.  */
1065
0
      hds->smclas = XMC_XO;
1066
0
      hds->root.u.def.section = bfd_abs_section_ptr;
1067
0
      hds->root.u.def.value = ldsym.l_value;
1068
0
    }
1069
0
        else
1070
0
    {
1071
0
      hds->smclas = XMC_PR;
1072
0
      hds->root.u.undef.abfd = abfd;
1073
      /* We do not want to add this to the undefined
1074
         symbol list.  */
1075
0
    }
1076
0
      }
1077
0
  }
1078
0
    }
1079
1080
0
  free (contents);
1081
0
  coff_section_data (abfd, lsec)->contents = NULL;
1082
1083
  /* Record this file in the import files.  */
1084
0
  n = bfd_alloc (abfd, (bfd_size_type) sizeof (struct xcoff_import_file));
1085
0
  if (n == NULL)
1086
0
    return false;
1087
0
  n->next = NULL;
1088
1089
0
  if (abfd->my_archive == NULL || bfd_is_thin_archive (abfd->my_archive))
1090
0
    {
1091
0
      if (!bfd_xcoff_split_import_path (abfd, bfd_get_filename (abfd),
1092
0
          &n->path, &n->file))
1093
0
  return false;
1094
0
      n->member = "";
1095
0
    }
1096
0
  else
1097
0
    {
1098
0
      struct xcoff_archive_info *archive_info;
1099
1100
0
      archive_info = xcoff_get_archive_info (info, abfd->my_archive);
1101
0
      if (!archive_info->impfile)
1102
0
  {
1103
0
    if (!bfd_xcoff_split_import_path (archive_info->archive,
1104
0
              bfd_get_filename (archive_info
1105
0
                    ->archive),
1106
0
              &archive_info->imppath,
1107
0
              &archive_info->impfile))
1108
0
      return false;
1109
0
  }
1110
0
      n->path = archive_info->imppath;
1111
0
      n->file = archive_info->impfile;
1112
0
      n->member = bfd_get_filename (abfd);
1113
0
    }
1114
1115
  /* We start c at 1 because the first import file number is reserved
1116
     for LIBPATH.  */
1117
0
  for (pp = &xcoff_hash_table (info)->imports, c = 1;
1118
0
       *pp != NULL;
1119
0
       pp = &(*pp)->next, ++c)
1120
0
    ;
1121
0
  *pp = n;
1122
1123
0
  xcoff_data (abfd)->import_file_id = c;
1124
1125
0
  return true;
1126
0
}
1127
1128
/* xcoff_link_create_extra_sections
1129
1130
   Takes care of creating the .loader, .gl, .ds, .debug and sections.  */
1131
1132
static bool
1133
xcoff_link_create_extra_sections (bfd * abfd, struct bfd_link_info *info)
1134
0
{
1135
0
  bool return_value = false;
1136
1137
0
  if (info->output_bfd->xvec == abfd->xvec)
1138
0
    {
1139
      /* We need to build a .loader section, so we do it here.  This
1140
   won't work if we're producing an XCOFF output file with no
1141
   XCOFF input files.  FIXME.  */
1142
1143
0
      if (!bfd_link_relocatable (info)
1144
0
    && xcoff_hash_table (info)->loader_section == NULL)
1145
0
  {
1146
0
    asection *lsec;
1147
0
    flagword flags = SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1148
1149
0
    lsec = bfd_make_section_anyway_with_flags (abfd, ".loader", flags);
1150
0
    if (lsec == NULL)
1151
0
      goto end_return;
1152
1153
0
    xcoff_hash_table (info)->loader_section = lsec;
1154
0
  }
1155
1156
      /* Likewise for the linkage section.  */
1157
0
      if (xcoff_hash_table (info)->linkage_section == NULL)
1158
0
  {
1159
0
    asection *lsec;
1160
0
    flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1161
0
          | SEC_IN_MEMORY);
1162
1163
0
    lsec = bfd_make_section_anyway_with_flags (abfd, ".gl", flags);
1164
0
    if (lsec == NULL)
1165
0
      goto end_return;
1166
1167
0
    xcoff_hash_table (info)->linkage_section = lsec;
1168
0
    lsec->alignment_power = 2;
1169
0
  }
1170
1171
      /* Likewise for the TOC section.  */
1172
0
      if (xcoff_hash_table (info)->toc_section == NULL)
1173
0
  {
1174
0
    asection *tsec;
1175
0
    flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1176
0
          | SEC_IN_MEMORY);
1177
1178
0
    tsec = bfd_make_section_anyway_with_flags (abfd, ".tc", flags);
1179
0
    if (tsec == NULL)
1180
0
      goto end_return;
1181
1182
0
    xcoff_hash_table (info)->toc_section = tsec;
1183
0
    tsec->alignment_power = 2;
1184
0
  }
1185
1186
      /* Likewise for the descriptor section.  */
1187
0
      if (xcoff_hash_table (info)->descriptor_section == NULL)
1188
0
  {
1189
0
    asection *dsec;
1190
0
    flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1191
0
          | SEC_IN_MEMORY);
1192
1193
0
    dsec = bfd_make_section_anyway_with_flags (abfd, ".ds", flags);
1194
0
    if (dsec == NULL)
1195
0
      goto end_return;
1196
1197
0
    xcoff_hash_table (info)->descriptor_section = dsec;
1198
0
    dsec->alignment_power = 2;
1199
0
  }
1200
1201
      /* Likewise for the .debug section.  */
1202
0
      if (xcoff_hash_table (info)->debug_section == NULL
1203
0
    && info->strip != strip_all)
1204
0
  {
1205
0
    asection *dsec;
1206
0
    flagword flags = SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1207
1208
0
    dsec = bfd_make_section_anyway_with_flags (abfd, ".debug", flags);
1209
0
    if (dsec == NULL)
1210
0
      goto end_return;
1211
1212
0
    xcoff_hash_table (info)->debug_section = dsec;
1213
0
  }
1214
0
    }
1215
1216
0
  return_value = true;
1217
1218
0
 end_return:
1219
1220
0
  return return_value;
1221
0
}
1222
1223
/* Returns the index of reloc in RELOCS with the least address greater
1224
   than or equal to ADDRESS.  The relocs are sorted by address.  */
1225
1226
static bfd_size_type
1227
xcoff_find_reloc (struct internal_reloc *relocs,
1228
      bfd_size_type count,
1229
      bfd_vma address)
1230
0
{
1231
0
  bfd_size_type min, max, this;
1232
1233
0
  if (count < 2)
1234
0
    {
1235
0
      if (count == 1 && relocs[0].r_vaddr < address)
1236
0
  return 1;
1237
0
      else
1238
0
  return 0;
1239
0
    }
1240
1241
0
  min = 0;
1242
0
  max = count;
1243
1244
  /* Do a binary search over (min,max].  */
1245
0
  while (min + 1 < max)
1246
0
    {
1247
0
      bfd_vma raddr;
1248
1249
0
      this = (max + min) / 2;
1250
0
      raddr = relocs[this].r_vaddr;
1251
0
      if (raddr > address)
1252
0
  max = this;
1253
0
      else if (raddr < address)
1254
0
  min = this;
1255
0
      else
1256
0
  {
1257
0
    min = this;
1258
0
    break;
1259
0
  }
1260
0
    }
1261
1262
0
  if (relocs[min].r_vaddr < address)
1263
0
    return min + 1;
1264
1265
0
  while (min > 0
1266
0
   && relocs[min - 1].r_vaddr == address)
1267
0
    --min;
1268
1269
0
  return min;
1270
0
}
1271
1272
/* Return true if the symbol has to be added to the linker hash
1273
   table.  */
1274
static bool
1275
xcoff_link_add_symbols_to_hash_table (struct internal_syment sym,
1276
              union internal_auxent aux)
1277
0
{
1278
  /* External symbols must be added.  */
1279
0
  if (EXTERN_SYM_P (sym.n_sclass))
1280
0
    return true;
1281
1282
  /* Hidden TLS symbols must be added to verify TLS relocations
1283
     in xcoff_reloc_type_tls.  */
1284
0
  if (sym.n_sclass == C_HIDEXT
1285
0
      && ((aux.x_csect.x_smclas == XMC_TL
1286
0
     || aux.x_csect.x_smclas == XMC_UL)))
1287
0
    return true;
1288
1289
0
  return false;
1290
0
}
1291
1292
/* Add all the symbols from an object file to the hash table.
1293
1294
   XCOFF is a weird format.  A normal XCOFF .o files will have three
1295
   COFF sections--.text, .data, and .bss--but each COFF section will
1296
   contain many csects.  These csects are described in the symbol
1297
   table.  From the linker's point of view, each csect must be
1298
   considered a section in its own right.  For example, a TOC entry is
1299
   handled as a small XMC_TC csect.  The linker must be able to merge
1300
   different TOC entries together, which means that it must be able to
1301
   extract the XMC_TC csects from the .data section of the input .o
1302
   file.
1303
1304
   From the point of view of our linker, this is, of course, a hideous
1305
   nightmare.  We cope by actually creating sections for each csect,
1306
   and discarding the original sections.  We then have to handle the
1307
   relocation entries carefully, since the only way to tell which
1308
   csect they belong to is to examine the address.  */
1309
1310
static bool
1311
xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
1312
0
{
1313
0
  unsigned int n_tmask;
1314
0
  unsigned int n_btshft;
1315
0
  bool default_copy;
1316
0
  bfd_size_type symcount;
1317
0
  struct xcoff_link_hash_entry **sym_hash;
1318
0
  asection **csect_cache;
1319
0
  unsigned int *lineno_counts;
1320
0
  bfd_size_type linesz;
1321
0
  asection *o;
1322
0
  asection *last_real;
1323
0
  bool keep_syms;
1324
0
  asection *csect;
1325
0
  unsigned int csect_index;
1326
0
  asection *first_csect;
1327
0
  bfd_size_type symesz;
1328
0
  bfd_byte *esym;
1329
0
  bfd_byte *esym_end;
1330
0
  struct reloc_info_struct
1331
0
  {
1332
0
    struct internal_reloc *relocs;
1333
0
    asection **csects;
1334
0
    bfd_byte *linenos;
1335
0
  } *reloc_info = NULL;
1336
0
  bfd_size_type amt;
1337
0
  unsigned short visibility;
1338
1339
0
  keep_syms = obj_coff_keep_syms (abfd);
1340
1341
0
  if ((abfd->flags & DYNAMIC) != 0
1342
0
      && ! info->static_link)
1343
0
    {
1344
0
      if (! xcoff_link_add_dynamic_symbols (abfd, info))
1345
0
  return false;
1346
0
    }
1347
1348
  /* Create the loader, toc, gl, ds and debug sections, if needed.  */
1349
0
  if (! xcoff_link_create_extra_sections (abfd, info))
1350
0
    goto error_return;
1351
1352
0
  if ((abfd->flags & DYNAMIC) != 0
1353
0
      && ! info->static_link)
1354
0
    return true;
1355
1356
0
  n_tmask = coff_data (abfd)->local_n_tmask;
1357
0
  n_btshft = coff_data (abfd)->local_n_btshft;
1358
1359
  /* Define macros so that ISFCN, et. al., macros work correctly.  */
1360
0
#define N_TMASK n_tmask
1361
0
#define N_BTSHFT n_btshft
1362
1363
0
  if (info->keep_memory)
1364
0
    default_copy = false;
1365
0
  else
1366
0
    default_copy = true;
1367
1368
0
  symcount = obj_raw_syment_count (abfd);
1369
1370
  /* We keep a list of the linker hash table entries that correspond
1371
     to each external symbol.  */
1372
0
  amt = symcount * sizeof (struct xcoff_link_hash_entry *);
1373
0
  sym_hash = bfd_zalloc (abfd, amt);
1374
0
  if (sym_hash == NULL && symcount != 0)
1375
0
    goto error_return;
1376
0
  coff_data (abfd)->sym_hashes = (struct coff_link_hash_entry **) sym_hash;
1377
1378
  /* Because of the weird stuff we are doing with XCOFF csects, we can
1379
     not easily determine which section a symbol is in, so we store
1380
     the information in the tdata for the input file.  */
1381
0
  amt = symcount * sizeof (asection *);
1382
0
  csect_cache = bfd_zalloc (abfd, amt);
1383
0
  if (csect_cache == NULL && symcount != 0)
1384
0
    goto error_return;
1385
0
  xcoff_data (abfd)->csects = csect_cache;
1386
1387
  /* We garbage-collect line-number information on a symbol-by-symbol
1388
     basis, so we need to have quick access to the number of entries
1389
     per symbol.  */
1390
0
  amt = symcount * sizeof (unsigned int);
1391
0
  lineno_counts = bfd_zalloc (abfd, amt);
1392
0
  if (lineno_counts == NULL && symcount != 0)
1393
0
    goto error_return;
1394
0
  xcoff_data (abfd)->lineno_counts = lineno_counts;
1395
1396
  /* While splitting sections into csects, we need to assign the
1397
     relocs correctly.  The relocs and the csects must both be in
1398
     order by VMA within a given section, so we handle this by
1399
     scanning along the relocs as we process the csects.  We index
1400
     into reloc_info using the section target_index.  */
1401
0
  amt = abfd->section_count + 1;
1402
0
  amt *= sizeof (struct reloc_info_struct);
1403
0
  reloc_info = bfd_zmalloc (amt);
1404
0
  if (reloc_info == NULL)
1405
0
    goto error_return;
1406
1407
  /* Read in the relocs and line numbers for each section.  */
1408
0
  linesz = bfd_coff_linesz (abfd);
1409
0
  last_real = NULL;
1410
0
  for (o = abfd->sections; o != NULL; o = o->next)
1411
0
    {
1412
0
      last_real = o;
1413
1414
0
      if ((o->flags & SEC_RELOC) != 0)
1415
0
  {
1416
0
    reloc_info[o->target_index].relocs =
1417
0
      xcoff_read_internal_relocs (abfd, o, true, NULL, false, NULL);
1418
0
    amt = o->reloc_count;
1419
0
    amt *= sizeof (asection *);
1420
0
    reloc_info[o->target_index].csects = bfd_zmalloc (amt);
1421
0
    if (reloc_info[o->target_index].csects == NULL)
1422
0
      goto error_return;
1423
0
  }
1424
1425
0
      if ((info->strip == strip_none || info->strip == strip_some)
1426
0
    && o->lineno_count > 0)
1427
0
  {
1428
0
    bfd_byte *linenos;
1429
1430
0
    if (bfd_seek (abfd, o->line_filepos, SEEK_SET) != 0)
1431
0
      goto error_return;
1432
0
    if (_bfd_mul_overflow (linesz, o->lineno_count, &amt))
1433
0
      {
1434
0
        bfd_set_error (bfd_error_file_too_big);
1435
0
        goto error_return;
1436
0
      }
1437
0
    linenos = _bfd_malloc_and_read (abfd, amt, amt);
1438
0
    if (linenos == NULL)
1439
0
      goto error_return;
1440
0
    reloc_info[o->target_index].linenos = linenos;
1441
0
  }
1442
0
    }
1443
1444
  /* Don't let the linker relocation routines discard the symbols.  */
1445
0
  obj_coff_keep_syms (abfd) = true;
1446
1447
0
  csect = NULL;
1448
0
  csect_index = 0;
1449
0
  first_csect = NULL;
1450
1451
0
  symesz = bfd_coff_symesz (abfd);
1452
0
  BFD_ASSERT (symesz == bfd_coff_auxesz (abfd));
1453
0
  esym = (bfd_byte *) obj_coff_external_syms (abfd);
1454
0
  esym_end = esym + symcount * symesz;
1455
1456
0
  while (esym < esym_end)
1457
0
    {
1458
0
      struct internal_syment sym;
1459
0
      union internal_auxent aux;
1460
0
      const char *name;
1461
0
      char buf[SYMNMLEN + 1];
1462
0
      int smtyp;
1463
0
      asection *section;
1464
0
      bfd_vma value;
1465
0
      struct xcoff_link_hash_entry *set_toc;
1466
1467
0
      bfd_coff_swap_sym_in (abfd, (void *) esym, (void *) &sym);
1468
1469
      /* In this pass we are only interested in symbols with csect
1470
   information.  */
1471
0
      if (!CSECT_SYM_P (sym.n_sclass))
1472
0
  {
1473
    /* Set csect_cache,
1474
       Normally csect is a .pr, .rw  etc. created in the loop
1475
       If C_FILE or first time, handle special
1476
1477
       Advance esym, sym_hash, csect_hash ptrs.  */
1478
0
    if (sym.n_sclass == C_FILE || sym.n_sclass == C_DWARF)
1479
0
      csect = NULL;
1480
0
    if (csect != NULL)
1481
0
      *csect_cache = csect;
1482
0
    else if (first_csect == NULL
1483
0
       || sym.n_sclass == C_FILE || sym.n_sclass == C_DWARF)
1484
0
      *csect_cache = coff_section_from_bfd_index (abfd, sym.n_scnum);
1485
0
    else
1486
0
      *csect_cache = NULL;
1487
0
    esym += (sym.n_numaux + 1) * symesz;
1488
0
    sym_hash += sym.n_numaux + 1;
1489
0
    csect_cache += sym.n_numaux + 1;
1490
0
    lineno_counts += sym.n_numaux + 1;
1491
1492
0
    continue;
1493
0
  }
1494
1495
0
      name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
1496
1497
0
      if (name == NULL)
1498
0
  goto error_return;
1499
1500
      /* If this symbol has line number information attached to it,
1501
   and we're not stripping it, count the number of entries and
1502
   add them to the count for this csect.  In the final link pass
1503
   we are going to attach line number information by symbol,
1504
   rather than by section, in order to more easily handle
1505
   garbage collection.  */
1506
0
      if ((info->strip == strip_none || info->strip == strip_some)
1507
0
    && sym.n_numaux > 1
1508
0
    && csect != NULL
1509
0
    && ISFCN (sym.n_type))
1510
0
  {
1511
0
    union internal_auxent auxlin;
1512
1513
0
    bfd_coff_swap_aux_in (abfd, (void *) (esym + symesz),
1514
0
        sym.n_type, sym.n_sclass,
1515
0
        0, sym.n_numaux, (void *) &auxlin);
1516
1517
0
    if (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0)
1518
0
      {
1519
0
        asection *enclosing;
1520
0
        bfd_signed_vma linoff;
1521
1522
0
        enclosing = xcoff_section_data (abfd, csect)->enclosing;
1523
0
        if (enclosing == NULL)
1524
0
    {
1525
0
      _bfd_error_handler
1526
        /* xgettext:c-format */
1527
0
        (_("%pB: `%s' has line numbers but no enclosing section"),
1528
0
         abfd, name);
1529
0
      bfd_set_error (bfd_error_bad_value);
1530
0
      goto error_return;
1531
0
    }
1532
0
        linoff = (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr
1533
0
      - enclosing->line_filepos);
1534
        /* Explicit cast to bfd_signed_vma for compiler.  */
1535
0
        if (linoff < (bfd_signed_vma) (enclosing->lineno_count * linesz))
1536
0
    {
1537
0
      struct internal_lineno lin;
1538
0
      bfd_byte *linpstart;
1539
1540
0
      linpstart = (reloc_info[enclosing->target_index].linenos
1541
0
             + linoff);
1542
0
      bfd_coff_swap_lineno_in (abfd, (void *) linpstart, (void *) &lin);
1543
0
      if (lin.l_lnno == 0
1544
0
          && ((bfd_size_type) lin.l_addr.l_symndx
1545
0
        == ((esym
1546
0
             - (bfd_byte *) obj_coff_external_syms (abfd))
1547
0
            / symesz)))
1548
0
        {
1549
0
          bfd_byte *linpend, *linp;
1550
1551
0
          linpend = (reloc_info[enclosing->target_index].linenos
1552
0
         + enclosing->lineno_count * linesz);
1553
0
          for (linp = linpstart + linesz;
1554
0
         linp < linpend;
1555
0
         linp += linesz)
1556
0
      {
1557
0
        bfd_coff_swap_lineno_in (abfd, (void *) linp,
1558
0
               (void *) &lin);
1559
0
        if (lin.l_lnno == 0)
1560
0
          break;
1561
0
      }
1562
0
          *lineno_counts = (linp - linpstart) / linesz;
1563
          /* The setting of line_filepos will only be
1564
       useful if all the line number entries for a
1565
       csect are contiguous; this only matters for
1566
       error reporting.  */
1567
0
          if (csect->line_filepos == 0)
1568
0
      csect->line_filepos =
1569
0
        auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr;
1570
0
        }
1571
0
    }
1572
0
      }
1573
0
  }
1574
1575
      /* Record visibility.  */
1576
0
      visibility = sym.n_type & SYM_V_MASK;
1577
1578
      /* Pick up the csect auxiliary information.  */
1579
0
      if (sym.n_numaux == 0)
1580
0
  {
1581
0
    _bfd_error_handler
1582
      /* xgettext:c-format */
1583
0
      (_("%pB: class %d symbol `%s' has no aux entries"),
1584
0
       abfd, sym.n_sclass, name);
1585
0
    bfd_set_error (bfd_error_bad_value);
1586
0
    goto error_return;
1587
0
  }
1588
1589
0
      bfd_coff_swap_aux_in (abfd,
1590
0
          (void *) (esym + symesz * sym.n_numaux),
1591
0
          sym.n_type, sym.n_sclass,
1592
0
          sym.n_numaux - 1, sym.n_numaux,
1593
0
          (void *) &aux);
1594
1595
0
      smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp);
1596
1597
0
      section = NULL;
1598
0
      value = 0;
1599
0
      set_toc = NULL;
1600
1601
0
      switch (smtyp)
1602
0
  {
1603
0
  default:
1604
0
    _bfd_error_handler
1605
      /* xgettext:c-format */
1606
0
      (_("%pB: symbol `%s' has unrecognized csect type %d"),
1607
0
       abfd, name, smtyp);
1608
0
    bfd_set_error (bfd_error_bad_value);
1609
0
    goto error_return;
1610
1611
0
  case XTY_ER:
1612
    /* This is an external reference.  */
1613
0
    if (sym.n_sclass == C_HIDEXT
1614
0
        || sym.n_scnum != N_UNDEF
1615
0
        || aux.x_csect.x_scnlen.u64 != 0)
1616
0
      {
1617
0
        _bfd_error_handler
1618
    /* xgettext:c-format */
1619
0
    (_("%pB: bad XTY_ER symbol `%s': class %d scnum %d "
1620
0
       "scnlen %" PRId64),
1621
0
     abfd, name, sym.n_sclass, sym.n_scnum,
1622
0
     aux.x_csect.x_scnlen.u64);
1623
0
        bfd_set_error (bfd_error_bad_value);
1624
0
        goto error_return;
1625
0
      }
1626
1627
    /* An XMC_XO external reference is actually a reference to
1628
       an absolute location.  */
1629
0
    if (aux.x_csect.x_smclas != XMC_XO)
1630
0
      section = bfd_und_section_ptr;
1631
0
    else
1632
0
      {
1633
0
        section = bfd_abs_section_ptr;
1634
0
        value = sym.n_value;
1635
0
      }
1636
0
    break;
1637
1638
0
  case XTY_SD:
1639
0
    csect = NULL;
1640
0
    csect_index = -(unsigned) 1;
1641
1642
    /* When we see a TOC anchor, we record the TOC value.  */
1643
0
    if (aux.x_csect.x_smclas == XMC_TC0)
1644
0
      {
1645
0
        if (sym.n_sclass != C_HIDEXT
1646
0
      || aux.x_csect.x_scnlen.u64 != 0)
1647
0
    {
1648
0
      _bfd_error_handler
1649
        /* xgettext:c-format */
1650
0
        (_("%pB: XMC_TC0 symbol `%s' is class %d scnlen %" PRIu64),
1651
0
         abfd, name, sym.n_sclass, aux.x_csect.x_scnlen.u64);
1652
0
      bfd_set_error (bfd_error_bad_value);
1653
0
      goto error_return;
1654
0
    }
1655
0
        xcoff_data (abfd)->toc = sym.n_value;
1656
0
      }
1657
1658
    /* We must merge TOC entries for the same symbol.  We can
1659
       merge two TOC entries if they are both C_HIDEXT, they
1660
       both have the same name, they are both 4 or 8 bytes long, and
1661
       they both have a relocation table entry for an external
1662
       symbol with the same name.  Unfortunately, this means
1663
       that we must look through the relocations.  Ick.
1664
1665
       Logic for 32 bit vs 64 bit.
1666
       32 bit has a csect length of 4 for TOC
1667
       64 bit has a csect length of 8 for TOC
1668
1669
       An exception is made for TOC entries with a R_TLSML
1670
       relocation.  This relocation is made for the loader.
1671
       We must check that the referenced symbol is the TOC entry
1672
       itself.
1673
1674
       The conditions to get past the if-check are not that bad.
1675
       They are what is used to create the TOC csects in the first
1676
       place.  */
1677
0
    if (aux.x_csect.x_smclas == XMC_TC
1678
0
        && sym.n_sclass == C_HIDEXT
1679
0
        && info->output_bfd->xvec == abfd->xvec
1680
0
        && ((bfd_xcoff_is_xcoff32 (abfd)
1681
0
       && aux.x_csect.x_scnlen.u64 == 4)
1682
0
      || (bfd_xcoff_is_xcoff64 (abfd)
1683
0
          && aux.x_csect.x_scnlen.u64 == 8)))
1684
0
      {
1685
0
        asection *enclosing;
1686
0
        struct internal_reloc *relocs;
1687
0
        bfd_size_type relindx;
1688
0
        struct internal_reloc *rel;
1689
1690
0
        enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum);
1691
0
        if (enclosing == NULL)
1692
0
    goto error_return;
1693
1694
0
        relocs = reloc_info[enclosing->target_index].relocs;
1695
0
        amt = enclosing->reloc_count;
1696
0
        relindx = xcoff_find_reloc (relocs, amt, sym.n_value);
1697
0
        rel = relocs + relindx;
1698
1699
        /* 32 bit R_POS r_size is 31
1700
     64 bit R_POS r_size is 63  */
1701
0
        if (relindx < enclosing->reloc_count
1702
0
      && rel->r_vaddr == (bfd_vma) sym.n_value
1703
0
      && (rel->r_type == R_POS ||
1704
0
          rel->r_type == R_TLSML)
1705
0
      && ((bfd_xcoff_is_xcoff32 (abfd)
1706
0
           && rel->r_size == 31)
1707
0
          || (bfd_xcoff_is_xcoff64 (abfd)
1708
0
        && rel->r_size == 63)))
1709
0
    {
1710
0
      bfd_byte *erelsym;
1711
1712
0
      struct internal_syment relsym;
1713
1714
0
      erelsym = ((bfd_byte *) obj_coff_external_syms (abfd)
1715
0
           + rel->r_symndx * symesz);
1716
0
      bfd_coff_swap_sym_in (abfd, (void *) erelsym, (void *) &relsym);
1717
0
      if (EXTERN_SYM_P (relsym.n_sclass))
1718
0
        {
1719
0
          const char *relname;
1720
0
          char relbuf[SYMNMLEN + 1];
1721
0
          bool copy;
1722
0
          struct xcoff_link_hash_entry *h;
1723
1724
          /* At this point we know that the TOC entry is
1725
       for an externally visible symbol.  */
1726
0
          relname = _bfd_coff_internal_syment_name (abfd, &relsym,
1727
0
                relbuf);
1728
0
          if (relname == NULL)
1729
0
      goto error_return;
1730
1731
          /* We only merge TOC entries if the TC name is
1732
       the same as the symbol name.  This handles
1733
       the normal case, but not common cases like
1734
       SYM.P4 which gcc generates to store SYM + 4
1735
       in the TOC.  FIXME.  */
1736
0
          if (strcmp (name, relname) == 0)
1737
0
      {
1738
0
        copy = (! info->keep_memory
1739
0
          || relsym._n._n_n._n_zeroes != 0
1740
0
          || relsym._n._n_n._n_offset == 0);
1741
0
        h = xcoff_link_hash_lookup (xcoff_hash_table (info),
1742
0
                  relname, true, copy,
1743
0
                  false);
1744
0
        if (h == NULL)
1745
0
          goto error_return;
1746
1747
        /* At this point h->root.type could be
1748
           bfd_link_hash_new.  That should be OK,
1749
           since we know for sure that we will come
1750
           across this symbol as we step through the
1751
           file.  */
1752
1753
        /* We store h in *sym_hash for the
1754
           convenience of the relocate_section
1755
           function.  */
1756
0
        *sym_hash = h;
1757
1758
0
        if (h->toc_section != NULL)
1759
0
          {
1760
0
            asection **rel_csects;
1761
1762
            /* We already have a TOC entry for this
1763
         symbol, so we can just ignore this
1764
         one.  */
1765
0
            rel_csects =
1766
0
        reloc_info[enclosing->target_index].csects;
1767
0
            rel_csects[relindx] = bfd_und_section_ptr;
1768
0
            break;
1769
0
          }
1770
1771
        /* We are about to create a TOC entry for
1772
           this symbol.  */
1773
0
        set_toc = h;
1774
0
      }
1775
0
        }
1776
0
      else if (rel->r_type == R_TLSML)
1777
0
        {
1778
0
      csect_index = ((esym
1779
0
          - (bfd_byte *) obj_coff_external_syms (abfd))
1780
0
               / symesz);
1781
0
      if (((unsigned long) rel->r_symndx) != csect_index)
1782
0
        {
1783
0
          _bfd_error_handler
1784
            /* xgettext:c-format */
1785
0
            (_("%pB: TOC entry `%s' has a R_TLSML"
1786
0
         "relocation not targeting itself"),
1787
0
             abfd, name);
1788
0
          bfd_set_error (bfd_error_bad_value);
1789
0
          goto error_return;
1790
0
        }
1791
0
        }
1792
0
    }
1793
0
      }
1794
1795
0
    {
1796
0
      asection *enclosing;
1797
1798
      /* We need to create a new section.  We get the name from
1799
         the csect storage mapping class, so that the linker can
1800
         accumulate similar csects together.  */
1801
1802
0
      csect = bfd_xcoff_create_csect_from_smclas(abfd, &aux, name);
1803
0
      if (NULL == csect)
1804
0
        goto error_return;
1805
1806
      /* The enclosing section is the main section : .data, .text
1807
         or .bss that the csect is coming from.  */
1808
0
      enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum);
1809
0
      if (enclosing == NULL)
1810
0
        goto error_return;
1811
1812
0
      if (! bfd_is_abs_section (enclosing)
1813
0
    && ((bfd_vma) sym.n_value < enclosing->vma
1814
0
        || (sym.n_value + aux.x_csect.x_scnlen.u64
1815
0
      > enclosing->vma + enclosing->size)))
1816
0
        {
1817
0
    _bfd_error_handler
1818
      /* xgettext:c-format */
1819
0
      (_("%pB: csect `%s' not in enclosing section"),
1820
0
       abfd, name);
1821
0
    bfd_set_error (bfd_error_bad_value);
1822
0
    goto error_return;
1823
0
        }
1824
0
      csect->vma = sym.n_value;
1825
0
      csect->filepos = (enclosing->filepos
1826
0
            + sym.n_value
1827
0
            - enclosing->vma);
1828
0
      csect->size = aux.x_csect.x_scnlen.u64;
1829
0
      csect->rawsize = aux.x_csect.x_scnlen.u64;
1830
0
      csect->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS;
1831
0
      csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp);
1832
1833
      /* Record the enclosing section in the tdata for this new
1834
         section.  */
1835
0
      amt = sizeof (struct coff_section_tdata);
1836
0
      csect->used_by_bfd = bfd_zalloc (abfd, amt);
1837
0
      if (csect->used_by_bfd == NULL)
1838
0
        goto error_return;
1839
0
      amt = sizeof (struct xcoff_section_tdata);
1840
0
      coff_section_data (abfd, csect)->tdata = bfd_zalloc (abfd, amt);
1841
0
      if (coff_section_data (abfd, csect)->tdata == NULL)
1842
0
        goto error_return;
1843
0
      xcoff_section_data (abfd, csect)->enclosing = enclosing;
1844
0
      xcoff_section_data (abfd, csect)->lineno_count =
1845
0
        enclosing->lineno_count;
1846
1847
0
      if (enclosing->owner == abfd)
1848
0
        {
1849
0
    struct internal_reloc *relocs;
1850
0
    bfd_size_type relindx;
1851
0
    struct internal_reloc *rel;
1852
0
    asection **rel_csect;
1853
1854
0
    relocs = reloc_info[enclosing->target_index].relocs;
1855
0
    amt = enclosing->reloc_count;
1856
0
    relindx = xcoff_find_reloc (relocs, amt, csect->vma);
1857
1858
0
    rel = relocs + relindx;
1859
0
    rel_csect = (reloc_info[enclosing->target_index].csects
1860
0
           + relindx);
1861
1862
0
    csect->rel_filepos = (enclosing->rel_filepos
1863
0
              + relindx * bfd_coff_relsz (abfd));
1864
0
    while (relindx < enclosing->reloc_count
1865
0
           && *rel_csect == NULL
1866
0
           && rel->r_vaddr < csect->vma + csect->size)
1867
0
      {
1868
1869
0
        *rel_csect = csect;
1870
0
        csect->flags |= SEC_RELOC;
1871
0
        ++csect->reloc_count;
1872
0
        ++relindx;
1873
0
        ++rel;
1874
0
        ++rel_csect;
1875
0
      }
1876
0
        }
1877
1878
      /* There are a number of other fields and section flags
1879
         which we do not bother to set.  */
1880
1881
0
      csect_index = ((esym
1882
0
          - (bfd_byte *) obj_coff_external_syms (abfd))
1883
0
         / symesz);
1884
1885
0
      xcoff_section_data (abfd, csect)->first_symndx = csect_index;
1886
1887
0
      if (first_csect == NULL)
1888
0
        first_csect = csect;
1889
1890
      /* If this symbol must be added to the linker hash table,
1891
         we treat it as starting at the beginning of the newly
1892
         created section.  */
1893
0
      if (xcoff_link_add_symbols_to_hash_table (sym, aux))
1894
0
        {
1895
0
    section = csect;
1896
0
    value = 0;
1897
0
        }
1898
1899
      /* If this is a TOC section for a symbol, record it.  */
1900
0
      if (set_toc != NULL)
1901
0
        set_toc->toc_section = csect;
1902
0
    }
1903
0
    break;
1904
1905
0
  case XTY_LD:
1906
    /* This is a label definition.  The x_scnlen field is the
1907
       symbol index of the csect.  Usually the XTY_LD symbol will
1908
       follow its appropriate XTY_SD symbol.  The .set pseudo op can
1909
       cause the XTY_LD to not follow the XTY_SD symbol. */
1910
0
    {
1911
0
      bool bad = (aux.x_csect.x_scnlen.u64
1912
0
      >= ((esym - (bfd_byte *) obj_coff_external_syms (abfd))
1913
0
          / symesz));
1914
0
      if (! bad)
1915
0
        {
1916
0
    section = xcoff_data (abfd)->csects[aux.x_csect.x_scnlen.u64];
1917
0
    if (section == NULL
1918
0
        || (section->flags & SEC_HAS_CONTENTS) == 0)
1919
0
      bad = true;
1920
0
        }
1921
0
      if (bad)
1922
0
        {
1923
0
    _bfd_error_handler
1924
      /* xgettext:c-format */
1925
0
      (_("%pB: misplaced XTY_LD `%s'"),
1926
0
       abfd, name);
1927
0
    bfd_set_error (bfd_error_bad_value);
1928
0
    goto error_return;
1929
0
        }
1930
0
      csect = section;
1931
0
      value = sym.n_value - csect->vma;
1932
0
    }
1933
0
    break;
1934
1935
0
  case XTY_CM:
1936
    /* This is an unitialized csect.  We could base the name on
1937
       the storage mapping class, but we don't bother except for
1938
       an XMC_TD symbol.  If this csect is externally visible,
1939
       it is a common symbol.  We put XMC_TD symbols in sections
1940
       named .tocbss, and rely on the linker script to put that
1941
       in the TOC area.  */
1942
1943
0
    if (aux.x_csect.x_smclas == XMC_TD)
1944
0
      {
1945
        /* The linker script puts the .td section in the data
1946
     section after the .tc section.  */
1947
0
        csect = bfd_make_section_anyway_with_flags (abfd, ".td",
1948
0
                SEC_ALLOC);
1949
0
      }
1950
0
    else if (aux.x_csect.x_smclas == XMC_UL)
1951
0
      {
1952
        /* This is a thread-local unitialized csect.  */
1953
0
        csect = bfd_make_section_anyway_with_flags (abfd, ".tbss",
1954
0
                SEC_ALLOC | SEC_THREAD_LOCAL);
1955
0
      }
1956
0
    else
1957
0
      csect = bfd_make_section_anyway_with_flags (abfd, ".bss",
1958
0
              SEC_ALLOC);
1959
1960
0
    if (csect == NULL)
1961
0
      goto error_return;
1962
0
    csect->vma = sym.n_value;
1963
0
    csect->size = aux.x_csect.x_scnlen.u64;
1964
0
    csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp);
1965
    /* There are a number of other fields and section flags
1966
       which we do not bother to set.  */
1967
1968
0
    csect_index = ((esym
1969
0
        - (bfd_byte *) obj_coff_external_syms (abfd))
1970
0
       / symesz);
1971
1972
0
    amt = sizeof (struct coff_section_tdata);
1973
0
    csect->used_by_bfd = bfd_zalloc (abfd, amt);
1974
0
    if (csect->used_by_bfd == NULL)
1975
0
      goto error_return;
1976
0
    amt = sizeof (struct xcoff_section_tdata);
1977
0
    coff_section_data (abfd, csect)->tdata = bfd_zalloc (abfd, amt);
1978
0
    if (coff_section_data (abfd, csect)->tdata == NULL)
1979
0
      goto error_return;
1980
0
    xcoff_section_data (abfd, csect)->first_symndx = csect_index;
1981
1982
0
    if (first_csect == NULL)
1983
0
      first_csect = csect;
1984
1985
0
    if (xcoff_link_add_symbols_to_hash_table (sym, aux))
1986
0
      {
1987
0
        csect->flags |= SEC_IS_COMMON;
1988
0
        csect->size = 0;
1989
0
        section = csect;
1990
0
        value = aux.x_csect.x_scnlen.u64;
1991
0
      }
1992
1993
0
    break;
1994
0
  }
1995
1996
      /* Check for magic symbol names.  */
1997
0
      if ((smtyp == XTY_SD || smtyp == XTY_CM)
1998
0
    && aux.x_csect.x_smclas != XMC_TC
1999
0
    && aux.x_csect.x_smclas != XMC_TD)
2000
0
  {
2001
0
    int i = -1;
2002
2003
0
    if (name[0] == '_')
2004
0
      {
2005
0
        if (strcmp (name, "_text") == 0)
2006
0
    i = XCOFF_SPECIAL_SECTION_TEXT;
2007
0
        else if (strcmp (name, "_etext") == 0)
2008
0
    i = XCOFF_SPECIAL_SECTION_ETEXT;
2009
0
        else if (strcmp (name, "_data") == 0)
2010
0
    i = XCOFF_SPECIAL_SECTION_DATA;
2011
0
        else if (strcmp (name, "_edata") == 0)
2012
0
    i = XCOFF_SPECIAL_SECTION_EDATA;
2013
0
        else if (strcmp (name, "_end") == 0)
2014
0
    i = XCOFF_SPECIAL_SECTION_END;
2015
0
      }
2016
0
    else if (name[0] == 'e' && strcmp (name, "end") == 0)
2017
0
      i = XCOFF_SPECIAL_SECTION_END2;
2018
2019
0
    if (i != -1)
2020
0
      xcoff_hash_table (info)->special_sections[i] = csect;
2021
0
  }
2022
2023
      /* Now we have enough information to add the symbol to the
2024
   linker hash table.  */
2025
2026
0
      if (xcoff_link_add_symbols_to_hash_table (sym, aux))
2027
0
  {
2028
0
    bool copy, ok;
2029
0
    flagword flags;
2030
2031
0
    BFD_ASSERT (section != NULL);
2032
2033
    /* We must copy the name into memory if we got it from the
2034
       syment itself, rather than the string table.  */
2035
0
    copy = default_copy;
2036
0
    if (sym._n._n_n._n_zeroes != 0
2037
0
        || sym._n._n_n._n_offset == 0)
2038
0
      copy = true;
2039
2040
    /* Ignore global linkage code when linking statically.  */
2041
0
    if (info->static_link
2042
0
        && (smtyp == XTY_SD || smtyp == XTY_LD)
2043
0
        && aux.x_csect.x_smclas == XMC_GL)
2044
0
      {
2045
0
        section = bfd_und_section_ptr;
2046
0
        value = 0;
2047
0
      }
2048
2049
    /* The AIX linker appears to only detect multiple symbol
2050
       definitions when there is a reference to the symbol.  If
2051
       a symbol is defined multiple times, and the only
2052
       references are from the same object file, the AIX linker
2053
       appears to permit it.  It does not merge the different
2054
       definitions, but handles them independently.  On the
2055
       other hand, if there is a reference, the linker reports
2056
       an error.
2057
2058
       This matters because the AIX <net/net_globals.h> header
2059
       file actually defines an initialized array, so we have to
2060
       actually permit that to work.
2061
2062
       Just to make matters even more confusing, the AIX linker
2063
       appears to permit multiple symbol definitions whenever
2064
       the second definition is in an archive rather than an
2065
       object file.  This may be a consequence of the manner in
2066
       which it handles archives: I think it may load the entire
2067
       archive in as separate csects, and then let garbage
2068
       collection discard symbols.
2069
2070
       We also have to handle the case of statically linking a
2071
       shared object, which will cause symbol redefinitions,
2072
       although this is an easier case to detect.  */
2073
0
    else if (info->output_bfd->xvec == abfd->xvec)
2074
0
      {
2075
0
        if (! bfd_is_und_section (section))
2076
0
    *sym_hash = xcoff_link_hash_lookup (xcoff_hash_table (info),
2077
0
                name, true, copy, false);
2078
0
        else
2079
    /* Make a copy of the symbol name to prevent problems with
2080
       merging symbols.  */
2081
0
    *sym_hash = ((struct xcoff_link_hash_entry *)
2082
0
           bfd_wrapped_link_hash_lookup (abfd, info, name,
2083
0
                 true, true, false));
2084
2085
0
        if (*sym_hash == NULL)
2086
0
    goto error_return;
2087
0
        if (((*sym_hash)->root.type == bfd_link_hash_defined
2088
0
       || (*sym_hash)->root.type == bfd_link_hash_defweak)
2089
0
      && ! bfd_is_und_section (section)
2090
0
      && ! bfd_is_com_section (section))
2091
0
    {
2092
      /* This is a second definition of a defined symbol.  */
2093
0
      if (((*sym_hash)->flags & XCOFF_DEF_REGULAR) == 0
2094
0
          && ((*sym_hash)->flags & XCOFF_DEF_DYNAMIC) != 0)
2095
0
        {
2096
          /* The existing symbol is from a shared library.
2097
       Replace it.  */
2098
0
          (*sym_hash)->root.type = bfd_link_hash_undefined;
2099
0
          (*sym_hash)->root.u.undef.abfd =
2100
0
      (*sym_hash)->root.u.def.section->owner;
2101
0
        }
2102
0
      else if (abfd->my_archive != NULL)
2103
0
        {
2104
          /* This is a redefinition in an object contained
2105
       in an archive.  Just ignore it.  See the
2106
       comment above.  */
2107
0
          section = bfd_und_section_ptr;
2108
0
          value = 0;
2109
0
        }
2110
0
      else if (sym.n_sclass == C_AIX_WEAKEXT
2111
0
         || (*sym_hash)->root.type == bfd_link_hash_defweak)
2112
0
        {
2113
          /* At least one of the definitions is weak.
2114
       Allow the normal rules to take effect.  */
2115
0
        }
2116
0
      else if ((*sym_hash)->root.u.undef.next != NULL
2117
0
         || info->hash->undefs_tail == &(*sym_hash)->root)
2118
0
        {
2119
          /* This symbol has been referenced.  In this
2120
       case, we just continue and permit the
2121
       multiple definition error.  See the comment
2122
       above about the behaviour of the AIX linker.  */
2123
0
        }
2124
0
      else if ((*sym_hash)->smclas == aux.x_csect.x_smclas)
2125
0
        {
2126
          /* The symbols are both csects of the same
2127
       class.  There is at least a chance that this
2128
       is a semi-legitimate redefinition.  */
2129
0
          section = bfd_und_section_ptr;
2130
0
          value = 0;
2131
0
          (*sym_hash)->flags |= XCOFF_MULTIPLY_DEFINED;
2132
0
        }
2133
0
    }
2134
0
        else if (((*sym_hash)->flags & XCOFF_MULTIPLY_DEFINED) != 0
2135
0
           && (*sym_hash)->root.type == bfd_link_hash_defined
2136
0
           && (bfd_is_und_section (section)
2137
0
         || bfd_is_com_section (section)))
2138
0
    {
2139
      /* This is a reference to a multiply defined symbol.
2140
         Report the error now.  See the comment above
2141
         about the behaviour of the AIX linker.  We could
2142
         also do this with warning symbols, but I'm not
2143
         sure the XCOFF linker is wholly prepared to
2144
         handle them, and that would only be a warning,
2145
         not an error.  */
2146
0
      (*info->callbacks->multiple_definition) (info,
2147
0
                 &(*sym_hash)->root,
2148
0
                 NULL, NULL,
2149
0
                 (bfd_vma) 0);
2150
      /* Try not to give this error too many times.  */
2151
0
      (*sym_hash)->flags &= ~XCOFF_MULTIPLY_DEFINED;
2152
0
    }
2153
2154
2155
        /* If the symbol is hidden or internal, completely undo
2156
     any dynamic link state.  */
2157
0
        if ((*sym_hash)->flags & XCOFF_DEF_DYNAMIC
2158
0
      && (visibility == SYM_V_HIDDEN
2159
0
          || visibility == SYM_V_INTERNAL))
2160
0
      (*sym_hash)->flags &= ~XCOFF_DEF_DYNAMIC;
2161
0
        else
2162
0
    {
2163
      /* Keep the most constraining visibility.  */
2164
0
      unsigned short hvis = (*sym_hash)->visibility;
2165
0
      if (visibility && ( !hvis || visibility < hvis))
2166
0
        (*sym_hash)->visibility = visibility;
2167
0
    }
2168
2169
0
      }
2170
2171
    /* _bfd_generic_link_add_one_symbol may call the linker to
2172
       generate an error message, and the linker may try to read
2173
       the symbol table to give a good error.  Right now, the
2174
       line numbers are in an inconsistent state, since they are
2175
       counted both in the real sections and in the new csects.
2176
       We need to leave the count in the real sections so that
2177
       the linker can report the line number of the error
2178
       correctly, so temporarily clobber the link to the csects
2179
       so that the linker will not try to read the line numbers
2180
       a second time from the csects.  */
2181
0
    BFD_ASSERT (last_real->next == first_csect);
2182
0
    last_real->next = NULL;
2183
0
    flags = (sym.n_sclass == C_EXT ? BSF_GLOBAL : BSF_WEAK);
2184
0
    ok = (_bfd_generic_link_add_one_symbol
2185
0
    (info, abfd, name, flags, section, value, NULL, copy, true,
2186
0
     (struct bfd_link_hash_entry **) sym_hash));
2187
0
    last_real->next = first_csect;
2188
0
    if (!ok)
2189
0
      goto error_return;
2190
2191
0
    if (smtyp == XTY_CM)
2192
0
      {
2193
0
        if ((*sym_hash)->root.type != bfd_link_hash_common
2194
0
      || (*sym_hash)->root.u.c.p->section != csect)
2195
    /* We don't need the common csect we just created.  */
2196
0
    csect->size = 0;
2197
0
        else
2198
0
    (*sym_hash)->root.u.c.p->alignment_power
2199
0
      = csect->alignment_power;
2200
0
      }
2201
2202
0
    if (info->output_bfd->xvec == abfd->xvec)
2203
0
      {
2204
0
        int flag;
2205
2206
0
        if (smtyp == XTY_ER
2207
0
      || smtyp == XTY_CM
2208
0
      || section == bfd_und_section_ptr)
2209
0
    flag = XCOFF_REF_REGULAR;
2210
0
        else
2211
0
    flag = XCOFF_DEF_REGULAR;
2212
0
        (*sym_hash)->flags |= flag;
2213
2214
0
        if ((*sym_hash)->smclas == XMC_UA
2215
0
      || flag == XCOFF_DEF_REGULAR)
2216
0
    (*sym_hash)->smclas = aux.x_csect.x_smclas;
2217
0
      }
2218
0
  }
2219
2220
0
      if (smtyp == XTY_ER)
2221
0
  *csect_cache = section;
2222
0
      else
2223
0
  {
2224
0
    *csect_cache = csect;
2225
0
    if (csect != NULL)
2226
0
      xcoff_section_data (abfd, csect)->last_symndx
2227
0
        = (esym - (bfd_byte *) obj_coff_external_syms (abfd)) / symesz;
2228
0
  }
2229
2230
0
      esym += (sym.n_numaux + 1) * symesz;
2231
0
      sym_hash += sym.n_numaux + 1;
2232
0
      csect_cache += sym.n_numaux + 1;
2233
0
      lineno_counts += sym.n_numaux + 1;
2234
0
    }
2235
2236
0
  BFD_ASSERT (last_real == NULL || last_real->next == first_csect);
2237
2238
  /* Make sure that we have seen all the relocs.  */
2239
0
  for (o = abfd->sections; o != first_csect; o = o->next)
2240
0
    {
2241
      /* Debugging sections have no csects.  */
2242
0
      if (bfd_section_flags (o) & SEC_DEBUGGING)
2243
0
  continue;
2244
2245
      /* Reset the section size and the line number count, since the
2246
   data is now attached to the csects.  Don't reset the size of
2247
   the .debug section, since we need to read it below in
2248
   bfd_xcoff_size_dynamic_sections.  */
2249
0
      if (strcmp (bfd_section_name (o), ".debug") != 0)
2250
0
  o->size = 0;
2251
0
      o->lineno_count = 0;
2252
2253
0
      if ((o->flags & SEC_RELOC) != 0)
2254
0
  {
2255
0
    bfd_size_type i;
2256
0
    struct internal_reloc *rel;
2257
0
    asection **rel_csect;
2258
2259
0
    rel = reloc_info[o->target_index].relocs;
2260
0
    rel_csect = reloc_info[o->target_index].csects;
2261
2262
0
    for (i = 0; i < o->reloc_count; i++, rel++, rel_csect++)
2263
0
      {
2264
0
        if (*rel_csect == NULL)
2265
0
    {
2266
0
      _bfd_error_handler
2267
        /* xgettext:c-format */
2268
0
        (_("%pB: reloc %s:%" PRId64 " not in csect"),
2269
0
         abfd, o->name, (int64_t) i);
2270
0
      bfd_set_error (bfd_error_bad_value);
2271
0
      goto error_return;
2272
0
    }
2273
2274
        /* We identify all function symbols that are the target
2275
     of a relocation, so that we can create glue code for
2276
     functions imported from dynamic objects.  */
2277
0
        if (info->output_bfd->xvec == abfd->xvec
2278
0
      && *rel_csect != bfd_und_section_ptr
2279
0
      && (unsigned long) rel->r_symndx < obj_raw_syment_count (abfd)
2280
0
      && obj_xcoff_sym_hashes (abfd)[rel->r_symndx] != NULL)
2281
0
    {
2282
0
      struct xcoff_link_hash_entry *h;
2283
2284
0
      h = obj_xcoff_sym_hashes (abfd)[rel->r_symndx];
2285
      /* If the symbol name starts with a period, it is
2286
         the code of a function.  If the symbol is
2287
         currently undefined, then add an undefined symbol
2288
         for the function descriptor.  This should do no
2289
         harm, because any regular object that defines the
2290
         function should also define the function
2291
         descriptor.  It helps, because it means that we
2292
         will identify the function descriptor with a
2293
         dynamic object if a dynamic object defines it.  */
2294
0
      if (h->root.root.string[0] == '.'
2295
0
          && h->descriptor == NULL)
2296
0
        {
2297
0
          struct xcoff_link_hash_entry *hds;
2298
0
          struct bfd_link_hash_entry *bh;
2299
2300
0
          hds = xcoff_link_hash_lookup (xcoff_hash_table (info),
2301
0
                h->root.root.string + 1,
2302
0
                true, false, true);
2303
0
          if (hds == NULL)
2304
0
      goto error_return;
2305
0
          if (hds->root.type == bfd_link_hash_new)
2306
0
      {
2307
0
        bh = &hds->root;
2308
0
        if (! (_bfd_generic_link_add_one_symbol
2309
0
         (info, abfd, hds->root.root.string,
2310
0
          (flagword) 0, bfd_und_section_ptr,
2311
0
          (bfd_vma) 0, NULL, false,
2312
0
          true, &bh)))
2313
0
          goto error_return;
2314
0
        hds = (struct xcoff_link_hash_entry *) bh;
2315
0
      }
2316
0
          hds->flags |= XCOFF_DESCRIPTOR;
2317
0
          BFD_ASSERT ((h->flags & XCOFF_DESCRIPTOR) == 0);
2318
0
          hds->descriptor = h;
2319
0
          h->descriptor = hds;
2320
0
        }
2321
0
      if (h->root.root.string[0] == '.')
2322
0
        h->flags |= XCOFF_CALLED;
2323
0
    }
2324
0
      }
2325
2326
0
    free (reloc_info[o->target_index].csects);
2327
0
    reloc_info[o->target_index].csects = NULL;
2328
2329
    /* Reset SEC_RELOC and the reloc_count, since the reloc
2330
       information is now attached to the csects.  */
2331
0
    o->flags &=~ SEC_RELOC;
2332
0
    o->reloc_count = 0;
2333
2334
    /* If we are not keeping memory, free the reloc information.  */
2335
0
    if (! info->keep_memory
2336
0
        && coff_section_data (abfd, o) != NULL)
2337
0
      {
2338
0
        free (coff_section_data (abfd, o)->relocs);
2339
0
        coff_section_data (abfd, o)->relocs = NULL;
2340
0
      }
2341
0
  }
2342
2343
      /* Free up the line numbers.  FIXME: We could cache these
2344
   somewhere for the final link, to avoid reading them again.  */
2345
0
      free (reloc_info[o->target_index].linenos);
2346
0
      reloc_info[o->target_index].linenos = NULL;
2347
0
    }
2348
2349
0
  free (reloc_info);
2350
2351
0
  obj_coff_keep_syms (abfd) = keep_syms;
2352
2353
0
  return true;
2354
2355
0
 error_return:
2356
0
  if (reloc_info != NULL)
2357
0
    {
2358
0
      for (o = abfd->sections; o != NULL; o = o->next)
2359
0
  {
2360
0
    free (reloc_info[o->target_index].csects);
2361
0
    free (reloc_info[o->target_index].linenos);
2362
0
  }
2363
0
      free (reloc_info);
2364
0
    }
2365
0
  obj_coff_keep_syms (abfd) = keep_syms;
2366
0
  return false;
2367
0
}
2368
2369
#undef N_TMASK
2370
#undef N_BTSHFT
2371
2372
/* Add symbols from an XCOFF object file.  */
2373
2374
static bool
2375
xcoff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
2376
0
{
2377
0
  if (! _bfd_coff_get_external_symbols (abfd))
2378
0
    return false;
2379
0
  if (! xcoff_link_add_symbols (abfd, info))
2380
0
    return false;
2381
0
  if (! info->keep_memory)
2382
0
    {
2383
0
      if (! _bfd_coff_free_symbols (abfd))
2384
0
  return false;
2385
0
    }
2386
0
  return true;
2387
0
}
2388
2389
/* Look through the loader symbols to see if this dynamic object
2390
   should be included in the link.  The native linker uses the loader
2391
   symbols, not the normal symbol table, so we do too.  */
2392
2393
static bool
2394
xcoff_link_check_dynamic_ar_symbols (bfd *abfd,
2395
             struct bfd_link_info *info,
2396
             bool *pneeded,
2397
             bfd **subsbfd)
2398
0
{
2399
0
  asection *lsec;
2400
0
  bfd_byte *contents;
2401
0
  struct internal_ldhdr ldhdr;
2402
0
  const char *strings;
2403
0
  bfd_byte *elsym, *elsymend;
2404
2405
0
  *pneeded = false;
2406
2407
0
  lsec = bfd_get_section_by_name (abfd, ".loader");
2408
0
  if (lsec == NULL || (lsec->flags & SEC_HAS_CONTENTS) == 0)
2409
    /* There are no symbols, so don't try to include it.  */
2410
0
    return true;
2411
2412
0
  contents = xcoff_get_ldhdr (abfd, lsec, &ldhdr);
2413
0
  if (!contents)
2414
0
    return false;
2415
2416
0
  strings = (char *) contents + ldhdr.l_stoff;
2417
2418
0
  elsym = contents + bfd_xcoff_loader_symbol_offset (abfd, &ldhdr);
2419
2420
0
  elsymend = elsym + ldhdr.l_nsyms * bfd_xcoff_ldsymsz (abfd);
2421
0
  for (; elsym < elsymend; elsym += bfd_xcoff_ldsymsz (abfd))
2422
0
    {
2423
0
      struct internal_ldsym ldsym;
2424
0
      char nambuf[SYMNMLEN + 1];
2425
0
      const char *name;
2426
0
      struct bfd_link_hash_entry *h;
2427
2428
0
      bfd_xcoff_swap_ldsym_in (abfd, elsym, &ldsym);
2429
2430
      /* We are only interested in exported symbols.  */
2431
0
      if ((ldsym.l_smtype & L_EXPORT) == 0)
2432
0
  continue;
2433
2434
0
      if (ldsym._l._l_l._l_zeroes != 0)
2435
0
  {
2436
0
    memcpy (nambuf, ldsym._l._l_name, SYMNMLEN);
2437
0
    nambuf[SYMNMLEN] = '\0';
2438
0
    name = nambuf;
2439
0
  }
2440
0
      else if (ldsym._l._l_l._l_offset < ldhdr.l_stlen)
2441
0
  name = strings + ldsym._l._l_l._l_offset;
2442
0
      else
2443
0
  continue;
2444
2445
0
      h = bfd_link_hash_lookup (info->hash, name, false, false, true);
2446
2447
      /* We are only interested in symbols that are currently
2448
   undefined.  At this point we know that we are using an XCOFF
2449
   hash table.  */
2450
0
      if (h != NULL
2451
0
    && h->type == bfd_link_hash_undefined
2452
0
    && (((struct xcoff_link_hash_entry *) h)->flags
2453
0
        & XCOFF_DEF_DYNAMIC) == 0)
2454
0
  {
2455
0
    if (!(*info->callbacks
2456
0
    ->add_archive_element) (info, abfd, name, subsbfd))
2457
0
      continue;
2458
0
    *pneeded = true;
2459
0
    return true;
2460
0
  }
2461
0
    }
2462
2463
  /* We do not need this shared object's .loader section.  */
2464
0
  free (contents);
2465
0
  coff_section_data (abfd, lsec)->contents = NULL;
2466
2467
0
  return true;
2468
0
}
2469
2470
/* Look through the symbols to see if this object file should be
2471
   included in the link.  */
2472
2473
static bool
2474
xcoff_link_check_ar_symbols (bfd *abfd,
2475
           struct bfd_link_info *info,
2476
           bool *pneeded,
2477
           bfd **subsbfd)
2478
0
{
2479
0
  bfd_size_type symesz;
2480
0
  bfd_byte *esym;
2481
0
  bfd_byte *esym_end;
2482
2483
0
  *pneeded = false;
2484
2485
0
  if ((abfd->flags & DYNAMIC) != 0
2486
0
      && ! info->static_link
2487
0
      && info->output_bfd->xvec == abfd->xvec)
2488
0
    return xcoff_link_check_dynamic_ar_symbols (abfd, info, pneeded, subsbfd);
2489
2490
0
  symesz = bfd_coff_symesz (abfd);
2491
0
  esym = (bfd_byte *) obj_coff_external_syms (abfd);
2492
0
  esym_end = esym + obj_raw_syment_count (abfd) * symesz;
2493
0
  while (esym < esym_end)
2494
0
    {
2495
0
      struct internal_syment sym;
2496
2497
0
      bfd_coff_swap_sym_in (abfd, (void *) esym, (void *) &sym);
2498
0
      esym += (sym.n_numaux + 1) * symesz;
2499
2500
0
      if (EXTERN_SYM_P (sym.n_sclass) && sym.n_scnum != N_UNDEF)
2501
0
  {
2502
0
    const char *name;
2503
0
    char buf[SYMNMLEN + 1];
2504
0
    struct bfd_link_hash_entry *h;
2505
2506
    /* This symbol is externally visible, and is defined by this
2507
       object file.  */
2508
0
    name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
2509
2510
0
    if (name == NULL)
2511
0
      return false;
2512
0
    h = bfd_link_hash_lookup (info->hash, name, false, false, true);
2513
2514
    /* We are only interested in symbols that are currently
2515
       undefined.  If a symbol is currently known to be common,
2516
       XCOFF linkers do not bring in an object file which
2517
       defines it.  We also don't bring in symbols to satisfy
2518
       undefined references in shared objects.  */
2519
0
    if (h != NULL
2520
0
        && h->type == bfd_link_hash_undefined
2521
0
        && (info->output_bfd->xvec != abfd->xvec
2522
0
      || (((struct xcoff_link_hash_entry *) h)->flags
2523
0
          & XCOFF_DEF_DYNAMIC) == 0))
2524
0
      {
2525
0
        if (!(*info->callbacks
2526
0
        ->add_archive_element) (info, abfd, name, subsbfd))
2527
0
    continue;
2528
0
        *pneeded = true;
2529
0
        return true;
2530
0
      }
2531
0
  }
2532
0
    }
2533
2534
  /* We do not need this object file.  */
2535
0
  return true;
2536
0
}
2537
2538
/* Check a single archive element to see if we need to include it in
2539
   the link.  *PNEEDED is set according to whether this element is
2540
   needed in the link or not.  This is called via
2541
   _bfd_generic_link_add_archive_symbols.  */
2542
2543
static bool
2544
xcoff_link_check_archive_element (bfd *abfd,
2545
          struct bfd_link_info *info,
2546
          struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
2547
          const char *name ATTRIBUTE_UNUSED,
2548
          bool *pneeded)
2549
0
{
2550
0
  bool keep_syms_p;
2551
0
  bfd *oldbfd;
2552
2553
0
  keep_syms_p = (obj_coff_external_syms (abfd) != NULL);
2554
0
  if (!_bfd_coff_get_external_symbols (abfd))
2555
0
    return false;
2556
2557
0
  oldbfd = abfd;
2558
0
  if (!xcoff_link_check_ar_symbols (abfd, info, pneeded, &abfd))
2559
0
    return false;
2560
2561
0
  if (*pneeded)
2562
0
    {
2563
      /* Potentially, the add_archive_element hook may have set a
2564
   substitute BFD for us.  */
2565
0
      if (abfd != oldbfd)
2566
0
  {
2567
0
    if (!keep_syms_p
2568
0
        && !_bfd_coff_free_symbols (oldbfd))
2569
0
      return false;
2570
0
    keep_syms_p = (obj_coff_external_syms (abfd) != NULL);
2571
0
    if (!_bfd_coff_get_external_symbols (abfd))
2572
0
      return false;
2573
0
  }
2574
0
      if (!xcoff_link_add_symbols (abfd, info))
2575
0
  return false;
2576
0
      if (info->keep_memory)
2577
0
  keep_syms_p = true;
2578
0
    }
2579
2580
0
  if (!keep_syms_p)
2581
0
    {
2582
0
      if (!_bfd_coff_free_symbols (abfd))
2583
0
  return false;
2584
0
    }
2585
2586
0
  return true;
2587
0
}
2588
2589
/* Given an XCOFF BFD, add symbols to the global hash table as
2590
   appropriate.  */
2591
2592
bool
2593
_bfd_xcoff_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
2594
0
{
2595
0
  switch (bfd_get_format (abfd))
2596
0
    {
2597
0
    case bfd_object:
2598
0
      return xcoff_link_add_object_symbols (abfd, info);
2599
2600
0
    case bfd_archive:
2601
      /* If the archive has a map, do the usual search.  We then need
2602
   to check the archive for dynamic objects, because they may not
2603
   appear in the archive map even though they should, perhaps, be
2604
   included.  If the archive has no map, we just consider each object
2605
   file in turn, since that apparently is what the AIX native linker
2606
   does.  */
2607
0
      if (bfd_has_map (abfd))
2608
0
  {
2609
0
    if (! (_bfd_generic_link_add_archive_symbols
2610
0
     (abfd, info, xcoff_link_check_archive_element)))
2611
0
      return false;
2612
0
  }
2613
0
      else if (!bfd_link_mapless (abfd))
2614
0
  {
2615
0
    bfd_set_error (bfd_error_no_armap);
2616
0
    return false;
2617
0
  }
2618
2619
0
      {
2620
0
  bfd *member;
2621
2622
0
  member = bfd_openr_next_archived_file (abfd, NULL);
2623
0
  while (member != NULL)
2624
0
    {
2625
0
      if (bfd_check_format (member, bfd_object)
2626
0
    && (info->output_bfd->xvec == member->xvec)
2627
0
    && (! bfd_has_map (abfd) || (member->flags & DYNAMIC) != 0))
2628
0
        {
2629
0
    bool needed;
2630
2631
0
    if (! xcoff_link_check_archive_element (member, info,
2632
0
              NULL, NULL, &needed))
2633
0
      return false;
2634
0
    if (needed)
2635
0
      member->archive_pass = -1;
2636
0
        }
2637
0
      member = bfd_openr_next_archived_file (abfd, member);
2638
0
    }
2639
0
      }
2640
2641
0
      return true;
2642
2643
0
    default:
2644
0
      bfd_set_error (bfd_error_wrong_format);
2645
0
      return false;
2646
0
    }
2647
0
}
2648

2649
bool
2650
_bfd_xcoff_define_common_symbol (bfd *output_bfd ATTRIBUTE_UNUSED,
2651
         struct bfd_link_info *info ATTRIBUTE_UNUSED,
2652
         struct bfd_link_hash_entry *harg)
2653
0
{
2654
0
  struct xcoff_link_hash_entry *h;
2655
2656
0
  if (!bfd_generic_define_common_symbol (output_bfd, info, harg))
2657
0
    return false;
2658
2659
0
  h = (struct xcoff_link_hash_entry *) harg;
2660
0
  h->flags |= XCOFF_DEF_REGULAR;
2661
0
  return true;
2662
0
}
2663

2664
/* If symbol H has not been interpreted as a function descriptor,
2665
   see whether it should be.  Set up its descriptor information if so.  */
2666
2667
static bool
2668
xcoff_find_function (struct bfd_link_info *info,
2669
         struct xcoff_link_hash_entry *h)
2670
0
{
2671
0
  if ((h->flags & XCOFF_DESCRIPTOR) == 0
2672
0
      && h->root.root.string[0] != '.')
2673
0
    {
2674
0
      char *fnname;
2675
0
      struct xcoff_link_hash_entry *hfn;
2676
0
      size_t amt;
2677
2678
0
      amt = strlen (h->root.root.string) + 2;
2679
0
      fnname = bfd_malloc (amt);
2680
0
      if (fnname == NULL)
2681
0
  return false;
2682
0
      fnname[0] = '.';
2683
0
      strcpy (fnname + 1, h->root.root.string);
2684
0
      hfn = xcoff_link_hash_lookup (xcoff_hash_table (info),
2685
0
            fnname, false, false, true);
2686
0
      free (fnname);
2687
0
      if (hfn != NULL
2688
0
    && hfn->smclas == XMC_PR
2689
0
    && (hfn->root.type == bfd_link_hash_defined
2690
0
        || hfn->root.type == bfd_link_hash_defweak))
2691
0
  {
2692
0
    h->flags |= XCOFF_DESCRIPTOR;
2693
0
    h->descriptor = hfn;
2694
0
    hfn->descriptor = h;
2695
0
  }
2696
0
    }
2697
0
  return true;
2698
0
}
2699

2700
/* Return true if the given bfd contains at least one shared object.  */
2701
2702
static bool
2703
xcoff_archive_contains_shared_object_p (struct bfd_link_info *info,
2704
          bfd *archive)
2705
0
{
2706
0
  struct xcoff_archive_info *archive_info;
2707
0
  bfd *member;
2708
2709
0
  archive_info = xcoff_get_archive_info (info, archive);
2710
0
  if (!archive_info->know_contains_shared_object_p)
2711
0
    {
2712
0
      member = bfd_openr_next_archived_file (archive, NULL);
2713
0
      while (member != NULL && (member->flags & DYNAMIC) == 0)
2714
0
  member = bfd_openr_next_archived_file (archive, member);
2715
2716
0
      archive_info->contains_shared_object_p = (member != NULL);
2717
0
      archive_info->know_contains_shared_object_p = 1;
2718
0
    }
2719
0
  return archive_info->contains_shared_object_p;
2720
0
}
2721
2722
/* Symbol H qualifies for export by -bexpfull.  Return true if it also
2723
   qualifies for export by -bexpall.  */
2724
2725
static bool
2726
xcoff_covered_by_expall_p (struct xcoff_link_hash_entry *h)
2727
0
{
2728
  /* Exclude symbols beginning with '_'.  */
2729
0
  if (h->root.root.string[0] == '_')
2730
0
    return false;
2731
2732
  /* Exclude archive members that would otherwise be unreferenced.  */
2733
0
  if ((h->flags & XCOFF_MARK) == 0
2734
0
      && (h->root.type == bfd_link_hash_defined
2735
0
    || h->root.type == bfd_link_hash_defweak)
2736
0
      && h->root.u.def.section->owner != NULL
2737
0
      && h->root.u.def.section->owner->my_archive != NULL)
2738
0
    return false;
2739
2740
0
  return true;
2741
0
}
2742
2743
/* Return true if symbol H qualifies for the forms of automatic export
2744
   specified by AUTO_EXPORT_FLAGS.  */
2745
2746
static bool
2747
xcoff_auto_export_p (struct bfd_link_info *info,
2748
         struct xcoff_link_hash_entry *h,
2749
         unsigned int auto_export_flags)
2750
0
{
2751
  /* Don't automatically export things that were explicitly exported.  */
2752
0
  if ((h->flags & XCOFF_EXPORT) != 0)
2753
0
    return false;
2754
2755
  /* Don't export things that we don't define.  */
2756
0
  if ((h->flags & XCOFF_DEF_REGULAR) == 0)
2757
0
    return false;
2758
2759
  /* Don't export functions; export their descriptors instead.  */
2760
0
  if (h->root.root.string[0] == '.')
2761
0
    return false;
2762
2763
  /* Don't export hidden or internal symbols.  */
2764
0
  if (h->visibility == SYM_V_HIDDEN
2765
0
      || h->visibility == SYM_V_INTERNAL)
2766
0
    return false;
2767
2768
  /* We don't export a symbol which is being defined by an object
2769
     included from an archive which contains a shared object.  The
2770
     rationale is that if an archive contains both an unshared and
2771
     a shared object, then there must be some reason that the
2772
     unshared object is unshared, and we don't want to start
2773
     providing a shared version of it.  In particular, this solves
2774
     a bug involving the _savefNN set of functions.  gcc will call
2775
     those functions without providing a slot to restore the TOC,
2776
     so it is essential that these functions be linked in directly
2777
     and not from a shared object, which means that a shared
2778
     object which also happens to link them in must not export
2779
     them.  This is confusing, but I haven't been able to think of
2780
     a different approach.  Note that the symbols can, of course,
2781
     be exported explicitly.  */
2782
0
  if (h->root.type == bfd_link_hash_defined
2783
0
      || h->root.type == bfd_link_hash_defweak)
2784
0
    {
2785
0
      bfd *owner;
2786
2787
0
      owner = h->root.u.def.section->owner;
2788
0
      if (owner != NULL
2789
0
    && owner->my_archive != NULL
2790
0
    && xcoff_archive_contains_shared_object_p (info, owner->my_archive))
2791
0
  return false;
2792
0
    }
2793
2794
  /* Otherwise, all symbols are exported by -bexpfull.  */
2795
0
  if ((auto_export_flags & XCOFF_EXPFULL) != 0)
2796
0
    return true;
2797
2798
  /* Despite its name, -bexpall exports most but not all symbols.  */
2799
0
  if ((auto_export_flags & XCOFF_EXPALL) != 0
2800
0
      && xcoff_covered_by_expall_p (h))
2801
0
    return true;
2802
2803
0
  return false;
2804
0
}
2805

2806
/* Return true if relocation REL needs to be copied to the .loader section.
2807
   If REL is against a global symbol, H is that symbol, otherwise it
2808
   is null.  */
2809
2810
static bool
2811
xcoff_need_ldrel_p (struct bfd_link_info *info, struct internal_reloc *rel,
2812
        struct xcoff_link_hash_entry *h, asection *ssec)
2813
0
{
2814
0
  if (!xcoff_hash_table (info)->loader_section)
2815
0
    return false;
2816
2817
0
  switch (rel->r_type)
2818
0
    {
2819
0
    case R_TOC:
2820
0
    case R_GL:
2821
0
    case R_TCL:
2822
0
    case R_TRL:
2823
0
    case R_TRLA:
2824
      /* We should never need a .loader reloc for a TOC-relative reloc.  */
2825
0
      return false;
2826
2827
0
    default:
2828
      /* In this case, relocations against defined symbols can be resolved
2829
   statically.  */
2830
0
      if (h == NULL
2831
0
    || h->root.type == bfd_link_hash_defined
2832
0
    || h->root.type == bfd_link_hash_defweak
2833
0
    || h->root.type == bfd_link_hash_common)
2834
0
  return false;
2835
2836
      /* We will always provide a local definition of function symbols,
2837
   even if we don't have one yet.  */
2838
0
      if ((h->flags & XCOFF_CALLED) != 0)
2839
0
  return false;
2840
2841
0
      return true;
2842
2843
0
    case R_POS:
2844
0
    case R_NEG:
2845
0
    case R_RL:
2846
0
    case R_RLA:
2847
      /* Absolute relocations against absolute symbols can be
2848
   resolved statically.  */
2849
0
      if (h != NULL
2850
0
    && (h->root.type == bfd_link_hash_defined
2851
0
        || h->root.type == bfd_link_hash_defweak)
2852
0
    && !h->root.rel_from_abs)
2853
0
  {
2854
0
    asection *sec = h->root.u.def.section;
2855
0
    if (bfd_is_abs_section (sec)
2856
0
        || (sec != NULL
2857
0
      && bfd_is_abs_section (sec->output_section)))
2858
0
      return false;
2859
0
  }
2860
2861
      /* Absolute relocations from read-only sections are forbidden
2862
   by AIX loader. However, they can appear in their section's
2863
         relocations.  */
2864
0
      if (ssec != NULL
2865
0
    && (ssec->output_section->flags & SEC_READONLY) != 0)
2866
0
  return false;
2867
2868
0
      return true;
2869
2870
0
    case R_TLS:
2871
0
    case R_TLS_LE:
2872
0
    case R_TLS_IE:
2873
0
    case R_TLS_LD:
2874
0
    case R_TLSM:
2875
0
    case R_TLSML:
2876
0
      return true;
2877
0
    }
2878
0
}
2879

2880
/* Mark a symbol as not being garbage, including the section in which
2881
   it is defined.  */
2882
2883
static inline bool
2884
xcoff_mark_symbol (struct bfd_link_info *info, struct xcoff_link_hash_entry *h)
2885
0
{
2886
0
  if ((h->flags & XCOFF_MARK) != 0)
2887
0
    return true;
2888
2889
0
  h->flags |= XCOFF_MARK;
2890
2891
  /* If we're marking an undefined symbol, try find some way of
2892
     defining it.  */
2893
0
  if (!bfd_link_relocatable (info)
2894
0
      && (h->flags & XCOFF_IMPORT) == 0
2895
0
      && (h->flags & XCOFF_DEF_REGULAR) == 0
2896
0
      && (h->root.type == bfd_link_hash_undefined
2897
0
    || h->root.type == bfd_link_hash_undefweak))
2898
0
    {
2899
      /* First check whether this symbol can be interpreted as an
2900
   undefined function descriptor for a defined function symbol.  */
2901
0
      if (!xcoff_find_function (info, h))
2902
0
  return false;
2903
2904
0
      if ((h->flags & XCOFF_DESCRIPTOR) != 0
2905
0
    && (h->descriptor->root.type == bfd_link_hash_defined
2906
0
        || h->descriptor->root.type == bfd_link_hash_defweak))
2907
0
  {
2908
    /* This is a descriptor for a defined symbol, but the input
2909
       objects have not defined the descriptor itself.  Fill in
2910
       the definition automatically.
2911
2912
       Note that we do this even if we found a dynamic definition
2913
       of H.  The local function definition logically overrides
2914
       the dynamic one.  */
2915
0
    asection *sec;
2916
2917
0
    sec = xcoff_hash_table (info)->descriptor_section;
2918
0
    h->root.type = bfd_link_hash_defined;
2919
0
    h->root.u.def.section = sec;
2920
0
    h->root.u.def.value = sec->size;
2921
0
    h->smclas = XMC_DS;
2922
0
    h->flags |= XCOFF_DEF_REGULAR;
2923
2924
    /* The size of the function descriptor depends on whether this
2925
       is xcoff32 (12) or xcoff64 (24).  */
2926
0
    sec->size += bfd_xcoff_function_descriptor_size (sec->owner);
2927
2928
    /* A function descriptor uses two relocs: one for the
2929
       associated code, and one for the TOC address.  */
2930
0
    xcoff_hash_table (info)->ldinfo.ldrel_count += 2;
2931
0
    sec->reloc_count += 2;
2932
2933
    /* Mark the function itself.  */
2934
0
    if (!xcoff_mark_symbol (info, h->descriptor))
2935
0
      return false;
2936
2937
    /* Mark the TOC section, so that we get an anchor
2938
       to relocate against.  */
2939
0
    if (!xcoff_mark (info, xcoff_hash_table (info)->toc_section))
2940
0
      return false;
2941
2942
    /* We handle writing out the contents of the descriptor in
2943
       xcoff_write_global_symbol.  */
2944
0
  }
2945
0
      else if (info->static_link)
2946
  /* We can't get a symbol value dynamically, so just assume
2947
     that it's undefined.  */
2948
0
  h->flags |= XCOFF_WAS_UNDEFINED;
2949
0
      else if ((h->flags & XCOFF_CALLED) != 0)
2950
0
  {
2951
    /* This is a function symbol for which we need to create
2952
       linkage code.  */
2953
0
    asection *sec;
2954
0
    struct xcoff_link_hash_entry *hds;
2955
2956
    /* Mark the descriptor (and its TOC section).  */
2957
0
    hds = h->descriptor;
2958
0
    BFD_ASSERT ((hds->root.type == bfd_link_hash_undefined
2959
0
           || hds->root.type == bfd_link_hash_undefweak)
2960
0
          && (hds->flags & XCOFF_DEF_REGULAR) == 0);
2961
0
    if (!xcoff_mark_symbol (info, hds))
2962
0
      return false;
2963
2964
    /* Treat this symbol as undefined if the descriptor was.  */
2965
0
    if ((hds->flags & XCOFF_WAS_UNDEFINED) != 0)
2966
0
      h->flags |= XCOFF_WAS_UNDEFINED;
2967
2968
    /* Allocate room for the global linkage code itself.  */
2969
0
    sec = xcoff_hash_table (info)->linkage_section;
2970
0
    h->root.type = bfd_link_hash_defined;
2971
0
    h->root.u.def.section = sec;
2972
0
    h->root.u.def.value = sec->size;
2973
0
    h->smclas = XMC_GL;
2974
0
    h->flags |= XCOFF_DEF_REGULAR;
2975
0
    sec->size += bfd_xcoff_glink_code_size (info->output_bfd);
2976
2977
    /* The global linkage code requires a TOC entry for the
2978
       descriptor.  */
2979
0
    if (hds->toc_section == NULL)
2980
0
      {
2981
0
        int byte_size;
2982
2983
        /* 32 vs 64
2984
     xcoff32 uses 4 bytes in the toc.
2985
     xcoff64 uses 8 bytes in the toc.  */
2986
0
        if (bfd_xcoff_is_xcoff64 (info->output_bfd))
2987
0
    byte_size = 8;
2988
0
        else if (bfd_xcoff_is_xcoff32 (info->output_bfd))
2989
0
    byte_size = 4;
2990
0
        else
2991
0
    return false;
2992
2993
        /* Allocate room in the fallback TOC section.  */
2994
0
        hds->toc_section = xcoff_hash_table (info)->toc_section;
2995
0
        hds->u.toc_offset = hds->toc_section->size;
2996
0
        hds->toc_section->size += byte_size;
2997
0
        if (!xcoff_mark (info, hds->toc_section))
2998
0
    return false;
2999
3000
        /* Allocate room for a static and dynamic R_TOC
3001
     relocation.  */
3002
0
        ++xcoff_hash_table (info)->ldinfo.ldrel_count;
3003
0
        ++hds->toc_section->reloc_count;
3004
3005
        /* Set the index to -2 to force this symbol to
3006
     get written out.  */
3007
0
        hds->indx = -2;
3008
0
        hds->flags |= XCOFF_SET_TOC | XCOFF_LDREL;
3009
0
      }
3010
0
  }
3011
0
      else if ((h->flags & XCOFF_DEF_DYNAMIC) == 0)
3012
0
  {
3013
    /* Record that the symbol was undefined, then import it.
3014
       -brtl links use a special fake import file.  */
3015
0
    h->flags |= XCOFF_WAS_UNDEFINED | XCOFF_IMPORT;
3016
0
    if (xcoff_hash_table (info)->rtld)
3017
0
      {
3018
0
        if (!xcoff_set_import_path (info, h, "", "..", ""))
3019
0
    return false;
3020
0
      }
3021
0
    else
3022
0
      {
3023
0
        if (!xcoff_set_import_path (info, h, NULL, NULL, NULL))
3024
0
    return false;
3025
0
      }
3026
0
  }
3027
0
    }
3028
3029
0
  if (h->root.type == bfd_link_hash_defined
3030
0
      || h->root.type == bfd_link_hash_defweak)
3031
0
    {
3032
0
      asection *hsec;
3033
3034
0
      hsec = h->root.u.def.section;
3035
0
      if (! bfd_is_abs_section (hsec)
3036
0
    && hsec->gc_mark == 0)
3037
0
  {
3038
0
    if (! xcoff_mark (info, hsec))
3039
0
      return false;
3040
0
  }
3041
0
    }
3042
3043
0
  if (h->toc_section != NULL
3044
0
      && h->toc_section->gc_mark == 0)
3045
0
    {
3046
0
      if (! xcoff_mark (info, h->toc_section))
3047
0
  return false;
3048
0
    }
3049
3050
0
  return true;
3051
0
}
3052
3053
/* Look for a symbol called NAME.  If the symbol is defined, mark it.
3054
   If the symbol exists, set FLAGS.  */
3055
3056
static bool
3057
xcoff_mark_symbol_by_name (struct bfd_link_info *info,
3058
         const char *name, unsigned int flags)
3059
0
{
3060
0
  struct xcoff_link_hash_entry *h;
3061
3062
0
  h = xcoff_link_hash_lookup (xcoff_hash_table (info), name,
3063
0
            false, false, true);
3064
0
  if (h != NULL)
3065
0
    {
3066
0
      h->flags |= flags;
3067
0
      if (h->root.type == bfd_link_hash_defined
3068
0
    || h->root.type == bfd_link_hash_defweak)
3069
0
  {
3070
0
    if (!xcoff_mark (info, h->root.u.def.section))
3071
0
      return false;
3072
0
  }
3073
0
    }
3074
0
  return true;
3075
0
}
3076
3077
/* The mark phase of garbage collection.  For a given section, mark
3078
   it, and all the sections which define symbols to which it refers.
3079
   Because this function needs to look at the relocs, we also count
3080
   the number of relocs which need to be copied into the .loader
3081
   section.  */
3082
3083
static bool
3084
xcoff_mark (struct bfd_link_info *info, asection *sec)
3085
0
{
3086
0
  if (bfd_is_const_section (sec)
3087
0
      || sec->gc_mark != 0)
3088
0
    return true;
3089
3090
0
  sec->gc_mark = 1;
3091
3092
0
  if (sec->owner->xvec != info->output_bfd->xvec)
3093
0
    return true;
3094
3095
0
  if (coff_section_data (sec->owner, sec) == NULL)
3096
0
    return true;
3097
3098
3099
0
  if (xcoff_section_data (sec->owner, sec) != NULL)
3100
0
    {
3101
0
      struct xcoff_link_hash_entry **syms;
3102
0
      asection **csects;
3103
0
      unsigned long i, first, last;
3104
3105
      /* Mark all the symbols in this section.  */
3106
0
      syms = obj_xcoff_sym_hashes (sec->owner);
3107
0
      csects = xcoff_data (sec->owner)->csects;
3108
0
      first = xcoff_section_data (sec->owner, sec)->first_symndx;
3109
0
      last = xcoff_section_data (sec->owner, sec)->last_symndx;
3110
0
      for (i = first; i <= last; i++)
3111
0
  if (csects[i] == sec
3112
0
      && syms[i] != NULL
3113
0
      && (syms[i]->flags & XCOFF_MARK) == 0)
3114
0
    {
3115
0
      if (!xcoff_mark_symbol (info, syms[i]))
3116
0
        return false;
3117
0
    }
3118
0
    }
3119
3120
  /* Look through the section relocs.  */
3121
0
  if ((sec->flags & SEC_RELOC) != 0
3122
0
      && sec->reloc_count > 0)
3123
0
    {
3124
0
      struct internal_reloc *rel, *relend;
3125
3126
0
      rel = xcoff_read_internal_relocs (sec->owner, sec, true,
3127
0
          NULL, false, NULL);
3128
0
      if (rel == NULL)
3129
0
  return false;
3130
0
      relend = rel + sec->reloc_count;
3131
0
      for (; rel < relend; rel++)
3132
0
  {
3133
0
    struct xcoff_link_hash_entry *h;
3134
3135
0
    if ((unsigned int) rel->r_symndx
3136
0
        > obj_raw_syment_count (sec->owner))
3137
0
      continue;
3138
3139
0
    h = obj_xcoff_sym_hashes (sec->owner)[rel->r_symndx];
3140
0
    if (h != NULL)
3141
0
      {
3142
0
        if ((h->flags & XCOFF_MARK) == 0)
3143
0
    {
3144
0
      if (!xcoff_mark_symbol (info, h))
3145
0
        return false;
3146
0
    }
3147
0
      }
3148
0
    else
3149
0
      {
3150
0
        asection *rsec;
3151
3152
0
        rsec = xcoff_data (sec->owner)->csects[rel->r_symndx];
3153
0
        if (rsec != NULL
3154
0
      && rsec->gc_mark == 0)
3155
0
    {
3156
0
      if (!xcoff_mark (info, rsec))
3157
0
        return false;
3158
0
    }
3159
0
      }
3160
3161
    /* See if this reloc needs to be copied into the .loader
3162
       section.  */
3163
0
    if ((sec->flags & SEC_DEBUGGING) == 0
3164
0
        && xcoff_need_ldrel_p (info, rel, h, sec))
3165
0
      {
3166
0
        ++xcoff_hash_table (info)->ldinfo.ldrel_count;
3167
0
        if (h != NULL)
3168
0
    h->flags |= XCOFF_LDREL;
3169
0
      }
3170
0
  }
3171
3172
0
      if (! info->keep_memory
3173
0
    && coff_section_data (sec->owner, sec) != NULL)
3174
0
  {
3175
0
    free (coff_section_data (sec->owner, sec)->relocs);
3176
0
    coff_section_data (sec->owner, sec)->relocs = NULL;
3177
0
  }
3178
0
    }
3179
3180
0
  return true;
3181
0
}
3182
3183
/* Routines that are called after all the input files have been
3184
   handled, but before the sections are laid out in memory.  */
3185
3186
/* The sweep phase of garbage collection.  Remove all garbage
3187
   sections.  */
3188
3189
static void
3190
xcoff_sweep (struct bfd_link_info *info)
3191
0
{
3192
0
  bfd *sub;
3193
3194
0
  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3195
0
    {
3196
0
      asection *o;
3197
0
      bool some_kept = false;
3198
3199
      /* As says below keep all sections from non-XCOFF
3200
         input files.  */
3201
0
      if (sub->xvec != info->output_bfd->xvec)
3202
0
  some_kept = true;
3203
0
      else
3204
0
  {
3205
    /* See whether any section is already marked.  */
3206
0
    for (o = sub->sections; o != NULL; o = o->next)
3207
0
      if (o->gc_mark)
3208
0
        some_kept = true;
3209
0
  }
3210
3211
      /* If no section in this file will be kept, then we can
3212
   toss out debug sections.  */
3213
0
      if (!some_kept)
3214
0
  {
3215
0
    for (o = sub->sections; o != NULL; o = o->next)
3216
0
      {
3217
0
        o->size = 0;
3218
0
        o->reloc_count = 0;
3219
0
      }
3220
0
    continue;
3221
0
  }
3222
3223
      /* Keep all sections from non-XCOFF input files.  Keep
3224
   special sections.  Keep .debug sections for the
3225
   moment.  */
3226
0
      for (o = sub->sections; o != NULL; o = o->next)
3227
0
  {
3228
0
    if (o->gc_mark == 1)
3229
0
      continue;
3230
3231
0
    if (sub->xvec != info->output_bfd->xvec
3232
0
        || o == xcoff_hash_table (info)->debug_section
3233
0
        || o == xcoff_hash_table (info)->loader_section
3234
0
        || o == xcoff_hash_table (info)->linkage_section
3235
0
        || o == xcoff_hash_table (info)->descriptor_section
3236
0
        || (bfd_section_flags (o) & SEC_DEBUGGING)
3237
0
        || strcmp (o->name, ".debug") == 0)
3238
0
      xcoff_mark (info, o);
3239
0
    else
3240
0
      {
3241
0
        o->size = 0;
3242
0
        o->reloc_count = 0;
3243
0
      }
3244
0
  }
3245
0
    }
3246
0
}
3247
3248
/* Initialize the back-end with linker infos.  */
3249
3250
bool
3251
bfd_xcoff_link_init (struct bfd_link_info *info,
3252
         struct bfd_xcoff_link_params *params)
3253
0
{
3254
0
  xcoff_hash_table (info)->params = params;
3255
3256
0
  return true;
3257
0
}
3258
3259
/* Record the number of elements in a set.  This is used to output the
3260
   correct csect length.  */
3261
3262
bool
3263
bfd_xcoff_link_record_set (bfd *output_bfd,
3264
         struct bfd_link_info *info,
3265
         struct bfd_link_hash_entry *harg,
3266
         bfd_size_type size)
3267
0
{
3268
0
  struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
3269
0
  struct xcoff_link_size_list *n;
3270
0
  size_t amt;
3271
3272
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3273
0
    return true;
3274
3275
  /* This will hardly ever be called.  I don't want to burn four bytes
3276
     per global symbol, so instead the size is kept on a linked list
3277
     attached to the hash table.  */
3278
0
  amt = sizeof (* n);
3279
0
  n = bfd_alloc (output_bfd, amt);
3280
0
  if (n == NULL)
3281
0
    return false;
3282
0
  n->next = xcoff_hash_table (info)->size_list;
3283
0
  n->h = h;
3284
0
  n->size = size;
3285
0
  xcoff_hash_table (info)->size_list = n;
3286
3287
0
  h->flags |= XCOFF_HAS_SIZE;
3288
3289
0
  return true;
3290
0
}
3291
3292
/* Import a symbol.  */
3293
3294
bool
3295
bfd_xcoff_import_symbol (bfd *output_bfd,
3296
       struct bfd_link_info *info,
3297
       struct bfd_link_hash_entry *harg,
3298
       bfd_vma val,
3299
       const char *imppath,
3300
       const char *impfile,
3301
       const char *impmember,
3302
       unsigned int syscall_flag)
3303
0
{
3304
0
  struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
3305
3306
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3307
0
    return true;
3308
3309
  /* A symbol name which starts with a period is the code for a
3310
     function.  If the symbol is undefined, then add an undefined
3311
     symbol for the function descriptor, and import that instead.  */
3312
0
  if (h->root.root.string[0] == '.'
3313
0
      && h->root.type == bfd_link_hash_undefined
3314
0
      && val == (bfd_vma) -1)
3315
0
    {
3316
0
      struct xcoff_link_hash_entry *hds;
3317
3318
0
      hds = h->descriptor;
3319
0
      if (hds == NULL)
3320
0
  {
3321
0
    hds = xcoff_link_hash_lookup (xcoff_hash_table (info),
3322
0
          h->root.root.string + 1,
3323
0
          true, false, true);
3324
0
    if (hds == NULL)
3325
0
      return false;
3326
0
    if (hds->root.type == bfd_link_hash_new)
3327
0
      {
3328
0
        hds->root.type = bfd_link_hash_undefined;
3329
0
        hds->root.u.undef.abfd = h->root.u.undef.abfd;
3330
0
      }
3331
0
    hds->flags |= XCOFF_DESCRIPTOR;
3332
0
    BFD_ASSERT ((h->flags & XCOFF_DESCRIPTOR) == 0);
3333
0
    hds->descriptor = h;
3334
0
    h->descriptor = hds;
3335
0
  }
3336
3337
      /* Now, if the descriptor is undefined, import the descriptor
3338
   rather than the symbol we were told to import.  FIXME: Is
3339
   this correct in all cases?  */
3340
0
      if (hds->root.type == bfd_link_hash_undefined)
3341
0
  h = hds;
3342
0
    }
3343
3344
0
  h->flags |= (XCOFF_IMPORT | syscall_flag);
3345
3346
0
  if (val != (bfd_vma) -1)
3347
0
    {
3348
0
      if (h->root.type == bfd_link_hash_defined)
3349
0
  (*info->callbacks->multiple_definition) (info, &h->root, output_bfd,
3350
0
             bfd_abs_section_ptr, val);
3351
3352
0
      h->root.type = bfd_link_hash_defined;
3353
0
      h->root.u.def.section = bfd_abs_section_ptr;
3354
0
      h->root.u.def.value = val;
3355
0
      h->smclas = XMC_XO;
3356
0
    }
3357
3358
0
  if (!xcoff_set_import_path (info, h, imppath, impfile, impmember))
3359
0
    return false;
3360
3361
0
  return true;
3362
0
}
3363
3364
/* Export a symbol.  */
3365
3366
bool
3367
bfd_xcoff_export_symbol (bfd *output_bfd,
3368
       struct bfd_link_info *info,
3369
       struct bfd_link_hash_entry *harg)
3370
0
{
3371
0
  struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg;
3372
3373
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3374
0
    return true;
3375
3376
  /* As AIX linker, symbols exported with hidden visibility are
3377
     silently ignored.  */
3378
0
  if (h->visibility == SYM_V_HIDDEN)
3379
0
    return true;
3380
3381
0
  if (h->visibility == SYM_V_INTERNAL)
3382
0
    {
3383
0
      _bfd_error_handler (_("%pB: cannot export internal symbol `%s`."),
3384
0
        output_bfd, h->root.root.string);
3385
0
      bfd_set_error (bfd_error_bad_value);
3386
0
      return false;
3387
0
    }
3388
3389
0
  h->flags |= XCOFF_EXPORT;
3390
3391
  /* FIXME: I'm not at all sure what syscall is supposed to mean, so
3392
     I'm just going to ignore it until somebody explains it.  */
3393
3394
  /* Make sure we don't garbage collect this symbol.  */
3395
0
  if (! xcoff_mark_symbol (info, h))
3396
0
    return false;
3397
3398
  /* If this is a function descriptor, make sure we don't garbage
3399
     collect the associated function code.  We normally don't have to
3400
     worry about this, because the descriptor will be attached to a
3401
     section with relocs, but if we are creating the descriptor
3402
     ourselves those relocs will not be visible to the mark code.  */
3403
0
  if ((h->flags & XCOFF_DESCRIPTOR) != 0)
3404
0
    {
3405
0
      if (! xcoff_mark_symbol (info, h->descriptor))
3406
0
  return false;
3407
0
    }
3408
3409
0
  return true;
3410
0
}
3411
3412
/* Count a reloc against a symbol.  This is called for relocs
3413
   generated by the linker script, typically for global constructors
3414
   and destructors.  */
3415
3416
bool
3417
bfd_xcoff_link_count_reloc (bfd *output_bfd,
3418
          struct bfd_link_info *info,
3419
          const char *name)
3420
0
{
3421
0
  struct xcoff_link_hash_entry *h;
3422
3423
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3424
0
    return true;
3425
3426
0
  h = ((struct xcoff_link_hash_entry *)
3427
0
       bfd_wrapped_link_hash_lookup (output_bfd, info, name, false, false,
3428
0
             false));
3429
0
  if (h == NULL)
3430
0
    {
3431
0
      _bfd_error_handler (_("%s: no such symbol"), name);
3432
0
      bfd_set_error (bfd_error_no_symbols);
3433
0
      return false;
3434
0
    }
3435
3436
0
  h->flags |= XCOFF_REF_REGULAR;
3437
0
  if (xcoff_hash_table (info)->loader_section)
3438
0
    {
3439
0
      h->flags |= XCOFF_LDREL;
3440
0
      ++xcoff_hash_table (info)->ldinfo.ldrel_count;
3441
0
    }
3442
3443
  /* Mark the symbol to avoid garbage collection.  */
3444
0
  if (! xcoff_mark_symbol (info, h))
3445
0
    return false;
3446
3447
0
  return true;
3448
0
}
3449
3450
/* This function is called for each symbol to which the linker script
3451
   assigns a value.
3452
   FIXME: In cases like the linker test ld-scripts/defined5 where a
3453
   symbol is defined both by an input object file and the script,
3454
   the script definition doesn't override the object file definition
3455
   as is usual for other targets.  At least not when the symbol is
3456
   output.  Other uses of the symbol value by the linker do use the
3457
   script value.  */
3458
3459
bool
3460
bfd_xcoff_record_link_assignment (bfd *output_bfd,
3461
          struct bfd_link_info *info,
3462
          const char *name)
3463
0
{
3464
0
  struct xcoff_link_hash_entry *h;
3465
3466
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3467
0
    return true;
3468
3469
0
  h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, true, true,
3470
0
            false);
3471
0
  if (h == NULL)
3472
0
    return false;
3473
3474
0
  h->flags |= XCOFF_DEF_REGULAR;
3475
3476
0
  return true;
3477
0
}
3478
3479
/* An xcoff_link_hash_traverse callback for which DATA points to an
3480
   xcoff_loader_info.  Mark all symbols that should be automatically
3481
   exported.  */
3482
3483
static bool
3484
xcoff_mark_auto_exports (struct xcoff_link_hash_entry *h, void *data)
3485
0
{
3486
0
  struct xcoff_loader_info *ldinfo;
3487
3488
0
  ldinfo = (struct xcoff_loader_info *) data;
3489
0
  if (xcoff_auto_export_p (ldinfo->info, h, ldinfo->auto_export_flags))
3490
0
    {
3491
0
      if (!xcoff_mark_symbol (ldinfo->info, h))
3492
0
  ldinfo->failed = true;
3493
0
    }
3494
0
  return true;
3495
0
}
3496
3497
/* INPUT_BFD has an external symbol associated with hash table entry H
3498
   and csect CSECT.   Return true if INPUT_BFD defines H.  */
3499
3500
static bool
3501
xcoff_final_definition_p (bfd *input_bfd, struct xcoff_link_hash_entry *h,
3502
        asection *csect)
3503
0
{
3504
0
  switch (h->root.type)
3505
0
    {
3506
0
    case bfd_link_hash_defined:
3507
0
    case bfd_link_hash_defweak:
3508
      /* No input bfd owns absolute symbols.  They are written by
3509
   xcoff_write_global_symbol instead.  */
3510
0
      return (!bfd_is_abs_section (csect)
3511
0
        && h->root.u.def.section == csect);
3512
3513
0
    case bfd_link_hash_common:
3514
0
      return h->root.u.c.p->section->owner == input_bfd;
3515
3516
0
    case bfd_link_hash_undefined:
3517
0
    case bfd_link_hash_undefweak:
3518
      /* We can't treat undef.abfd as the owner because that bfd
3519
   might be a dynamic object.  Allow any bfd to claim it.  */
3520
0
      return true;
3521
3522
0
    default:
3523
0
      abort ();
3524
0
    }
3525
0
}
3526
3527
/* See if H should have a loader symbol associated with it.  */
3528
3529
static bool
3530
xcoff_build_ldsym (struct xcoff_loader_info *ldinfo,
3531
       struct xcoff_link_hash_entry *h)
3532
0
{
3533
0
  size_t amt;
3534
3535
  /* Warn if this symbol is exported but not defined.  */
3536
0
  if ((h->flags & XCOFF_EXPORT) != 0
3537
0
      && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
3538
0
    {
3539
0
      _bfd_error_handler
3540
0
  (_("warning: attempt to export undefined symbol `%s'"),
3541
0
   h->root.root.string);
3542
0
      return true;
3543
0
    }
3544
3545
  /* We need to add a symbol to the .loader section if it is mentioned
3546
     in a reloc which we are copying to the .loader section and it was
3547
     not defined or common, or if it is the entry point, or if it is
3548
     being exported.  */
3549
0
  if (((h->flags & XCOFF_LDREL) == 0
3550
0
       || h->root.type == bfd_link_hash_defined
3551
0
       || h->root.type == bfd_link_hash_defweak
3552
0
       || h->root.type == bfd_link_hash_common)
3553
0
      && (h->flags & XCOFF_ENTRY) == 0
3554
0
      && (h->flags & XCOFF_EXPORT) == 0)
3555
0
    return true;
3556
3557
  /* We need to add this symbol to the .loader symbols.  */
3558
3559
0
  BFD_ASSERT (h->ldsym == NULL);
3560
0
  amt = sizeof (struct internal_ldsym);
3561
0
  h->ldsym = bfd_zalloc (ldinfo->output_bfd, amt);
3562
0
  if (h->ldsym == NULL)
3563
0
    {
3564
0
      ldinfo->failed = true;
3565
0
      return false;
3566
0
    }
3567
3568
0
  if ((h->flags & XCOFF_IMPORT) != 0)
3569
0
    {
3570
      /* Give imported descriptors class XMC_DS rather than XMC_UA.  */
3571
0
      if ((h->flags & XCOFF_DESCRIPTOR) != 0)
3572
0
  h->smclas = XMC_DS;
3573
0
      h->ldsym->l_ifile = h->ldindx;
3574
0
    }
3575
3576
  /* The first 3 symbol table indices are reserved to indicate the
3577
     data, text and bss sections.  */
3578
0
  h->ldindx = ldinfo->ldsym_count + 3;
3579
3580
0
  ++ldinfo->ldsym_count;
3581
3582
0
  if (! bfd_xcoff_put_ldsymbol_name (ldinfo->output_bfd, ldinfo,
3583
0
             h->ldsym, h->root.root.string))
3584
0
    return false;
3585
3586
0
  h->flags |= XCOFF_BUILT_LDSYM;
3587
0
  return true;
3588
0
}
3589
3590
/* An xcoff_htab_traverse callback that is called for each symbol
3591
   once garbage collection is complete.  */
3592
3593
static bool
3594
xcoff_post_gc_symbol (struct xcoff_link_hash_entry *h, void * p)
3595
0
{
3596
0
  struct xcoff_loader_info *ldinfo = (struct xcoff_loader_info *) p;
3597
3598
  /* __rtinit, this symbol has special handling. */
3599
0
  if (h->flags & XCOFF_RTINIT)
3600
0
    return true;
3601
3602
  /* We don't want to garbage collect symbols which are not defined in
3603
     XCOFF files.  This is a convenient place to mark them.  */
3604
0
  if (xcoff_hash_table (ldinfo->info)->gc
3605
0
      && (h->flags & XCOFF_MARK) == 0
3606
0
      && (h->root.type == bfd_link_hash_defined
3607
0
    || h->root.type == bfd_link_hash_defweak)
3608
0
      && (h->root.u.def.section->owner == NULL
3609
0
    || (h->root.u.def.section->owner->xvec
3610
0
        != ldinfo->info->output_bfd->xvec)))
3611
0
    h->flags |= XCOFF_MARK;
3612
3613
  /* Skip discarded symbols.  */
3614
0
  if (xcoff_hash_table (ldinfo->info)->gc
3615
0
      && (h->flags & XCOFF_MARK) == 0)
3616
0
    return true;
3617
3618
  /* If this is still a common symbol, and it wasn't garbage
3619
     collected, we need to actually allocate space for it in the .bss
3620
     section.  */
3621
0
  if (h->root.type == bfd_link_hash_common
3622
0
      && h->root.u.c.p->section->size == 0)
3623
0
    {
3624
0
      BFD_ASSERT (bfd_is_com_section (h->root.u.c.p->section));
3625
0
      h->root.u.c.p->section->size = h->root.u.c.size;
3626
0
    }
3627
3628
0
  if (xcoff_hash_table (ldinfo->info)->loader_section)
3629
0
    {
3630
0
      if (xcoff_auto_export_p (ldinfo->info, h, ldinfo->auto_export_flags))
3631
0
  h->flags |= XCOFF_EXPORT;
3632
3633
0
      if (!xcoff_build_ldsym (ldinfo, h))
3634
0
  return false;
3635
0
    }
3636
3637
0
  return true;
3638
0
}
3639
3640
/* INPUT_BFD includes XCOFF symbol ISYM, which is associated with linker
3641
   hash table entry H and csect CSECT.  AUX contains ISYM's auxiliary
3642
   csect information, if any.  NAME is the function's name if the name
3643
   is stored in the .debug section, otherwise it is null.
3644
3645
   Return 1 if we should include an appropriately-adjusted ISYM
3646
   in the output file, 0 if we should discard ISYM, or -1 if an
3647
   error occured.  */
3648
3649
static int
3650
xcoff_keep_symbol_p (struct bfd_link_info *info, bfd *input_bfd,
3651
         struct internal_syment *isym,
3652
         union internal_auxent *aux,
3653
         struct xcoff_link_hash_entry *h,
3654
         asection *csect, const char *name)
3655
0
{
3656
0
  int smtyp;
3657
3658
  /* If we are skipping this csect, we want to strip the symbol too.  */
3659
0
  if (csect == NULL)
3660
0
    return 0;
3661
3662
  /* Likewise if we garbage-collected the csect.  */
3663
0
  if (xcoff_hash_table (info)->gc
3664
0
      && !bfd_is_abs_section (csect)
3665
0
      && !bfd_is_und_section (csect)
3666
0
      && csect->gc_mark == 0)
3667
0
    return 0;
3668
3669
  /* An XCOFF linker always removes C_STAT symbols.  */
3670
0
  if (isym->n_sclass == C_STAT)
3671
0
    return 0;
3672
3673
  /* We generate the TOC anchor separately.  */
3674
0
  if (isym->n_sclass == C_HIDEXT
3675
0
      && aux->x_csect.x_smclas == XMC_TC0)
3676
0
    return 0;
3677
3678
  /* If we are stripping all symbols, we want to discard this one.  */
3679
0
  if (info->strip == strip_all)
3680
0
    return 0;
3681
3682
  /* Discard symbols that are defined elsewhere.  */
3683
0
  if (EXTERN_SYM_P (isym->n_sclass))
3684
0
    {
3685
0
      if ((h->flags & XCOFF_ALLOCATED) != 0)
3686
0
  return 0;
3687
0
      if (!xcoff_final_definition_p (input_bfd, h, csect))
3688
0
  return 0;
3689
0
    }
3690
3691
  /* If we're discarding local symbols, check whether ISYM is local.  */
3692
0
  smtyp = SMTYP_SMTYP (aux->x_csect.x_smtyp);
3693
0
  if (info->discard == discard_all
3694
0
      && !EXTERN_SYM_P (isym->n_sclass)
3695
0
      && (isym->n_sclass != C_HIDEXT || smtyp != XTY_SD))
3696
0
    return 0;
3697
3698
  /* If we're stripping debugging symbols, check whether ISYM is one.  */
3699
0
  if (info->strip == strip_debugger
3700
0
      && isym->n_scnum == N_DEBUG)
3701
0
    return 0;
3702
3703
  /* If we are stripping symbols based on name, check how ISYM's
3704
     name should be handled.  */
3705
0
  if (info->strip == strip_some
3706
0
      || info->discard == discard_l)
3707
0
    {
3708
0
      char buf[SYMNMLEN + 1];
3709
3710
0
      if (name == NULL)
3711
0
  {
3712
0
    name = _bfd_coff_internal_syment_name (input_bfd, isym, buf);
3713
0
    if (name == NULL)
3714
0
      return -1;
3715
0
  }
3716
3717
0
      if (info->strip == strip_some
3718
0
    && bfd_hash_lookup (info->keep_hash, name, false, false) == NULL)
3719
0
  return 0;
3720
3721
0
      if (info->discard == discard_l
3722
0
    && !EXTERN_SYM_P (isym->n_sclass)
3723
0
    && (isym->n_sclass != C_HIDEXT || smtyp != XTY_SD)
3724
0
    && bfd_is_local_label_name (input_bfd, name))
3725
0
  return 0;
3726
0
    }
3727
3728
0
  return 1;
3729
0
}
3730
3731
/* Compute the current size of the .loader section. Start filling
3732
   its header but it will be finalized in xcoff_build_loader_section.   */
3733
3734
static bool
3735
xcoff_size_loader_section (struct xcoff_loader_info *ldinfo)
3736
0
{
3737
0
  bfd *output_bfd;
3738
0
  struct xcoff_link_hash_table *htab;
3739
0
  struct internal_ldhdr *ldhdr;
3740
0
  struct xcoff_import_file *fl;
3741
0
  bfd_size_type stoff;
3742
0
  size_t impsize, impcount;
3743
0
  asection *lsec;
3744
3745
0
  output_bfd = ldinfo->output_bfd;
3746
0
  htab = xcoff_hash_table (ldinfo->info);
3747
0
  ldhdr = &htab->ldhdr;
3748
3749
  /* If this function has already been called (ie l_version is set)
3750
     and the number of symbols or relocations haven't changed since
3751
     last call, the size is already known.  */
3752
0
  if (ldhdr->l_version != 0
3753
0
      && ldhdr->l_nsyms == ldinfo->ldsym_count
3754
0
      && ldhdr->l_nreloc == ldinfo->ldrel_count)
3755
0
    return true;
3756
3757
  /* Work out the size of the import file names.  Each import file ID
3758
     consists of three null terminated strings: the path, the file
3759
     name, and the archive member name.  The first entry in the list
3760
     of names is the path to use to find objects, which the linker has
3761
     passed in as the libpath argument.  For some reason, the path
3762
     entry in the other import file names appears to always be empty.  */
3763
0
  if (ldhdr->l_nimpid == 0)
3764
0
    {
3765
0
      impsize = strlen (ldinfo->libpath) + 3;
3766
0
      impcount = 1;
3767
0
      for (fl = htab->imports; fl != NULL; fl = fl->next)
3768
0
  {
3769
0
    ++impcount;
3770
0
    impsize += (strlen (fl->path)
3771
0
          + strlen (fl->file)
3772
0
          + strlen (fl->member)
3773
0
          + 3);
3774
0
  }
3775
0
      ldhdr->l_istlen = impsize;
3776
0
      ldhdr->l_nimpid = impcount;
3777
0
    }
3778
3779
  /* Set up the .loader section header.  */
3780
0
  ldhdr->l_version = bfd_xcoff_ldhdr_version(output_bfd);
3781
0
  ldhdr->l_nsyms = ldinfo->ldsym_count;
3782
0
  ldhdr->l_nreloc = ldinfo->ldrel_count;
3783
0
  ldhdr->l_impoff = (bfd_xcoff_ldhdrsz (output_bfd)
3784
0
         + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (output_bfd)
3785
0
         + ldhdr->l_nreloc * bfd_xcoff_ldrelsz (output_bfd));
3786
0
  ldhdr->l_stlen = ldinfo->string_size;
3787
0
  stoff = ldhdr->l_impoff + ldhdr->l_istlen;
3788
0
  if (ldinfo->string_size == 0)
3789
0
    ldhdr->l_stoff = 0;
3790
0
  else
3791
0
    ldhdr->l_stoff = stoff;
3792
3793
  /* 64 bit elements to ldhdr
3794
     The swap out routine for 32 bit will ignore them.
3795
     Nothing fancy, symbols come after the header and relocs come
3796
     after symbols.  */
3797
0
  ldhdr->l_symoff = bfd_xcoff_ldhdrsz (output_bfd);
3798
0
  ldhdr->l_rldoff = (bfd_xcoff_ldhdrsz (output_bfd)
3799
0
         + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (output_bfd));
3800
3801
  /* Save the size of the .loader section.  */
3802
0
  lsec = htab->loader_section;
3803
0
  lsec->size = stoff + ldhdr->l_stlen;
3804
3805
0
  return true;
3806
0
}
3807
3808
/* Prepare the .loader section.  This is called by the XCOFF linker
3809
   emulation before_allocation routine.  We must set the size of the
3810
   .loader section before the linker lays out the output file.  However,
3811
   some symbols or relocations might be append to the .loader section
3812
   when processing the addresses, thus it's not layout right now and
3813
   its size might change.
3814
   LIBPATH is the library path to search for shared objects; this is
3815
   normally built from the -L arguments passed to the linker.  ENTRY
3816
   is the name of the entry point symbol (the -e linker option).
3817
   FILE_ALIGN is the alignment to use for sections within the file
3818
   (the -H linker option).  MAXSTACK is the maximum stack size (the
3819
   -bmaxstack linker option).  MAXDATA is the maximum data size (the
3820
   -bmaxdata linker option).  GC is whether to do garbage collection
3821
   (the -bgc linker option).  MODTYPE is the module type (the
3822
   -bmodtype linker option).  TEXTRO is whether the text section must
3823
   be read only (the -btextro linker option).  AUTO_EXPORT_FLAGS
3824
   is a mask of XCOFF_EXPALL and XCOFF_EXPFULL.  SPECIAL_SECTIONS
3825
   is set by this routine to csects with magic names like _end.  */
3826
3827
bool
3828
bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
3829
         struct bfd_link_info *info,
3830
         const char *libpath,
3831
         const char *entry,
3832
         unsigned long file_align,
3833
         unsigned long maxstack,
3834
         unsigned long maxdata,
3835
         bool gc,
3836
         int modtype,
3837
         bool textro,
3838
         unsigned int auto_export_flags,
3839
         asection **special_sections,
3840
         bool rtld)
3841
0
{
3842
0
  struct xcoff_loader_info *ldinfo;
3843
0
  int i;
3844
0
  asection *sec;
3845
0
  bfd *sub;
3846
0
  size_t amt;
3847
3848
0
  if (bfd_get_flavour (output_bfd) != bfd_target_xcoff_flavour)
3849
0
    {
3850
0
      for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
3851
0
  special_sections[i] = NULL;
3852
0
      return true;
3853
0
    }
3854
3855
  /* Setup ldinfo.  */
3856
0
  ldinfo = &(xcoff_hash_table (info)->ldinfo);
3857
3858
0
  ldinfo->failed = false;
3859
0
  ldinfo->output_bfd = output_bfd;
3860
0
  ldinfo->info = info;
3861
0
  ldinfo->auto_export_flags = auto_export_flags;
3862
0
  ldinfo->ldsym_count = 0;
3863
0
  ldinfo->string_size = 0;
3864
0
  ldinfo->strings = NULL;
3865
0
  ldinfo->string_alc = 0;
3866
0
  ldinfo->libpath = libpath;
3867
3868
0
  xcoff_data (output_bfd)->maxstack = maxstack;
3869
0
  xcoff_data (output_bfd)->maxdata = maxdata;
3870
0
  xcoff_data (output_bfd)->modtype = modtype;
3871
3872
0
  xcoff_hash_table (info)->file_align = file_align;
3873
0
  xcoff_hash_table (info)->textro = textro;
3874
0
  xcoff_hash_table (info)->rtld = rtld;
3875
3876
  /* __rtinit */
3877
0
  if (xcoff_hash_table (info)->loader_section
3878
0
      && (info->init_function || info->fini_function || rtld))
3879
0
    {
3880
0
      struct xcoff_link_hash_entry *hsym;
3881
0
      struct internal_ldsym *ldsym;
3882
3883
0
      hsym = xcoff_link_hash_lookup (xcoff_hash_table (info),
3884
0
             "__rtinit", false, false, true);
3885
0
      if (hsym == NULL)
3886
0
  {
3887
0
    _bfd_error_handler
3888
0
      (_("error: undefined symbol __rtinit"));
3889
0
    return false;
3890
0
  }
3891
3892
0
      xcoff_mark_symbol (info, hsym);
3893
0
      hsym->flags |= (XCOFF_DEF_REGULAR | XCOFF_RTINIT);
3894
3895
      /* __rtinit initialized.  */
3896
0
      amt = sizeof (* ldsym);
3897
0
      ldsym = bfd_malloc (amt);
3898
3899
0
      ldsym->l_value = 0;   /* Will be filled in later.  */
3900
0
      ldsym->l_scnum = 2;   /* Data section.  */
3901
0
      ldsym->l_smtype = XTY_SD;   /* Csect section definition.  */
3902
0
      ldsym->l_smclas = 5;    /* .rw.  */
3903
0
      ldsym->l_ifile = 0;   /* Special system loader symbol.  */
3904
0
      ldsym->l_parm = 0;    /* NA.  */
3905
3906
      /* Force __rtinit to be the first symbol in the loader symbol table
3907
   See xcoff_build_ldsyms
3908
3909
   The first 3 symbol table indices are reserved to indicate the data,
3910
   text and bss sections.  */
3911
0
      BFD_ASSERT (0 == ldinfo->ldsym_count);
3912
3913
0
      hsym->ldindx = 3;
3914
0
      ldinfo->ldsym_count = 1;
3915
0
      hsym->ldsym = ldsym;
3916
3917
0
      if (! bfd_xcoff_put_ldsymbol_name (ldinfo->output_bfd, ldinfo,
3918
0
           hsym->ldsym, hsym->root.root.string))
3919
0
  return false;
3920
3921
      /* This symbol is written out by xcoff_write_global_symbol
3922
   Set stuff up so xcoff_write_global_symbol logic works.  */
3923
0
      hsym->flags |= XCOFF_DEF_REGULAR | XCOFF_MARK;
3924
0
      hsym->root.type = bfd_link_hash_defined;
3925
0
      hsym->root.u.def.value = 0;
3926
0
    }
3927
3928
  /* Garbage collect unused sections.  */
3929
0
  if (bfd_link_relocatable (info) || !gc)
3930
0
    {
3931
0
      gc = false;
3932
0
      xcoff_hash_table (info)->gc = false;
3933
3934
      /* We still need to call xcoff_mark, in order to set ldrel_count
3935
   correctly.  */
3936
0
      for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
3937
0
  {
3938
0
    asection *o;
3939
3940
0
    for (o = sub->sections; o != NULL; o = o->next)
3941
0
      {
3942
        /* We shouldn't unconditionaly mark the TOC section.
3943
     The output file should only have a TOC if either
3944
     (a) one of the input files did or (b) we end up
3945
     creating TOC references as part of the link process.  */
3946
0
        if (o != xcoff_hash_table (info)->toc_section
3947
0
      && o->gc_mark == 0)
3948
0
    {
3949
0
      if (! xcoff_mark (info, o))
3950
0
        goto error_return;
3951
0
    }
3952
0
      }
3953
0
  }
3954
0
    }
3955
0
  else
3956
0
    {
3957
0
      if (entry != NULL
3958
0
    && !xcoff_mark_symbol_by_name (info, entry, XCOFF_ENTRY))
3959
0
  goto error_return;
3960
0
      if (info->init_function != NULL
3961
0
    && !xcoff_mark_symbol_by_name (info, info->init_function, 0))
3962
0
  goto error_return;
3963
0
      if (info->fini_function != NULL
3964
0
    && !xcoff_mark_symbol_by_name (info, info->fini_function, 0))
3965
0
  goto error_return;
3966
0
      if (auto_export_flags != 0)
3967
0
  {
3968
0
    xcoff_link_hash_traverse (xcoff_hash_table (info),
3969
0
            xcoff_mark_auto_exports, ldinfo);
3970
0
    if (ldinfo->failed)
3971
0
      goto error_return;
3972
0
  }
3973
0
      xcoff_sweep (info);
3974
0
      xcoff_hash_table (info)->gc = true;
3975
0
    }
3976
3977
  /* Return special sections to the caller.  */
3978
0
  for (i = 0; i < XCOFF_NUMBER_OF_SPECIAL_SECTIONS; i++)
3979
0
    {
3980
0
      sec = xcoff_hash_table (info)->special_sections[i];
3981
3982
0
      if (sec != NULL
3983
0
    && gc
3984
0
    && sec->gc_mark == 0)
3985
0
  sec = NULL;
3986
3987
0
      special_sections[i] = sec;
3988
0
    }
3989
3990
0
  if (info->input_bfds == NULL)
3991
    /* I'm not sure what to do in this bizarre case.  */
3992
0
    return true;
3993
3994
0
  xcoff_link_hash_traverse (xcoff_hash_table (info), xcoff_post_gc_symbol,
3995
0
          (void *) ldinfo);
3996
0
  if (ldinfo->failed)
3997
0
    goto error_return;
3998
3999
0
  if (xcoff_hash_table (info)->loader_section
4000
0
      && !xcoff_size_loader_section (ldinfo))
4001
0
    goto error_return;
4002
4003
0
  return true;
4004
4005
0
 error_return:
4006
0
  free (ldinfo->strings);
4007
0
  return false;
4008
0
}
4009
4010
/* Lay out the .loader section, finalizing its header and
4011
   filling the import paths  */
4012
static bool
4013
xcoff_build_loader_section (struct xcoff_loader_info *ldinfo)
4014
0
{
4015
0
  bfd *output_bfd;
4016
0
  asection *lsec;
4017
0
  struct xcoff_link_hash_table *htab;
4018
0
  struct internal_ldhdr *ldhdr;
4019
0
  struct xcoff_import_file *fl;
4020
0
  char *out;
4021
4022
0
  output_bfd = ldinfo->output_bfd;
4023
0
  htab = xcoff_hash_table (ldinfo->info);
4024
0
  lsec = htab->loader_section;
4025
0
  ldhdr = &htab->ldhdr;
4026
4027
  /* We could have called xcoff_size_loader_section one more time.
4028
     However, this function is called once all the addresses have
4029
     been layout thus the .loader section shouldn't be changed
4030
     anymore.  */
4031
0
  BFD_ASSERT (ldhdr->l_nsyms == ldinfo->ldsym_count);
4032
0
  BFD_ASSERT (ldhdr->l_nreloc == ldinfo->ldrel_count);
4033
4034
  /* We now know the final size of the .loader section.  Allocate
4035
     space for it.  */
4036
0
  lsec->contents = bfd_zalloc (output_bfd, lsec->size);
4037
0
  if (lsec->contents == NULL)
4038
0
    return false;
4039
0
  lsec->alloced = 1;
4040
4041
  /* Set up the header.  */
4042
0
  bfd_xcoff_swap_ldhdr_out (output_bfd, ldhdr, lsec->contents);
4043
4044
  /* Set up the import file names.  */
4045
0
  out = (char *) lsec->contents + ldhdr->l_impoff;
4046
0
  strcpy (out, ldinfo->libpath);
4047
0
  out += strlen (ldinfo->libpath) + 1;
4048
0
  *out++ = '\0';
4049
0
  *out++ = '\0';
4050
0
  for (fl = htab->imports; fl != NULL; fl = fl->next)
4051
0
    {
4052
0
      const char *s;
4053
4054
0
      s = fl->path;
4055
0
      while ((*out++ = *s++) != '\0')
4056
0
  ;
4057
0
      s = fl->file;
4058
0
      while ((*out++ = *s++) != '\0')
4059
0
  ;
4060
0
      s = fl->member;
4061
0
      while ((*out++ = *s++) != '\0')
4062
0
  ;
4063
0
    }
4064
4065
0
  BFD_ASSERT ((bfd_size_type) ((bfd_byte *) out - lsec->contents) == ldhdr->l_impoff + ldhdr->l_istlen);
4066
4067
  /* Set up the symbol string table.  */
4068
0
  if (ldinfo->string_size > 0)
4069
0
    {
4070
0
      memcpy (out, ldinfo->strings, ldinfo->string_size);
4071
0
      free (ldinfo->strings);
4072
0
      ldinfo->strings = NULL;
4073
0
    }
4074
4075
  /* We can't set up the symbol table or the relocs yet, because we
4076
     don't yet know the final position of the various sections.  The
4077
     .loader symbols are written out when the corresponding normal
4078
     symbols are written out in xcoff_link_input_bfd or
4079
     xcoff_write_global_symbol.  The .loader relocs are written out
4080
     when the corresponding normal relocs are handled in
4081
     xcoff_link_input_bfd.  */
4082
4083
0
  return true;
4084
0
}
4085
4086
4087
/* Lay out the .loader section and allocate the space for
4088
   the other dynamic sections of XCOFF.  */
4089
bool
4090
bfd_xcoff_build_dynamic_sections (bfd *output_bfd,
4091
          struct bfd_link_info *info)
4092
0
{
4093
0
  struct xcoff_loader_info *ldinfo;
4094
0
  struct bfd_strtab_hash *debug_strtab;
4095
0
  bfd_byte *debug_contents = NULL;
4096
0
  bfd *sub;
4097
0
  asection *sec;
4098
4099
0
  ldinfo = &(xcoff_hash_table (info)->ldinfo);
4100
4101
0
  if (xcoff_hash_table (info)->loader_section
4102
0
      && !xcoff_build_loader_section (ldinfo))
4103
0
    return false;
4104
4105
  /* Allocate space for the magic sections.  */
4106
0
  sec = xcoff_hash_table (info)->linkage_section;
4107
0
  if (sec->size > 0)
4108
0
    {
4109
0
      sec->contents = bfd_zalloc (output_bfd, sec->size);
4110
0
      if (sec->contents == NULL)
4111
0
  return false;
4112
0
      sec->alloced = 1;
4113
0
    }
4114
0
  sec = xcoff_hash_table (info)->toc_section;
4115
0
  if (sec->size > 0)
4116
0
    {
4117
0
      sec->contents = bfd_zalloc (output_bfd, sec->size);
4118
0
      if (sec->contents == NULL)
4119
0
  return false;
4120
0
      sec->alloced = 1;
4121
0
    }
4122
0
  sec = xcoff_hash_table (info)->descriptor_section;
4123
0
  if (sec->size > 0)
4124
0
    {
4125
0
      sec->contents = bfd_zalloc (output_bfd, sec->size);
4126
0
      if (sec->contents == NULL)
4127
0
  return false;
4128
0
      sec->alloced = 1;
4129
0
    }
4130
4131
  /* Now that we've done garbage collection, decide which symbols to keep,
4132
     and figure out the contents of the .debug section.  */
4133
0
  debug_strtab = xcoff_hash_table (info)->debug_strtab;
4134
4135
0
  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
4136
0
    {
4137
0
      asection *subdeb;
4138
0
      bfd_size_type symcount;
4139
0
      long *debug_index;
4140
0
      asection **csectpp;
4141
0
      unsigned int *lineno_counts;
4142
0
      struct xcoff_link_hash_entry **sym_hash;
4143
0
      bfd_byte *esym, *esymend;
4144
0
      bfd_size_type symesz;
4145
4146
0
      if (sub->xvec != info->output_bfd->xvec)
4147
0
  continue;
4148
4149
0
      if ((sub->flags & DYNAMIC) != 0
4150
0
    && !info->static_link)
4151
0
  continue;
4152
4153
0
      if (! _bfd_coff_get_external_symbols (sub))
4154
0
  goto error_return;
4155
4156
0
      symcount = obj_raw_syment_count (sub);
4157
0
      debug_index = bfd_zalloc (sub, symcount * sizeof (long));
4158
0
      if (debug_index == NULL)
4159
0
  goto error_return;
4160
0
      xcoff_data (sub)->debug_indices = debug_index;
4161
4162
0
      if (info->strip == strip_all
4163
0
    || info->strip == strip_debugger
4164
0
    || info->discard == discard_all)
4165
  /* We're stripping all debugging information, so there's no need
4166
     to read SUB's .debug section.  */
4167
0
  subdeb = NULL;
4168
0
      else
4169
0
  {
4170
    /* Grab the contents of SUB's .debug section, if any.  */
4171
0
    subdeb = bfd_get_section_by_name (sub, ".debug");
4172
0
    if (subdeb != NULL
4173
0
        && subdeb->size != 0
4174
0
        && (subdeb->flags & SEC_HAS_CONTENTS) != 0)
4175
0
      {
4176
        /* We use malloc and copy the names into the debug
4177
     stringtab, rather than bfd_alloc, because I expect
4178
     that, when linking many files together, many of the
4179
     strings will be the same.  Storing the strings in the
4180
     hash table should save space in this case.  */
4181
0
        if (!bfd_malloc_and_get_section (sub, subdeb, &debug_contents))
4182
0
    goto error_return;
4183
0
      }
4184
0
  }
4185
4186
0
      csectpp = xcoff_data (sub)->csects;
4187
0
      lineno_counts = xcoff_data (sub)->lineno_counts;
4188
0
      sym_hash = obj_xcoff_sym_hashes (sub);
4189
0
      symesz = bfd_coff_symesz (sub);
4190
0
      esym = (bfd_byte *) obj_coff_external_syms (sub);
4191
0
      esymend = esym + symcount * symesz;
4192
4193
0
      while (esym < esymend)
4194
0
  {
4195
0
    struct internal_syment sym;
4196
0
    union internal_auxent aux;
4197
0
    asection *csect;
4198
0
    const char *name;
4199
0
    int keep_p;
4200
4201
0
    bfd_coff_swap_sym_in (sub, esym, &sym);
4202
4203
    /* Read in the csect information, if any.  */
4204
0
    if (CSECT_SYM_P (sym.n_sclass))
4205
0
      {
4206
0
        BFD_ASSERT (sym.n_numaux > 0);
4207
0
        bfd_coff_swap_aux_in (sub, esym + symesz * sym.n_numaux,
4208
0
            sym.n_type, sym.n_sclass,
4209
0
            sym.n_numaux - 1, sym.n_numaux, &aux);
4210
0
      }
4211
4212
    /* If this symbol's name is stored in the debug section,
4213
       get a pointer to it.  */
4214
0
    if (debug_contents != NULL
4215
0
        && sym._n._n_n._n_zeroes == 0
4216
0
        && bfd_coff_symname_in_debug (sub, &sym))
4217
0
      name = (const char *) debug_contents + sym._n._n_n._n_offset;
4218
0
    else
4219
0
      name = NULL;
4220
4221
    /* Decide whether to copy this symbol to the output file.  */
4222
0
    csect = *csectpp;
4223
0
    keep_p = xcoff_keep_symbol_p (info, sub, &sym, &aux,
4224
0
          *sym_hash, csect, name);
4225
0
    if (keep_p < 0)
4226
0
      goto error_return;
4227
4228
0
    if (!keep_p)
4229
      /* Use a debug_index of -2 to record that a symbol should
4230
         be stripped.  */
4231
0
      *debug_index = -2;
4232
0
    else
4233
0
      {
4234
        /* See whether we should store the symbol name in the
4235
     output .debug section.  */
4236
0
        if (name != NULL)
4237
0
    {
4238
0
      bfd_size_type indx;
4239
4240
0
      indx = _bfd_stringtab_add (debug_strtab, name, true, true);
4241
0
      if (indx == (bfd_size_type) -1)
4242
0
        goto error_return;
4243
0
      *debug_index = indx;
4244
0
    }
4245
0
        else
4246
0
    *debug_index = -1;
4247
0
        if (*sym_hash != 0)
4248
0
    (*sym_hash)->flags |= XCOFF_ALLOCATED;
4249
0
        if (*lineno_counts > 0)
4250
0
    csect->output_section->lineno_count += *lineno_counts;
4251
0
      }
4252
4253
0
    esym += (sym.n_numaux + 1) * symesz;
4254
0
    csectpp += sym.n_numaux + 1;
4255
0
    sym_hash += sym.n_numaux + 1;
4256
0
    lineno_counts += sym.n_numaux + 1;
4257
0
    debug_index += sym.n_numaux + 1;
4258
0
  }
4259
4260
0
      if (debug_contents)
4261
0
  {
4262
0
    free (debug_contents);
4263
0
    debug_contents = NULL;
4264
4265
    /* Clear the size of subdeb, so that it is not included directly
4266
       in the output file.  */
4267
0
    subdeb->size = 0;
4268
0
  }
4269
4270
0
      if (! info->keep_memory)
4271
0
  {
4272
0
    if (! _bfd_coff_free_symbols (sub))
4273
0
      goto error_return;
4274
0
  }
4275
0
    }
4276
4277
0
  if (info->strip != strip_all
4278
0
      && xcoff_hash_table (info)->debug_section != NULL)
4279
0
    xcoff_hash_table (info)->debug_section->size =
4280
0
      _bfd_stringtab_size (debug_strtab);
4281
4282
0
  return true;
4283
4284
0
 error_return:
4285
0
  free (debug_contents);
4286
0
  return false;
4287
0
}
4288
4289
bool
4290
bfd_xcoff_link_generate_rtinit (bfd *abfd,
4291
        const char *init,
4292
        const char *fini,
4293
        bool rtld)
4294
0
{
4295
0
  struct bfd_in_memory *bim;
4296
4297
0
  bim = bfd_malloc ((bfd_size_type) sizeof (* bim));
4298
0
  if (bim == NULL)
4299
0
    return false;
4300
4301
0
  bim->size = 0;
4302
0
  bim->buffer = 0;
4303
4304
0
  abfd->link.next = 0;
4305
0
  abfd->format = bfd_object;
4306
0
  abfd->iostream = (void *) bim;
4307
0
  abfd->flags = BFD_IN_MEMORY;
4308
0
  abfd->iovec = &_bfd_memory_iovec;
4309
0
  abfd->direction = write_direction;
4310
0
  abfd->origin = 0;
4311
0
  abfd->where = 0;
4312
4313
0
  if (! bfd_xcoff_generate_rtinit (abfd, init, fini, rtld))
4314
0
    return false;
4315
4316
  /* need to reset to unknown or it will not be read back in correctly */
4317
0
  abfd->format = bfd_unknown;
4318
0
  abfd->direction = read_direction;
4319
0
  abfd->where = 0;
4320
4321
0
  return true;
4322
0
}
4323

4324
4325
/* Linker stubs.
4326
   The stubs will be gathered in stub csects named "@FIX'number'".
4327
   A new csect will be created by xcoff_stub_get_csect_in_range,
4328
   everytime a relocation cannot reach its target and its section
4329
   is too far from the others stub csects.
4330
   The stubs will simply be code generated inside these stub
4331
   csects.  In order to simplify the symbol table, only the symbols
4332
   for the stub csects are written.
4333
4334
   As the code is dependent of the architecture, it's defined
4335
   in the backend.
4336
4337
   xcoff_stub_indirect_call:
4338
   Used when a 24 bit branch cannot reach its destination and that
4339
   this destination isn't a global linkage symbol.
4340
4341
   xcoff_stub_shared_call:
4342
   As above but when it's a global linkage symbol.
4343
   The main difference being that it doesn't branch to the global
4344
   linkage symbol which will then call the shared library.  It
4345
   directly call it saving the TOC.
4346
4347
   TODO: -bbigtoc option should be able to be implemented using
4348
   this stubs.  */
4349
4350
/* Get the name of a csect which will contain stubs.
4351
   It has the same pattern as AIX linker: @FIX"number".  */
4352
static char *
4353
xcoff_stub_csect_name (unsigned int n)
4354
0
{
4355
0
  char buf[8];
4356
0
  size_t len;
4357
0
  char *csect_name;
4358
4359
  /* For now, allow "only" 1000000 stub csects.  */
4360
0
  if (n >= 1000000)
4361
0
    {
4362
0
      BFD_FAIL();
4363
0
      return NULL;
4364
0
    }
4365
4366
0
  sprintf (buf, "%d", n);
4367
0
  len = 4 + strlen (buf) + 1;
4368
4369
0
  csect_name = bfd_malloc (len);
4370
0
  if (csect_name == NULL)
4371
0
    return NULL;
4372
0
  sprintf (csect_name, "@FIX%d", n);
4373
4374
0
  return csect_name;
4375
0
}
4376
4377
/* Return a stub section which can be reach with a single branch
4378
   from SECTION.  CREATE means that creating a csect is allowed.  */
4379
static struct xcoff_link_hash_entry *
4380
xcoff_stub_get_csect_in_range (asection *section,
4381
             struct bfd_link_info *info,
4382
             bool create)
4383
0
{
4384
0
  struct xcoff_link_hash_table *htab = xcoff_hash_table (info);
4385
0
  struct xcoff_link_hash_entry *csect_entry;
4386
0
  struct bfd_link_hash_entry *bh = NULL;
4387
0
  asection *csect;
4388
0
  unsigned int it;
4389
0
  char *csect_name;
4390
4391
  /* Search for a csect in range.  */
4392
0
  for (csect = htab->params->stub_bfd->sections, it = 0;
4393
0
       csect != NULL;
4394
0
       csect = csect->next, it++)
4395
0
    {
4396
      /* A csect is in range if everything instructions in SECTION
4397
   can branch to every stubs in the stub csect.  This can
4398
   be simplify by saying that the first entry of each sections
4399
   (ie the vma of this section) can reach the last entry of the
4400
   stub csect (ie the vma of the csect + its size).
4401
   However, as the stub csect might be growing its size isn't
4402
   fixed.  Thus, the last entry of SECTION might not be able
4403
   to reach the first entry of the stub csect anymore.
4404
   If this case happens, the following condition will be
4405
   false during the next pass of bfd_xcoff_size_stubs and
4406
   another csect will be used.
4407
   This means we might create more stubs than needed.  */
4408
0
      bfd_vma csect_vma, section_vma;
4409
0
      bfd_vma csect_last_vma, section_last_vma;
4410
4411
0
      csect_vma = (csect->output_section->vma
4412
0
       + csect->output_offset);
4413
0
      csect_last_vma = (csect->output_section->vma
4414
0
      + csect->output_offset
4415
0
      + csect->size);
4416
0
      section_vma = (section->output_section->vma
4417
0
         + section->output_offset);
4418
0
      section_last_vma = (section->output_section->vma
4419
0
        + section->output_offset
4420
0
        + section->size);
4421
4422
0
      if (csect_last_vma - section_vma + (1 << 25) < 2 * (1 << 25)
4423
0
    && section_last_vma - csect_vma + (1 << 25) < 2 * (1 << 25))
4424
0
  break;
4425
0
    }
4426
4427
0
  if (!create && csect == NULL)
4428
0
    return NULL;
4429
4430
0
  csect_name = xcoff_stub_csect_name (it);
4431
0
  if (!csect_name)
4432
0
    return NULL;
4433
4434
  /* A stub csect already exists, get its entry.  */
4435
0
  if (csect != NULL)
4436
0
    {
4437
0
      csect_entry = xcoff_link_hash_lookup (htab, csect_name, false, false, true);
4438
0
      free(csect_name);
4439
0
      return csect_entry;
4440
0
    }
4441
4442
  /* Create the csect and its symbol.  */
4443
0
  csect = (*htab->params->add_stub_section) (".pr", section);
4444
0
  if (!csect)
4445
0
    {
4446
0
      free(csect_name);
4447
0
      return NULL;
4448
0
    }
4449
4450
0
  csect->alignment_power = 2;
4451
0
  csect->gc_mark = 1;
4452
0
  csect->reloc_count = 0;
4453
4454
  /* We need to associate a VMA to this new csect.  Otherwise,
4455
     our "in range" algorithm won't find it for the next stub.
4456
     And as we will be adding this stub section just after the
4457
     SECTION, we know its address.  */
4458
0
  csect->output_offset = BFD_ALIGN (section->output_offset + section->size,
4459
0
            4);
4460
4461
0
  if (!_bfd_generic_link_add_one_symbol (info, htab->params->stub_bfd,
4462
0
           csect_name, BSF_GLOBAL, csect, 0,
4463
0
           NULL, true, true, &bh))
4464
0
    {
4465
0
      free(csect_name);
4466
0
      return NULL;
4467
0
    }
4468
4469
0
  csect_entry = (struct xcoff_link_hash_entry *)bh;
4470
0
  csect_entry->smclas = XMC_PR;
4471
0
  csect_entry->flags = XCOFF_MARK | XCOFF_DEF_REGULAR;
4472
4473
0
  free(csect_name);
4474
0
  return csect_entry;
4475
0
}
4476
4477
4478
/* Build a name for an entry in the stub hash table.  */
4479
static char *
4480
xcoff_stub_name (const struct xcoff_link_hash_entry *h,
4481
     const struct xcoff_link_hash_entry *hcsect)
4482
0
{
4483
0
  char *stub_name;
4484
0
  size_t len;
4485
4486
0
  if (h)
4487
0
    {
4488
      /* The name of a stub is based on its stub csect and the
4489
   symbol it wants to reach.  It looks like: ".@FIX0.tramp.f".
4490
   When the stub targets a function, the last dot of ".tramp."
4491
   is removed to avoid having two dot.  */
4492
0
      len = (1 + 6
4493
0
       + strlen (hcsect->root.root.string)
4494
0
       + strlen (h->root.root.string)
4495
0
       + 1);
4496
0
      if (h->root.root.string[0] != '.')
4497
0
  len++;
4498
4499
0
      stub_name = bfd_malloc (len);
4500
0
      if (stub_name == NULL)
4501
0
  return stub_name;
4502
4503
0
      if (h->root.root.string[0] == '.')
4504
0
  sprintf (stub_name, ".%s.tramp%s",
4505
0
     hcsect->root.root.string,
4506
0
     h->root.root.string);
4507
0
      else
4508
0
  sprintf (stub_name, ".%s.tramp.%s",
4509
0
     hcsect->root.root.string,
4510
0
     h->root.root.string);
4511
0
    }
4512
0
  else
4513
0
    {
4514
0
      BFD_FAIL();
4515
0
      return NULL;
4516
0
    }
4517
4518
0
  return stub_name;
4519
0
}
4520
4521
/* Look up an entry in the stub hash.  */
4522
struct xcoff_stub_hash_entry *
4523
bfd_xcoff_get_stub_entry (asection *section,
4524
        struct xcoff_link_hash_entry *h,
4525
        struct bfd_link_info *info)
4526
0
{
4527
0
  struct xcoff_link_hash_table *htab = xcoff_hash_table (info);
4528
0
  struct xcoff_link_hash_entry *hcsect;
4529
0
  struct xcoff_stub_hash_entry *hstub;
4530
0
  char *stub_name;
4531
4532
0
  hcsect = xcoff_stub_get_csect_in_range (section, info, false);
4533
0
  if (!hcsect)
4534
0
    return NULL;
4535
4536
0
  stub_name = xcoff_stub_name (h, hcsect);
4537
0
  if (stub_name == NULL)
4538
0
    return NULL;
4539
4540
0
  hstub = xcoff_stub_hash_lookup (&htab->stub_hash_table,
4541
0
          stub_name, false, false);
4542
4543
0
  free (stub_name);
4544
0
  return hstub;
4545
0
}
4546
4547
/* Check if the symbol targeted by IREL is reachable.
4548
   Return the type of stub needed otherwise.  */
4549
enum xcoff_stub_type
4550
bfd_xcoff_type_of_stub (asection *sec,
4551
      const struct internal_reloc *irel,
4552
      bfd_vma destination,
4553
      struct xcoff_link_hash_entry *h)
4554
0
{
4555
0
  bfd_vma location, offset, max_offset;
4556
4557
0
  switch (irel->r_type)
4558
0
    {
4559
0
    default:
4560
0
      return xcoff_stub_none;
4561
4562
0
    case R_BR:
4563
0
    case R_RBR:
4564
0
      location = (sec->output_section->vma
4565
0
      + sec->output_offset
4566
0
      + irel->r_vaddr
4567
0
      - sec->vma);
4568
4569
0
      max_offset = 1 << 25 ;
4570
4571
0
      offset = destination - location;
4572
4573
0
      if (offset + max_offset < 2 * max_offset)
4574
0
  return xcoff_stub_none;
4575
4576
      /* A stub is needed.  Now, check that we can make one.  */
4577
0
      if (h != NULL
4578
0
    && h->descriptor != NULL)
4579
0
  {
4580
    /* Not sure how to handle this case. For now, skip it. */
4581
0
    if (bfd_is_abs_section (h->root.u.def.section))
4582
0
      return xcoff_stub_none;
4583
4584
0
    if (h->smclas == XMC_GL)
4585
0
      return xcoff_stub_shared_call;
4586
0
    else
4587
0
      return xcoff_stub_indirect_call;
4588
0
  }
4589
0
      break;
4590
0
    }
4591
4592
0
  return xcoff_stub_none;
4593
0
}
4594
4595
/* Add a new stub entry to the stub hash.  Not all fields of the new
4596
   stub entry are initialised.  */
4597
static struct xcoff_stub_hash_entry *
4598
xcoff_add_stub (const char *stub_name,
4599
    struct xcoff_link_hash_entry *hstub_csect,
4600
    struct xcoff_link_hash_entry *htarget,
4601
    struct bfd_link_info *info,
4602
    enum xcoff_stub_type stub_type)
4603
0
{
4604
0
  struct xcoff_link_hash_table *htab = xcoff_hash_table (info);
4605
0
  struct xcoff_stub_hash_entry *hstub;
4606
0
  bfd_vma stub_offset;
4607
0
  asection *stub_csect;
4608
4609
0
  stub_csect = hstub_csect->root.u.def.section;
4610
0
  stub_offset = stub_csect->size;
4611
4612
  /* Update the relocation counter and the size of
4613
     the containing csect.  The size is needed for
4614
     the algorithm in xcoff_stub_get_csect_in_range.  */
4615
0
  switch (stub_type)
4616
0
    {
4617
0
    default:
4618
0
      BFD_FAIL ();
4619
0
      return NULL;
4620
4621
0
    case xcoff_stub_indirect_call:
4622
0
      stub_csect->reloc_count++;
4623
0
      stub_csect->size += bfd_xcoff_stub_indirect_call_size (info->output_bfd);
4624
0
  break;
4625
4626
0
    case xcoff_stub_shared_call:
4627
0
      stub_csect->reloc_count++;
4628
0
      stub_csect->size += bfd_xcoff_stub_shared_call_size (info->output_bfd);
4629
0
      break;
4630
0
    }
4631
4632
  /* Create the stub entry.  */
4633
0
  hstub = xcoff_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4634
0
               true, true);
4635
0
  if (hstub == NULL)
4636
0
    return NULL;
4637
4638
0
  hstub->htarget = htarget;
4639
0
  hstub->stub_offset = stub_offset;
4640
4641
  /* For indirect call or shared call, the relocations are against
4642
     the target descriptor.  Its toc entry will be used.  */
4643
0
  if (stub_type == xcoff_stub_indirect_call
4644
0
      || stub_type == xcoff_stub_shared_call)
4645
0
    {
4646
0
      struct xcoff_link_hash_entry *hds = htarget->descriptor;
4647
0
      asection *hds_section = hds->root.u.def.section;
4648
4649
0
      hstub->htarget = hds;
4650
4651
      /* If the symbol haven't been marked, its section might have
4652
   its size and its relocation count been deleted by xcoff_sweep.
4653
   Restore it.  */
4654
0
      if ((hds->flags & XCOFF_MARK) == 0)
4655
0
  {
4656
0
    if (hds_section->size == 0
4657
0
        && hds_section->reloc_count == 0
4658
0
        && hds_section->rawsize != 0)
4659
0
      {
4660
0
        hds_section->size = hds_section->rawsize;
4661
        /* Always two relocations for a XMC_DS symbol.  */
4662
0
        hds_section->reloc_count = 2;
4663
0
      }
4664
4665
    /* Mark the section and the symbol.  */
4666
0
    if (!xcoff_mark (info, hds_section))
4667
0
      return NULL;
4668
0
  }
4669
4670
      /* Add a TOC entry for the descriptor if non exists.  */
4671
0
      if (hds->toc_section == NULL)
4672
0
  {
4673
0
    int byte_size;
4674
4675
0
    if (bfd_xcoff_is_xcoff64 (info->output_bfd))
4676
0
      byte_size = 8;
4677
0
    else if (bfd_xcoff_is_xcoff32 (info->output_bfd))
4678
0
      byte_size = 4;
4679
0
    else
4680
0
      return NULL;
4681
4682
    /* Allocate room in the fallback TOC section.  */
4683
0
    hds->toc_section = xcoff_hash_table (info)->toc_section;
4684
0
    hds->u.toc_offset = hds->toc_section->size;
4685
0
    hds->toc_section->size += byte_size;
4686
0
    if (!xcoff_mark (info, hds->toc_section))
4687
0
      return NULL;
4688
4689
    /* Update relocation counters for a static and dynamic
4690
       R_TOC relocation.  */
4691
0
    ++hds->toc_section->reloc_count;
4692
0
    ++htab->ldinfo.ldrel_count;
4693
4694
    /* Set the index to -2 to force this symbol to
4695
       get written out.  */
4696
0
    hds->indx = -2;
4697
0
    hds->flags |= XCOFF_SET_TOC;
4698
0
  }
4699
0
    }
4700
4701
0
  return hstub;
4702
0
}
4703
4704
static bool
4705
xcoff_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
4706
0
{
4707
0
  struct xcoff_stub_hash_entry *hstub
4708
0
    = (struct xcoff_stub_hash_entry *) gen_entry;
4709
4710
0
  bfd *stub_bfd;
4711
0
  bfd *output_bfd;
4712
0
  struct bfd_link_info *info;
4713
0
  bfd_byte *loc;
4714
0
  bfd_byte *p;
4715
0
  unsigned int i;
4716
4717
0
  info = (struct bfd_link_info *) in_arg;
4718
0
  stub_bfd = xcoff_hash_table (info)->params->stub_bfd;
4719
0
  output_bfd = info->output_bfd;
4720
4721
  /* Fail if the target section could not be assigned to an output
4722
     section.  The user should fix his linker script.  */
4723
0
  if (hstub->target_section != NULL
4724
0
      && hstub->target_section->output_section == NULL
4725
0
      && info->non_contiguous_regions)
4726
0
    info->callbacks->fatal (_("%P: Could not assign `%pA' to an output section. "
4727
0
            "Retry without --enable-non-contiguous-regions.\n"),
4728
0
          hstub->target_section);
4729
4730
0
  loc = (hstub->hcsect->root.u.def.section->contents
4731
0
   + hstub->stub_offset);
4732
0
  p = loc;
4733
4734
0
  switch (hstub->stub_type)
4735
0
    {
4736
0
    case xcoff_stub_indirect_call:
4737
0
      BFD_ASSERT (hstub->htarget->toc_section != NULL);
4738
      /* The first instruction in the stub code needs to be
4739
   cooked to hold the correct offset in the toc.  It will
4740
   be filled by xcoff_stub_create_relocations.  */
4741
0
      for (i = 0; i < bfd_xcoff_stub_indirect_call_size(output_bfd) / 4; i++)
4742
0
  bfd_put_32 (stub_bfd,
4743
0
        (bfd_vma) bfd_xcoff_stub_indirect_call_code(output_bfd, i),
4744
0
        &p[4 * i]);
4745
0
      break;
4746
4747
0
    case xcoff_stub_shared_call:
4748
0
      BFD_ASSERT (hstub->htarget->toc_section != NULL);
4749
      /* The first instruction in the glink code needs to be
4750
   cooked to hold the correct offset in the toc.  It will
4751
   be filled by xcoff_stub_create_relocations.  */
4752
0
      for (i = 0; i < bfd_xcoff_stub_shared_call_size(output_bfd) / 4; i++)
4753
0
  bfd_put_32 (stub_bfd,
4754
0
        (bfd_vma) bfd_xcoff_stub_shared_call_code(output_bfd, i),
4755
0
        &p[4 * i]);
4756
4757
0
      break;
4758
4759
0
    default:
4760
0
      BFD_FAIL ();
4761
0
      return false;
4762
0
    }
4763
0
  return true;
4764
0
}
4765
4766
/* Check relocations and adds stubs if needed.  */
4767
4768
bool
4769
bfd_xcoff_size_stubs (struct bfd_link_info *info)
4770
0
{
4771
0
  struct xcoff_link_hash_table *htab = xcoff_hash_table (info);
4772
0
  struct xcoff_loader_info *ldinfo = &(htab->ldinfo);
4773
4774
0
  while (1)
4775
0
    {
4776
0
      bfd *input_bfd;
4777
0
      bool stub_changed = false;
4778
4779
0
      for (input_bfd = info->input_bfds;
4780
0
     input_bfd != NULL;
4781
0
     input_bfd = input_bfd->link.next)
4782
0
  {
4783
0
    asection *section;
4784
0
    bfd_size_type symcount;
4785
0
    bfd_size_type symesz;
4786
0
    bfd_byte *esyms;
4787
4788
0
    if (bfd_get_flavour (input_bfd) != bfd_target_xcoff_flavour)
4789
0
      continue;
4790
4791
0
    symcount = obj_raw_syment_count (input_bfd);
4792
0
    if (!symcount)
4793
0
      continue;
4794
0
    symesz = bfd_coff_symesz (input_bfd);
4795
0
    esyms = (bfd_byte *) obj_coff_external_syms (input_bfd);
4796
4797
    /* Walk over each section attached to the input bfd.  */
4798
0
    for (section = input_bfd->sections;
4799
0
         section != NULL;
4800
0
         section = section->next)
4801
0
      {
4802
0
        struct internal_reloc *internal_relocs;
4803
0
        struct internal_reloc *irel, *irelend;
4804
4805
        /* If there aren't any relocs, then there's nothing more
4806
     to do.  */
4807
0
        if ((section->flags & SEC_RELOC) == 0
4808
0
      || section->reloc_count == 0)
4809
0
    continue;
4810
4811
        /* If this section is a link-once section that will be
4812
     discarded, then don't create any stubs.  */
4813
0
        if (section->output_section == NULL
4814
0
      || section->output_section->owner != info->output_bfd)
4815
0
    continue;
4816
4817
        /* This section have been garbage-collected.  */
4818
0
        if (section->gc_mark == 0)
4819
0
    continue;
4820
4821
        /* Read in the relocs.  */
4822
0
        internal_relocs = (xcoff_read_internal_relocs
4823
0
         (input_bfd, section, true, NULL,
4824
0
          false, NULL));
4825
0
        if (internal_relocs == NULL)
4826
0
    goto error_ret;
4827
4828
0
        irel = internal_relocs;
4829
0
        irelend = irel + section->reloc_count;
4830
0
        for (; irel < irelend; irel++)
4831
0
    {
4832
0
      enum xcoff_stub_type stub_type;
4833
0
      struct xcoff_link_hash_entry *hsym = NULL;
4834
0
      struct xcoff_link_hash_entry *hstub_csect = NULL;
4835
0
      struct xcoff_stub_hash_entry *hstub = NULL;
4836
0
      asection *sym_sec;
4837
0
      bfd_vma sym_value;
4838
0
      bfd_vma destination;
4839
0
      char *stub_name;
4840
4841
0
      if (irel->r_symndx == -1)
4842
0
        continue;
4843
4844
0
      switch (irel->r_type)
4845
0
        {
4846
0
        default:
4847
0
          continue;
4848
4849
0
        case R_BR:
4850
0
        case R_RBR:
4851
0
          break;
4852
0
        }
4853
4854
      /* Retrieve targeted symbol address */
4855
0
      hsym = obj_xcoff_sym_hashes (input_bfd)[irel->r_symndx];
4856
0
      if (hsym == NULL)
4857
0
        {
4858
0
          struct internal_syment sym;
4859
0
          if ((long unsigned int)irel->r_symndx > symcount)
4860
0
      {
4861
0
        BFD_FAIL();
4862
0
        goto error_ret;
4863
0
      }
4864
4865
0
          bfd_coff_swap_sym_in (input_bfd,
4866
0
              (void *) esyms + irel->r_symndx * symesz,
4867
0
              (void *) &sym);
4868
4869
0
          sym_sec = xcoff_data (input_bfd)->csects[irel->r_symndx];
4870
0
          sym_value = sym.n_value - sym_sec->vma;
4871
4872
0
          destination = (sym_value
4873
0
             + sym_sec->output_section->vma
4874
0
             + sym_sec->output_offset);
4875
0
        }
4876
0
      else if (hsym->root.type == bfd_link_hash_defined
4877
0
         || hsym->root.type == bfd_link_hash_defweak)
4878
0
        {
4879
0
          sym_sec = hsym->root.u.def.section;
4880
0
          sym_value = hsym->root.u.def.value;
4881
0
          destination = (sym_value
4882
0
             + sym_sec->output_section->vma
4883
0
             + sym_sec->output_offset);
4884
0
        }
4885
0
      else
4886
0
        {
4887
0
          bfd_set_error (bfd_error_bad_value);
4888
0
          goto error_ret;
4889
0
        }
4890
4891
      /* I'm not sure how to handle this case. Skip it for now.  */
4892
0
      if (bfd_is_abs_section (sym_sec))
4893
0
        continue;
4894
4895
0
      stub_type = bfd_xcoff_type_of_stub (section, irel, destination, hsym);
4896
4897
0
      if (stub_type == xcoff_stub_none)
4898
0
        continue;
4899
4900
      /* Get a stub csect in ranch.  */
4901
0
      hstub_csect = xcoff_stub_get_csect_in_range (section, info, true);
4902
0
      if (!hstub_csect)
4903
0
        {
4904
          /* xgettext:c-format */
4905
0
          _bfd_error_handler (_("%pB: Unable to find a stub csect in range"
4906
0
              "of relocation at %#" PRIx64 " targeting"
4907
0
              "'%s'"),
4908
0
            section->owner, (uint64_t) irel->r_vaddr,
4909
0
            hsym->root.root.string);
4910
0
          goto error_ret;
4911
0
        }
4912
4913
      /* Get the name of this stub.  */
4914
0
      stub_name = xcoff_stub_name (hsym, hstub_csect);
4915
0
      if (!stub_name)
4916
0
        goto error_ret;
4917
4918
0
      hstub = xcoff_stub_hash_lookup (&(xcoff_hash_table (info)->stub_hash_table),
4919
0
                   stub_name, false, false);
4920
4921
      /* A stub entry inside the in range csect already exists.  */
4922
0
      if (hstub != NULL)
4923
0
        {
4924
0
          free (stub_name);
4925
0
          continue;
4926
0
        }
4927
4928
0
      stub_changed = true;
4929
4930
0
      hstub = xcoff_add_stub (stub_name, hstub_csect, hsym, info, stub_type);
4931
0
      if (hstub == NULL)
4932
0
        {
4933
          /* xgettext:c-format */
4934
0
          _bfd_error_handler (_("%pB: Cannot create stub entry '%s'"),
4935
0
            section->owner, stub_name);
4936
0
          free (stub_name);
4937
0
          goto error_ret;
4938
0
        }
4939
4940
0
      hstub->stub_type = stub_type;
4941
0
      hstub->hcsect = hstub_csect;
4942
0
      hstub->target_section = sym_sec;
4943
0
      free (stub_name);
4944
0
    }
4945
0
      }
4946
0
  }
4947
4948
0
      if (!stub_changed)
4949
0
  break;
4950
4951
      /* Update the size of the loader.  */
4952
0
      if (xcoff_hash_table (info)->loader_section
4953
0
    && !xcoff_size_loader_section (ldinfo))
4954
0
  goto error_ret;
4955
4956
      /* Ask the linker to do its stuff.  */
4957
0
      (*htab->params->layout_sections_again) ();
4958
4959
0
    }
4960
0
  return true;
4961
4962
0
 error_ret:
4963
0
  bfd_set_error (bfd_error_bad_value);
4964
0
  return false;
4965
0
}
4966
4967
bool
4968
bfd_xcoff_build_stubs (struct bfd_link_info *info)
4969
0
{
4970
0
  struct xcoff_link_hash_table *htab = xcoff_hash_table (info);
4971
0
  asection *stub_sec;
4972
4973
0
  for (stub_sec = htab->params->stub_bfd->sections;
4974
0
       stub_sec != NULL;
4975
0
       stub_sec = stub_sec->next)
4976
0
    {
4977
0
      bfd_size_type size;
4978
4979
      /* Allocate memory to hold the linker stubs.  */
4980
0
      size = stub_sec->size;
4981
0
      stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, size);
4982
0
      if (stub_sec->contents == NULL && size != 0)
4983
0
  return false;
4984
0
      stub_sec->alloced = 1;
4985
0
    }
4986
4987
  /* Build the stubs as directed by the stub hash table.  */
4988
0
  bfd_hash_traverse (&htab->stub_hash_table, xcoff_build_one_stub, info);
4989
0
  return true;
4990
0
}
4991
4992
/* Create and apply relocations made by a stub entry.  */
4993
static bool
4994
xcoff_stub_create_relocations (struct bfd_hash_entry *bh, void * inf)
4995
0
{
4996
0
  struct xcoff_stub_hash_entry *hstub
4997
0
    = (struct xcoff_stub_hash_entry *) bh;
4998
0
  struct xcoff_final_link_info *flinfo
4999
0
    = (struct xcoff_final_link_info *) inf;
5000
5001
0
  bfd *output_bfd;
5002
0
  struct internal_reloc *irel;
5003
0
  struct xcoff_link_hash_entry **rel_hash;
5004
0
  struct xcoff_link_hash_entry *htarget;
5005
0
  asection *sec, *osec;
5006
0
  bfd_vma off;
5007
0
  bfd_byte *p;
5008
5009
0
  htarget = hstub->htarget;
5010
0
  sec = hstub->hcsect->root.u.def.section;
5011
0
  osec = sec->output_section;
5012
5013
0
  irel = (flinfo->section_info[osec->target_index].relocs
5014
0
    + osec->reloc_count);
5015
0
  rel_hash = (flinfo->section_info[osec->target_index].rel_hashes
5016
0
        + osec->output_section->reloc_count);
5017
0
  *rel_hash = NULL;
5018
0
  output_bfd = flinfo->output_bfd;
5019
5020
0
  irel->r_symndx = htarget->indx;
5021
0
  irel->r_vaddr = (osec->vma
5022
0
       + sec->output_offset
5023
0
       + hstub->hcsect->root.u.def.value
5024
0
       + hstub->stub_offset);
5025
5026
0
  p = (sec->contents
5027
0
       + hstub->stub_offset);
5028
5029
0
  switch (hstub->stub_type)
5030
0
    {
5031
0
    default:
5032
0
      BFD_FAIL ();
5033
0
      return false;
5034
5035
      /* The first instruction of this stub code need
5036
   a R_TOC relocation.  */
5037
0
    case xcoff_stub_indirect_call:
5038
0
    case xcoff_stub_shared_call:
5039
0
      irel->r_size = 0xf;
5040
0
      irel->r_type = R_TOC;
5041
5042
      /* Retrieve the toc offset of the target which is
5043
   a function descriptor.  */
5044
0
      BFD_ASSERT (htarget->toc_section != NULL);
5045
0
      if ((htarget->flags & XCOFF_SET_TOC) != 0)
5046
0
  off = hstub->htarget->u.toc_offset;
5047
0
      else
5048
0
  off = (htarget->toc_section->output_section->vma
5049
0
         + htarget->toc_section->output_offset
5050
0
         - xcoff_data (flinfo->output_bfd)->toc);
5051
0
      if ((off & 0xffff) != off)
5052
0
  {
5053
0
    _bfd_error_handler
5054
0
      (_("TOC overflow during stub generation; try -mminimal-toc "
5055
0
         "when compiling"));
5056
0
    bfd_set_error (bfd_error_file_too_big);
5057
0
    return false;
5058
0
  }
5059
5060
0
      bfd_put_16 (output_bfd, off & 0xffff, p+2);
5061
0
      break;
5062
0
    }
5063
5064
0
  ++osec->reloc_count;
5065
0
  return true;
5066
0
}
5067
5068
5069
/* Return the section that defines H.  Return null if no section does.  */
5070
5071
static asection *
5072
xcoff_symbol_section (struct xcoff_link_hash_entry *h)
5073
0
{
5074
0
  switch (h->root.type)
5075
0
    {
5076
0
    case bfd_link_hash_defined:
5077
0
    case bfd_link_hash_defweak:
5078
0
      return h->root.u.def.section;
5079
5080
0
    case bfd_link_hash_common:
5081
0
      return h->root.u.c.p->section;
5082
5083
0
    default:
5084
0
      return NULL;
5085
0
    }
5086
0
}
5087
5088
/* Add a .loader relocation for input relocation IREL.  If the loader
5089
   relocation should be against an output section, HSEC points to the
5090
   input section that IREL is against, otherwise HSEC is null.  H is the
5091
   symbol that IREL is against, or null if it isn't against a global symbol.
5092
   REFERENCE_BFD is the bfd to use in error messages about the relocation.  */
5093
5094
static bool
5095
xcoff_create_ldrel (bfd *output_bfd, struct xcoff_final_link_info *flinfo,
5096
        asection *output_section, bfd *reference_bfd,
5097
        struct internal_reloc *irel, asection *hsec,
5098
        struct xcoff_link_hash_entry *h)
5099
0
{
5100
0
  struct internal_ldrel ldrel;
5101
5102
0
  ldrel.l_vaddr = irel->r_vaddr;
5103
0
  if (hsec != NULL)
5104
0
    {
5105
0
      const char *secname;
5106
5107
0
      secname = hsec->output_section->name;
5108
0
      if (strcmp (secname, ".text") == 0)
5109
0
  ldrel.l_symndx = 0;
5110
0
      else if (strcmp (secname, ".data") == 0)
5111
0
  ldrel.l_symndx = 1;
5112
0
      else if (strcmp (secname, ".bss") == 0)
5113
0
  ldrel.l_symndx = 2;
5114
0
      else if (strcmp (secname, ".tdata") == 0)
5115
0
  ldrel.l_symndx = -1;
5116
0
      else if (strcmp (secname, ".tbss") == 0)
5117
0
  ldrel.l_symndx = -2;
5118
0
      else
5119
0
  {
5120
0
    _bfd_error_handler
5121
      /* xgettext:c-format */
5122
0
      (_("%pB: loader reloc in unrecognized section `%s'"),
5123
0
       reference_bfd, secname);
5124
0
    bfd_set_error (bfd_error_nonrepresentable_section);
5125
0
    return false;
5126
0
  }
5127
0
    }
5128
0
  else if (h != NULL)
5129
0
    {
5130
0
      if (h->ldindx < 0)
5131
0
  {
5132
0
    _bfd_error_handler
5133
      /* xgettext:c-format */
5134
0
      (_("%pB: `%s' in loader reloc but not loader sym"),
5135
0
       reference_bfd, h->root.root.string);
5136
0
    bfd_set_error (bfd_error_bad_value);
5137
0
    return false;
5138
0
  }
5139
0
      ldrel.l_symndx = h->ldindx;
5140
0
    }
5141
0
  else
5142
0
    abort ();
5143
5144
0
  ldrel.l_rtype = (irel->r_size << 8) | irel->r_type;
5145
0
  ldrel.l_rsecnm = output_section->target_index;
5146
0
  if (xcoff_hash_table (flinfo->info)->textro
5147
0
      && strcmp (output_section->name, ".text") == 0)
5148
0
    {
5149
0
      _bfd_error_handler
5150
  /* xgettext:c-format */
5151
0
  (_("%pB: loader reloc in read-only section %pA"),
5152
0
   reference_bfd, output_section);
5153
0
      bfd_set_error (bfd_error_invalid_operation);
5154
0
      return false;
5155
0
    }
5156
0
  bfd_xcoff_swap_ldrel_out (output_bfd, &ldrel, flinfo->ldrel);
5157
0
  flinfo->ldrel += bfd_xcoff_ldrelsz (output_bfd);
5158
0
  return true;
5159
0
}
5160
5161
/* Link an input file into the linker output file.  This function
5162
   handles all the sections and relocations of the input file at once.  */
5163
5164
static bool
5165
xcoff_link_input_bfd (struct xcoff_final_link_info *flinfo,
5166
          bfd *input_bfd)
5167
0
{
5168
0
  bfd *output_bfd;
5169
0
  const char *strings;
5170
0
  bfd_size_type syment_base;
5171
0
  unsigned int n_tmask;
5172
0
  unsigned int n_btshft;
5173
0
  bool copy, hash;
5174
0
  bfd_size_type isymesz;
5175
0
  bfd_size_type osymesz;
5176
0
  bfd_size_type linesz;
5177
0
  bfd_byte *esym;
5178
0
  bfd_byte *esym_end;
5179
0
  struct xcoff_link_hash_entry **sym_hash;
5180
0
  struct internal_syment *isymp;
5181
0
  asection **csectpp;
5182
0
  unsigned int *lineno_counts;
5183
0
  long *debug_index;
5184
0
  long *indexp;
5185
0
  unsigned long output_index;
5186
0
  bfd_byte *outsym;
5187
0
  unsigned int incls;
5188
0
  asection *oline;
5189
0
  bool keep_syms;
5190
0
  asection *o;
5191
5192
  /* We can just skip DYNAMIC files, unless this is a static link.  */
5193
0
  if ((input_bfd->flags & DYNAMIC) != 0
5194
0
      && ! flinfo->info->static_link)
5195
0
    return true;
5196
5197
  /* Move all the symbols to the output file.  */
5198
0
  output_bfd = flinfo->output_bfd;
5199
0
  strings = NULL;
5200
0
  syment_base = obj_raw_syment_count (output_bfd);
5201
0
  isymesz = bfd_coff_symesz (input_bfd);
5202
0
  osymesz = bfd_coff_symesz (output_bfd);
5203
0
  linesz = bfd_coff_linesz (input_bfd);
5204
0
  BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd));
5205
5206
0
  n_tmask = coff_data (input_bfd)->local_n_tmask;
5207
0
  n_btshft = coff_data (input_bfd)->local_n_btshft;
5208
5209
  /* Define macros so that ISFCN, et. al., macros work correctly.  */
5210
0
#define N_TMASK n_tmask
5211
0
#define N_BTSHFT n_btshft
5212
5213
0
  copy = false;
5214
0
  if (! flinfo->info->keep_memory)
5215
0
    copy = true;
5216
0
  hash = true;
5217
0
  if (flinfo->info->traditional_format)
5218
0
    hash = false;
5219
5220
0
  if (! _bfd_coff_get_external_symbols (input_bfd))
5221
0
    return false;
5222
5223
  /* Make one pass over the symbols and assign indices to symbols that
5224
     we have decided to keep.  Also use create .loader symbol information
5225
     and update information in hash table entries.  */
5226
0
  esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
5227
0
  esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
5228
0
  sym_hash = obj_xcoff_sym_hashes (input_bfd);
5229
0
  csectpp = xcoff_data (input_bfd)->csects;
5230
0
  debug_index = xcoff_data (input_bfd)->debug_indices;
5231
0
  isymp = flinfo->internal_syms;
5232
0
  indexp = flinfo->sym_indices;
5233
0
  output_index = syment_base;
5234
0
  while (esym < esym_end)
5235
0
    {
5236
0
      union internal_auxent aux;
5237
0
      int smtyp = 0;
5238
0
      int add;
5239
5240
0
      bfd_coff_swap_sym_in (input_bfd, (void *) esym, (void *) isymp);
5241
5242
      /* Read in the csect information, if any.  */
5243
0
      if (CSECT_SYM_P (isymp->n_sclass))
5244
0
  {
5245
0
    BFD_ASSERT (isymp->n_numaux > 0);
5246
0
    bfd_coff_swap_aux_in (input_bfd,
5247
0
        (void *) (esym + isymesz * isymp->n_numaux),
5248
0
        isymp->n_type, isymp->n_sclass,
5249
0
        isymp->n_numaux - 1, isymp->n_numaux,
5250
0
        (void *) &aux);
5251
5252
0
    smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp);
5253
0
  }
5254
5255
      /* If this symbol is in the .loader section, swap out the
5256
   .loader symbol information.  If this is an external symbol
5257
   reference to a defined symbol, though, then wait until we get
5258
   to the definition.  */
5259
0
      if (EXTERN_SYM_P (isymp->n_sclass)
5260
0
    && *sym_hash != NULL
5261
0
    && (*sym_hash)->ldsym != NULL
5262
0
    && xcoff_final_definition_p (input_bfd, *sym_hash, *csectpp))
5263
0
  {
5264
0
    struct xcoff_link_hash_entry *h;
5265
0
    struct internal_ldsym *ldsym;
5266
5267
0
    h = *sym_hash;
5268
0
    ldsym = h->ldsym;
5269
0
    if (isymp->n_scnum > 0)
5270
0
      {
5271
0
        ldsym->l_scnum = (*csectpp)->output_section->target_index;
5272
0
        ldsym->l_value = (isymp->n_value
5273
0
        + (*csectpp)->output_section->vma
5274
0
        + (*csectpp)->output_offset
5275
0
        - (*csectpp)->vma);
5276
0
      }
5277
0
    else
5278
0
      {
5279
0
        ldsym->l_scnum = isymp->n_scnum;
5280
0
        ldsym->l_value = isymp->n_value;
5281
0
      }
5282
5283
0
    ldsym->l_smtype = smtyp;
5284
0
    if (((h->flags & XCOFF_DEF_REGULAR) == 0
5285
0
         && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
5286
0
        || (h->flags & XCOFF_IMPORT) != 0)
5287
0
      ldsym->l_smtype |= L_IMPORT;
5288
0
    if (((h->flags & XCOFF_DEF_REGULAR) != 0
5289
0
         && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
5290
0
        || (h->flags & XCOFF_EXPORT) != 0)
5291
0
      ldsym->l_smtype |= L_EXPORT;
5292
0
    if ((h->flags & XCOFF_ENTRY) != 0)
5293
0
      ldsym->l_smtype |= L_ENTRY;
5294
0
    if (isymp->n_sclass == C_AIX_WEAKEXT)
5295
0
      ldsym->l_smtype |= L_WEAK;
5296
5297
0
    ldsym->l_smclas = aux.x_csect.x_smclas;
5298
5299
0
    if (ldsym->l_ifile == (bfd_size_type) -1)
5300
0
      ldsym->l_ifile = 0;
5301
0
    else if (ldsym->l_ifile == 0)
5302
0
      {
5303
0
        if ((ldsym->l_smtype & L_IMPORT) == 0)
5304
0
    ldsym->l_ifile = 0;
5305
0
        else
5306
0
    {
5307
0
      bfd *impbfd;
5308
5309
0
      if (h->root.type == bfd_link_hash_defined
5310
0
          || h->root.type == bfd_link_hash_defweak)
5311
0
        impbfd = h->root.u.def.section->owner;
5312
0
      else if (h->root.type == bfd_link_hash_undefined
5313
0
         || h->root.type == bfd_link_hash_undefweak)
5314
0
        impbfd = h->root.u.undef.abfd;
5315
0
      else
5316
0
        impbfd = NULL;
5317
5318
0
      if (impbfd == NULL)
5319
0
        ldsym->l_ifile = 0;
5320
0
      else
5321
0
        {
5322
0
          BFD_ASSERT (impbfd->xvec == flinfo->output_bfd->xvec);
5323
0
          ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
5324
0
        }
5325
0
    }
5326
0
      }
5327
5328
0
    ldsym->l_parm = 0;
5329
5330
0
    BFD_ASSERT (h->ldindx >= 0);
5331
0
    bfd_xcoff_swap_ldsym_out (flinfo->output_bfd, ldsym,
5332
0
            (flinfo->ldsym
5333
0
             + ((h->ldindx - 3)
5334
0
          * bfd_xcoff_ldsymsz (flinfo->output_bfd))));
5335
0
    h->ldsym = NULL;
5336
5337
    /* Fill in snentry now that we know the target_index.  */
5338
0
    if ((h->flags & XCOFF_ENTRY) != 0
5339
0
        && (h->root.type == bfd_link_hash_defined
5340
0
      || h->root.type == bfd_link_hash_defweak))
5341
0
      {
5342
0
        xcoff_data (output_bfd)->snentry =
5343
0
    h->root.u.def.section->output_section->target_index;
5344
0
      }
5345
0
  }
5346
5347
0
      add = 1 + isymp->n_numaux;
5348
5349
0
      if (*debug_index == -2)
5350
  /* We've decided to strip this symbol.  */
5351
0
  *indexp = -1;
5352
0
      else
5353
0
  {
5354
    /* Assign the next unused index to this symbol.  */
5355
0
    *indexp = output_index;
5356
5357
0
    if (EXTERN_SYM_P (isymp->n_sclass))
5358
0
      {
5359
0
        BFD_ASSERT (*sym_hash != NULL);
5360
0
        (*sym_hash)->indx = output_index;
5361
0
      }
5362
5363
    /* If this is a symbol in the TOC which we may have merged
5364
       (class XMC_TC), remember the symbol index of the TOC
5365
       symbol.  */
5366
0
    if (isymp->n_sclass == C_HIDEXT
5367
0
        && aux.x_csect.x_smclas == XMC_TC
5368
0
        && *sym_hash != NULL)
5369
0
      {
5370
0
        BFD_ASSERT (((*sym_hash)->flags & XCOFF_SET_TOC) == 0);
5371
0
        BFD_ASSERT ((*sym_hash)->toc_section != NULL);
5372
0
        (*sym_hash)->u.toc_indx = output_index;
5373
0
      }
5374
5375
0
    output_index += add;
5376
0
  }
5377
5378
0
      esym += add * isymesz;
5379
0
      isymp += add;
5380
0
      csectpp += add;
5381
0
      sym_hash += add;
5382
0
      debug_index += add;
5383
0
      ++indexp;
5384
0
      for (--add; add > 0; --add)
5385
0
  *indexp++ = -1;
5386
0
    }
5387
5388
  /* Now write out the symbols that we decided to keep.  */
5389
5390
0
  esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
5391
0
  esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
5392
0
  sym_hash = obj_xcoff_sym_hashes (input_bfd);
5393
0
  isymp = flinfo->internal_syms;
5394
0
  indexp = flinfo->sym_indices;
5395
0
  csectpp = xcoff_data (input_bfd)->csects;
5396
0
  lineno_counts = xcoff_data (input_bfd)->lineno_counts;
5397
0
  debug_index = xcoff_data (input_bfd)->debug_indices;
5398
0
  outsym = flinfo->outsyms;
5399
0
  incls = 0;
5400
0
  oline = NULL;
5401
0
  while (esym < esym_end)
5402
0
    {
5403
0
      int add;
5404
5405
0
      add = 1 + isymp->n_numaux;
5406
5407
0
      if (*indexp < 0)
5408
0
  esym += add * isymesz;
5409
0
      else
5410
0
  {
5411
0
    struct internal_syment isym;
5412
0
    int i;
5413
5414
    /* Adjust the symbol in order to output it.  */
5415
0
    isym = *isymp;
5416
0
    if (isym._n._n_n._n_zeroes == 0
5417
0
        && isym._n._n_n._n_offset != 0)
5418
0
      {
5419
        /* This symbol has a long name.  Enter it in the string
5420
     table we are building.  If *debug_index != -1, the
5421
     name has already been entered in the .debug section.  */
5422
0
        if (*debug_index >= 0)
5423
0
    isym._n._n_n._n_offset = *debug_index;
5424
0
        else
5425
0
    {
5426
0
      const char *name;
5427
0
      bfd_size_type indx;
5428
5429
0
      name = _bfd_coff_internal_syment_name (input_bfd, &isym, NULL);
5430
5431
0
      if (name == NULL)
5432
0
        return false;
5433
0
      indx = _bfd_stringtab_add (flinfo->strtab, name, hash, copy);
5434
0
      if (indx == (bfd_size_type) -1)
5435
0
        return false;
5436
0
      isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
5437
0
    }
5438
0
      }
5439
5440
    /* Make __rtinit C_HIDEXT rather than C_EXT.  This avoids
5441
       multiple definition problems when linking a shared object
5442
       statically.  (The native linker doesn't enter __rtinit into
5443
       the normal table at all, but having a local symbol can make
5444
       the objdump output easier to read.)  */
5445
0
    if (isym.n_sclass == C_EXT
5446
0
        && *sym_hash
5447
0
        && ((*sym_hash)->flags & XCOFF_RTINIT) != 0)
5448
0
      isym.n_sclass = C_HIDEXT;
5449
5450
    /* The value of a C_FILE symbol is the symbol index of the
5451
       next C_FILE symbol.  The value of the last C_FILE symbol
5452
       is -1.  We try to get this right, below, just before we
5453
       write the symbols out, but in the general case we may
5454
       have to write the symbol out twice.  */
5455
0
    if (isym.n_sclass == C_FILE)
5456
0
      {
5457
0
        if (flinfo->last_file_index != -1
5458
0
      && flinfo->last_file.n_value != (bfd_vma) *indexp)
5459
0
    {
5460
      /* We must correct the value of the last C_FILE entry.  */
5461
0
      flinfo->last_file.n_value = *indexp;
5462
0
      if ((bfd_size_type) flinfo->last_file_index >= syment_base)
5463
0
        {
5464
          /* The last C_FILE symbol is in this input file.  */
5465
0
          bfd_coff_swap_sym_out (output_bfd,
5466
0
               (void *) &flinfo->last_file,
5467
0
               (void *) (flinfo->outsyms
5468
0
                + ((flinfo->last_file_index
5469
0
              - syment_base)
5470
0
                   * osymesz)));
5471
0
        }
5472
0
      else
5473
0
        {
5474
          /* We have already written out the last C_FILE
5475
       symbol.  We need to write it out again.  We
5476
       borrow *outsym temporarily.  */
5477
0
          file_ptr pos;
5478
5479
0
          bfd_coff_swap_sym_out (output_bfd,
5480
0
               (void *) &flinfo->last_file,
5481
0
               (void *) outsym);
5482
5483
0
          pos = obj_sym_filepos (output_bfd);
5484
0
          pos += flinfo->last_file_index * osymesz;
5485
0
          if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
5486
0
        || (bfd_write (outsym, osymesz, output_bfd)
5487
0
            != osymesz))
5488
0
      return false;
5489
0
        }
5490
0
    }
5491
5492
0
        flinfo->last_file_index = *indexp;
5493
0
        flinfo->last_file = isym;
5494
0
      }
5495
5496
    /* The value of a C_BINCL or C_EINCL symbol is a file offset
5497
       into the line numbers.  We update the symbol values when
5498
       we handle the line numbers.  */
5499
0
    if (isym.n_sclass == C_BINCL
5500
0
        || isym.n_sclass == C_EINCL)
5501
0
      {
5502
0
        isym.n_value = flinfo->line_filepos;
5503
0
        ++incls;
5504
0
      }
5505
    /* The value of a C_BSTAT symbol is the symbol table
5506
       index of the containing csect.  */
5507
0
    else if (isym.n_sclass == C_BSTAT)
5508
0
      {
5509
0
        bfd_vma indx;
5510
5511
0
        indx = isym.n_value;
5512
0
        if (indx < obj_raw_syment_count (input_bfd))
5513
0
    {
5514
0
      long symindx;
5515
5516
0
      symindx = flinfo->sym_indices[indx];
5517
0
      if (symindx < 0)
5518
0
        isym.n_value = 0;
5519
0
      else
5520
0
        isym.n_value = symindx;
5521
0
    }
5522
0
      }
5523
0
    else if (isym.n_sclass != C_ESTAT
5524
0
       && isym.n_sclass != C_DECL
5525
0
       && isym.n_scnum > 0)
5526
0
      {
5527
0
        if (*sym_hash != NULL
5528
0
      && ((*sym_hash)->root.type == bfd_link_hash_defined
5529
0
          || (*sym_hash)->root.type == bfd_link_hash_defweak)
5530
0
      && (*sym_hash)->root.u.def.section == bfd_abs_section_ptr)
5531
0
    isym.n_scnum = N_ABS;
5532
0
        else
5533
0
    isym.n_scnum = (*csectpp)->output_section->target_index;
5534
0
        isym.n_value += ((*csectpp)->output_section->vma
5535
0
             + (*csectpp)->output_offset
5536
0
             - (*csectpp)->vma);
5537
0
      }
5538
5539
    /* Update visibility.  */
5540
0
    if (*sym_hash)
5541
0
      {
5542
0
        isym.n_type &= ~SYM_V_MASK;
5543
0
        isym.n_type |= (*sym_hash)->visibility;
5544
0
      }
5545
5546
    /* Output the symbol.  */
5547
0
    bfd_coff_swap_sym_out (output_bfd, (void *) &isym, (void *) outsym);
5548
5549
0
    esym += isymesz;
5550
0
    outsym += osymesz;
5551
5552
0
    for (i = 0; i < isymp->n_numaux && esym < esym_end; i++)
5553
0
      {
5554
0
        union internal_auxent aux;
5555
5556
0
        bfd_coff_swap_aux_in (input_bfd, (void *) esym, isymp->n_type,
5557
0
            isymp->n_sclass, i, isymp->n_numaux,
5558
0
            (void *) &aux);
5559
5560
0
        if (isymp->n_sclass == C_FILE)
5561
0
    {
5562
      /* This is the file name (or some comment put in by
5563
         the compiler).  If it is long, we must put it in
5564
         the string table.  */
5565
0
      if (aux.x_file.x_n.x_n.x_zeroes == 0
5566
0
          && aux.x_file.x_n.x_n.x_offset != 0)
5567
0
        {
5568
0
          const char *filename;
5569
0
          bfd_size_type indx;
5570
5571
0
          BFD_ASSERT (aux.x_file.x_n.x_n.x_offset
5572
0
          >= STRING_SIZE_SIZE);
5573
0
          if (strings == NULL)
5574
0
      {
5575
0
        strings = _bfd_coff_read_string_table (input_bfd);
5576
0
        if (strings == NULL)
5577
0
          return false;
5578
0
      }
5579
0
          if ((bfd_size_type) aux.x_file.x_n.x_n.x_offset >= obj_coff_strings_len (input_bfd))
5580
0
      filename = _("<corrupt>");
5581
0
          else
5582
0
      filename = strings + aux.x_file.x_n.x_n.x_offset;
5583
0
          indx = _bfd_stringtab_add (flinfo->strtab, filename,
5584
0
             hash, copy);
5585
0
          if (indx == (bfd_size_type) -1)
5586
0
      return false;
5587
0
          aux.x_file.x_n.x_n.x_offset = STRING_SIZE_SIZE + indx;
5588
0
        }
5589
0
    }
5590
0
        else if (CSECT_SYM_P (isymp->n_sclass)
5591
0
           && i + 1 == isymp->n_numaux)
5592
0
    {
5593
5594
      /* We don't support type checking.  I don't know if
5595
         anybody does.  */
5596
0
      aux.x_csect.x_parmhash = 0;
5597
      /* I don't think anybody uses these fields, but we'd
5598
         better clobber them just in case.  */
5599
0
      aux.x_csect.x_stab = 0;
5600
0
      aux.x_csect.x_snstab = 0;
5601
5602
0
      if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_LD)
5603
0
        {
5604
0
          unsigned long indx;
5605
5606
0
          indx = aux.x_csect.x_scnlen.u64;
5607
0
          if (indx < obj_raw_syment_count (input_bfd))
5608
0
      {
5609
0
        long symindx;
5610
5611
0
        symindx = flinfo->sym_indices[indx];
5612
0
        if (symindx < 0)
5613
0
          {
5614
0
            aux.x_csect.x_scnlen.u64 = 0;
5615
0
          }
5616
0
        else
5617
0
          {
5618
0
            aux.x_csect.x_scnlen.u64 = symindx;
5619
0
          }
5620
0
      }
5621
0
        }
5622
0
    }
5623
0
        else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
5624
0
    {
5625
0
      unsigned long indx;
5626
5627
0
      if (ISFCN (isymp->n_type)
5628
0
          || ISTAG (isymp->n_sclass)
5629
0
          || isymp->n_sclass == C_BLOCK
5630
0
          || isymp->n_sclass == C_FCN)
5631
0
        {
5632
0
          indx = aux.x_sym.x_fcnary.x_fcn.x_endndx.u32;
5633
0
          if (indx > 0
5634
0
        && indx < obj_raw_syment_count (input_bfd))
5635
0
      {
5636
        /* We look forward through the symbol for
5637
           the index of the next symbol we are going
5638
           to include.  I don't know if this is
5639
           entirely right.  */
5640
0
        while (flinfo->sym_indices[indx] < 0
5641
0
         && indx < obj_raw_syment_count (input_bfd))
5642
0
          ++indx;
5643
0
        if (indx >= obj_raw_syment_count (input_bfd))
5644
0
          indx = output_index;
5645
0
        else
5646
0
          indx = flinfo->sym_indices[indx];
5647
0
        aux.x_sym.x_fcnary.x_fcn.x_endndx.u32 = indx;
5648
5649
0
      }
5650
0
        }
5651
5652
0
      indx = aux.x_sym.x_tagndx.u32;
5653
0
      if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
5654
0
        {
5655
0
          long symindx;
5656
5657
0
          symindx = flinfo->sym_indices[indx];
5658
0
          if (symindx < 0)
5659
0
      aux.x_sym.x_tagndx.u32 = 0;
5660
0
          else
5661
0
      aux.x_sym.x_tagndx.u32 = symindx;
5662
0
        }
5663
5664
0
    }
5665
5666
        /* Copy over the line numbers, unless we are stripping
5667
     them.  We do this on a symbol by symbol basis in
5668
     order to more easily handle garbage collection.  */
5669
0
        if (CSECT_SYM_P (isymp->n_sclass)
5670
0
      && i == 0
5671
0
      && isymp->n_numaux > 1
5672
0
      && ISFCN (isymp->n_type)
5673
0
      && aux.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0)
5674
0
    {
5675
0
      if (*lineno_counts == 0)
5676
0
        aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0;
5677
0
      else
5678
0
        {
5679
0
          asection *enclosing;
5680
0
          unsigned int enc_count;
5681
0
          bfd_signed_vma linoff;
5682
0
          struct internal_lineno lin;
5683
0
          bfd_byte *linp;
5684
0
          bfd_byte *linpend;
5685
0
          bfd_vma offset;
5686
0
          file_ptr pos;
5687
0
          bfd_size_type amt;
5688
5689
          /* Read in the enclosing section's line-number
5690
       information, if we haven't already.  */
5691
0
          o = *csectpp;
5692
0
          enclosing = xcoff_section_data (abfd, o)->enclosing;
5693
0
          enc_count = xcoff_section_data (abfd, o)->lineno_count;
5694
0
          if (oline != enclosing)
5695
0
      {
5696
0
        pos = enclosing->line_filepos;
5697
0
        amt = linesz * enc_count;
5698
0
        if (bfd_seek (input_bfd, pos, SEEK_SET) != 0
5699
0
            || (bfd_read (flinfo->linenos, amt, input_bfd)
5700
0
          != amt))
5701
0
          return false;
5702
0
        oline = enclosing;
5703
0
      }
5704
5705
          /* Copy across the first entry, adjusting its
5706
       symbol index.  */
5707
0
          linoff = (aux.x_sym.x_fcnary.x_fcn.x_lnnoptr
5708
0
        - enclosing->line_filepos);
5709
0
          linp = flinfo->linenos + linoff;
5710
0
          bfd_coff_swap_lineno_in (input_bfd, linp, &lin);
5711
0
          lin.l_addr.l_symndx = *indexp;
5712
0
          bfd_coff_swap_lineno_out (output_bfd, &lin, linp);
5713
5714
          /* Copy the other entries, adjusting their addresses.  */
5715
0
          linpend = linp + *lineno_counts * linesz;
5716
0
          offset = (o->output_section->vma
5717
0
        + o->output_offset
5718
0
        - o->vma);
5719
0
          for (linp += linesz; linp < linpend; linp += linesz)
5720
0
      {
5721
0
        bfd_coff_swap_lineno_in (input_bfd, linp, &lin);
5722
0
        lin.l_addr.l_paddr += offset;
5723
0
        bfd_coff_swap_lineno_out (output_bfd, &lin, linp);
5724
0
      }
5725
5726
          /* Write out the entries we've just processed.  */
5727
0
          pos = (o->output_section->line_filepos
5728
0
           + o->output_section->lineno_count * linesz);
5729
0
          amt = linesz * *lineno_counts;
5730
0
          if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
5731
0
        || bfd_write (flinfo->linenos + linoff, amt,
5732
0
          output_bfd) != amt)
5733
0
      return false;
5734
0
          o->output_section->lineno_count += *lineno_counts;
5735
5736
          /* Record the offset of the symbol's line numbers
5737
       in the output file.  */
5738
0
          aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = pos;
5739
5740
0
          if (incls > 0)
5741
0
      {
5742
0
        struct internal_syment *iisp, *iispend;
5743
0
        long *iindp;
5744
0
        bfd_byte *oos;
5745
0
        bfd_vma range_start, range_end;
5746
0
        int iiadd;
5747
5748
        /* Update any C_BINCL or C_EINCL symbols
5749
           that refer to a line number in the
5750
           range we just output.  */
5751
0
        iisp = flinfo->internal_syms;
5752
0
        iispend = iisp + obj_raw_syment_count (input_bfd);
5753
0
        iindp = flinfo->sym_indices;
5754
0
        oos = flinfo->outsyms;
5755
0
        range_start = enclosing->line_filepos + linoff;
5756
0
        range_end = range_start + *lineno_counts * linesz;
5757
0
        while (iisp < iispend)
5758
0
          {
5759
0
            if (*iindp >= 0
5760
0
          && (iisp->n_sclass == C_BINCL
5761
0
              || iisp->n_sclass == C_EINCL)
5762
0
          && iisp->n_value >= range_start
5763
0
          && iisp->n_value < range_end)
5764
0
        {
5765
0
          struct internal_syment iis;
5766
5767
0
          bfd_coff_swap_sym_in (output_bfd, oos, &iis);
5768
0
          iis.n_value = (iisp->n_value
5769
0
             - range_start
5770
0
             + pos);
5771
0
          bfd_coff_swap_sym_out (output_bfd,
5772
0
               &iis, oos);
5773
0
          --incls;
5774
0
        }
5775
5776
0
            iiadd = 1 + iisp->n_numaux;
5777
0
            if (*iindp >= 0)
5778
0
        oos += iiadd * osymesz;
5779
0
            iisp += iiadd;
5780
0
            iindp += iiadd;
5781
0
          }
5782
0
      }
5783
0
        }
5784
0
    }
5785
5786
0
        bfd_coff_swap_aux_out (output_bfd, (void *) &aux, isymp->n_type,
5787
0
             isymp->n_sclass, i, isymp->n_numaux,
5788
0
             (void *) outsym);
5789
0
        outsym += osymesz;
5790
0
        esym += isymesz;
5791
0
      }
5792
0
  }
5793
5794
0
      sym_hash += add;
5795
0
      indexp += add;
5796
0
      isymp += add;
5797
0
      csectpp += add;
5798
0
      lineno_counts += add;
5799
0
      debug_index += add;
5800
0
    }
5801
5802
  /* If we swapped out a C_FILE symbol, guess that the next C_FILE
5803
     symbol will be the first symbol in the next input file.  In the
5804
     normal case, this will save us from writing out the C_FILE symbol
5805
     again.  */
5806
0
  if (flinfo->last_file_index != -1
5807
0
      && (bfd_size_type) flinfo->last_file_index >= syment_base)
5808
0
    {
5809
0
      flinfo->last_file.n_value = output_index;
5810
0
      bfd_coff_swap_sym_out (output_bfd, (void *) &flinfo->last_file,
5811
0
           (void *) (flinfo->outsyms
5812
0
            + ((flinfo->last_file_index - syment_base)
5813
0
               * osymesz)));
5814
0
    }
5815
5816
  /* Write the modified symbols to the output file.  */
5817
0
  if (outsym > flinfo->outsyms)
5818
0
    {
5819
0
      file_ptr pos = obj_sym_filepos (output_bfd) + syment_base * osymesz;
5820
0
      bfd_size_type amt = outsym - flinfo->outsyms;
5821
0
      if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
5822
0
    || bfd_write (flinfo->outsyms, amt, output_bfd) != amt)
5823
0
  return false;
5824
5825
0
      BFD_ASSERT ((obj_raw_syment_count (output_bfd)
5826
0
       + (outsym - flinfo->outsyms) / osymesz)
5827
0
      == output_index);
5828
5829
0
      obj_raw_syment_count (output_bfd) = output_index;
5830
0
    }
5831
5832
  /* Don't let the linker relocation routines discard the symbols.  */
5833
0
  keep_syms = obj_coff_keep_syms (input_bfd);
5834
0
  obj_coff_keep_syms (input_bfd) = true;
5835
5836
  /* Relocate the contents of each section.  */
5837
0
  for (o = input_bfd->sections; o != NULL; o = o->next)
5838
0
    {
5839
0
      bfd_byte *contents;
5840
5841
0
      if (! o->linker_mark)
5842
  /* This section was omitted from the link.  */
5843
0
  continue;
5844
5845
0
      if ((o->flags & SEC_HAS_CONTENTS) == 0
5846
0
    || o->size == 0
5847
0
    || (o->flags & SEC_IN_MEMORY) != 0)
5848
0
  continue;
5849
5850
      /* We have set filepos correctly for the sections we created to
5851
   represent csects, so bfd_get_section_contents should work.  */
5852
0
      if (coff_section_data (input_bfd, o) != NULL
5853
0
    && coff_section_data (input_bfd, o)->contents != NULL)
5854
0
  contents = coff_section_data (input_bfd, o)->contents;
5855
0
      else
5856
0
  {
5857
0
    bfd_size_type sz = o->rawsize ? o->rawsize : o->size;
5858
0
    if (!bfd_get_section_contents (input_bfd, o, flinfo->contents, 0, sz))
5859
0
      goto err_out;
5860
0
    contents = flinfo->contents;
5861
0
  }
5862
5863
0
      if ((o->flags & SEC_RELOC) != 0)
5864
0
  {
5865
0
    int target_index;
5866
0
    struct internal_reloc *internal_relocs;
5867
0
    struct internal_reloc *irel;
5868
0
    bfd_vma offset;
5869
0
    struct internal_reloc *irelend;
5870
0
    struct xcoff_link_hash_entry **rel_hash;
5871
0
    long r_symndx;
5872
5873
    /* Read in the relocs.  */
5874
0
    target_index = o->output_section->target_index;
5875
0
    internal_relocs = (xcoff_read_internal_relocs
5876
0
           (input_bfd, o, false, flinfo->external_relocs,
5877
0
            true,
5878
0
            (flinfo->section_info[target_index].relocs
5879
0
             + o->output_section->reloc_count)));
5880
0
    if (internal_relocs == NULL)
5881
0
      goto err_out;
5882
5883
    /* Call processor specific code to relocate the section
5884
       contents.  */
5885
0
    if (! bfd_coff_relocate_section (output_bfd, flinfo->info,
5886
0
             input_bfd, o,
5887
0
             contents,
5888
0
             internal_relocs,
5889
0
             flinfo->internal_syms,
5890
0
             xcoff_data (input_bfd)->csects))
5891
0
      goto err_out;
5892
5893
0
    offset = o->output_section->vma + o->output_offset - o->vma;
5894
0
    irel = internal_relocs;
5895
0
    irelend = irel + o->reloc_count;
5896
0
    rel_hash = (flinfo->section_info[target_index].rel_hashes
5897
0
          + o->output_section->reloc_count);
5898
0
    for (; irel < irelend; irel++, rel_hash++)
5899
0
      {
5900
0
        struct xcoff_link_hash_entry *h = NULL;
5901
5902
0
        *rel_hash = NULL;
5903
5904
        /* Adjust the reloc address and symbol index.  */
5905
5906
0
        r_symndx = irel->r_symndx;
5907
5908
0
        if (r_symndx == -1)
5909
0
    h = NULL;
5910
0
        else
5911
0
    h = obj_xcoff_sym_hashes (input_bfd)[r_symndx];
5912
5913
        /* In case of a R_BR or R_RBR, change the target if
5914
     a stub is being called.  */
5915
0
        if (h != NULL
5916
0
      && (irel->r_type == R_BR
5917
0
          || irel->r_type == R_RBR))
5918
0
    {
5919
0
      asection *sym_sec;
5920
0
      bfd_vma dest;
5921
0
      struct xcoff_stub_hash_entry *hstub = NULL;
5922
0
      enum xcoff_stub_type stub_type;
5923
5924
0
      if (h->root.type == bfd_link_hash_defined
5925
0
          || h->root.type == bfd_link_hash_defweak)
5926
0
        {
5927
0
          sym_sec = h->root.u.def.section;
5928
0
          dest = (h->root.u.def.value
5929
0
            + sym_sec->output_section->vma
5930
0
            + sym_sec->output_offset);
5931
0
        }
5932
0
      else
5933
0
        {
5934
0
          BFD_FAIL ();
5935
0
          goto err_out;
5936
0
        }
5937
5938
0
      stub_type = bfd_xcoff_type_of_stub (o, irel, dest, h);
5939
0
      if (stub_type != xcoff_stub_none)
5940
0
        {
5941
0
          hstub = bfd_xcoff_get_stub_entry (o, h, flinfo->info);
5942
0
          if (hstub == NULL)
5943
0
      goto err_out;
5944
5945
0
          h = hstub->hcsect;
5946
0
        }
5947
5948
0
    }
5949
5950
0
        irel->r_vaddr += offset;
5951
5952
0
        if (r_symndx != -1 && flinfo->info->strip != strip_all)
5953
0
    {
5954
5955
0
      if (h != NULL
5956
0
          && h->smclas != XMC_TD
5957
0
          && (irel->r_type == R_TOC
5958
0
        || irel->r_type == R_GL
5959
0
        || irel->r_type == R_TCL
5960
0
        || irel->r_type == R_TRL
5961
0
        || irel->r_type == R_TRLA))
5962
0
        {
5963
          /* This is a TOC relative reloc with a symbol
5964
       attached.  The symbol should be the one which
5965
       this reloc is for.  We want to make this
5966
       reloc against the TOC address of the symbol,
5967
       not the symbol itself.  */
5968
0
          BFD_ASSERT (h->toc_section != NULL);
5969
0
          BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
5970
0
          if (h->u.toc_indx != -1)
5971
0
      irel->r_symndx = h->u.toc_indx;
5972
0
          else
5973
0
      {
5974
0
        struct xcoff_toc_rel_hash *n;
5975
0
        struct xcoff_link_section_info *si;
5976
0
        size_t amt;
5977
5978
0
        amt = sizeof (* n);
5979
0
        n = bfd_alloc (flinfo->output_bfd, amt);
5980
0
        if (n == NULL)
5981
0
          goto err_out;
5982
0
        si = flinfo->section_info + target_index;
5983
0
        n->next = si->toc_rel_hashes;
5984
0
        n->h = h;
5985
0
        n->rel = irel;
5986
0
        si->toc_rel_hashes = n;
5987
0
      }
5988
0
        }
5989
0
      else if (h != NULL)
5990
0
        {
5991
          /* This is a global symbol.  */
5992
0
          if (h->indx >= 0)
5993
0
      irel->r_symndx = h->indx;
5994
0
          else
5995
0
      {
5996
        /* This symbol is being written at the end
5997
           of the file, and we do not yet know the
5998
           symbol index.  We save the pointer to the
5999
           hash table entry in the rel_hash list.
6000
           We set the indx field to -2 to indicate
6001
           that this symbol must not be stripped.  */
6002
0
        *rel_hash = h;
6003
0
        h->indx = -2;
6004
0
      }
6005
0
        }
6006
0
      else
6007
0
        {
6008
0
          long indx;
6009
6010
0
          indx = flinfo->sym_indices[r_symndx];
6011
6012
0
          if (indx == -1)
6013
0
      {
6014
0
        struct internal_syment *is;
6015
6016
        /* Relocations against a TC0 TOC anchor are
6017
           automatically transformed to be against
6018
           the TOC anchor in the output file.  */
6019
0
        is = flinfo->internal_syms + r_symndx;
6020
0
        if (is->n_sclass == C_HIDEXT
6021
0
            && is->n_numaux > 0)
6022
0
          {
6023
0
            void * auxptr;
6024
0
            union internal_auxent aux;
6025
6026
0
            auxptr = ((void *)
6027
0
          (((bfd_byte *)
6028
0
            obj_coff_external_syms (input_bfd))
6029
0
           + ((r_symndx + is->n_numaux)
6030
0
              * isymesz)));
6031
0
            bfd_coff_swap_aux_in (input_bfd, auxptr,
6032
0
                is->n_type, is->n_sclass,
6033
0
                is->n_numaux - 1,
6034
0
                is->n_numaux,
6035
0
                (void *) &aux);
6036
0
            if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_SD
6037
0
          && aux.x_csect.x_smclas == XMC_TC0)
6038
0
        indx = flinfo->toc_symindx;
6039
0
          }
6040
0
      }
6041
6042
0
          if (indx != -1)
6043
0
      irel->r_symndx = indx;
6044
0
          else
6045
0
      {
6046
6047
0
        struct internal_syment *is;
6048
6049
0
        const char *name;
6050
0
        char buf[SYMNMLEN + 1];
6051
6052
        /* This reloc is against a symbol we are
6053
           stripping.  It would be possible to handle
6054
           this case, but I don't think it's worth it.  */
6055
0
        is = flinfo->internal_syms + r_symndx;
6056
6057
0
        if (is->n_sclass != C_DWARF)
6058
0
          {
6059
0
            name = (_bfd_coff_internal_syment_name
6060
0
              (input_bfd, is, buf));
6061
6062
0
            if (name == NULL)
6063
0
        goto err_out;
6064
6065
0
            (*flinfo->info->callbacks->unattached_reloc)
6066
0
        (flinfo->info, name,
6067
0
         input_bfd, o, irel->r_vaddr);
6068
0
          }
6069
0
      }
6070
0
        }
6071
0
    }
6072
6073
0
        if ((o->flags & SEC_DEBUGGING) == 0
6074
0
      && xcoff_need_ldrel_p (flinfo->info, irel, h, o))
6075
0
    {
6076
0
      asection *sec;
6077
6078
0
      if (r_symndx == -1)
6079
0
        sec = NULL;
6080
0
      else if (h == NULL)
6081
0
        sec = xcoff_data (input_bfd)->csects[r_symndx];
6082
0
      else
6083
0
        sec = xcoff_symbol_section (h);
6084
0
      if (!xcoff_create_ldrel (output_bfd, flinfo,
6085
0
             o->output_section, input_bfd,
6086
0
             irel, sec, h))
6087
0
        goto err_out;
6088
0
    }
6089
0
      }
6090
6091
0
    o->output_section->reloc_count += o->reloc_count;
6092
0
  }
6093
6094
      /* Write out the modified section contents.  */
6095
0
      if (! bfd_set_section_contents (output_bfd, o->output_section,
6096
0
              contents, (file_ptr) o->output_offset,
6097
0
              o->size))
6098
0
  goto err_out;
6099
0
    }
6100
6101
0
  obj_coff_keep_syms (input_bfd) = keep_syms;
6102
6103
0
  if (! flinfo->info->keep_memory)
6104
0
    {
6105
0
      if (! _bfd_coff_free_symbols (input_bfd))
6106
0
  return false;
6107
0
    }
6108
6109
0
  return true;
6110
6111
0
 err_out:
6112
0
  obj_coff_keep_syms (input_bfd) = keep_syms;
6113
0
  return false;
6114
0
}
6115
6116
#undef N_TMASK
6117
#undef N_BTSHFT
6118
6119
/* Sort relocs by VMA.  This is called via qsort.  */
6120
6121
static int
6122
xcoff_sort_relocs (const void * p1, const void * p2)
6123
0
{
6124
0
  const struct internal_reloc *r1 = (const struct internal_reloc *) p1;
6125
0
  const struct internal_reloc *r2 = (const struct internal_reloc *) p2;
6126
6127
0
  if (r1->r_vaddr > r2->r_vaddr)
6128
0
    return 1;
6129
0
  else if (r1->r_vaddr < r2->r_vaddr)
6130
0
    return -1;
6131
0
  else
6132
0
    return 0;
6133
0
}
6134
6135
/* Return true if section SEC is a TOC section.  */
6136
6137
static inline bool
6138
xcoff_toc_section_p (asection *sec)
6139
0
{
6140
0
  const char *name;
6141
6142
0
  name = sec->name;
6143
0
  if (name[0] == '.' && name[1] == 't')
6144
0
    {
6145
0
      if (name[2] == 'c')
6146
0
  {
6147
0
    if (name[3] == '0' && name[4] == 0)
6148
0
      return true;
6149
0
    if (name[3] == 0)
6150
0
      return true;
6151
0
  }
6152
0
      if (name[2] == 'd' && name[3] == 0)
6153
0
  return true;
6154
0
    }
6155
0
  return false;
6156
0
}
6157
6158
/* See if the link requires a TOC (it usually does!).  If so, find a
6159
   good place to put the TOC anchor csect, and write out the associated
6160
   symbol.  */
6161
6162
static bool
6163
xcoff_find_tc0 (bfd *output_bfd, struct xcoff_final_link_info *flinfo)
6164
0
{
6165
0
  bfd_vma toc_start, toc_end, start, end, best_address;
6166
0
  asection *sec;
6167
0
  bfd *input_bfd;
6168
0
  int section_index;
6169
0
  struct internal_syment irsym;
6170
0
  union internal_auxent iraux;
6171
0
  file_ptr pos;
6172
0
  size_t size;
6173
6174
  /* Set [TOC_START, TOC_END) to the range of the TOC.  Record the
6175
     index of a csect at the beginning of the TOC.  */
6176
0
  toc_start = ~(bfd_vma) 0;
6177
0
  toc_end = 0;
6178
0
  section_index = -1;
6179
0
  for (input_bfd = flinfo->info->input_bfds;
6180
0
       input_bfd != NULL;
6181
0
       input_bfd = input_bfd->link.next)
6182
0
    for (sec = input_bfd->sections; sec != NULL; sec = sec->next)
6183
0
      if (sec->gc_mark != 0 && xcoff_toc_section_p (sec))
6184
0
  {
6185
0
    start = sec->output_section->vma + sec->output_offset;
6186
0
    if (toc_start > start)
6187
0
      {
6188
0
        toc_start = start;
6189
0
        section_index = sec->output_section->target_index;
6190
0
      }
6191
6192
0
    end = start + sec->size;
6193
0
    if (toc_end < end)
6194
0
      toc_end = end;
6195
0
  }
6196
6197
  /* There's no need for a TC0 symbol if we don't have a TOC.  */
6198
0
  if (toc_end < toc_start)
6199
0
    {
6200
0
      xcoff_data (output_bfd)->toc = toc_start;
6201
0
      return true;
6202
0
    }
6203
6204
0
  if (toc_end - toc_start < 0x8000)
6205
    /* Every TOC csect can be accessed from TOC_START.  */
6206
0
    best_address = toc_start;
6207
0
  else
6208
0
    {
6209
      /* Find the lowest TOC csect that is still within range of TOC_END.  */
6210
0
      best_address = toc_end;
6211
0
      for (input_bfd = flinfo->info->input_bfds;
6212
0
     input_bfd != NULL;
6213
0
     input_bfd = input_bfd->link.next)
6214
0
  for (sec = input_bfd->sections; sec != NULL; sec = sec->next)
6215
0
    if (sec->gc_mark != 0 && xcoff_toc_section_p (sec))
6216
0
      {
6217
0
        start = sec->output_section->vma + sec->output_offset;
6218
0
        if (start < best_address
6219
0
      && start + 0x8000 >= toc_end)
6220
0
    {
6221
0
      best_address = start;
6222
0
      section_index = sec->output_section->target_index;
6223
0
    }
6224
0
      }
6225
6226
      /* Make sure that the start of the TOC is also within range.  */
6227
0
      if (best_address > toc_start + 0x8000)
6228
0
  {
6229
0
    _bfd_error_handler
6230
0
      (_("TOC overflow: %#" PRIx64 " > 0x10000; try -mminimal-toc "
6231
0
         "when compiling"),
6232
0
       (uint64_t) (toc_end - toc_start));
6233
0
    bfd_set_error (bfd_error_file_too_big);
6234
0
    return false;
6235
0
  }
6236
0
    }
6237
6238
  /* Record the chosen TOC value.  */
6239
0
  flinfo->toc_symindx = obj_raw_syment_count (output_bfd);
6240
0
  xcoff_data (output_bfd)->toc = best_address;
6241
0
  xcoff_data (output_bfd)->sntoc = section_index;
6242
6243
  /* Fill out the TC0 symbol.  */
6244
0
  if (!bfd_xcoff_put_symbol_name (output_bfd, flinfo->info, flinfo->strtab,
6245
0
          &irsym, "TOC"))
6246
0
    return false;
6247
0
  irsym.n_value = best_address;
6248
0
  irsym.n_scnum = section_index;
6249
0
  irsym.n_sclass = C_HIDEXT;
6250
0
  irsym.n_type = T_NULL;
6251
0
  irsym.n_numaux = 1;
6252
0
  bfd_coff_swap_sym_out (output_bfd, &irsym, flinfo->outsyms);
6253
6254
  /* Fill out the auxiliary csect information.  */
6255
0
  memset (&iraux, 0, sizeof iraux);
6256
0
  iraux.x_csect.x_smtyp = XTY_SD;
6257
0
  iraux.x_csect.x_smclas = XMC_TC0;
6258
0
  iraux.x_csect.x_scnlen.u64 = 0;
6259
0
  bfd_coff_swap_aux_out (output_bfd, &iraux, T_NULL, C_HIDEXT, 0, 1,
6260
0
       flinfo->outsyms + bfd_coff_symesz (output_bfd));
6261
6262
  /* Write the contents to the file.  */
6263
0
  pos = obj_sym_filepos (output_bfd);
6264
0
  pos += obj_raw_syment_count (output_bfd) * bfd_coff_symesz (output_bfd);
6265
0
  size = 2 * bfd_coff_symesz (output_bfd);
6266
0
  if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
6267
0
      || bfd_write (flinfo->outsyms, size, output_bfd) != size)
6268
0
    return false;
6269
0
  obj_raw_syment_count (output_bfd) += 2;
6270
6271
0
  return true;
6272
0
}
6273
6274
/* Write out a non-XCOFF global symbol.  */
6275
6276
static bool
6277
xcoff_write_global_symbol (struct bfd_hash_entry *bh, void * inf)
6278
0
{
6279
0
  struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) bh;
6280
0
  struct xcoff_final_link_info *flinfo = (struct xcoff_final_link_info *) inf;
6281
0
  bfd *output_bfd;
6282
0
  bfd_byte *outsym;
6283
0
  struct internal_syment isym;
6284
0
  union internal_auxent aux;
6285
0
  bool result;
6286
0
  file_ptr pos;
6287
0
  bfd_size_type amt;
6288
6289
0
  output_bfd = flinfo->output_bfd;
6290
0
  outsym = flinfo->outsyms;
6291
6292
0
  if (h->root.type == bfd_link_hash_warning)
6293
0
    {
6294
0
      h = (struct xcoff_link_hash_entry *) h->root.u.i.link;
6295
0
      if (h->root.type == bfd_link_hash_new)
6296
0
  return true;
6297
0
    }
6298
6299
  /* If this symbol was garbage collected, just skip it.  */
6300
0
  if (xcoff_hash_table (flinfo->info)->gc
6301
0
      && (h->flags & XCOFF_MARK) == 0)
6302
0
    return true;
6303
6304
  /* If we need a .loader section entry, write it out.  */
6305
0
  if (h->ldsym != NULL)
6306
0
    {
6307
0
      struct internal_ldsym *ldsym;
6308
0
      bfd *impbfd;
6309
6310
0
      ldsym = h->ldsym;
6311
6312
0
      if (h->root.type == bfd_link_hash_undefined
6313
0
    || h->root.type == bfd_link_hash_undefweak)
6314
0
  {
6315
6316
0
    ldsym->l_value = 0;
6317
0
    ldsym->l_scnum = N_UNDEF;
6318
0
    ldsym->l_smtype = XTY_ER;
6319
0
    impbfd = h->root.u.undef.abfd;
6320
6321
0
  }
6322
0
      else if (h->root.type == bfd_link_hash_defined
6323
0
         || h->root.type == bfd_link_hash_defweak)
6324
0
  {
6325
0
    asection *sec;
6326
6327
0
    sec = h->root.u.def.section;
6328
0
    ldsym->l_value = (sec->output_section->vma
6329
0
          + sec->output_offset
6330
0
          + h->root.u.def.value);
6331
0
    ldsym->l_scnum = sec->output_section->target_index;
6332
0
    ldsym->l_smtype = XTY_SD;
6333
0
    impbfd = sec->owner;
6334
6335
0
  }
6336
0
      else
6337
0
  abort ();
6338
6339
0
      if (((h->flags & XCOFF_DEF_REGULAR) == 0
6340
0
     && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
6341
0
    || (h->flags & XCOFF_IMPORT) != 0)
6342
  /* Clear l_smtype
6343
     Import symbols are defined so the check above will make
6344
     the l_smtype XTY_SD.  But this is not correct, it should
6345
     be cleared.  */
6346
0
  ldsym->l_smtype |= L_IMPORT;
6347
6348
0
      if (((h->flags & XCOFF_DEF_REGULAR) != 0
6349
0
     && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
6350
0
    || (h->flags & XCOFF_EXPORT) != 0)
6351
0
  ldsym->l_smtype |= L_EXPORT;
6352
6353
0
      if ((h->flags & XCOFF_ENTRY) != 0)
6354
0
  ldsym->l_smtype |= L_ENTRY;
6355
6356
0
      if ((h->flags & XCOFF_RTINIT) != 0)
6357
0
  ldsym->l_smtype = XTY_SD;
6358
6359
0
      ldsym->l_smclas = h->smclas;
6360
6361
0
      if (ldsym->l_smtype & L_IMPORT)
6362
0
  {
6363
0
    if ((h->root.type == bfd_link_hash_defined
6364
0
         || h->root.type == bfd_link_hash_defweak)
6365
0
        && (h->root.u.def.value != 0))
6366
0
      ldsym->l_smclas = XMC_XO;
6367
6368
0
    else if ((h->flags & (XCOFF_SYSCALL32 | XCOFF_SYSCALL64)) ==
6369
0
       (XCOFF_SYSCALL32 | XCOFF_SYSCALL64))
6370
0
      ldsym->l_smclas = XMC_SV3264;
6371
6372
0
    else if (h->flags & XCOFF_SYSCALL32)
6373
0
      ldsym->l_smclas = XMC_SV;
6374
6375
0
    else if (h->flags & XCOFF_SYSCALL64)
6376
0
      ldsym->l_smclas = XMC_SV64;
6377
0
  }
6378
6379
0
      if (ldsym->l_ifile == -(bfd_size_type) 1)
6380
0
  {
6381
0
    ldsym->l_ifile = 0;
6382
0
  }
6383
0
      else if (ldsym->l_ifile == 0)
6384
0
  {
6385
0
    if ((ldsym->l_smtype & L_IMPORT) == 0)
6386
0
      ldsym->l_ifile = 0;
6387
0
    else if (impbfd == NULL)
6388
0
      ldsym->l_ifile = 0;
6389
0
    else
6390
0
      {
6391
0
        BFD_ASSERT (impbfd->xvec == output_bfd->xvec);
6392
0
        ldsym->l_ifile = xcoff_data (impbfd)->import_file_id;
6393
0
      }
6394
0
  }
6395
6396
0
      ldsym->l_parm = 0;
6397
6398
0
      BFD_ASSERT (h->ldindx >= 0);
6399
6400
0
      bfd_xcoff_swap_ldsym_out (output_bfd, ldsym,
6401
0
        (flinfo->ldsym +
6402
0
         (h->ldindx - 3)
6403
0
         * bfd_xcoff_ldsymsz(flinfo->output_bfd)));
6404
0
      h->ldsym = NULL;
6405
0
    }
6406
6407
  /* If this symbol needs global linkage code, write it out.  */
6408
0
  if (h->root.type == bfd_link_hash_defined
6409
0
      && (h->root.u.def.section
6410
0
    == xcoff_hash_table (flinfo->info)->linkage_section))
6411
0
    {
6412
0
      bfd_byte *p;
6413
0
      bfd_vma tocoff;
6414
0
      unsigned int i;
6415
6416
0
      p = h->root.u.def.section->contents + h->root.u.def.value;
6417
6418
      /* The first instruction in the global linkage code loads a
6419
   specific TOC element.  */
6420
0
      tocoff = (h->descriptor->toc_section->output_section->vma
6421
0
    + h->descriptor->toc_section->output_offset
6422
0
    - xcoff_data (output_bfd)->toc);
6423
6424
0
      if ((h->descriptor->flags & XCOFF_SET_TOC) != 0)
6425
0
  tocoff += h->descriptor->u.toc_offset;
6426
6427
      /* The first instruction in the glink code needs to be
6428
   cooked to hold the correct offset in the toc.  The
6429
   rest are just output raw.  */
6430
0
      bfd_put_32 (output_bfd,
6431
0
      bfd_xcoff_glink_code(output_bfd, 0) | (tocoff & 0xffff), p);
6432
6433
      /* Start with i == 1 to get past the first instruction done above
6434
   The /4 is because the glink code is in bytes and we are going
6435
   4 at a pop.  */
6436
0
      for (i = 1; i < bfd_xcoff_glink_code_size(output_bfd) / 4; i++)
6437
0
  bfd_put_32 (output_bfd,
6438
0
        (bfd_vma) bfd_xcoff_glink_code(output_bfd, i),
6439
0
        &p[4 * i]);
6440
0
    }
6441
6442
  /* If we created a TOC entry for this symbol, write out the required
6443
     relocs.  */
6444
0
  if ((h->flags & XCOFF_SET_TOC) != 0)
6445
0
    {
6446
0
      asection *tocsec;
6447
0
      asection *osec;
6448
0
      int oindx;
6449
0
      struct internal_reloc *irel;
6450
0
      struct internal_syment irsym;
6451
0
      union internal_auxent iraux;
6452
6453
0
      tocsec = h->toc_section;
6454
0
      osec = tocsec->output_section;
6455
0
      oindx = osec->target_index;
6456
0
      irel = flinfo->section_info[oindx].relocs + osec->reloc_count;
6457
0
      irel->r_vaddr = (osec->vma
6458
0
           + tocsec->output_offset
6459
0
           + h->u.toc_offset);
6460
6461
0
      if (h->indx >= 0)
6462
0
  irel->r_symndx = h->indx;
6463
0
      else
6464
0
  {
6465
0
    h->indx = -2;
6466
0
    irel->r_symndx = obj_raw_syment_count (output_bfd);
6467
0
  }
6468
6469
      /* Initialize the aux union here instead of closer to when it is
6470
   written out below because the length of the csect depends on
6471
   whether the output is 32 or 64 bit.  */
6472
0
      memset (&iraux, 0, sizeof iraux);
6473
0
      iraux.x_csect.x_smtyp = XTY_SD;
6474
      /* iraux.x_csect.x_scnlen.u64 = 4 or 8, see below.  */
6475
0
      iraux.x_csect.x_smclas = XMC_TC;
6476
6477
      /* 32 bit uses a 32 bit R_POS to do the relocations
6478
   64 bit uses a 64 bit R_POS to do the relocations
6479
6480
   Also needs to change the csect size : 4 for 32 bit, 8 for 64 bit
6481
6482
   Which one is determined by the backend.  */
6483
0
      if (bfd_xcoff_is_xcoff64 (output_bfd))
6484
0
  {
6485
0
    irel->r_size = 63;
6486
0
    iraux.x_csect.x_scnlen.u64 = 8;
6487
0
  }
6488
0
      else if (bfd_xcoff_is_xcoff32 (output_bfd))
6489
0
  {
6490
0
    irel->r_size = 31;
6491
0
    iraux.x_csect.x_scnlen.u64 = 4;
6492
0
  }
6493
0
      else
6494
0
  return false;
6495
6496
0
      irel->r_type = R_POS;
6497
0
      flinfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
6498
0
      ++osec->reloc_count;
6499
6500
      /* There are two kind of linker-created TOC entry.
6501
   The ones importing their symbols from outside, made for the
6502
   global linkage.  These symbols have XCOFF_LDREL set and only
6503
   requires a loader relocation on their imported symbol.
6504
   On the other hand, symbols without XCOFF_LDREL are TOC entries
6505
   of internal symbols (like function descriptors made for stubs).
6506
   These symbols needs a loader relocation over .data and this
6507
   relocation must be applied.  */
6508
6509
0
      if ((h->flags & XCOFF_LDREL) != 0
6510
0
    && h->ldindx >= 0)
6511
0
  {
6512
0
    if (!xcoff_create_ldrel (output_bfd, flinfo, osec,
6513
0
           output_bfd, irel, NULL, h))
6514
0
      return false;
6515
0
  }
6516
0
      else
6517
0
  {
6518
0
    bfd_byte *p;
6519
0
    bfd_vma val;
6520
6521
0
    p = tocsec->contents + h->u.toc_offset;
6522
0
    val = (h->root.u.def.value
6523
0
     + h->root.u.def.section->output_section->vma
6524
0
     + h->root.u.def.section->output_offset);
6525
6526
0
    if (bfd_xcoff_is_xcoff64 (output_bfd))
6527
0
      bfd_put_64 (output_bfd, val, p);
6528
0
    else if (bfd_xcoff_is_xcoff32 (output_bfd))
6529
0
      bfd_put_32 (output_bfd, val, p);
6530
0
    else
6531
0
      return false;
6532
6533
0
    if (!xcoff_create_ldrel (output_bfd, flinfo, osec,
6534
0
           output_bfd, irel, h->root.u.def.section, h))
6535
0
      return false;
6536
0
  }
6537
6538
      /* We need to emit a symbol to define a csect which holds
6539
   the reloc.  */
6540
0
      if (flinfo->info->strip != strip_all)
6541
0
  {
6542
0
    result = bfd_xcoff_put_symbol_name (output_bfd, flinfo->info,
6543
0
                flinfo->strtab,
6544
0
                &irsym, h->root.root.string);
6545
0
    if (!result)
6546
0
      return false;
6547
6548
0
    irsym.n_value = irel->r_vaddr;
6549
0
    irsym.n_scnum = osec->target_index;
6550
0
    irsym.n_sclass = C_HIDEXT;
6551
0
    irsym.n_type = T_NULL;
6552
0
    irsym.n_numaux = 1;
6553
6554
0
    bfd_coff_swap_sym_out (output_bfd, (void *) &irsym, (void *) outsym);
6555
0
    outsym += bfd_coff_symesz (output_bfd);
6556
6557
    /* Note : iraux is initialized above.  */
6558
0
    bfd_coff_swap_aux_out (output_bfd, (void *) &iraux, T_NULL, C_HIDEXT,
6559
0
         0, 1, (void *) outsym);
6560
0
    outsym += bfd_coff_auxesz (output_bfd);
6561
6562
0
    if (h->indx >= 0)
6563
0
      {
6564
        /* We aren't going to write out the symbols below, so we
6565
     need to write them out now.  */
6566
0
        pos = obj_sym_filepos (output_bfd);
6567
0
        pos += (obj_raw_syment_count (output_bfd)
6568
0
          * bfd_coff_symesz (output_bfd));
6569
0
        amt = outsym - flinfo->outsyms;
6570
0
        if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
6571
0
      || bfd_write (flinfo->outsyms, amt, output_bfd) != amt)
6572
0
    return false;
6573
0
        obj_raw_syment_count (output_bfd) +=
6574
0
    (outsym - flinfo->outsyms) / bfd_coff_symesz (output_bfd);
6575
6576
0
        outsym = flinfo->outsyms;
6577
0
      }
6578
0
  }
6579
0
    }
6580
6581
  /* If this symbol is a specially defined function descriptor, write
6582
     it out.  The first word is the address of the function code
6583
     itself, the second word is the address of the TOC, and the third
6584
     word is zero.
6585
6586
     32 bit vs 64 bit
6587
     The addresses for the 32 bit will take 4 bytes and the addresses
6588
     for 64 bit will take 8 bytes.  Similar for the relocs.  This type
6589
     of logic was also done above to create a TOC entry in
6590
     xcoff_write_global_symbol.  */
6591
0
  if ((h->flags & XCOFF_DESCRIPTOR) != 0
6592
0
      && h->root.type == bfd_link_hash_defined
6593
0
      && (h->root.u.def.section
6594
0
    == xcoff_hash_table (flinfo->info)->descriptor_section))
6595
0
    {
6596
0
      asection *sec;
6597
0
      asection *osec;
6598
0
      int oindx;
6599
0
      bfd_byte *p;
6600
0
      struct xcoff_link_hash_entry *hentry;
6601
0
      asection *esec;
6602
0
      struct internal_reloc *irel;
6603
0
      asection *tsec;
6604
0
      unsigned int reloc_size, byte_size;
6605
6606
0
      if (bfd_xcoff_is_xcoff64 (output_bfd))
6607
0
  {
6608
0
    reloc_size = 63;
6609
0
    byte_size = 8;
6610
0
  }
6611
0
      else if (bfd_xcoff_is_xcoff32 (output_bfd))
6612
0
  {
6613
0
    reloc_size = 31;
6614
0
    byte_size = 4;
6615
0
  }
6616
0
      else
6617
0
  return false;
6618
6619
0
      sec = h->root.u.def.section;
6620
0
      osec = sec->output_section;
6621
0
      oindx = osec->target_index;
6622
0
      p = sec->contents + h->root.u.def.value;
6623
6624
0
      hentry = h->descriptor;
6625
0
      BFD_ASSERT (hentry != NULL
6626
0
      && (hentry->root.type == bfd_link_hash_defined
6627
0
          || hentry->root.type == bfd_link_hash_defweak));
6628
0
      esec = hentry->root.u.def.section;
6629
6630
0
      irel = flinfo->section_info[oindx].relocs + osec->reloc_count;
6631
0
      irel->r_vaddr = (osec->vma
6632
0
           + sec->output_offset
6633
0
           + h->root.u.def.value);
6634
0
      irel->r_symndx = esec->output_section->target_index;
6635
0
      irel->r_type = R_POS;
6636
0
      irel->r_size = reloc_size;
6637
0
      flinfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
6638
0
      ++osec->reloc_count;
6639
6640
0
      if (!xcoff_create_ldrel (output_bfd, flinfo, osec,
6641
0
             output_bfd, irel, esec, NULL))
6642
0
  return false;
6643
6644
      /* There are three items to write out,
6645
   the address of the code
6646
   the address of the toc anchor
6647
   the environment pointer.
6648
   We are ignoring the environment pointer.  So set it to zero.  */
6649
0
      if (bfd_xcoff_is_xcoff64 (output_bfd))
6650
0
  {
6651
0
    bfd_put_64 (output_bfd,
6652
0
          (esec->output_section->vma + esec->output_offset
6653
0
           + hentry->root.u.def.value),
6654
0
          p);
6655
0
    bfd_put_64 (output_bfd, xcoff_data (output_bfd)->toc, p + 8);
6656
0
    bfd_put_64 (output_bfd, (bfd_vma) 0, p + 16);
6657
0
  }
6658
0
      else
6659
0
  {
6660
    /* 32 bit backend
6661
       This logic was already called above so the error case where
6662
       the backend is neither has already been checked.  */
6663
0
    bfd_put_32 (output_bfd,
6664
0
          (esec->output_section->vma + esec->output_offset
6665
0
           + hentry->root.u.def.value),
6666
0
          p);
6667
0
    bfd_put_32 (output_bfd, xcoff_data (output_bfd)->toc, p + 4);
6668
0
    bfd_put_32 (output_bfd, (bfd_vma) 0, p + 8);
6669
0
  }
6670
6671
0
      tsec = coff_section_from_bfd_index (output_bfd,
6672
0
            xcoff_data (output_bfd)->sntoc);
6673
6674
0
      ++irel;
6675
0
      irel->r_vaddr = (osec->vma
6676
0
           + sec->output_offset
6677
0
           + h->root.u.def.value
6678
0
           + byte_size);
6679
0
      irel->r_symndx = tsec->output_section->target_index;
6680
0
      irel->r_type = R_POS;
6681
0
      irel->r_size = reloc_size;
6682
0
      flinfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL;
6683
0
      ++osec->reloc_count;
6684
6685
0
      if (!xcoff_create_ldrel (output_bfd, flinfo, osec,
6686
0
             output_bfd, irel, tsec, NULL))
6687
0
  return false;
6688
0
    }
6689
6690
0
  if (h->indx >= 0 || flinfo->info->strip == strip_all)
6691
0
    {
6692
0
      BFD_ASSERT (outsym == flinfo->outsyms);
6693
0
      return true;
6694
0
    }
6695
6696
0
  if (h->indx != -2
6697
0
      && (flinfo->info->strip == strip_all
6698
0
    || (flinfo->info->strip == strip_some
6699
0
        && bfd_hash_lookup (flinfo->info->keep_hash, h->root.root.string,
6700
0
          false, false) == NULL)))
6701
0
    {
6702
0
      BFD_ASSERT (outsym == flinfo->outsyms);
6703
0
      return true;
6704
0
    }
6705
6706
0
  if (h->indx != -2
6707
0
      && (h->flags & (XCOFF_REF_REGULAR | XCOFF_DEF_REGULAR)) == 0)
6708
0
    {
6709
0
      BFD_ASSERT (outsym == flinfo->outsyms);
6710
0
      return true;
6711
0
    }
6712
6713
0
  memset (&aux, 0, sizeof aux);
6714
6715
0
  h->indx = obj_raw_syment_count (output_bfd);
6716
6717
0
  result = bfd_xcoff_put_symbol_name (output_bfd, flinfo->info, flinfo->strtab,
6718
0
              &isym, h->root.root.string);
6719
0
  if (!result)
6720
0
    return false;
6721
6722
0
  if (h->root.type == bfd_link_hash_undefined
6723
0
      || h->root.type == bfd_link_hash_undefweak)
6724
0
    {
6725
0
      isym.n_value = 0;
6726
0
      isym.n_scnum = N_UNDEF;
6727
0
      if (h->root.type == bfd_link_hash_undefweak
6728
0
    && C_WEAKEXT == C_AIX_WEAKEXT)
6729
0
  isym.n_sclass = C_WEAKEXT;
6730
0
      else
6731
0
  isym.n_sclass = C_EXT;
6732
0
      aux.x_csect.x_smtyp = XTY_ER;
6733
0
    }
6734
0
  else if ((h->root.type == bfd_link_hash_defined
6735
0
      || h->root.type == bfd_link_hash_defweak)
6736
0
     && h->smclas == XMC_XO)
6737
0
    {
6738
0
      BFD_ASSERT (bfd_is_abs_symbol (&h->root));
6739
0
      isym.n_value = h->root.u.def.value;
6740
0
      isym.n_scnum = N_UNDEF;
6741
0
      if (h->root.type == bfd_link_hash_defweak
6742
0
    && C_WEAKEXT == C_AIX_WEAKEXT)
6743
0
  isym.n_sclass = C_WEAKEXT;
6744
0
      else
6745
0
  isym.n_sclass = C_EXT;
6746
0
      aux.x_csect.x_smtyp = XTY_ER;
6747
0
    }
6748
0
  else if (h->root.type == bfd_link_hash_defined
6749
0
     || h->root.type == bfd_link_hash_defweak)
6750
0
    {
6751
0
      struct xcoff_link_size_list *l;
6752
6753
0
      isym.n_value = (h->root.u.def.section->output_section->vma
6754
0
          + h->root.u.def.section->output_offset
6755
0
          + h->root.u.def.value);
6756
0
      if (bfd_is_abs_section (h->root.u.def.section->output_section))
6757
0
  isym.n_scnum = N_ABS;
6758
0
      else
6759
0
  isym.n_scnum = h->root.u.def.section->output_section->target_index;
6760
0
      isym.n_sclass = C_HIDEXT;
6761
0
      aux.x_csect.x_smtyp = XTY_SD;
6762
6763
      /* For stub symbols, the section already has its correct size.  */
6764
0
      if (h->root.u.def.section->owner == xcoff_hash_table (flinfo->info)->params->stub_bfd)
6765
0
  {
6766
0
    aux.x_csect.x_scnlen.u64 = h->root.u.def.section->size;
6767
0
  }
6768
0
      else if ((h->flags & XCOFF_HAS_SIZE) != 0)
6769
0
  {
6770
0
    for (l = xcoff_hash_table (flinfo->info)->size_list;
6771
0
         l != NULL;
6772
0
         l = l->next)
6773
0
      {
6774
0
        if (l->h == h)
6775
0
    {
6776
0
      aux.x_csect.x_scnlen.u64 = l->size;
6777
0
      break;
6778
0
    }
6779
0
      }
6780
0
  }
6781
0
    }
6782
0
  else if (h->root.type == bfd_link_hash_common)
6783
0
    {
6784
0
      isym.n_value = (h->root.u.c.p->section->output_section->vma
6785
0
          + h->root.u.c.p->section->output_offset);
6786
0
      isym.n_scnum = h->root.u.c.p->section->output_section->target_index;
6787
0
      isym.n_sclass = C_EXT;
6788
0
      aux.x_csect.x_smtyp = XTY_CM;
6789
0
      aux.x_csect.x_scnlen.u64 = h->root.u.c.size;
6790
0
    }
6791
0
  else
6792
0
    abort ();
6793
6794
0
  isym.n_type = T_NULL;
6795
0
  isym.n_numaux = 1;
6796
6797
0
  bfd_coff_swap_sym_out (output_bfd, (void *) &isym, (void *) outsym);
6798
0
  outsym += bfd_coff_symesz (output_bfd);
6799
6800
0
  aux.x_csect.x_smclas = h->smclas;
6801
0
  bfd_coff_swap_aux_out (output_bfd, (void *) &aux, T_NULL, isym.n_sclass, 0, 1,
6802
0
       (void *) outsym);
6803
0
  outsym += bfd_coff_auxesz (output_bfd);
6804
6805
0
  if ((h->root.type == bfd_link_hash_defined
6806
0
       || h->root.type == bfd_link_hash_defweak)
6807
0
      && h->smclas != XMC_XO)
6808
0
    {
6809
      /* We just output an SD symbol.  Now output an LD symbol.  */
6810
0
      h->indx += 2;
6811
6812
0
      if (h->root.type == bfd_link_hash_defweak
6813
0
    && C_WEAKEXT == C_AIX_WEAKEXT)
6814
0
  isym.n_sclass = C_WEAKEXT;
6815
0
      else
6816
0
  isym.n_sclass = C_EXT;
6817
0
      bfd_coff_swap_sym_out (output_bfd, (void *) &isym, (void *) outsym);
6818
0
      outsym += bfd_coff_symesz (output_bfd);
6819
6820
0
      aux.x_csect.x_smtyp = XTY_LD;
6821
0
      aux.x_csect.x_scnlen.u64 = obj_raw_syment_count (output_bfd);
6822
0
      bfd_coff_swap_aux_out (output_bfd, (void *) &aux, T_NULL, C_EXT, 0, 1,
6823
0
           (void *) outsym);
6824
0
      outsym += bfd_coff_auxesz (output_bfd);
6825
0
    }
6826
6827
0
  pos = obj_sym_filepos (output_bfd);
6828
0
  pos += obj_raw_syment_count (output_bfd) * bfd_coff_symesz (output_bfd);
6829
0
  amt = outsym - flinfo->outsyms;
6830
0
  if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
6831
0
      || bfd_write (flinfo->outsyms, amt, output_bfd) != amt)
6832
0
    return false;
6833
0
  obj_raw_syment_count (output_bfd) +=
6834
0
    (outsym - flinfo->outsyms) / bfd_coff_symesz (output_bfd);
6835
6836
0
  return true;
6837
0
}
6838
6839
/* Handle a link order which is supposed to generate a reloc.  */
6840
6841
static bool
6842
xcoff_reloc_link_order (bfd *output_bfd,
6843
      struct xcoff_final_link_info *flinfo,
6844
      asection *output_section,
6845
      struct bfd_link_order *link_order)
6846
0
{
6847
0
  reloc_howto_type *howto;
6848
0
  struct xcoff_link_hash_entry *h;
6849
0
  asection *hsec;
6850
0
  bfd_vma hval;
6851
0
  bfd_vma addend;
6852
0
  struct internal_reloc *irel;
6853
0
  struct xcoff_link_hash_entry **rel_hash_ptr;
6854
6855
0
  if (link_order->type == bfd_section_reloc_link_order)
6856
    /* We need to somehow locate a symbol in the right section.  The
6857
       symbol must either have a value of zero, or we must adjust
6858
       the addend by the value of the symbol.  FIXME: Write this
6859
       when we need it.  The old linker couldn't handle this anyhow.  */
6860
0
    abort ();
6861
6862
0
  howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
6863
0
  if (howto == NULL)
6864
0
    {
6865
0
      bfd_set_error (bfd_error_bad_value);
6866
0
      return false;
6867
0
    }
6868
6869
0
  h = ((struct xcoff_link_hash_entry *)
6870
0
       bfd_wrapped_link_hash_lookup (output_bfd, flinfo->info,
6871
0
             link_order->u.reloc.p->u.name,
6872
0
             false, false, true));
6873
0
  if (h == NULL)
6874
0
    {
6875
0
      (*flinfo->info->callbacks->unattached_reloc)
6876
0
  (flinfo->info, link_order->u.reloc.p->u.name, NULL, NULL, (bfd_vma) 0);
6877
0
      return true;
6878
0
    }
6879
6880
0
  hsec = xcoff_symbol_section (h);
6881
0
  if (h->root.type == bfd_link_hash_defined
6882
0
      || h->root.type == bfd_link_hash_defweak)
6883
0
    hval = h->root.u.def.value;
6884
0
  else
6885
0
    hval = 0;
6886
6887
0
  addend = link_order->u.reloc.p->addend;
6888
0
  if (hsec != NULL)
6889
0
    addend += (hsec->output_section->vma
6890
0
         + hsec->output_offset
6891
0
         + hval);
6892
6893
0
  if (addend != 0)
6894
0
    {
6895
0
      bfd_size_type size;
6896
0
      bfd_byte *buf;
6897
0
      bfd_reloc_status_type rstat;
6898
0
      bool ok;
6899
6900
0
      size = bfd_get_reloc_size (howto);
6901
0
      buf = bfd_zmalloc (size);
6902
0
      if (buf == NULL && size != 0)
6903
0
  return false;
6904
6905
0
      rstat = _bfd_relocate_contents (howto, output_bfd, addend, buf);
6906
0
      switch (rstat)
6907
0
  {
6908
0
  case bfd_reloc_ok:
6909
0
    break;
6910
0
  default:
6911
0
  case bfd_reloc_outofrange:
6912
0
    abort ();
6913
0
  case bfd_reloc_overflow:
6914
0
    (*flinfo->info->callbacks->reloc_overflow)
6915
0
      (flinfo->info, NULL, link_order->u.reloc.p->u.name,
6916
0
       howto->name, addend, NULL, NULL, (bfd_vma) 0);
6917
0
    break;
6918
0
  }
6919
0
      ok = bfd_set_section_contents (output_bfd, output_section, (void *) buf,
6920
0
             (file_ptr) link_order->offset, size);
6921
0
      free (buf);
6922
0
      if (! ok)
6923
0
  return false;
6924
0
    }
6925
6926
  /* Store the reloc information in the right place.  It will get
6927
     swapped and written out at the end of the final_link routine.  */
6928
0
  irel = (flinfo->section_info[output_section->target_index].relocs
6929
0
    + output_section->reloc_count);
6930
0
  rel_hash_ptr = (flinfo->section_info[output_section->target_index].rel_hashes
6931
0
      + output_section->reloc_count);
6932
6933
0
  memset (irel, 0, sizeof (struct internal_reloc));
6934
0
  *rel_hash_ptr = NULL;
6935
6936
0
  irel->r_vaddr = output_section->vma + link_order->offset;
6937
6938
0
  if (h->indx >= 0)
6939
0
    irel->r_symndx = h->indx;
6940
0
  else
6941
0
    {
6942
      /* Set the index to -2 to force this symbol to get written out.  */
6943
0
      h->indx = -2;
6944
0
      *rel_hash_ptr = h;
6945
0
      irel->r_symndx = 0;
6946
0
    }
6947
6948
0
  irel->r_type = howto->type;
6949
0
  irel->r_size = howto->bitsize - 1;
6950
0
  if (howto->complain_on_overflow == complain_overflow_signed)
6951
0
    irel->r_size |= 0x80;
6952
6953
0
  ++output_section->reloc_count;
6954
6955
  /* Now output the reloc to the .loader section.  */
6956
0
  if (xcoff_hash_table (flinfo->info)->loader_section)
6957
0
    {
6958
0
      if (!xcoff_create_ldrel (output_bfd, flinfo, output_section,
6959
0
             output_bfd, irel, hsec, h))
6960
0
  return false;
6961
0
    }
6962
6963
0
  return true;
6964
0
}
6965
6966
/* Do the final link step.  */
6967
6968
bool
6969
_bfd_xcoff_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
6970
0
{
6971
0
  bfd_size_type symesz;
6972
0
  struct xcoff_final_link_info flinfo;
6973
0
  asection *o;
6974
0
  struct bfd_link_order *p;
6975
0
  bfd_size_type max_contents_size;
6976
0
  bfd_size_type max_sym_count;
6977
0
  bfd_size_type max_lineno_count;
6978
0
  bfd_size_type max_reloc_count;
6979
0
  bfd_size_type max_output_reloc_count;
6980
0
  file_ptr rel_filepos;
6981
0
  unsigned int relsz;
6982
0
  file_ptr line_filepos;
6983
0
  unsigned int linesz;
6984
0
  bfd *sub;
6985
0
  bfd_byte *external_relocs = NULL;
6986
0
  char strbuf[STRING_SIZE_SIZE];
6987
0
  file_ptr pos;
6988
0
  bfd_size_type amt;
6989
6990
0
  if (bfd_link_pic (info))
6991
0
    abfd->flags |= DYNAMIC;
6992
6993
0
  symesz = bfd_coff_symesz (abfd);
6994
6995
0
  flinfo.info = info;
6996
0
  flinfo.output_bfd = abfd;
6997
0
  flinfo.strtab = NULL;
6998
0
  flinfo.section_info = NULL;
6999
0
  flinfo.last_file_index = -1;
7000
0
  flinfo.toc_symindx = -1;
7001
0
  flinfo.internal_syms = NULL;
7002
0
  flinfo.sym_indices = NULL;
7003
0
  flinfo.outsyms = NULL;
7004
0
  flinfo.linenos = NULL;
7005
0
  flinfo.contents = NULL;
7006
0
  flinfo.external_relocs = NULL;
7007
7008
0
  if (xcoff_hash_table (info)->loader_section)
7009
0
    {
7010
0
      flinfo.ldsym = (xcoff_hash_table (info)->loader_section->contents
7011
0
         + bfd_xcoff_ldhdrsz (abfd));
7012
0
      flinfo.ldrel = (xcoff_hash_table (info)->loader_section->contents
7013
0
         + bfd_xcoff_ldhdrsz (abfd)
7014
0
         + (xcoff_hash_table (info)->ldhdr.l_nsyms
7015
0
      * bfd_xcoff_ldsymsz (abfd)));
7016
0
    }
7017
0
  else
7018
0
    {
7019
0
      flinfo.ldsym = NULL;
7020
0
      flinfo.ldrel = NULL;
7021
0
    }
7022
7023
0
  xcoff_data (abfd)->coff.link_info = info;
7024
7025
0
  flinfo.strtab = _bfd_stringtab_init ();
7026
0
  if (flinfo.strtab == NULL)
7027
0
    goto error_return;
7028
7029
  /* Count the relocation entries required for the output file.
7030
     (We've already counted the line numbers.)  Determine a few
7031
     maximum sizes.  */
7032
0
  max_contents_size = 0;
7033
0
  max_lineno_count = 0;
7034
0
  max_reloc_count = 0;
7035
0
  for (o = abfd->sections; o != NULL; o = o->next)
7036
0
    {
7037
0
      o->reloc_count = 0;
7038
0
      for (p = o->map_head.link_order; p != NULL; p = p->next)
7039
0
  {
7040
0
    if (p->type == bfd_indirect_link_order)
7041
0
      {
7042
0
        asection *sec;
7043
7044
0
        sec = p->u.indirect.section;
7045
7046
        /* Mark all sections which are to be included in the
7047
     link.  This will normally be every section.  We need
7048
     to do this so that we can identify any sections which
7049
     the linker has decided to not include.  */
7050
0
        sec->linker_mark = true;
7051
7052
0
        o->reloc_count += sec->reloc_count;
7053
7054
0
        if ((sec->flags & SEC_IN_MEMORY) == 0)
7055
0
    {
7056
0
      if (sec->rawsize > max_contents_size)
7057
0
        max_contents_size = sec->rawsize;
7058
0
      if (sec->size > max_contents_size)
7059
0
        max_contents_size = sec->size;
7060
0
    }
7061
0
        if (coff_section_data (sec->owner, sec) != NULL
7062
0
      && xcoff_section_data (sec->owner, sec) != NULL
7063
0
      && (xcoff_section_data (sec->owner, sec)->lineno_count
7064
0
          > max_lineno_count))
7065
0
    max_lineno_count =
7066
0
      xcoff_section_data (sec->owner, sec)->lineno_count;
7067
0
        if (sec->reloc_count > max_reloc_count)
7068
0
    max_reloc_count = sec->reloc_count;
7069
0
      }
7070
0
    else if (p->type == bfd_section_reloc_link_order
7071
0
       || p->type == bfd_symbol_reloc_link_order)
7072
0
      ++o->reloc_count;
7073
0
  }
7074
0
    }
7075
7076
  /* Compute the file positions for all the sections.  */
7077
0
  if (abfd->output_has_begun)
7078
0
    {
7079
0
      if (xcoff_hash_table (info)->file_align != 0)
7080
0
  abort ();
7081
0
    }
7082
0
  else
7083
0
    {
7084
0
      bfd_vma file_align;
7085
7086
0
      file_align = xcoff_hash_table (info)->file_align;
7087
0
      if (file_align != 0)
7088
0
  {
7089
0
    bool saw_contents;
7090
0
    int indx;
7091
0
    file_ptr sofar;
7092
7093
    /* Insert .pad sections before every section which has
7094
       contents and is loaded, if it is preceded by some other
7095
       section which has contents and is loaded.  */
7096
0
    saw_contents = true;
7097
0
    for (o = abfd->sections; o != NULL; o = o->next)
7098
0
      {
7099
0
        if (strcmp (o->name, ".pad") == 0)
7100
0
    saw_contents = false;
7101
0
        else if ((o->flags & SEC_HAS_CONTENTS) != 0
7102
0
           && (o->flags & SEC_LOAD) != 0)
7103
0
    {
7104
0
      if (! saw_contents)
7105
0
        saw_contents = true;
7106
0
      else
7107
0
        {
7108
0
          asection *n;
7109
7110
          /* Create a pad section and place it before the section
7111
       that needs padding.  This requires unlinking and
7112
       relinking the bfd's section list.  */
7113
7114
0
          n = bfd_make_section_anyway_with_flags (abfd, ".pad",
7115
0
                    SEC_HAS_CONTENTS);
7116
0
          n->alignment_power = 0;
7117
7118
0
          bfd_section_list_remove (abfd, n);
7119
0
          bfd_section_list_insert_before (abfd, o, n);
7120
0
          saw_contents = false;
7121
0
        }
7122
0
    }
7123
0
      }
7124
7125
    /* Reset the section indices after inserting the new
7126
       sections.  */
7127
0
    if (xcoff_data (abfd)->coff.section_by_target_index)
7128
0
      htab_empty (xcoff_data (abfd)->coff.section_by_target_index);
7129
0
    indx = 0;
7130
0
    for (o = abfd->sections; o != NULL; o = o->next)
7131
0
      {
7132
0
        ++indx;
7133
0
        o->target_index = indx;
7134
0
      }
7135
0
    BFD_ASSERT ((unsigned int) indx == abfd->section_count);
7136
7137
    /* Work out appropriate sizes for the .pad sections to force
7138
       each section to land on a page boundary.  This bit of
7139
       code knows what compute_section_file_positions is going
7140
       to do.  */
7141
0
    sofar = bfd_coff_filhsz (abfd);
7142
0
    sofar += bfd_coff_aoutsz (abfd);
7143
0
    sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
7144
0
    for (o = abfd->sections; o != NULL; o = o->next)
7145
0
      if ((bfd_xcoff_is_reloc_count_overflow
7146
0
     (abfd, (bfd_vma) o->reloc_count))
7147
0
    || (bfd_xcoff_is_lineno_count_overflow
7148
0
        (abfd, (bfd_vma) o->lineno_count)))
7149
        /* 64 does not overflow, need to check if 32 does */
7150
0
        sofar += bfd_coff_scnhsz (abfd);
7151
7152
0
    for (o = abfd->sections; o != NULL; o = o->next)
7153
0
      {
7154
0
        if (strcmp (o->name, ".pad") == 0)
7155
0
    {
7156
0
      bfd_vma pageoff;
7157
7158
0
      BFD_ASSERT (o->size == 0);
7159
0
      pageoff = sofar & (file_align - 1);
7160
0
      if (pageoff != 0)
7161
0
        {
7162
0
          o->size = file_align - pageoff;
7163
0
          sofar += file_align - pageoff;
7164
0
          o->flags |= SEC_HAS_CONTENTS;
7165
0
        }
7166
0
    }
7167
0
        else
7168
0
    {
7169
0
      if ((o->flags & SEC_HAS_CONTENTS) != 0)
7170
0
        sofar += BFD_ALIGN (o->size,
7171
0
          1 << o->alignment_power);
7172
0
    }
7173
0
      }
7174
0
  }
7175
7176
0
      if (! bfd_coff_compute_section_file_positions (abfd))
7177
0
  goto error_return;
7178
0
    }
7179
7180
  /* Allocate space for the pointers we need to keep for the relocs.  */
7181
0
  {
7182
0
    unsigned int i;
7183
7184
    /* We use section_count + 1, rather than section_count, because
7185
       the target_index fields are 1 based.  */
7186
0
    amt = abfd->section_count + 1;
7187
0
    amt *= sizeof (struct xcoff_link_section_info);
7188
0
    flinfo.section_info = bfd_malloc (amt);
7189
0
    if (flinfo.section_info == NULL)
7190
0
      goto error_return;
7191
0
    for (i = 0; i <= abfd->section_count; i++)
7192
0
      {
7193
0
  flinfo.section_info[i].relocs = NULL;
7194
0
  flinfo.section_info[i].rel_hashes = NULL;
7195
0
  flinfo.section_info[i].toc_rel_hashes = NULL;
7196
0
      }
7197
0
  }
7198
7199
  /* Set the file positions for the relocs.  */
7200
0
  rel_filepos = obj_relocbase (abfd);
7201
0
  relsz = bfd_coff_relsz (abfd);
7202
0
  max_output_reloc_count = 0;
7203
0
  for (o = abfd->sections; o != NULL; o = o->next)
7204
0
    {
7205
0
      if (o->reloc_count == 0)
7206
0
  o->rel_filepos = 0;
7207
0
      else
7208
0
  {
7209
    /* A stripped file has no relocs.  However, we still
7210
       allocate the buffers, so that later code doesn't have to
7211
       worry about whether we are stripping or not.  */
7212
0
    if (info->strip == strip_all)
7213
0
      o->rel_filepos = 0;
7214
0
    else
7215
0
      {
7216
0
        o->flags |= SEC_RELOC;
7217
0
        o->rel_filepos = rel_filepos;
7218
0
        rel_filepos += o->reloc_count * relsz;
7219
0
      }
7220
7221
    /* We don't know the indices of global symbols until we have
7222
       written out all the local symbols.  For each section in
7223
       the output file, we keep an array of pointers to hash
7224
       table entries.  Each entry in the array corresponds to a
7225
       reloc.  When we find a reloc against a global symbol, we
7226
       set the corresponding entry in this array so that we can
7227
       fix up the symbol index after we have written out all the
7228
       local symbols.
7229
7230
       Because of this problem, we also keep the relocs in
7231
       memory until the end of the link.  This wastes memory.
7232
       We could backpatch the file later, I suppose, although it
7233
       would be slow.  */
7234
0
    amt = o->reloc_count;
7235
0
    amt *= sizeof (struct internal_reloc);
7236
0
    flinfo.section_info[o->target_index].relocs = bfd_malloc (amt);
7237
7238
0
    amt = o->reloc_count;
7239
0
    amt *= sizeof (struct xcoff_link_hash_entry *);
7240
0
    flinfo.section_info[o->target_index].rel_hashes = bfd_malloc (amt);
7241
7242
0
    if (flinfo.section_info[o->target_index].relocs == NULL
7243
0
        || flinfo.section_info[o->target_index].rel_hashes == NULL)
7244
0
      goto error_return;
7245
7246
0
    if (o->reloc_count > max_output_reloc_count)
7247
0
      max_output_reloc_count = o->reloc_count;
7248
0
  }
7249
0
    }
7250
7251
  /* We now know the size of the relocs, so we can determine the file
7252
     positions of the line numbers.  */
7253
0
  line_filepos = rel_filepos;
7254
0
  flinfo.line_filepos = line_filepos;
7255
0
  linesz = bfd_coff_linesz (abfd);
7256
0
  for (o = abfd->sections; o != NULL; o = o->next)
7257
0
    {
7258
0
      if (o->lineno_count == 0)
7259
0
  o->line_filepos = 0;
7260
0
      else
7261
0
  {
7262
0
    o->line_filepos = line_filepos;
7263
0
    line_filepos += o->lineno_count * linesz;
7264
0
  }
7265
7266
      /* Reset the reloc and lineno counts, so that we can use them to
7267
   count the number of entries we have output so far.  */
7268
0
      o->reloc_count = 0;
7269
0
      o->lineno_count = 0;
7270
0
    }
7271
7272
0
  obj_sym_filepos (abfd) = line_filepos;
7273
7274
  /* Figure out the largest number of symbols in an input BFD.  Take
7275
     the opportunity to clear the output_has_begun fields of all the
7276
     input BFD's.  We want at least 6 symbols, since that is the
7277
     number which xcoff_write_global_symbol may need.  */
7278
0
  max_sym_count = 6;
7279
0
  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
7280
0
    {
7281
0
      bfd_size_type sz;
7282
7283
0
      sub->output_has_begun = false;
7284
0
      sz = obj_raw_syment_count (sub);
7285
0
      if (sz > max_sym_count)
7286
0
  max_sym_count = sz;
7287
0
    }
7288
7289
  /* Allocate some buffers used while linking.  */
7290
0
  amt = max_sym_count * sizeof (struct internal_syment);
7291
0
  flinfo.internal_syms = bfd_malloc (amt);
7292
7293
0
  amt = max_sym_count * sizeof (long);
7294
0
  flinfo.sym_indices = bfd_malloc (amt);
7295
7296
0
  amt = (max_sym_count + 1) * symesz;
7297
0
  flinfo.outsyms = bfd_malloc (amt);
7298
7299
0
  amt = max_lineno_count * bfd_coff_linesz (abfd);
7300
0
  flinfo.linenos = bfd_malloc (amt);
7301
7302
0
  amt = max_contents_size;
7303
0
  flinfo.contents = bfd_malloc (amt);
7304
7305
0
  amt = max_reloc_count * relsz;
7306
0
  flinfo.external_relocs = bfd_malloc (amt);
7307
7308
0
  if ((flinfo.internal_syms == NULL && max_sym_count > 0)
7309
0
      || (flinfo.sym_indices == NULL && max_sym_count > 0)
7310
0
      || flinfo.outsyms == NULL
7311
0
      || (flinfo.linenos == NULL && max_lineno_count > 0)
7312
0
      || (flinfo.contents == NULL && max_contents_size > 0)
7313
0
      || (flinfo.external_relocs == NULL && max_reloc_count > 0))
7314
0
    goto error_return;
7315
7316
0
  obj_raw_syment_count (abfd) = 0;
7317
7318
  /* Find a TOC symbol, if we need one.  */
7319
0
  if (!xcoff_find_tc0 (abfd, &flinfo))
7320
0
    goto error_return;
7321
7322
  /* We now know the position of everything in the file, except that
7323
     we don't know the size of the symbol table and therefore we don't
7324
     know where the string table starts.  We just build the string
7325
     table in memory as we go along.  We process all the relocations
7326
     for a single input file at once.  */
7327
0
  for (o = abfd->sections; o != NULL; o = o->next)
7328
0
    {
7329
0
      for (p = o->map_head.link_order; p != NULL; p = p->next)
7330
0
  {
7331
0
    if (p->type == bfd_indirect_link_order
7332
0
        && p->u.indirect.section->owner->xvec == abfd->xvec)
7333
0
      {
7334
0
        sub = p->u.indirect.section->owner;
7335
0
        if (! sub->output_has_begun)
7336
0
    {
7337
0
      if (sub == xcoff_hash_table (info)->params->stub_bfd)
7338
0
        {
7339
0
          continue;
7340
0
        }
7341
0
      else
7342
0
        {
7343
0
          if (! xcoff_link_input_bfd (&flinfo, sub))
7344
0
      {
7345
0
        _bfd_error_handler
7346
0
          (_("Unable to link input file: %s"), sub->filename);
7347
0
        bfd_set_error (bfd_error_sorry);
7348
0
        goto error_return;
7349
0
      }
7350
0
        }
7351
0
      sub->output_has_begun = true;
7352
0
    }
7353
0
      }
7354
0
    else if (p->type == bfd_section_reloc_link_order
7355
0
       || p->type == bfd_symbol_reloc_link_order)
7356
0
      {
7357
0
        if (! xcoff_reloc_link_order (abfd, &flinfo, o, p))
7358
0
    goto error_return;
7359
0
      }
7360
0
    else
7361
0
      {
7362
0
        if (! _bfd_default_link_order (abfd, info, o, p))
7363
0
    goto error_return;
7364
0
      }
7365
0
  }
7366
0
    }
7367
7368
  /* Free up the buffers used by xcoff_link_input_bfd.  */
7369
0
  free (flinfo.internal_syms);
7370
0
  flinfo.internal_syms = NULL;
7371
0
  free (flinfo.sym_indices);
7372
0
  flinfo.sym_indices = NULL;
7373
0
  free (flinfo.linenos);
7374
0
  flinfo.linenos = NULL;
7375
0
  free (flinfo.contents);
7376
0
  flinfo.contents = NULL;
7377
0
  free (flinfo.external_relocs);
7378
0
  flinfo.external_relocs = NULL;
7379
7380
  /* The value of the last C_FILE symbol is supposed to be -1.  Write
7381
     it out again.  */
7382
0
  if (flinfo.last_file_index != -1)
7383
0
    {
7384
0
      flinfo.last_file.n_value = -(bfd_vma) 1;
7385
0
      bfd_coff_swap_sym_out (abfd, (void *) &flinfo.last_file,
7386
0
           (void *) flinfo.outsyms);
7387
0
      pos = obj_sym_filepos (abfd) + flinfo.last_file_index * symesz;
7388
0
      if (bfd_seek (abfd, pos, SEEK_SET) != 0
7389
0
    || bfd_write (flinfo.outsyms, symesz, abfd) != symesz)
7390
0
  goto error_return;
7391
0
    }
7392
7393
  /* Write out all the global symbols which do not come from XCOFF
7394
     input files.  */
7395
0
  bfd_hash_traverse (&info->hash->table, xcoff_write_global_symbol, &flinfo);
7396
7397
  /* Write out the relocations created by stub entries. The symbols
7398
     will have been already written by xcoff_write_global_symbol.  */
7399
0
  bfd_hash_traverse (&xcoff_hash_table(info)->stub_hash_table,
7400
0
         xcoff_stub_create_relocations,
7401
0
         &flinfo);
7402
7403
0
  free (flinfo.outsyms);
7404
0
  flinfo.outsyms = NULL;
7405
7406
  /* Now that we have written out all the global symbols, we know the
7407
     symbol indices to use for relocs against them, and we can finally
7408
     write out the relocs.  */
7409
0
  amt = max_output_reloc_count * relsz;
7410
0
  external_relocs = bfd_malloc (amt);
7411
0
  if (external_relocs == NULL && max_output_reloc_count != 0)
7412
0
    goto error_return;
7413
7414
0
  for (o = abfd->sections; o != NULL; o = o->next)
7415
0
    {
7416
0
      struct internal_reloc *irel;
7417
0
      struct internal_reloc *irelend;
7418
0
      struct xcoff_link_hash_entry **rel_hash;
7419
0
      struct xcoff_toc_rel_hash *toc_rel_hash;
7420
0
      bfd_byte *erel;
7421
0
      bfd_size_type rel_size;
7422
7423
      /* A stripped file has no relocs.  */
7424
0
      if (info->strip == strip_all)
7425
0
  {
7426
0
    o->reloc_count = 0;
7427
0
    continue;
7428
0
  }
7429
7430
0
      if (o->reloc_count == 0)
7431
0
  continue;
7432
7433
0
      irel = flinfo.section_info[o->target_index].relocs;
7434
0
      irelend = irel + o->reloc_count;
7435
0
      rel_hash = flinfo.section_info[o->target_index].rel_hashes;
7436
0
      for (; irel < irelend; irel++, rel_hash++)
7437
0
  {
7438
0
    if (*rel_hash != NULL)
7439
0
      {
7440
0
        if ((*rel_hash)->indx < 0)
7441
0
    {
7442
0
      (*info->callbacks->unattached_reloc)
7443
0
        (info, (*rel_hash)->root.root.string,
7444
0
         NULL, o, irel->r_vaddr);
7445
0
      (*rel_hash)->indx = 0;
7446
0
    }
7447
0
        irel->r_symndx = (*rel_hash)->indx;
7448
0
      }
7449
0
  }
7450
7451
0
      for (toc_rel_hash = flinfo.section_info[o->target_index].toc_rel_hashes;
7452
0
     toc_rel_hash != NULL;
7453
0
     toc_rel_hash = toc_rel_hash->next)
7454
0
  {
7455
0
    if (toc_rel_hash->h->u.toc_indx < 0)
7456
0
      {
7457
0
        (*info->callbacks->unattached_reloc)
7458
0
    (info, toc_rel_hash->h->root.root.string,
7459
0
     NULL, o, toc_rel_hash->rel->r_vaddr);
7460
0
        toc_rel_hash->h->u.toc_indx = 0;
7461
0
      }
7462
0
    toc_rel_hash->rel->r_symndx = toc_rel_hash->h->u.toc_indx;
7463
0
  }
7464
7465
      /* XCOFF requires that the relocs be sorted by address.  We tend
7466
   to produce them in the order in which their containing csects
7467
   appear in the symbol table, which is not necessarily by
7468
   address.  So we sort them here.  There may be a better way to
7469
   do this.  */
7470
0
      qsort ((void *) flinfo.section_info[o->target_index].relocs,
7471
0
       o->reloc_count, sizeof (struct internal_reloc),
7472
0
       xcoff_sort_relocs);
7473
7474
0
      irel = flinfo.section_info[o->target_index].relocs;
7475
0
      irelend = irel + o->reloc_count;
7476
0
      erel = external_relocs;
7477
0
      for (; irel < irelend; irel++, rel_hash++, erel += relsz)
7478
0
  bfd_coff_swap_reloc_out (abfd, (void *) irel, (void *) erel);
7479
7480
0
      rel_size = relsz * o->reloc_count;
7481
0
      if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
7482
0
    || bfd_write (external_relocs, rel_size, abfd) != rel_size)
7483
0
  goto error_return;
7484
0
    }
7485
7486
0
  free (external_relocs);
7487
0
  external_relocs = NULL;
7488
7489
  /* Free up the section information.  */
7490
0
  if (flinfo.section_info != NULL)
7491
0
    {
7492
0
      unsigned int i;
7493
7494
0
      for (i = 0; i < abfd->section_count; i++)
7495
0
  {
7496
0
    free (flinfo.section_info[i].relocs);
7497
0
    free (flinfo.section_info[i].rel_hashes);
7498
0
  }
7499
0
      free (flinfo.section_info);
7500
0
      flinfo.section_info = NULL;
7501
0
    }
7502
7503
  /* Write out the stub sections.  */
7504
0
  for (o = xcoff_hash_table (info)->params->stub_bfd->sections;
7505
0
       o != NULL; o = o->next)
7506
0
    {
7507
0
      if ((o->flags & SEC_HAS_CONTENTS) == 0
7508
0
    || o->size == 0)
7509
0
  continue;
7510
7511
0
      if (!bfd_set_section_contents (abfd, o->output_section, o->contents,
7512
0
             (file_ptr) o->output_offset, o->size))
7513
0
  goto error_return;
7514
0
    }
7515
7516
  /* Write out the loader section contents.  */
7517
0
  o = xcoff_hash_table (info)->loader_section;
7518
0
  if (o != NULL
7519
0
      && o->size != 0
7520
0
      && o->output_section != bfd_abs_section_ptr)
7521
0
    {
7522
0
      BFD_ASSERT ((bfd_byte *) flinfo.ldrel
7523
0
      == (xcoff_hash_table (info)->loader_section->contents
7524
0
          + xcoff_hash_table (info)->ldhdr.l_impoff));
7525
0
      if (!bfd_set_section_contents (abfd, o->output_section, o->contents,
7526
0
             (file_ptr) o->output_offset, o->size))
7527
0
  goto error_return;
7528
0
    }
7529
7530
  /* Write out the magic sections.  */
7531
0
  o = xcoff_hash_table (info)->linkage_section;
7532
0
  if (o != NULL
7533
0
      && o->size != 0
7534
0
      && o->output_section != bfd_abs_section_ptr
7535
0
      && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
7536
0
             (file_ptr) o->output_offset,
7537
0
             o->size))
7538
0
    goto error_return;
7539
0
  o = xcoff_hash_table (info)->toc_section;
7540
0
  if (o != NULL
7541
0
      && o->size != 0
7542
0
      && o->output_section != bfd_abs_section_ptr
7543
0
      && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
7544
0
             (file_ptr) o->output_offset,
7545
0
             o->size))
7546
0
    goto error_return;
7547
0
  o = xcoff_hash_table (info)->descriptor_section;
7548
0
  if (o != NULL
7549
0
      && o->size != 0
7550
0
      && o->output_section != bfd_abs_section_ptr
7551
0
      && ! bfd_set_section_contents (abfd, o->output_section, o->contents,
7552
0
             (file_ptr) o->output_offset,
7553
0
             o->size))
7554
0
    goto error_return;
7555
7556
  /* Write out the string table.  */
7557
0
  pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz;
7558
0
  if (bfd_seek (abfd, pos, SEEK_SET) != 0)
7559
0
    goto error_return;
7560
0
  H_PUT_32 (abfd,
7561
0
      _bfd_stringtab_size (flinfo.strtab) + STRING_SIZE_SIZE,
7562
0
      strbuf);
7563
0
  amt = STRING_SIZE_SIZE;
7564
0
  if (bfd_write (strbuf, amt, abfd) != amt)
7565
0
    goto error_return;
7566
0
  if (! _bfd_stringtab_emit (abfd, flinfo.strtab))
7567
0
    goto error_return;
7568
7569
0
  _bfd_stringtab_free (flinfo.strtab);
7570
7571
  /* Write out the debugging string table.  */
7572
0
  o = xcoff_hash_table (info)->debug_section;
7573
0
  if (o != NULL
7574
0
      && o->size != 0
7575
0
      && o->output_section != bfd_abs_section_ptr)
7576
0
    {
7577
0
      struct bfd_strtab_hash *debug_strtab;
7578
7579
0
      debug_strtab = xcoff_hash_table (info)->debug_strtab;
7580
0
      BFD_ASSERT (o->output_section->size - o->output_offset
7581
0
      >= _bfd_stringtab_size (debug_strtab));
7582
0
      pos = o->output_section->filepos + o->output_offset;
7583
0
      if (bfd_seek (abfd, pos, SEEK_SET) != 0)
7584
0
  goto error_return;
7585
0
      if (! _bfd_stringtab_emit (abfd, debug_strtab))
7586
0
  goto error_return;
7587
0
    }
7588
7589
  /* Setting symcount to 0 will cause write_object_contents to
7590
     not try to write out the symbols.  */
7591
0
  abfd->symcount = 0;
7592
7593
0
  return true;
7594
7595
0
 error_return:
7596
0
  if (flinfo.strtab != NULL)
7597
0
    _bfd_stringtab_free (flinfo.strtab);
7598
7599
0
  if (flinfo.section_info != NULL)
7600
0
    {
7601
0
      unsigned int i;
7602
7603
0
      for (i = 0; i < abfd->section_count; i++)
7604
0
  {
7605
0
    free (flinfo.section_info[i].relocs);
7606
0
    free (flinfo.section_info[i].rel_hashes);
7607
0
  }
7608
0
      free (flinfo.section_info);
7609
0
    }
7610
7611
0
  free (flinfo.internal_syms);
7612
0
  free (flinfo.sym_indices);
7613
0
  free (flinfo.outsyms);
7614
0
  free (flinfo.linenos);
7615
0
  free (flinfo.contents);
7616
0
  free (flinfo.external_relocs);
7617
0
  free (external_relocs);
7618
  return false;
7619
0
}