Coverage Report

Created: 2026-05-11 07:54

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