OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.3/] [bfd/] [sunos.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* BFD backend for SunOS binaries.
2
   Copyright 1990, 1991, 1992, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
3
   2002
4
   Free Software Foundation, Inc.
5
   Written by Cygnus Support.
6
 
7
This file is part of BFD, the Binary File Descriptor library.
8
 
9
This program is free software; you can redistribute it and/or modify
10
it under the terms of the GNU General Public License as published by
11
the Free Software Foundation; either version 2 of the License, or
12
(at your option) any later version.
13
 
14
This program is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
GNU General Public License for more details.
18
 
19
You should have received a copy of the GNU General Public License
20
along with this program; if not, write to the Free Software
21
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22
 
23
#define TARGETNAME "a.out-sunos-big"
24
 
25
/* Do not "beautify" the CONCAT* macro args.  Traditional C will not
26
   remove whitespace added here, and thus will fail to concatenate
27
   the tokens.  */
28
#define MY(OP) CONCAT2 (sunos_big_,OP)
29
 
30
#include "bfd.h"
31
#include "bfdlink.h"
32
#include "libaout.h"
33
 
34
/* Static routines defined in this file.  */
35
 
36
static boolean sunos_read_dynamic_info PARAMS ((bfd *));
37
static long sunos_get_dynamic_symtab_upper_bound PARAMS ((bfd *));
38
static boolean sunos_slurp_dynamic_symtab PARAMS ((bfd *));
39
static long sunos_canonicalize_dynamic_symtab PARAMS ((bfd *, asymbol **));
40
static long sunos_get_dynamic_reloc_upper_bound PARAMS ((bfd *));
41
static long sunos_canonicalize_dynamic_reloc
42
  PARAMS ((bfd *, arelent **, asymbol **));
43
static struct bfd_hash_entry *sunos_link_hash_newfunc
44
  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
45
static struct bfd_link_hash_table *sunos_link_hash_table_create
46
  PARAMS ((bfd *));
47
static boolean sunos_create_dynamic_sections
48
  PARAMS ((bfd *, struct bfd_link_info *, boolean));
49
static boolean sunos_add_dynamic_symbols
50
  PARAMS ((bfd *, struct bfd_link_info *, struct external_nlist **,
51
           bfd_size_type *, char **));
52
static boolean sunos_add_one_symbol
53
  PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword, asection *,
54
           bfd_vma, const char *, boolean, boolean,
55
           struct bfd_link_hash_entry **));
56
static boolean sunos_scan_relocs
57
  PARAMS ((struct bfd_link_info *, bfd *, asection *, bfd_size_type));
58
static boolean sunos_scan_std_relocs
59
  PARAMS ((struct bfd_link_info *, bfd *, asection *,
60
           const struct reloc_std_external *, bfd_size_type));
61
static boolean sunos_scan_ext_relocs
62
  PARAMS ((struct bfd_link_info *, bfd *, asection *,
63
           const struct reloc_ext_external *, bfd_size_type));
64
static boolean sunos_link_dynamic_object
65
  PARAMS ((struct bfd_link_info *, bfd *));
66
static boolean sunos_write_dynamic_symbol
67
  PARAMS ((bfd *, struct bfd_link_info *, struct aout_link_hash_entry *));
68
static boolean sunos_check_dynamic_reloc
69
  PARAMS ((struct bfd_link_info *, bfd *, asection *,
70
           struct aout_link_hash_entry *, PTR, bfd_byte *, boolean *,
71
           bfd_vma *));
72
static boolean sunos_finish_dynamic_link
73
  PARAMS ((bfd *, struct bfd_link_info *));
74
 
75
#define MY_get_dynamic_symtab_upper_bound sunos_get_dynamic_symtab_upper_bound
76
#define MY_canonicalize_dynamic_symtab sunos_canonicalize_dynamic_symtab
77
#define MY_get_dynamic_reloc_upper_bound sunos_get_dynamic_reloc_upper_bound
78
#define MY_canonicalize_dynamic_reloc sunos_canonicalize_dynamic_reloc
79
#define MY_bfd_link_hash_table_create sunos_link_hash_table_create
80
#define MY_add_dynamic_symbols sunos_add_dynamic_symbols
81
#define MY_add_one_symbol sunos_add_one_symbol
82
#define MY_link_dynamic_object sunos_link_dynamic_object
83
#define MY_write_dynamic_symbol sunos_write_dynamic_symbol
84
#define MY_check_dynamic_reloc sunos_check_dynamic_reloc
85
#define MY_finish_dynamic_link sunos_finish_dynamic_link
86
 
87
/* ??? Where should this go?  */
88
#define MACHTYPE_OK(mtype) \
89
  (((mtype) == M_SPARC && bfd_lookup_arch (bfd_arch_sparc, 0) != NULL) \
90
   || ((mtype) == M_SPARCLET \
91
       && bfd_lookup_arch (bfd_arch_sparc, bfd_mach_sparc_sparclet) != NULL) \
92
   || ((mtype) == M_SPARCLITE_LE \
93
       && bfd_lookup_arch (bfd_arch_sparc, bfd_mach_sparc_sparclet) != NULL) \
94
   || (((mtype) == M_UNKNOWN || (mtype) == M_68010 || (mtype) == M_68020) \
95
       && bfd_lookup_arch (bfd_arch_m68k, 0) != NULL))
96
 
97
/* Include the usual a.out support.  */
98
#include "aoutf1.h"
99
 
100
/* The SunOS 4.1.4 /usr/include/locale.h defines valid as a macro.  */
101
#undef valid
102
 
103
/* SunOS shared library support.  We store a pointer to this structure
104
   in obj_aout_dynamic_info (abfd).  */
105
 
106
struct sunos_dynamic_info
107
{
108
  /* Whether we found any dynamic information.  */
109
  boolean valid;
110
  /* Dynamic information.  */
111
  struct internal_sun4_dynamic_link dyninfo;
112
  /* Number of dynamic symbols.  */
113
  unsigned long dynsym_count;
114
  /* Read in nlists for dynamic symbols.  */
115
  struct external_nlist *dynsym;
116
  /* asymbol structures for dynamic symbols.  */
117
  aout_symbol_type *canonical_dynsym;
118
  /* Read in dynamic string table.  */
119
  char *dynstr;
120
  /* Number of dynamic relocs.  */
121
  unsigned long dynrel_count;
122
  /* Read in dynamic relocs.  This may be reloc_std_external or
123
     reloc_ext_external.  */
124
  PTR dynrel;
125
  /* arelent structures for dynamic relocs.  */
126
  arelent *canonical_dynrel;
127
};
128
 
129
/* The hash table of dynamic symbols is composed of two word entries.
130
   See include/aout/sun4.h for details.  */
131
 
132
#define HASH_ENTRY_SIZE (2 * BYTES_IN_WORD)
133
 
134
/* Read in the basic dynamic information.  This locates the __DYNAMIC
135
   structure and uses it to find the dynamic_link structure.  It
136
   creates and saves a sunos_dynamic_info structure.  If it can't find
137
   __DYNAMIC, it sets the valid field of the sunos_dynamic_info
138
   structure to false to avoid doing this work again.  */
139
 
140
static boolean
141
sunos_read_dynamic_info (abfd)
142
     bfd *abfd;
143
{
144
  struct sunos_dynamic_info *info;
145
  asection *dynsec;
146
  bfd_vma dynoff;
147
  struct external_sun4_dynamic dyninfo;
148
  unsigned long dynver;
149
  struct external_sun4_dynamic_link linkinfo;
150
  bfd_size_type amt;
151
 
152
  if (obj_aout_dynamic_info (abfd) != (PTR) NULL)
153
    return true;
154
 
155
  if ((abfd->flags & DYNAMIC) == 0)
156
    {
157
      bfd_set_error (bfd_error_invalid_operation);
158
      return false;
159
    }
160
 
161
  amt = sizeof (struct sunos_dynamic_info);
162
  info = (struct sunos_dynamic_info *) bfd_zalloc (abfd, amt);
163
  if (!info)
164
    return false;
165
  info->valid = false;
166
  info->dynsym = NULL;
167
  info->dynstr = NULL;
168
  info->canonical_dynsym = NULL;
169
  info->dynrel = NULL;
170
  info->canonical_dynrel = NULL;
171
  obj_aout_dynamic_info (abfd) = (PTR) info;
172
 
173
  /* This code used to look for the __DYNAMIC symbol to locate the dynamic
174
     linking information.
175
     However this inhibits recovering the dynamic symbols from a
176
     stripped object file, so blindly assume that the dynamic linking
177
     information is located at the start of the data section.
178
     We could verify this assumption later by looking through the dynamic
179
     symbols for the __DYNAMIC symbol.  */
180
  if ((abfd->flags & DYNAMIC) == 0)
181
    return true;
182
  if (! bfd_get_section_contents (abfd, obj_datasec (abfd), (PTR) &dyninfo,
183
                                  (file_ptr) 0,
184
                                  (bfd_size_type) sizeof dyninfo))
185
    return true;
186
 
187
  dynver = GET_WORD (abfd, dyninfo.ld_version);
188
  if (dynver != 2 && dynver != 3)
189
    return true;
190
 
191
  dynoff = GET_WORD (abfd, dyninfo.ld);
192
 
193
  /* dynoff is a virtual address.  It is probably always in the .data
194
     section, but this code should work even if it moves.  */
195
  if (dynoff < bfd_get_section_vma (abfd, obj_datasec (abfd)))
196
    dynsec = obj_textsec (abfd);
197
  else
198
    dynsec = obj_datasec (abfd);
199
  dynoff -= bfd_get_section_vma (abfd, dynsec);
200
  if (dynoff > bfd_section_size (abfd, dynsec))
201
    return true;
202
 
203
  /* This executable appears to be dynamically linked in a way that we
204
     can understand.  */
205
  if (! bfd_get_section_contents (abfd, dynsec, (PTR) &linkinfo,
206
                                  (file_ptr) dynoff,
207
                                  (bfd_size_type) sizeof linkinfo))
208
    return true;
209
 
210
  /* Swap in the dynamic link information.  */
211
  info->dyninfo.ld_loaded = GET_WORD (abfd, linkinfo.ld_loaded);
212
  info->dyninfo.ld_need = GET_WORD (abfd, linkinfo.ld_need);
213
  info->dyninfo.ld_rules = GET_WORD (abfd, linkinfo.ld_rules);
214
  info->dyninfo.ld_got = GET_WORD (abfd, linkinfo.ld_got);
215
  info->dyninfo.ld_plt = GET_WORD (abfd, linkinfo.ld_plt);
216
  info->dyninfo.ld_rel = GET_WORD (abfd, linkinfo.ld_rel);
217
  info->dyninfo.ld_hash = GET_WORD (abfd, linkinfo.ld_hash);
218
  info->dyninfo.ld_stab = GET_WORD (abfd, linkinfo.ld_stab);
219
  info->dyninfo.ld_stab_hash = GET_WORD (abfd, linkinfo.ld_stab_hash);
220
  info->dyninfo.ld_buckets = GET_WORD (abfd, linkinfo.ld_buckets);
221
  info->dyninfo.ld_symbols = GET_WORD (abfd, linkinfo.ld_symbols);
222
  info->dyninfo.ld_symb_size = GET_WORD (abfd, linkinfo.ld_symb_size);
223
  info->dyninfo.ld_text = GET_WORD (abfd, linkinfo.ld_text);
224
  info->dyninfo.ld_plt_sz = GET_WORD (abfd, linkinfo.ld_plt_sz);
225
 
226
  /* Reportedly the addresses need to be offset by the size of the
227
     exec header in an NMAGIC file.  */
228
  if (adata (abfd).magic == n_magic)
229
    {
230
      unsigned long exec_bytes_size = adata (abfd).exec_bytes_size;
231
 
232
      info->dyninfo.ld_need += exec_bytes_size;
233
      info->dyninfo.ld_rules += exec_bytes_size;
234
      info->dyninfo.ld_rel += exec_bytes_size;
235
      info->dyninfo.ld_hash += exec_bytes_size;
236
      info->dyninfo.ld_stab += exec_bytes_size;
237
      info->dyninfo.ld_symbols += exec_bytes_size;
238
    }
239
 
240
  /* The only way to get the size of the symbol information appears to
241
     be to determine the distance between it and the string table.  */
242
  info->dynsym_count = ((info->dyninfo.ld_symbols - info->dyninfo.ld_stab)
243
                        / EXTERNAL_NLIST_SIZE);
244
  BFD_ASSERT (info->dynsym_count * EXTERNAL_NLIST_SIZE
245
              == (unsigned long) (info->dyninfo.ld_symbols
246
                                  - info->dyninfo.ld_stab));
247
 
248
  /* Similarly, the relocs end at the hash table.  */
249
  info->dynrel_count = ((info->dyninfo.ld_hash - info->dyninfo.ld_rel)
250
                        / obj_reloc_entry_size (abfd));
251
  BFD_ASSERT (info->dynrel_count * obj_reloc_entry_size (abfd)
252
              == (unsigned long) (info->dyninfo.ld_hash
253
                                  - info->dyninfo.ld_rel));
254
 
255
  info->valid = true;
256
 
257
  return true;
258
}
259
 
260
/* Return the amount of memory required for the dynamic symbols.  */
261
 
262
static long
263
sunos_get_dynamic_symtab_upper_bound (abfd)
264
     bfd *abfd;
265
{
266
  struct sunos_dynamic_info *info;
267
 
268
  if (! sunos_read_dynamic_info (abfd))
269
    return -1;
270
 
271
  info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
272
  if (! info->valid)
273
    {
274
      bfd_set_error (bfd_error_no_symbols);
275
      return -1;
276
    }
277
 
278
  return (info->dynsym_count + 1) * sizeof (asymbol *);
279
}
280
 
281
/* Read the external dynamic symbols.  */
282
 
283
static boolean
284
sunos_slurp_dynamic_symtab (abfd)
285
     bfd *abfd;
286
{
287
  struct sunos_dynamic_info *info;
288
  bfd_size_type amt;
289
 
290
  /* Get the general dynamic information.  */
291
  if (obj_aout_dynamic_info (abfd) == NULL)
292
    {
293
      if (! sunos_read_dynamic_info (abfd))
294
          return false;
295
    }
296
 
297
  info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
298
  if (! info->valid)
299
    {
300
      bfd_set_error (bfd_error_no_symbols);
301
      return false;
302
    }
303
 
304
  /* Get the dynamic nlist structures.  */
305
  if (info->dynsym == (struct external_nlist *) NULL)
306
    {
307
      amt = (bfd_size_type) info->dynsym_count * EXTERNAL_NLIST_SIZE;
308
      info->dynsym = (struct external_nlist *) bfd_alloc (abfd, amt);
309
      if (info->dynsym == NULL && info->dynsym_count != 0)
310
        return false;
311
      if (bfd_seek (abfd, (file_ptr) info->dyninfo.ld_stab, SEEK_SET) != 0
312
          || bfd_bread ((PTR) info->dynsym, amt, abfd) != amt)
313
        {
314
          if (info->dynsym != NULL)
315
            {
316
              bfd_release (abfd, info->dynsym);
317
              info->dynsym = NULL;
318
            }
319
          return false;
320
        }
321
    }
322
 
323
  /* Get the dynamic strings.  */
324
  if (info->dynstr == (char *) NULL)
325
    {
326
      amt = info->dyninfo.ld_symb_size;
327
      info->dynstr = (char *) bfd_alloc (abfd, amt);
328
      if (info->dynstr == NULL && info->dyninfo.ld_symb_size != 0)
329
        return false;
330
      if (bfd_seek (abfd, (file_ptr) info->dyninfo.ld_symbols, SEEK_SET) != 0
331
          || bfd_bread ((PTR) info->dynstr, amt, abfd) != amt)
332
        {
333
          if (info->dynstr != NULL)
334
            {
335
              bfd_release (abfd, info->dynstr);
336
              info->dynstr = NULL;
337
            }
338
          return false;
339
        }
340
    }
341
 
342
  return true;
343
}
344
 
345
/* Read in the dynamic symbols.  */
346
 
347
static long
348
sunos_canonicalize_dynamic_symtab (abfd, storage)
349
     bfd *abfd;
350
     asymbol **storage;
351
{
352
  struct sunos_dynamic_info *info;
353
  unsigned long i;
354
 
355
  if (! sunos_slurp_dynamic_symtab (abfd))
356
    return -1;
357
 
358
  info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
359
 
360
#ifdef CHECK_DYNAMIC_HASH
361
  /* Check my understanding of the dynamic hash table by making sure
362
     that each symbol can be located in the hash table.  */
363
  {
364
    bfd_size_type table_size;
365
    bfd_byte *table;
366
    bfd_size_type i;
367
 
368
    if (info->dyninfo.ld_buckets > info->dynsym_count)
369
      abort ();
370
    table_size = info->dyninfo.ld_stab - info->dyninfo.ld_hash;
371
    table = (bfd_byte *) bfd_malloc (table_size);
372
    if (table == NULL && table_size != 0)
373
      abort ();
374
    if (bfd_seek (abfd, (file_ptr) info->dyninfo.ld_hash, SEEK_SET) != 0
375
        || bfd_bread ((PTR) table, table_size, abfd) != table_size)
376
      abort ();
377
    for (i = 0; i < info->dynsym_count; i++)
378
      {
379
        unsigned char *name;
380
        unsigned long hash;
381
 
382
        name = ((unsigned char *) info->dynstr
383
                + GET_WORD (abfd, info->dynsym[i].e_strx));
384
        hash = 0;
385
        while (*name != '\0')
386
          hash = (hash << 1) + *name++;
387
        hash &= 0x7fffffff;
388
        hash %= info->dyninfo.ld_buckets;
389
        while (GET_WORD (abfd, table + hash * HASH_ENTRY_SIZE) != i)
390
          {
391
            hash = GET_WORD (abfd,
392
                             table + hash * HASH_ENTRY_SIZE + BYTES_IN_WORD);
393
            if (hash == 0 || hash >= table_size / HASH_ENTRY_SIZE)
394
              abort ();
395
          }
396
      }
397
    free (table);
398
  }
399
#endif /* CHECK_DYNAMIC_HASH */
400
 
401
  /* Get the asymbol structures corresponding to the dynamic nlist
402
     structures.  */
403
  if (info->canonical_dynsym == (aout_symbol_type *) NULL)
404
    {
405
      bfd_size_type size;
406
      bfd_size_type strsize = info->dyninfo.ld_symb_size;
407
 
408
      size = (bfd_size_type) info->dynsym_count * sizeof (aout_symbol_type);
409
      info->canonical_dynsym = (aout_symbol_type *) bfd_alloc (abfd, size);
410
      if (info->canonical_dynsym == NULL && info->dynsym_count != 0)
411
        return -1;
412
 
413
      if (! aout_32_translate_symbol_table (abfd, info->canonical_dynsym,
414
                                            info->dynsym,
415
                                            (bfd_size_type) info->dynsym_count,
416
                                            info->dynstr, strsize, true))
417
        {
418
          if (info->canonical_dynsym != NULL)
419
            {
420
              bfd_release (abfd, info->canonical_dynsym);
421
              info->canonical_dynsym = NULL;
422
            }
423
          return -1;
424
        }
425
    }
426
 
427
  /* Return pointers to the dynamic asymbol structures.  */
428
  for (i = 0; i < info->dynsym_count; i++)
429
    *storage++ = (asymbol *) (info->canonical_dynsym + i);
430
  *storage = NULL;
431
 
432
  return info->dynsym_count;
433
}
434
 
435
/* Return the amount of memory required for the dynamic relocs.  */
436
 
437
static long
438
sunos_get_dynamic_reloc_upper_bound (abfd)
439
     bfd *abfd;
440
{
441
  struct sunos_dynamic_info *info;
442
 
443
  if (! sunos_read_dynamic_info (abfd))
444
    return -1;
445
 
446
  info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
447
  if (! info->valid)
448
    {
449
      bfd_set_error (bfd_error_no_symbols);
450
      return -1;
451
    }
452
 
453
  return (info->dynrel_count + 1) * sizeof (arelent *);
454
}
455
 
456
/* Read in the dynamic relocs.  */
457
 
458
static long
459
sunos_canonicalize_dynamic_reloc (abfd, storage, syms)
460
     bfd *abfd;
461
     arelent **storage;
462
     asymbol **syms;
463
{
464
  struct sunos_dynamic_info *info;
465
  unsigned long i;
466
  bfd_size_type size;
467
 
468
  /* Get the general dynamic information.  */
469
  if (obj_aout_dynamic_info (abfd) == (PTR) NULL)
470
    {
471
      if (! sunos_read_dynamic_info (abfd))
472
        return -1;
473
    }
474
 
475
  info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
476
  if (! info->valid)
477
    {
478
      bfd_set_error (bfd_error_no_symbols);
479
      return -1;
480
    }
481
 
482
  /* Get the dynamic reloc information.  */
483
  if (info->dynrel == NULL)
484
    {
485
      size = (bfd_size_type) info->dynrel_count * obj_reloc_entry_size (abfd);
486
      info->dynrel = (PTR) bfd_alloc (abfd, size);
487
      if (info->dynrel == NULL && size != 0)
488
        return -1;
489
      if (bfd_seek (abfd, (file_ptr) info->dyninfo.ld_rel, SEEK_SET) != 0
490
          || bfd_bread ((PTR) info->dynrel, size, abfd) != size)
491
        {
492
          if (info->dynrel != NULL)
493
            {
494
              bfd_release (abfd, info->dynrel);
495
              info->dynrel = NULL;
496
            }
497
          return -1;
498
        }
499
    }
500
 
501
  /* Get the arelent structures corresponding to the dynamic reloc
502
     information.  */
503
  if (info->canonical_dynrel == (arelent *) NULL)
504
    {
505
      arelent *to;
506
 
507
      size = (bfd_size_type) info->dynrel_count * sizeof (arelent);
508
      info->canonical_dynrel = (arelent *) bfd_alloc (abfd, size);
509
      if (info->canonical_dynrel == NULL && info->dynrel_count != 0)
510
        return -1;
511
 
512
      to = info->canonical_dynrel;
513
 
514
      if (obj_reloc_entry_size (abfd) == RELOC_EXT_SIZE)
515
        {
516
          register struct reloc_ext_external *p;
517
          struct reloc_ext_external *pend;
518
 
519
          p = (struct reloc_ext_external *) info->dynrel;
520
          pend = p + info->dynrel_count;
521
          for (; p < pend; p++, to++)
522
            NAME(aout,swap_ext_reloc_in) (abfd, p, to, syms,
523
                                          (bfd_size_type) info->dynsym_count);
524
        }
525
      else
526
        {
527
          register struct reloc_std_external *p;
528
          struct reloc_std_external *pend;
529
 
530
          p = (struct reloc_std_external *) info->dynrel;
531
          pend = p + info->dynrel_count;
532
          for (; p < pend; p++, to++)
533
            NAME(aout,swap_std_reloc_in) (abfd, p, to, syms,
534
                                          (bfd_size_type) info->dynsym_count);
535
        }
536
    }
537
 
538
  /* Return pointers to the dynamic arelent structures.  */
539
  for (i = 0; i < info->dynrel_count; i++)
540
    *storage++ = info->canonical_dynrel + i;
541
  *storage = NULL;
542
 
543
  return info->dynrel_count;
544
}
545
 
546
/* Code to handle linking of SunOS shared libraries.  */
547
 
548
/* A SPARC procedure linkage table entry is 12 bytes.  The first entry
549
   in the table is a jump which is filled in by the runtime linker.
550
   The remaining entries are branches back to the first entry,
551
   followed by an index into the relocation table encoded to look like
552
   a sethi of %g0.  */
553
 
554
#define SPARC_PLT_ENTRY_SIZE (12)
555
 
556
static const bfd_byte sparc_plt_first_entry[SPARC_PLT_ENTRY_SIZE] =
557
{
558
  /* sethi %hi(0),%g1; address filled in by runtime linker.  */
559
  0x3, 0, 0, 0,
560
  /* jmp %g1; offset filled in by runtime linker.  */
561
  0x81, 0xc0, 0x60, 0,
562
  /* nop */
563
  0x1, 0, 0, 0
564
};
565
 
566
/* save %sp, -96, %sp */
567
#define SPARC_PLT_ENTRY_WORD0 ((bfd_vma) 0x9de3bfa0)
568
/* call; address filled in later.  */
569
#define SPARC_PLT_ENTRY_WORD1 ((bfd_vma) 0x40000000)
570
/* sethi; reloc index filled in later.  */
571
#define SPARC_PLT_ENTRY_WORD2 ((bfd_vma) 0x01000000)
572
 
573
/* This sequence is used when for the jump table entry to a defined
574
   symbol in a complete executable.  It is used when linking PIC
575
   compiled code which is not being put into a shared library.  */
576
/* sethi <address to be filled in later>, %g1 */
577
#define SPARC_PLT_PIC_WORD0 ((bfd_vma) 0x03000000)
578
/* jmp %g1 + <address to be filled in later> */
579
#define SPARC_PLT_PIC_WORD1 ((bfd_vma) 0x81c06000)
580
/* nop */
581
#define SPARC_PLT_PIC_WORD2 ((bfd_vma) 0x01000000)
582
 
583
/* An m68k procedure linkage table entry is 8 bytes.  The first entry
584
   in the table is a jump which is filled in the by the runtime
585
   linker.  The remaining entries are branches back to the first
586
   entry, followed by a two byte index into the relocation table.  */
587
 
588
#define M68K_PLT_ENTRY_SIZE (8)
589
 
590
static const bfd_byte m68k_plt_first_entry[M68K_PLT_ENTRY_SIZE] =
591
{
592
  /* jmps @# */
593
  0x4e, 0xf9,
594
  /* Filled in by runtime linker with a magic address.  */
595
  0, 0, 0, 0,
596
  /* Not used?  */
597
  0, 0
598
};
599
 
600
/* bsrl */
601
#define M68K_PLT_ENTRY_WORD0 ((bfd_vma) 0x61ff)
602
/* Remaining words filled in later.  */
603
 
604
/* An entry in the SunOS linker hash table.  */
605
 
606
struct sunos_link_hash_entry
607
{
608
  struct aout_link_hash_entry root;
609
 
610
  /* If this is a dynamic symbol, this is its index into the dynamic
611
     symbol table.  This is initialized to -1.  As the linker looks at
612
     the input files, it changes this to -2 if it will be added to the
613
     dynamic symbol table.  After all the input files have been seen,
614
     the linker will know whether to build a dynamic symbol table; if
615
     it does build one, this becomes the index into the table.  */
616
  long dynindx;
617
 
618
  /* If this is a dynamic symbol, this is the index of the name in the
619
     dynamic symbol string table.  */
620
  long dynstr_index;
621
 
622
  /* The offset into the global offset table used for this symbol.  If
623
     the symbol does not require a GOT entry, this is 0.  */
624
  bfd_vma got_offset;
625
 
626
  /* The offset into the procedure linkage table used for this symbol.
627
     If the symbol does not require a PLT entry, this is 0.  */
628
  bfd_vma plt_offset;
629
 
630
  /* Some linker flags.  */
631
  unsigned char flags;
632
  /* Symbol is referenced by a regular object.  */
633
#define SUNOS_REF_REGULAR 01
634
  /* Symbol is defined by a regular object.  */
635
#define SUNOS_DEF_REGULAR 02
636
  /* Symbol is referenced by a dynamic object.  */
637
#define SUNOS_REF_DYNAMIC 04
638
  /* Symbol is defined by a dynamic object.  */
639
#define SUNOS_DEF_DYNAMIC 010
640
  /* Symbol is a constructor symbol in a regular object.  */
641
#define SUNOS_CONSTRUCTOR 020
642
};
643
 
644
/* The SunOS linker hash table.  */
645
 
646
struct sunos_link_hash_table
647
{
648
  struct aout_link_hash_table root;
649
 
650
  /* The object which holds the dynamic sections.  */
651
  bfd *dynobj;
652
 
653
  /* Whether we have created the dynamic sections.  */
654
  boolean dynamic_sections_created;
655
 
656
  /* Whether we need the dynamic sections.  */
657
  boolean dynamic_sections_needed;
658
 
659
  /* Whether we need the .got table.  */
660
  boolean got_needed;
661
 
662
  /* The number of dynamic symbols.  */
663
  size_t dynsymcount;
664
 
665
  /* The number of buckets in the hash table.  */
666
  size_t bucketcount;
667
 
668
  /* The list of dynamic objects needed by dynamic objects included in
669
     the link.  */
670
  struct bfd_link_needed_list *needed;
671
 
672
  /* The offset of __GLOBAL_OFFSET_TABLE_ into the .got section.  */
673
  bfd_vma got_base;
674
};
675
 
676
/* Routine to create an entry in an SunOS link hash table.  */
677
 
678
static struct bfd_hash_entry *
679
sunos_link_hash_newfunc (entry, table, string)
680
     struct bfd_hash_entry *entry;
681
     struct bfd_hash_table *table;
682
     const char *string;
683
{
684
  struct sunos_link_hash_entry *ret = (struct sunos_link_hash_entry *) entry;
685
 
686
  /* Allocate the structure if it has not already been allocated by a
687
     subclass.  */
688
  if (ret == (struct sunos_link_hash_entry *) NULL)
689
    ret = ((struct sunos_link_hash_entry *)
690
           bfd_hash_allocate (table, sizeof (struct sunos_link_hash_entry)));
691
  if (ret == (struct sunos_link_hash_entry *) NULL)
692
    return (struct bfd_hash_entry *) ret;
693
 
694
  /* Call the allocation method of the superclass.  */
695
  ret = ((struct sunos_link_hash_entry *)
696
         NAME(aout,link_hash_newfunc) ((struct bfd_hash_entry *) ret,
697
                                       table, string));
698
  if (ret != NULL)
699
    {
700
      /* Set local fields.  */
701
      ret->dynindx = -1;
702
      ret->dynstr_index = -1;
703
      ret->got_offset = 0;
704
      ret->plt_offset = 0;
705
      ret->flags = 0;
706
    }
707
 
708
  return (struct bfd_hash_entry *) ret;
709
}
710
 
711
/* Create a SunOS link hash table.  */
712
 
713
static struct bfd_link_hash_table *
714
sunos_link_hash_table_create (abfd)
715
     bfd *abfd;
716
{
717
  struct sunos_link_hash_table *ret;
718
  bfd_size_type amt = sizeof (struct sunos_link_hash_table);
719
 
720
  ret = (struct sunos_link_hash_table *) bfd_malloc (amt);
721
  if (ret == (struct sunos_link_hash_table *) NULL)
722
    return (struct bfd_link_hash_table *) NULL;
723
  if (! NAME(aout,link_hash_table_init) (&ret->root, abfd,
724
                                         sunos_link_hash_newfunc))
725
    {
726
      free (ret);
727
      return (struct bfd_link_hash_table *) NULL;
728
    }
729
 
730
  ret->dynobj = NULL;
731
  ret->dynamic_sections_created = false;
732
  ret->dynamic_sections_needed = false;
733
  ret->got_needed = false;
734
  ret->dynsymcount = 0;
735
  ret->bucketcount = 0;
736
  ret->needed = NULL;
737
  ret->got_base = 0;
738
 
739
  return &ret->root.root;
740
}
741
 
742
/* Look up an entry in an SunOS link hash table.  */
743
 
744
#define sunos_link_hash_lookup(table, string, create, copy, follow) \
745
  ((struct sunos_link_hash_entry *) \
746
   aout_link_hash_lookup (&(table)->root, (string), (create), (copy),\
747
                          (follow)))
748
 
749
/* Traverse a SunOS link hash table.  */
750
 
751
#define sunos_link_hash_traverse(table, func, info)                     \
752
  (aout_link_hash_traverse                                              \
753
   (&(table)->root,                                                     \
754
    (boolean (*) PARAMS ((struct aout_link_hash_entry *, PTR))) (func), \
755
    (info)))
756
 
757
/* Get the SunOS link hash table from the info structure.  This is
758
   just a cast.  */
759
 
760
#define sunos_hash_table(p) ((struct sunos_link_hash_table *) ((p)->hash))
761
 
762
static boolean sunos_scan_dynamic_symbol
763
  PARAMS ((struct sunos_link_hash_entry *, PTR));
764
 
765
/* Create the dynamic sections needed if we are linking against a
766
   dynamic object, or if we are linking PIC compiled code.  ABFD is a
767
   bfd we can attach the dynamic sections to.  The linker script will
768
   look for these special sections names and put them in the right
769
   place in the output file.  See include/aout/sun4.h for more details
770
   of the dynamic linking information.  */
771
 
772
static boolean
773
sunos_create_dynamic_sections (abfd, info, needed)
774
     bfd *abfd;
775
     struct bfd_link_info *info;
776
     boolean needed;
777
{
778
  asection *s;
779
 
780
  if (! sunos_hash_table (info)->dynamic_sections_created)
781
    {
782
      flagword flags;
783
 
784
      sunos_hash_table (info)->dynobj = abfd;
785
 
786
      flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
787
               | SEC_LINKER_CREATED);
788
 
789
      /* The .dynamic section holds the basic dynamic information: the
790
         sun4_dynamic structure, the dynamic debugger information, and
791
         the sun4_dynamic_link structure.  */
792
      s = bfd_make_section (abfd, ".dynamic");
793
      if (s == NULL
794
          || ! bfd_set_section_flags (abfd, s, flags)
795
          || ! bfd_set_section_alignment (abfd, s, 2))
796
        return false;
797
 
798
      /* The .got section holds the global offset table.  The address
799
         is put in the ld_got field.  */
800
      s = bfd_make_section (abfd, ".got");
801
      if (s == NULL
802
          || ! bfd_set_section_flags (abfd, s, flags)
803
          || ! bfd_set_section_alignment (abfd, s, 2))
804
        return false;
805
 
806
      /* The .plt section holds the procedure linkage table.  The
807
         address is put in the ld_plt field.  */
808
      s = bfd_make_section (abfd, ".plt");
809
      if (s == NULL
810
          || ! bfd_set_section_flags (abfd, s, flags | SEC_CODE)
811
          || ! bfd_set_section_alignment (abfd, s, 2))
812
        return false;
813
 
814
      /* The .dynrel section holds the dynamic relocs.  The address is
815
         put in the ld_rel field.  */
816
      s = bfd_make_section (abfd, ".dynrel");
817
      if (s == NULL
818
          || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
819
          || ! bfd_set_section_alignment (abfd, s, 2))
820
        return false;
821
 
822
      /* The .hash section holds the dynamic hash table.  The address
823
         is put in the ld_hash field.  */
824
      s = bfd_make_section (abfd, ".hash");
825
      if (s == NULL
826
          || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
827
          || ! bfd_set_section_alignment (abfd, s, 2))
828
        return false;
829
 
830
      /* The .dynsym section holds the dynamic symbols.  The address
831
         is put in the ld_stab field.  */
832
      s = bfd_make_section (abfd, ".dynsym");
833
      if (s == NULL
834
          || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
835
          || ! bfd_set_section_alignment (abfd, s, 2))
836
        return false;
837
 
838
      /* The .dynstr section holds the dynamic symbol string table.
839
         The address is put in the ld_symbols field.  */
840
      s = bfd_make_section (abfd, ".dynstr");
841
      if (s == NULL
842
          || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
843
          || ! bfd_set_section_alignment (abfd, s, 2))
844
        return false;
845
 
846
      sunos_hash_table (info)->dynamic_sections_created = true;
847
    }
848
 
849
  if ((needed && ! sunos_hash_table (info)->dynamic_sections_needed)
850
      || info->shared)
851
    {
852
      bfd *dynobj;
853
 
854
      dynobj = sunos_hash_table (info)->dynobj;
855
 
856
      s = bfd_get_section_by_name (dynobj, ".got");
857
      if (s->_raw_size == 0)
858
        s->_raw_size = BYTES_IN_WORD;
859
 
860
      sunos_hash_table (info)->dynamic_sections_needed = true;
861
      sunos_hash_table (info)->got_needed = true;
862
    }
863
 
864
  return true;
865
}
866
 
867
/* Add dynamic symbols during a link.  This is called by the a.out
868
   backend linker for each object it encounters.  */
869
 
870
static boolean
871
sunos_add_dynamic_symbols (abfd, info, symsp, sym_countp, stringsp)
872
     bfd *abfd;
873
     struct bfd_link_info *info;
874
     struct external_nlist **symsp;
875
     bfd_size_type *sym_countp;
876
     char **stringsp;
877
{
878
  bfd *dynobj;
879
  struct sunos_dynamic_info *dinfo;
880
  unsigned long need;
881
  asection **ps;
882
 
883
  /* Make sure we have all the required sections.  */
884
  if (info->hash->creator == abfd->xvec)
885
    {
886
      if (! sunos_create_dynamic_sections (abfd, info,
887
                                           (((abfd->flags & DYNAMIC) != 0
888
                                             && ! info->relocateable)
889
                                            ? true
890
                                            : false)))
891
        return false;
892
    }
893
 
894
  /* There is nothing else to do for a normal object.  */
895
  if ((abfd->flags & DYNAMIC) == 0)
896
    return true;
897
 
898
  dynobj = sunos_hash_table (info)->dynobj;
899
 
900
  /* We do not want to include the sections in a dynamic object in the
901
     output file.  We hack by simply clobbering the list of sections
902
     in the BFD.  This could be handled more cleanly by, say, a new
903
     section flag; the existing SEC_NEVER_LOAD flag is not the one we
904
     want, because that one still implies that the section takes up
905
     space in the output file.  If this is the first object we have
906
     seen, we must preserve the dynamic sections we just created.  */
907
  for (ps = &abfd->sections; *ps != NULL; )
908
    {
909
      if (abfd != dynobj || ((*ps)->flags & SEC_LINKER_CREATED) == 0)
910
        bfd_section_list_remove (abfd, ps);
911
      else
912
        ps = &(*ps)->next;
913
    }
914
 
915
  /* The native linker seems to just ignore dynamic objects when -r is
916
     used.  */
917
  if (info->relocateable)
918
    return true;
919
 
920
  /* There's no hope of using a dynamic object which does not exactly
921
     match the format of the output file.  */
922
  if (info->hash->creator != abfd->xvec)
923
    {
924
      bfd_set_error (bfd_error_invalid_operation);
925
      return false;
926
    }
927
 
928
  /* Make sure we have a .need and a .rules sections.  These are only
929
     needed if there really is a dynamic object in the link, so they
930
     are not added by sunos_create_dynamic_sections.  */
931
  if (bfd_get_section_by_name (dynobj, ".need") == NULL)
932
    {
933
      /* The .need section holds the list of names of shared objets
934
         which must be included at runtime.  The address of this
935
         section is put in the ld_need field.  */
936
      asection *s = bfd_make_section (dynobj, ".need");
937
      if (s == NULL
938
          || ! bfd_set_section_flags (dynobj, s,
939
                                      (SEC_ALLOC
940
                                       | SEC_LOAD
941
                                       | SEC_HAS_CONTENTS
942
                                       | SEC_IN_MEMORY
943
                                       | SEC_READONLY))
944
          || ! bfd_set_section_alignment (dynobj, s, 2))
945
        return false;
946
    }
947
 
948
  if (bfd_get_section_by_name (dynobj, ".rules") == NULL)
949
    {
950
      /* The .rules section holds the path to search for shared
951
         objects.  The address of this section is put in the ld_rules
952
         field.  */
953
      asection *s = bfd_make_section (dynobj, ".rules");
954
      if (s == NULL
955
          || ! bfd_set_section_flags (dynobj, s,
956
                                      (SEC_ALLOC
957
                                       | SEC_LOAD
958
                                       | SEC_HAS_CONTENTS
959
                                       | SEC_IN_MEMORY
960
                                       | SEC_READONLY))
961
          || ! bfd_set_section_alignment (dynobj, s, 2))
962
        return false;
963
    }
964
 
965
  /* Pick up the dynamic symbols and return them to the caller.  */
966
  if (! sunos_slurp_dynamic_symtab (abfd))
967
    return false;
968
 
969
  dinfo = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
970
  *symsp = dinfo->dynsym;
971
  *sym_countp = dinfo->dynsym_count;
972
  *stringsp = dinfo->dynstr;
973
 
974
  /* Record information about any other objects needed by this one.  */
975
  need = dinfo->dyninfo.ld_need;
976
  while (need != 0)
977
    {
978
      bfd_byte buf[16];
979
      unsigned long name, flags;
980
      unsigned short major_vno, minor_vno;
981
      struct bfd_link_needed_list *needed, **pp;
982
      char *namebuf, *p;
983
      bfd_size_type alc;
984
      bfd_byte b;
985
      char *namecopy;
986
 
987
      if (bfd_seek (abfd, (file_ptr) need, SEEK_SET) != 0
988
          || bfd_bread (buf, (bfd_size_type) 16, abfd) != 16)
989
        return false;
990
 
991
      /* For the format of an ld_need entry, see aout/sun4.h.  We
992
         should probably define structs for this manipulation.  */
993
 
994
      name = bfd_get_32 (abfd, buf);
995
      flags = bfd_get_32 (abfd, buf + 4);
996
      major_vno = (unsigned short) bfd_get_16 (abfd, buf + 8);
997
      minor_vno = (unsigned short) bfd_get_16 (abfd, buf + 10);
998
      need = bfd_get_32 (abfd, buf + 12);
999
 
1000
      alc = sizeof (struct bfd_link_needed_list);
1001
      needed = (struct bfd_link_needed_list *) bfd_alloc (abfd, alc);
1002
      if (needed == NULL)
1003
        return false;
1004
      needed->by = abfd;
1005
 
1006
      /* We return the name as [-l]name[.maj][.min].  */
1007
      alc = 30;
1008
      namebuf = (char *) bfd_malloc (alc + 1);
1009
      if (namebuf == NULL)
1010
        return false;
1011
      p = namebuf;
1012
 
1013
      if ((flags & 0x80000000) != 0)
1014
        {
1015
          *p++ = '-';
1016
          *p++ = 'l';
1017
        }
1018
      if (bfd_seek (abfd, (file_ptr) name, SEEK_SET) != 0)
1019
        {
1020
          free (namebuf);
1021
          return false;
1022
        }
1023
 
1024
      do
1025
        {
1026
          if (bfd_bread (&b, (bfd_size_type) 1, abfd) != 1)
1027
            {
1028
              free (namebuf);
1029
              return false;
1030
            }
1031
 
1032
          if ((bfd_size_type) (p - namebuf) >= alc)
1033
            {
1034
              char *n;
1035
 
1036
              alc *= 2;
1037
              n = (char *) bfd_realloc (namebuf, alc + 1);
1038
              if (n == NULL)
1039
                {
1040
                  free (namebuf);
1041
                  return false;
1042
                }
1043
              p = n + (p - namebuf);
1044
              namebuf = n;
1045
            }
1046
 
1047
          *p++ = b;
1048
        }
1049
      while (b != '\0');
1050
 
1051
      if (major_vno == 0)
1052
        *p = '\0';
1053
      else
1054
        {
1055
          char majbuf[30];
1056
          char minbuf[30];
1057
 
1058
          sprintf (majbuf, ".%d", major_vno);
1059
          if (minor_vno == 0)
1060
            minbuf[0] = '\0';
1061
          else
1062
            sprintf (minbuf, ".%d", minor_vno);
1063
 
1064
          if ((p - namebuf) + strlen (majbuf) + strlen (minbuf) >= alc)
1065
            {
1066
              char *n;
1067
 
1068
              alc = (p - namebuf) + strlen (majbuf) + strlen (minbuf);
1069
              n = (char *) bfd_realloc (namebuf, alc + 1);
1070
              if (n == NULL)
1071
                {
1072
                  free (namebuf);
1073
                  return false;
1074
                }
1075
              p = n + (p - namebuf);
1076
              namebuf = n;
1077
            }
1078
 
1079
          strcpy (p, majbuf);
1080
          strcat (p, minbuf);
1081
        }
1082
 
1083
      namecopy = bfd_alloc (abfd, (bfd_size_type) strlen (namebuf) + 1);
1084
      if (namecopy == NULL)
1085
        {
1086
          free (namebuf);
1087
          return false;
1088
        }
1089
      strcpy (namecopy, namebuf);
1090
      free (namebuf);
1091
      needed->name = namecopy;
1092
 
1093
      needed->next = NULL;
1094
 
1095
      for (pp = &sunos_hash_table (info)->needed;
1096
           *pp != NULL;
1097
           pp = &(*pp)->next)
1098
        ;
1099
      *pp = needed;
1100
    }
1101
 
1102
  return true;
1103
}
1104
 
1105
/* Function to add a single symbol to the linker hash table.  This is
1106
   a wrapper around _bfd_generic_link_add_one_symbol which handles the
1107
   tweaking needed for dynamic linking support.  */
1108
 
1109
static boolean
1110
sunos_add_one_symbol (info, abfd, name, flags, section, value, string,
1111
                      copy, collect, hashp)
1112
     struct bfd_link_info *info;
1113
     bfd *abfd;
1114
     const char *name;
1115
     flagword flags;
1116
     asection *section;
1117
     bfd_vma value;
1118
     const char *string;
1119
     boolean copy;
1120
     boolean collect;
1121
     struct bfd_link_hash_entry **hashp;
1122
{
1123
  struct sunos_link_hash_entry *h;
1124
  int new_flag;
1125
 
1126
  if ((flags & (BSF_INDIRECT | BSF_WARNING | BSF_CONSTRUCTOR)) != 0
1127
      || ! bfd_is_und_section (section))
1128
    h = sunos_link_hash_lookup (sunos_hash_table (info), name, true, copy,
1129
                                false);
1130
  else
1131
    h = ((struct sunos_link_hash_entry *)
1132
         bfd_wrapped_link_hash_lookup (abfd, info, name, true, copy, false));
1133
  if (h == NULL)
1134
    return false;
1135
 
1136
  if (hashp != NULL)
1137
    *hashp = (struct bfd_link_hash_entry *) h;
1138
 
1139
  /* Treat a common symbol in a dynamic object as defined in the .bss
1140
     section of the dynamic object.  We don't want to allocate space
1141
     for it in our process image.  */
1142
  if ((abfd->flags & DYNAMIC) != 0
1143
      && bfd_is_com_section (section))
1144
    section = obj_bsssec (abfd);
1145
 
1146
  if (! bfd_is_und_section (section)
1147
      && h->root.root.type != bfd_link_hash_new
1148
      && h->root.root.type != bfd_link_hash_undefined
1149
      && h->root.root.type != bfd_link_hash_defweak)
1150
    {
1151
      /* We are defining the symbol, and it is already defined.  This
1152
         is a potential multiple definition error.  */
1153
      if ((abfd->flags & DYNAMIC) != 0)
1154
        {
1155
          /* The definition we are adding is from a dynamic object.
1156
             We do not want this new definition to override the
1157
             existing definition, so we pretend it is just a
1158
             reference.  */
1159
          section = bfd_und_section_ptr;
1160
        }
1161
      else if (h->root.root.type == bfd_link_hash_defined
1162
               && h->root.root.u.def.section->owner != NULL
1163
               && (h->root.root.u.def.section->owner->flags & DYNAMIC) != 0)
1164
        {
1165
          /* The existing definition is from a dynamic object.  We
1166
             want to override it with the definition we just found.
1167
             Clobber the existing definition.  */
1168
          h->root.root.type = bfd_link_hash_undefined;
1169
          h->root.root.u.undef.abfd = h->root.root.u.def.section->owner;
1170
        }
1171
      else if (h->root.root.type == bfd_link_hash_common
1172
               && (h->root.root.u.c.p->section->owner->flags & DYNAMIC) != 0)
1173
        {
1174
          /* The existing definition is from a dynamic object.  We
1175
             want to override it with the definition we just found.
1176
             Clobber the existing definition.  We can't set it to new,
1177
             because it is on the undefined list.  */
1178
          h->root.root.type = bfd_link_hash_undefined;
1179
          h->root.root.u.undef.abfd = h->root.root.u.c.p->section->owner;
1180
        }
1181
    }
1182
 
1183
  if ((abfd->flags & DYNAMIC) != 0
1184
      && abfd->xvec == info->hash->creator
1185
      && (h->flags & SUNOS_CONSTRUCTOR) != 0)
1186
    {
1187
      /* The existing symbol is a constructor symbol, and this symbol
1188
         is from a dynamic object.  A constructor symbol is actually a
1189
         definition, although the type will be bfd_link_hash_undefined
1190
         at this point.  We want to ignore the definition from the
1191
         dynamic object.  */
1192
      section = bfd_und_section_ptr;
1193
    }
1194
  else if ((flags & BSF_CONSTRUCTOR) != 0
1195
           && (abfd->flags & DYNAMIC) == 0
1196
           && h->root.root.type == bfd_link_hash_defined
1197
           && h->root.root.u.def.section->owner != NULL
1198
           && (h->root.root.u.def.section->owner->flags & DYNAMIC) != 0)
1199
    {
1200
      /* The existing symbol is defined by a dynamic object, and this
1201
         is a constructor symbol.  As above, we want to force the use
1202
         of the constructor symbol from the regular object.  */
1203
      h->root.root.type = bfd_link_hash_new;
1204
    }
1205
 
1206
  /* Do the usual procedure for adding a symbol.  */
1207
  if (! _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section,
1208
                                          value, string, copy, collect,
1209
                                          hashp))
1210
    return false;
1211
 
1212
  if (abfd->xvec == info->hash->creator)
1213
    {
1214
      /* Set a flag in the hash table entry indicating the type of
1215
         reference or definition we just found.  Keep a count of the
1216
         number of dynamic symbols we find.  A dynamic symbol is one
1217
         which is referenced or defined by both a regular object and a
1218
         shared object.  */
1219
      if ((abfd->flags & DYNAMIC) == 0)
1220
        {
1221
          if (bfd_is_und_section (section))
1222
            new_flag = SUNOS_REF_REGULAR;
1223
          else
1224
            new_flag = SUNOS_DEF_REGULAR;
1225
        }
1226
      else
1227
        {
1228
          if (bfd_is_und_section (section))
1229
            new_flag = SUNOS_REF_DYNAMIC;
1230
          else
1231
            new_flag = SUNOS_DEF_DYNAMIC;
1232
        }
1233
      h->flags |= new_flag;
1234
 
1235
      if (h->dynindx == -1
1236
          && (h->flags & (SUNOS_DEF_REGULAR | SUNOS_REF_REGULAR)) != 0)
1237
        {
1238
          ++sunos_hash_table (info)->dynsymcount;
1239
          h->dynindx = -2;
1240
        }
1241
 
1242
      if ((flags & BSF_CONSTRUCTOR) != 0
1243
          && (abfd->flags & DYNAMIC) == 0)
1244
        h->flags |= SUNOS_CONSTRUCTOR;
1245
    }
1246
 
1247
  return true;
1248
}
1249
 
1250
/* Return the list of objects needed by BFD.  */
1251
 
1252
/*ARGSUSED*/
1253
struct bfd_link_needed_list *
1254
bfd_sunos_get_needed_list (abfd, info)
1255
     bfd *abfd ATTRIBUTE_UNUSED;
1256
     struct bfd_link_info *info;
1257
{
1258
  if (info->hash->creator != &MY(vec))
1259
    return NULL;
1260
  return sunos_hash_table (info)->needed;
1261
}
1262
 
1263
/* Record an assignment made to a symbol by a linker script.  We need
1264
   this in case some dynamic object refers to this symbol.  */
1265
 
1266
boolean
1267
bfd_sunos_record_link_assignment (output_bfd, info, name)
1268
     bfd *output_bfd;
1269
     struct bfd_link_info *info;
1270
     const char *name;
1271
{
1272
  struct sunos_link_hash_entry *h;
1273
 
1274
  if (output_bfd->xvec != &MY(vec))
1275
    return true;
1276
 
1277
  /* This is called after we have examined all the input objects.  If
1278
     the symbol does not exist, it merely means that no object refers
1279
     to it, and we can just ignore it at this point.  */
1280
  h = sunos_link_hash_lookup (sunos_hash_table (info), name,
1281
                              false, false, false);
1282
  if (h == NULL)
1283
    return true;
1284
 
1285
  /* In a shared library, the __DYNAMIC symbol does not appear in the
1286
     dynamic symbol table.  */
1287
  if (! info->shared || strcmp (name, "__DYNAMIC") != 0)
1288
    {
1289
      h->flags |= SUNOS_DEF_REGULAR;
1290
 
1291
      if (h->dynindx == -1)
1292
        {
1293
          ++sunos_hash_table (info)->dynsymcount;
1294
          h->dynindx = -2;
1295
        }
1296
    }
1297
 
1298
  return true;
1299
}
1300
 
1301
/* Set up the sizes and contents of the dynamic sections created in
1302
   sunos_add_dynamic_symbols.  This is called by the SunOS linker
1303
   emulation before_allocation routine.  We must set the sizes of the
1304
   sections before the linker sets the addresses of the various
1305
   sections.  This unfortunately requires reading all the relocs so
1306
   that we can work out which ones need to become dynamic relocs.  If
1307
   info->keep_memory is true, we keep the relocs in memory; otherwise,
1308
   we discard them, and will read them again later.  */
1309
 
1310
boolean
1311
bfd_sunos_size_dynamic_sections (output_bfd, info, sdynptr, sneedptr,
1312
                                 srulesptr)
1313
     bfd *output_bfd;
1314
     struct bfd_link_info *info;
1315
     asection **sdynptr;
1316
     asection **sneedptr;
1317
     asection **srulesptr;
1318
{
1319
  bfd *dynobj;
1320
  bfd_size_type dynsymcount;
1321
  struct sunos_link_hash_entry *h;
1322
  asection *s;
1323
  size_t bucketcount;
1324
  bfd_size_type hashalloc;
1325
  size_t i;
1326
  bfd *sub;
1327
 
1328
  *sdynptr = NULL;
1329
  *sneedptr = NULL;
1330
  *srulesptr = NULL;
1331
 
1332
  if (info->relocateable)
1333
    return true;
1334
 
1335
  if (output_bfd->xvec != &MY(vec))
1336
    return true;
1337
 
1338
  /* Look through all the input BFD's and read their relocs.  It would
1339
     be better if we didn't have to do this, but there is no other way
1340
     to determine the number of dynamic relocs we need, and, more
1341
     importantly, there is no other way to know which symbols should
1342
     get an entry in the procedure linkage table.  */
1343
  for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
1344
    {
1345
      if ((sub->flags & DYNAMIC) == 0
1346
          && sub->xvec == output_bfd->xvec)
1347
        {
1348
          if (! sunos_scan_relocs (info, sub, obj_textsec (sub),
1349
                                   exec_hdr (sub)->a_trsize)
1350
              || ! sunos_scan_relocs (info, sub, obj_datasec (sub),
1351
                                      exec_hdr (sub)->a_drsize))
1352
            return false;
1353
        }
1354
    }
1355
 
1356
  dynobj = sunos_hash_table (info)->dynobj;
1357
  dynsymcount = sunos_hash_table (info)->dynsymcount;
1358
 
1359
  /* If there were no dynamic objects in the link, and we don't need
1360
     to build a global offset table, there is nothing to do here.  */
1361
  if (! sunos_hash_table (info)->dynamic_sections_needed
1362
      && ! sunos_hash_table (info)->got_needed)
1363
    return true;
1364
 
1365
  /* If __GLOBAL_OFFSET_TABLE_ was mentioned, define it.  */
1366
  h = sunos_link_hash_lookup (sunos_hash_table (info),
1367
                              "__GLOBAL_OFFSET_TABLE_", false, false, false);
1368
  if (h != NULL && (h->flags & SUNOS_REF_REGULAR) != 0)
1369
    {
1370
      h->flags |= SUNOS_DEF_REGULAR;
1371
      if (h->dynindx == -1)
1372
        {
1373
          ++sunos_hash_table (info)->dynsymcount;
1374
          h->dynindx = -2;
1375
        }
1376
      h->root.root.type = bfd_link_hash_defined;
1377
      h->root.root.u.def.section = bfd_get_section_by_name (dynobj, ".got");
1378
 
1379
      /* If the .got section is more than 0x1000 bytes, we set
1380
         __GLOBAL_OFFSET_TABLE_ to be 0x1000 bytes into the section,
1381
         so that 13 bit relocations have a greater chance of working.  */
1382
      s = bfd_get_section_by_name (dynobj, ".got");
1383
      BFD_ASSERT (s != NULL);
1384
      if (s->_raw_size >= 0x1000)
1385
        h->root.root.u.def.value = 0x1000;
1386
      else
1387
        h->root.root.u.def.value = 0;
1388
 
1389
      sunos_hash_table (info)->got_base = h->root.root.u.def.value;
1390
    }
1391
 
1392
  /* If there are any shared objects in the link, then we need to set
1393
     up the dynamic linking information.  */
1394
  if (sunos_hash_table (info)->dynamic_sections_needed)
1395
    {
1396
      *sdynptr = bfd_get_section_by_name (dynobj, ".dynamic");
1397
 
1398
      /* The .dynamic section is always the same size.  */
1399
      s = *sdynptr;
1400
      BFD_ASSERT (s != NULL);
1401
      s->_raw_size = (sizeof (struct external_sun4_dynamic)
1402
                      + EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE
1403
                      + sizeof (struct external_sun4_dynamic_link));
1404
 
1405
      /* Set the size of the .dynsym and .hash sections.  We counted
1406
         the number of dynamic symbols as we read the input files.  We
1407
         will build the dynamic symbol table (.dynsym) and the hash
1408
         table (.hash) when we build the final symbol table, because
1409
         until then we do not know the correct value to give the
1410
         symbols.  We build the dynamic symbol string table (.dynstr)
1411
         in a traversal of the symbol table using
1412
         sunos_scan_dynamic_symbol.  */
1413
      s = bfd_get_section_by_name (dynobj, ".dynsym");
1414
      BFD_ASSERT (s != NULL);
1415
      s->_raw_size = dynsymcount * sizeof (struct external_nlist);
1416
      s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size);
1417
      if (s->contents == NULL && s->_raw_size != 0)
1418
        return false;
1419
 
1420
      /* The number of buckets is just the number of symbols divided
1421
         by four.  To compute the final size of the hash table, we
1422
         must actually compute the hash table.  Normally we need
1423
         exactly as many entries in the hash table as there are
1424
         dynamic symbols, but if some of the buckets are not used we
1425
         will need additional entries.  In the worst case, every
1426
         symbol will hash to the same bucket, and we will need
1427
         BUCKETCOUNT - 1 extra entries.  */
1428
      if (dynsymcount >= 4)
1429
        bucketcount = dynsymcount / 4;
1430
      else if (dynsymcount > 0)
1431
        bucketcount = dynsymcount;
1432
      else
1433
        bucketcount = 1;
1434
      s = bfd_get_section_by_name (dynobj, ".hash");
1435
      BFD_ASSERT (s != NULL);
1436
      hashalloc = (dynsymcount + bucketcount - 1) * HASH_ENTRY_SIZE;
1437
      s->contents = (bfd_byte *) bfd_zalloc (dynobj, hashalloc);
1438
      if (s->contents == NULL && dynsymcount > 0)
1439
        return false;
1440
      for (i = 0; i < bucketcount; i++)
1441
        PUT_WORD (output_bfd, (bfd_vma) -1, s->contents + i * HASH_ENTRY_SIZE);
1442
      s->_raw_size = bucketcount * HASH_ENTRY_SIZE;
1443
 
1444
      sunos_hash_table (info)->bucketcount = bucketcount;
1445
 
1446
      /* Scan all the symbols, place them in the dynamic symbol table,
1447
         and build the dynamic hash table.  We reuse dynsymcount as a
1448
         counter for the number of symbols we have added so far.  */
1449
      sunos_hash_table (info)->dynsymcount = 0;
1450
      sunos_link_hash_traverse (sunos_hash_table (info),
1451
                                sunos_scan_dynamic_symbol,
1452
                                (PTR) info);
1453
      BFD_ASSERT (sunos_hash_table (info)->dynsymcount == dynsymcount);
1454
 
1455
      /* The SunOS native linker seems to align the total size of the
1456
         symbol strings to a multiple of 8.  I don't know if this is
1457
         important, but it can't hurt much.  */
1458
      s = bfd_get_section_by_name (dynobj, ".dynstr");
1459
      BFD_ASSERT (s != NULL);
1460
      if ((s->_raw_size & 7) != 0)
1461
        {
1462
          bfd_size_type add;
1463
          bfd_byte *contents;
1464
 
1465
          add = 8 - (s->_raw_size & 7);
1466
          contents = (bfd_byte *) bfd_realloc (s->contents,
1467
                                               s->_raw_size + add);
1468
          if (contents == NULL)
1469
            return false;
1470
          memset (contents + s->_raw_size, 0, (size_t) add);
1471
          s->contents = contents;
1472
          s->_raw_size += add;
1473
        }
1474
    }
1475
 
1476
  /* Now that we have worked out the sizes of the procedure linkage
1477
     table and the dynamic relocs, allocate storage for them.  */
1478
  s = bfd_get_section_by_name (dynobj, ".plt");
1479
  BFD_ASSERT (s != NULL);
1480
  if (s->_raw_size != 0)
1481
    {
1482
      s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
1483
      if (s->contents == NULL)
1484
        return false;
1485
 
1486
      /* Fill in the first entry in the table.  */
1487
      switch (bfd_get_arch (dynobj))
1488
        {
1489
        case bfd_arch_sparc:
1490
          memcpy (s->contents, sparc_plt_first_entry, SPARC_PLT_ENTRY_SIZE);
1491
          break;
1492
 
1493
        case bfd_arch_m68k:
1494
          memcpy (s->contents, m68k_plt_first_entry, M68K_PLT_ENTRY_SIZE);
1495
          break;
1496
 
1497
        default:
1498
          abort ();
1499
        }
1500
    }
1501
 
1502
  s = bfd_get_section_by_name (dynobj, ".dynrel");
1503
  if (s->_raw_size != 0)
1504
    {
1505
      s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
1506
      if (s->contents == NULL)
1507
        return false;
1508
    }
1509
  /* We use the reloc_count field to keep track of how many of the
1510
     relocs we have output so far.  */
1511
  s->reloc_count = 0;
1512
 
1513
  /* Make space for the global offset table.  */
1514
  s = bfd_get_section_by_name (dynobj, ".got");
1515
  s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
1516
  if (s->contents == NULL)
1517
    return false;
1518
 
1519
  *sneedptr = bfd_get_section_by_name (dynobj, ".need");
1520
  *srulesptr = bfd_get_section_by_name (dynobj, ".rules");
1521
 
1522
  return true;
1523
}
1524
 
1525
/* Scan the relocs for an input section.  */
1526
 
1527
static boolean
1528
sunos_scan_relocs (info, abfd, sec, rel_size)
1529
     struct bfd_link_info *info;
1530
     bfd *abfd;
1531
     asection *sec;
1532
     bfd_size_type rel_size;
1533
{
1534
  PTR relocs;
1535
  PTR free_relocs = NULL;
1536
 
1537
  if (rel_size == 0)
1538
    return true;
1539
 
1540
  if (! info->keep_memory)
1541
    relocs = free_relocs = bfd_malloc (rel_size);
1542
  else
1543
    {
1544
      struct aout_section_data_struct *n;
1545
      bfd_size_type amt = sizeof (struct aout_section_data_struct);
1546
 
1547
      n = (struct aout_section_data_struct *) bfd_alloc (abfd, amt);
1548
      if (n == NULL)
1549
        relocs = NULL;
1550
      else
1551
        {
1552
          set_aout_section_data (sec, n);
1553
          relocs = bfd_malloc (rel_size);
1554
          aout_section_data (sec)->relocs = relocs;
1555
        }
1556
    }
1557
  if (relocs == NULL)
1558
    return false;
1559
 
1560
  if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
1561
      || bfd_bread (relocs, rel_size, abfd) != rel_size)
1562
    goto error_return;
1563
 
1564
  if (obj_reloc_entry_size (abfd) == RELOC_STD_SIZE)
1565
    {
1566
      if (! sunos_scan_std_relocs (info, abfd, sec,
1567
                                   (struct reloc_std_external *) relocs,
1568
                                   rel_size))
1569
        goto error_return;
1570
    }
1571
  else
1572
    {
1573
      if (! sunos_scan_ext_relocs (info, abfd, sec,
1574
                                   (struct reloc_ext_external *) relocs,
1575
                                   rel_size))
1576
        goto error_return;
1577
    }
1578
 
1579
  if (free_relocs != NULL)
1580
    free (free_relocs);
1581
 
1582
  return true;
1583
 
1584
 error_return:
1585
  if (free_relocs != NULL)
1586
    free (free_relocs);
1587
  return false;
1588
}
1589
 
1590
/* Scan the relocs for an input section using standard relocs.  We
1591
   need to figure out what to do for each reloc against a dynamic
1592
   symbol.  If the symbol is in the .text section, an entry is made in
1593
   the procedure linkage table.  Note that this will do the wrong
1594
   thing if the symbol is actually data; I don't think the Sun 3
1595
   native linker handles this case correctly either.  If the symbol is
1596
   not in the .text section, we must preserve the reloc as a dynamic
1597
   reloc.  FIXME: We should also handle the PIC relocs here by
1598
   building global offset table entries.  */
1599
 
1600
static boolean
1601
sunos_scan_std_relocs (info, abfd, sec, relocs, rel_size)
1602
     struct bfd_link_info *info;
1603
     bfd *abfd;
1604
     asection *sec ATTRIBUTE_UNUSED;
1605
     const struct reloc_std_external *relocs;
1606
     bfd_size_type rel_size;
1607
{
1608
  bfd *dynobj;
1609
  asection *splt = NULL;
1610
  asection *srel = NULL;
1611
  struct sunos_link_hash_entry **sym_hashes;
1612
  const struct reloc_std_external *rel, *relend;
1613
 
1614
  /* We only know how to handle m68k plt entries.  */
1615
  if (bfd_get_arch (abfd) != bfd_arch_m68k)
1616
    {
1617
      bfd_set_error (bfd_error_invalid_target);
1618
      return false;
1619
    }
1620
 
1621
  dynobj = NULL;
1622
 
1623
  sym_hashes = (struct sunos_link_hash_entry **) obj_aout_sym_hashes (abfd);
1624
 
1625
  relend = relocs + rel_size / RELOC_STD_SIZE;
1626
  for (rel = relocs; rel < relend; rel++)
1627
    {
1628
      int r_index;
1629
      struct sunos_link_hash_entry *h;
1630
 
1631
      /* We only want relocs against external symbols.  */
1632
      if (bfd_header_big_endian (abfd))
1633
        {
1634
          if ((rel->r_type[0] & RELOC_STD_BITS_EXTERN_BIG) == 0)
1635
            continue;
1636
        }
1637
      else
1638
        {
1639
          if ((rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE) == 0)
1640
            continue;
1641
        }
1642
 
1643
      /* Get the symbol index.  */
1644
      if (bfd_header_big_endian (abfd))
1645
        r_index = ((rel->r_index[0] << 16)
1646
                   | (rel->r_index[1] << 8)
1647
                   | rel->r_index[2]);
1648
      else
1649
        r_index = ((rel->r_index[2] << 16)
1650
                   | (rel->r_index[1] << 8)
1651
                   | rel->r_index[0]);
1652
 
1653
      /* Get the hash table entry.  */
1654
      h = sym_hashes[r_index];
1655
      if (h == NULL)
1656
        {
1657
          /* This should not normally happen, but it will in any case
1658
             be caught in the relocation phase.  */
1659
          continue;
1660
        }
1661
 
1662
      /* At this point common symbols have already been allocated, so
1663
         we don't have to worry about them.  We need to consider that
1664
         we may have already seen this symbol and marked it undefined;
1665
         if the symbol is really undefined, then SUNOS_DEF_DYNAMIC
1666
         will be zero.  */
1667
      if (h->root.root.type != bfd_link_hash_defined
1668
          && h->root.root.type != bfd_link_hash_defweak
1669
          && h->root.root.type != bfd_link_hash_undefined)
1670
        continue;
1671
 
1672
      if ((h->flags & SUNOS_DEF_DYNAMIC) == 0
1673
          || (h->flags & SUNOS_DEF_REGULAR) != 0)
1674
        continue;
1675
 
1676
      if (dynobj == NULL)
1677
        {
1678
          asection *sgot;
1679
 
1680
          if (! sunos_create_dynamic_sections (abfd, info, false))
1681
            return false;
1682
          dynobj = sunos_hash_table (info)->dynobj;
1683
          splt = bfd_get_section_by_name (dynobj, ".plt");
1684
          srel = bfd_get_section_by_name (dynobj, ".dynrel");
1685
          BFD_ASSERT (splt != NULL && srel != NULL);
1686
 
1687
          sgot = bfd_get_section_by_name (dynobj, ".got");
1688
          BFD_ASSERT (sgot != NULL);
1689
          if (sgot->_raw_size == 0)
1690
            sgot->_raw_size = BYTES_IN_WORD;
1691
          sunos_hash_table (info)->got_needed = true;
1692
        }
1693
 
1694
      BFD_ASSERT ((h->flags & SUNOS_REF_REGULAR) != 0);
1695
      BFD_ASSERT (h->plt_offset != 0
1696
                  || ((h->root.root.type == bfd_link_hash_defined
1697
                       || h->root.root.type == bfd_link_hash_defweak)
1698
                      ? (h->root.root.u.def.section->owner->flags
1699
                         & DYNAMIC) != 0
1700
                      : (h->root.root.u.undef.abfd->flags & DYNAMIC) != 0));
1701
 
1702
      /* This reloc is against a symbol defined only by a dynamic
1703
         object.  */
1704
 
1705
      if (h->root.root.type == bfd_link_hash_undefined)
1706
        {
1707
          /* Presumably this symbol was marked as being undefined by
1708
             an earlier reloc.  */
1709
          srel->_raw_size += RELOC_STD_SIZE;
1710
        }
1711
      else if ((h->root.root.u.def.section->flags & SEC_CODE) == 0)
1712
        {
1713
          bfd *sub;
1714
 
1715
          /* This reloc is not in the .text section.  It must be
1716
             copied into the dynamic relocs.  We mark the symbol as
1717
             being undefined.  */
1718
          srel->_raw_size += RELOC_STD_SIZE;
1719
          sub = h->root.root.u.def.section->owner;
1720
          h->root.root.type = bfd_link_hash_undefined;
1721
          h->root.root.u.undef.abfd = sub;
1722
        }
1723
      else
1724
        {
1725
          /* This symbol is in the .text section.  We must give it an
1726
             entry in the procedure linkage table, if we have not
1727
             already done so.  We change the definition of the symbol
1728
             to the .plt section; this will cause relocs against it to
1729
             be handled correctly.  */
1730
          if (h->plt_offset == 0)
1731
            {
1732
              if (splt->_raw_size == 0)
1733
                splt->_raw_size = M68K_PLT_ENTRY_SIZE;
1734
              h->plt_offset = splt->_raw_size;
1735
 
1736
              if ((h->flags & SUNOS_DEF_REGULAR) == 0)
1737
                {
1738
                  h->root.root.u.def.section = splt;
1739
                  h->root.root.u.def.value = splt->_raw_size;
1740
                }
1741
 
1742
              splt->_raw_size += M68K_PLT_ENTRY_SIZE;
1743
 
1744
              /* We may also need a dynamic reloc entry.  */
1745
              if ((h->flags & SUNOS_DEF_REGULAR) == 0)
1746
                srel->_raw_size += RELOC_STD_SIZE;
1747
            }
1748
        }
1749
    }
1750
 
1751
  return true;
1752
}
1753
 
1754
/* Scan the relocs for an input section using extended relocs.  We
1755
   need to figure out what to do for each reloc against a dynamic
1756
   symbol.  If the reloc is a WDISP30, and the symbol is in the .text
1757
   section, an entry is made in the procedure linkage table.
1758
   Otherwise, we must preserve the reloc as a dynamic reloc.  */
1759
 
1760
static boolean
1761
sunos_scan_ext_relocs (info, abfd, sec, relocs, rel_size)
1762
     struct bfd_link_info *info;
1763
     bfd *abfd;
1764
     asection *sec ATTRIBUTE_UNUSED;
1765
     const struct reloc_ext_external *relocs;
1766
     bfd_size_type rel_size;
1767
{
1768
  bfd *dynobj;
1769
  struct sunos_link_hash_entry **sym_hashes;
1770
  const struct reloc_ext_external *rel, *relend;
1771
  asection *splt = NULL;
1772
  asection *sgot = NULL;
1773
  asection *srel = NULL;
1774
  bfd_size_type amt;
1775
 
1776
  /* We only know how to handle SPARC plt entries.  */
1777
  if (bfd_get_arch (abfd) != bfd_arch_sparc)
1778
    {
1779
      bfd_set_error (bfd_error_invalid_target);
1780
      return false;
1781
    }
1782
 
1783
  dynobj = NULL;
1784
 
1785
  sym_hashes = (struct sunos_link_hash_entry **) obj_aout_sym_hashes (abfd);
1786
 
1787
  relend = relocs + rel_size / RELOC_EXT_SIZE;
1788
  for (rel = relocs; rel < relend; rel++)
1789
    {
1790
      unsigned int r_index;
1791
      int r_extern;
1792
      int r_type;
1793
      struct sunos_link_hash_entry *h = NULL;
1794
 
1795
      /* Swap in the reloc information.  */
1796
      if (bfd_header_big_endian (abfd))
1797
        {
1798
          r_index = ((rel->r_index[0] << 16)
1799
                     | (rel->r_index[1] << 8)
1800
                     | rel->r_index[2]);
1801
          r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG));
1802
          r_type = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_BIG)
1803
                    >> RELOC_EXT_BITS_TYPE_SH_BIG);
1804
        }
1805
      else
1806
        {
1807
          r_index = ((rel->r_index[2] << 16)
1808
                     | (rel->r_index[1] << 8)
1809
                     | rel->r_index[0]);
1810
          r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE));
1811
          r_type = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE)
1812
                    >> RELOC_EXT_BITS_TYPE_SH_LITTLE);
1813
        }
1814
 
1815
      if (r_extern)
1816
        {
1817
          h = sym_hashes[r_index];
1818
          if (h == NULL)
1819
            {
1820
              /* This should not normally happen, but it will in any
1821
                 case be caught in the relocation phase.  */
1822
              continue;
1823
            }
1824
        }
1825
 
1826
      /* If this is a base relative reloc, we need to make an entry in
1827
         the .got section.  */
1828
      if (r_type == RELOC_BASE10
1829
          || r_type == RELOC_BASE13
1830
          || r_type == RELOC_BASE22)
1831
        {
1832
          if (dynobj == NULL)
1833
            {
1834
              if (! sunos_create_dynamic_sections (abfd, info, false))
1835
                return false;
1836
              dynobj = sunos_hash_table (info)->dynobj;
1837
              splt = bfd_get_section_by_name (dynobj, ".plt");
1838
              sgot = bfd_get_section_by_name (dynobj, ".got");
1839
              srel = bfd_get_section_by_name (dynobj, ".dynrel");
1840
              BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
1841
 
1842
              /* Make sure we have an initial entry in the .got table.  */
1843
              if (sgot->_raw_size == 0)
1844
                sgot->_raw_size = BYTES_IN_WORD;
1845
              sunos_hash_table (info)->got_needed = true;
1846
            }
1847
 
1848
          if (r_extern)
1849
            {
1850
              if (h->got_offset != 0)
1851
                continue;
1852
 
1853
              h->got_offset = sgot->_raw_size;
1854
            }
1855
          else
1856
            {
1857
              if (r_index >= bfd_get_symcount (abfd))
1858
                {
1859
                  /* This is abnormal, but should be caught in the
1860
                     relocation phase.  */
1861
                  continue;
1862
                }
1863
 
1864
              if (adata (abfd).local_got_offsets == NULL)
1865
                {
1866
                  amt = bfd_get_symcount (abfd);
1867
                  amt *= sizeof (bfd_vma);
1868
                  adata (abfd).local_got_offsets =
1869
                    (bfd_vma *) bfd_zalloc (abfd, amt);
1870
                  if (adata (abfd).local_got_offsets == NULL)
1871
                    return false;
1872
                }
1873
 
1874
              if (adata (abfd).local_got_offsets[r_index] != 0)
1875
                continue;
1876
 
1877
              adata (abfd).local_got_offsets[r_index] = sgot->_raw_size;
1878
            }
1879
 
1880
          sgot->_raw_size += BYTES_IN_WORD;
1881
 
1882
          /* If we are making a shared library, or if the symbol is
1883
             defined by a dynamic object, we will need a dynamic reloc
1884
             entry.  */
1885
          if (info->shared
1886
              || (h != NULL
1887
                  && (h->flags & SUNOS_DEF_DYNAMIC) != 0
1888
                  && (h->flags & SUNOS_DEF_REGULAR) == 0))
1889
            srel->_raw_size += RELOC_EXT_SIZE;
1890
 
1891
          continue;
1892
        }
1893
 
1894
      /* Otherwise, we are only interested in relocs against symbols
1895
         defined in dynamic objects but not in regular objects.  We
1896
         only need to consider relocs against external symbols.  */
1897
      if (! r_extern)
1898
        {
1899
          /* But, if we are creating a shared library, we need to
1900
             generate an absolute reloc.  */
1901
          if (info->shared)
1902
            {
1903
              if (dynobj == NULL)
1904
                {
1905
                  if (! sunos_create_dynamic_sections (abfd, info, true))
1906
                    return false;
1907
                  dynobj = sunos_hash_table (info)->dynobj;
1908
                  splt = bfd_get_section_by_name (dynobj, ".plt");
1909
                  sgot = bfd_get_section_by_name (dynobj, ".got");
1910
                  srel = bfd_get_section_by_name (dynobj, ".dynrel");
1911
                  BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
1912
                }
1913
 
1914
              srel->_raw_size += RELOC_EXT_SIZE;
1915
            }
1916
 
1917
          continue;
1918
        }
1919
 
1920
      /* At this point common symbols have already been allocated, so
1921
         we don't have to worry about them.  We need to consider that
1922
         we may have already seen this symbol and marked it undefined;
1923
         if the symbol is really undefined, then SUNOS_DEF_DYNAMIC
1924
         will be zero.  */
1925
      if (h->root.root.type != bfd_link_hash_defined
1926
          && h->root.root.type != bfd_link_hash_defweak
1927
          && h->root.root.type != bfd_link_hash_undefined)
1928
        continue;
1929
 
1930
      if (r_type != RELOC_JMP_TBL
1931
          && ! info->shared
1932
          && ((h->flags & SUNOS_DEF_DYNAMIC) == 0
1933
              || (h->flags & SUNOS_DEF_REGULAR) != 0))
1934
        continue;
1935
 
1936
      if (r_type == RELOC_JMP_TBL
1937
          && ! info->shared
1938
          && (h->flags & SUNOS_DEF_DYNAMIC) == 0
1939
          && (h->flags & SUNOS_DEF_REGULAR) == 0)
1940
        {
1941
          /* This symbol is apparently undefined.  Don't do anything
1942
             here; just let the relocation routine report an undefined
1943
             symbol.  */
1944
          continue;
1945
        }
1946
 
1947
      if (strcmp (h->root.root.root.string, "__GLOBAL_OFFSET_TABLE_") == 0)
1948
        continue;
1949
 
1950
      if (dynobj == NULL)
1951
        {
1952
          if (! sunos_create_dynamic_sections (abfd, info, false))
1953
            return false;
1954
          dynobj = sunos_hash_table (info)->dynobj;
1955
          splt = bfd_get_section_by_name (dynobj, ".plt");
1956
          sgot = bfd_get_section_by_name (dynobj, ".got");
1957
          srel = bfd_get_section_by_name (dynobj, ".dynrel");
1958
          BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL);
1959
 
1960
          /* Make sure we have an initial entry in the .got table.  */
1961
          if (sgot->_raw_size == 0)
1962
            sgot->_raw_size = BYTES_IN_WORD;
1963
          sunos_hash_table (info)->got_needed = true;
1964
        }
1965
 
1966
      BFD_ASSERT (r_type == RELOC_JMP_TBL
1967
                  || info->shared
1968
                  || (h->flags & SUNOS_REF_REGULAR) != 0);
1969
      BFD_ASSERT (r_type == RELOC_JMP_TBL
1970
                  || info->shared
1971
                  || h->plt_offset != 0
1972
                  || ((h->root.root.type == bfd_link_hash_defined
1973
                       || h->root.root.type == bfd_link_hash_defweak)
1974
                      ? (h->root.root.u.def.section->owner->flags
1975
                         & DYNAMIC) != 0
1976
                      : (h->root.root.u.undef.abfd->flags & DYNAMIC) != 0));
1977
 
1978
      /* This reloc is against a symbol defined only by a dynamic
1979
         object, or it is a jump table reloc from PIC compiled code.  */
1980
 
1981
      if (r_type != RELOC_JMP_TBL
1982
          && h->root.root.type == bfd_link_hash_undefined)
1983
        {
1984
          /* Presumably this symbol was marked as being undefined by
1985
             an earlier reloc.  */
1986
          srel->_raw_size += RELOC_EXT_SIZE;
1987
        }
1988
      else if (r_type != RELOC_JMP_TBL
1989
               && (h->root.root.u.def.section->flags & SEC_CODE) == 0)
1990
        {
1991
          bfd *sub;
1992
 
1993
          /* This reloc is not in the .text section.  It must be
1994
             copied into the dynamic relocs.  We mark the symbol as
1995
             being undefined.  */
1996
          srel->_raw_size += RELOC_EXT_SIZE;
1997
          if ((h->flags & SUNOS_DEF_REGULAR) == 0)
1998
            {
1999
              sub = h->root.root.u.def.section->owner;
2000
              h->root.root.type = bfd_link_hash_undefined;
2001
              h->root.root.u.undef.abfd = sub;
2002
            }
2003
        }
2004
      else
2005
        {
2006
          /* This symbol is in the .text section.  We must give it an
2007
             entry in the procedure linkage table, if we have not
2008
             already done so.  We change the definition of the symbol
2009
             to the .plt section; this will cause relocs against it to
2010
             be handled correctly.  */
2011
          if (h->plt_offset == 0)
2012
            {
2013
              if (splt->_raw_size == 0)
2014
                splt->_raw_size = SPARC_PLT_ENTRY_SIZE;
2015
              h->plt_offset = splt->_raw_size;
2016
 
2017
              if ((h->flags & SUNOS_DEF_REGULAR) == 0)
2018
                {
2019
                  if (h->root.root.type == bfd_link_hash_undefined)
2020
                    h->root.root.type = bfd_link_hash_defined;
2021
                  h->root.root.u.def.section = splt;
2022
                  h->root.root.u.def.value = splt->_raw_size;
2023
                }
2024
 
2025
              splt->_raw_size += SPARC_PLT_ENTRY_SIZE;
2026
 
2027
              /* We will also need a dynamic reloc entry, unless this
2028
                 is a JMP_TBL reloc produced by linking PIC compiled
2029
                 code, and we are not making a shared library.  */
2030
              if (info->shared || (h->flags & SUNOS_DEF_REGULAR) == 0)
2031
                srel->_raw_size += RELOC_EXT_SIZE;
2032
            }
2033
 
2034
          /* If we are creating a shared library, we need to copy over
2035
             any reloc other than a jump table reloc.  */
2036
          if (info->shared && r_type != RELOC_JMP_TBL)
2037
            srel->_raw_size += RELOC_EXT_SIZE;
2038
        }
2039
    }
2040
 
2041
  return true;
2042
}
2043
 
2044
/* Build the hash table of dynamic symbols, and to mark as written all
2045
   symbols from dynamic objects which we do not plan to write out.  */
2046
 
2047
static boolean
2048
sunos_scan_dynamic_symbol (h, data)
2049
     struct sunos_link_hash_entry *h;
2050
     PTR data;
2051
{
2052
  struct bfd_link_info *info = (struct bfd_link_info *) data;
2053
 
2054
  if (h->root.root.type == bfd_link_hash_warning)
2055
    h = (struct sunos_link_hash_entry *) h->root.root.u.i.link;
2056
 
2057
  /* Set the written flag for symbols we do not want to write out as
2058
     part of the regular symbol table.  This is all symbols which are
2059
     not defined in a regular object file.  For some reason symbols
2060
     which are referenced by a regular object and defined by a dynamic
2061
     object do not seem to show up in the regular symbol table.  It is
2062
     possible for a symbol to have only SUNOS_REF_REGULAR set here, it
2063
     is an undefined symbol which was turned into a common symbol
2064
     because it was found in an archive object which was not included
2065
     in the link.  */
2066
  if ((h->flags & SUNOS_DEF_REGULAR) == 0
2067
      && (h->flags & SUNOS_DEF_DYNAMIC) != 0
2068
      && strcmp (h->root.root.root.string, "__DYNAMIC") != 0)
2069
    h->root.written = true;
2070
 
2071
  /* If this symbol is defined by a dynamic object and referenced by a
2072
     regular object, see whether we gave it a reasonable value while
2073
     scanning the relocs.  */
2074
 
2075
  if ((h->flags & SUNOS_DEF_REGULAR) == 0
2076
      && (h->flags & SUNOS_DEF_DYNAMIC) != 0
2077
      && (h->flags & SUNOS_REF_REGULAR) != 0)
2078
    {
2079
      if ((h->root.root.type == bfd_link_hash_defined
2080
           || h->root.root.type == bfd_link_hash_defweak)
2081
          && ((h->root.root.u.def.section->owner->flags & DYNAMIC) != 0)
2082
          && h->root.root.u.def.section->output_section == NULL)
2083
        {
2084
          bfd *sub;
2085
 
2086
          /* This symbol is currently defined in a dynamic section
2087
             which is not being put into the output file.  This
2088
             implies that there is no reloc against the symbol.  I'm
2089
             not sure why this case would ever occur.  In any case, we
2090
             change the symbol to be undefined.  */
2091
          sub = h->root.root.u.def.section->owner;
2092
          h->root.root.type = bfd_link_hash_undefined;
2093
          h->root.root.u.undef.abfd = sub;
2094
        }
2095
    }
2096
 
2097
  /* If this symbol is defined or referenced by a regular file, add it
2098
     to the dynamic symbols.  */
2099
  if ((h->flags & (SUNOS_DEF_REGULAR | SUNOS_REF_REGULAR)) != 0)
2100
    {
2101
      asection *s;
2102
      size_t len;
2103
      bfd_byte *contents;
2104
      unsigned char *name;
2105
      unsigned long hash;
2106
      bfd *dynobj;
2107
 
2108
      BFD_ASSERT (h->dynindx == -2);
2109
 
2110
      dynobj = sunos_hash_table (info)->dynobj;
2111
 
2112
      h->dynindx = sunos_hash_table (info)->dynsymcount;
2113
      ++sunos_hash_table (info)->dynsymcount;
2114
 
2115
      len = strlen (h->root.root.root.string);
2116
 
2117
      /* We don't bother to construct a BFD hash table for the strings
2118
         which are the names of the dynamic symbols.  Using a hash
2119
         table for the regular symbols is beneficial, because the
2120
         regular symbols includes the debugging symbols, which have
2121
         long names and are often duplicated in several object files.
2122
         There are no debugging symbols in the dynamic symbols.  */
2123
      s = bfd_get_section_by_name (dynobj, ".dynstr");
2124
      BFD_ASSERT (s != NULL);
2125
      contents = (bfd_byte *) bfd_realloc (s->contents,
2126
                                           s->_raw_size + len + 1);
2127
      if (contents == NULL)
2128
        return false;
2129
      s->contents = contents;
2130
 
2131
      h->dynstr_index = s->_raw_size;
2132
      strcpy ((char *) contents + s->_raw_size, h->root.root.root.string);
2133
      s->_raw_size += len + 1;
2134
 
2135
      /* Add it to the dynamic hash table.  */
2136
      name = (unsigned char *) h->root.root.root.string;
2137
      hash = 0;
2138
      while (*name != '\0')
2139
        hash = (hash << 1) + *name++;
2140
      hash &= 0x7fffffff;
2141
      hash %= sunos_hash_table (info)->bucketcount;
2142
 
2143
      s = bfd_get_section_by_name (dynobj, ".hash");
2144
      BFD_ASSERT (s != NULL);
2145
 
2146
      if (GET_SWORD (dynobj, s->contents + hash * HASH_ENTRY_SIZE) == -1)
2147
        PUT_WORD (dynobj, h->dynindx, s->contents + hash * HASH_ENTRY_SIZE);
2148
      else
2149
        {
2150
          bfd_vma next;
2151
 
2152
          next = GET_WORD (dynobj,
2153
                           (s->contents
2154
                            + hash * HASH_ENTRY_SIZE
2155
                            + BYTES_IN_WORD));
2156
          PUT_WORD (dynobj, s->_raw_size / HASH_ENTRY_SIZE,
2157
                    s->contents + hash * HASH_ENTRY_SIZE + BYTES_IN_WORD);
2158
          PUT_WORD (dynobj, h->dynindx, s->contents + s->_raw_size);
2159
          PUT_WORD (dynobj, next, s->contents + s->_raw_size + BYTES_IN_WORD);
2160
          s->_raw_size += HASH_ENTRY_SIZE;
2161
        }
2162
    }
2163
 
2164
  return true;
2165
}
2166
 
2167
/* Link a dynamic object.  We actually don't have anything to do at
2168
   this point.  This entry point exists to prevent the regular linker
2169
   code from doing anything with the object.  */
2170
 
2171
/*ARGSUSED*/
2172
static boolean
2173
sunos_link_dynamic_object (info, abfd)
2174
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
2175
     bfd *abfd ATTRIBUTE_UNUSED;
2176
{
2177
  return true;
2178
}
2179
 
2180
/* Write out a dynamic symbol.  This is called by the final traversal
2181
   over the symbol table.  */
2182
 
2183
static boolean
2184
sunos_write_dynamic_symbol (output_bfd, info, harg)
2185
     bfd *output_bfd;
2186
     struct bfd_link_info *info;
2187
     struct aout_link_hash_entry *harg;
2188
{
2189
  struct sunos_link_hash_entry *h = (struct sunos_link_hash_entry *) harg;
2190
  int type;
2191
  bfd_vma val;
2192
  asection *s;
2193
  struct external_nlist *outsym;
2194
 
2195
  /* If this symbol is in the procedure linkage table, fill in the
2196
     table entry.  */
2197
  if (h->plt_offset != 0)
2198
    {
2199
      bfd *dynobj;
2200
      asection *splt;
2201
      bfd_byte *p;
2202
      bfd_vma r_address;
2203
 
2204
      dynobj = sunos_hash_table (info)->dynobj;
2205
      splt = bfd_get_section_by_name (dynobj, ".plt");
2206
      p = splt->contents + h->plt_offset;
2207
 
2208
      s = bfd_get_section_by_name (dynobj, ".dynrel");
2209
 
2210
      r_address = (splt->output_section->vma
2211
                   + splt->output_offset
2212
                   + h->plt_offset);
2213
 
2214
      switch (bfd_get_arch (output_bfd))
2215
        {
2216
        case bfd_arch_sparc:
2217
          if (info->shared || (h->flags & SUNOS_DEF_REGULAR) == 0)
2218
            {
2219
              bfd_put_32 (output_bfd, SPARC_PLT_ENTRY_WORD0, p);
2220
              bfd_put_32 (output_bfd,
2221
                          (SPARC_PLT_ENTRY_WORD1
2222
                           + (((- (h->plt_offset + 4) >> 2)
2223
                               & 0x3fffffff))),
2224
                          p + 4);
2225
              bfd_put_32 (output_bfd, SPARC_PLT_ENTRY_WORD2 + s->reloc_count,
2226
                          p + 8);
2227
            }
2228
          else
2229
            {
2230
              val = (h->root.root.u.def.section->output_section->vma
2231
                     + h->root.root.u.def.section->output_offset
2232
                     + h->root.root.u.def.value);
2233
              bfd_put_32 (output_bfd,
2234
                          SPARC_PLT_PIC_WORD0 + ((val >> 10) & 0x3fffff),
2235
                          p);
2236
              bfd_put_32 (output_bfd,
2237
                          SPARC_PLT_PIC_WORD1 + (val & 0x3ff),
2238
                          p + 4);
2239
              bfd_put_32 (output_bfd, SPARC_PLT_PIC_WORD2, p + 8);
2240
            }
2241
          break;
2242
 
2243
        case bfd_arch_m68k:
2244
          if (! info->shared && (h->flags & SUNOS_DEF_REGULAR) != 0)
2245
            abort ();
2246
          bfd_put_16 (output_bfd, M68K_PLT_ENTRY_WORD0, p);
2247
          bfd_put_32 (output_bfd, (- (h->plt_offset + 2)), p + 2);
2248
          bfd_put_16 (output_bfd, (bfd_vma) s->reloc_count, p + 6);
2249
          r_address += 2;
2250
          break;
2251
 
2252
        default:
2253
          abort ();
2254
        }
2255
 
2256
      /* We also need to add a jump table reloc, unless this is the
2257
         result of a JMP_TBL reloc from PIC compiled code.  */
2258
      if (info->shared || (h->flags & SUNOS_DEF_REGULAR) == 0)
2259
        {
2260
          BFD_ASSERT (h->dynindx >= 0);
2261
          BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj)
2262
                      < s->_raw_size);
2263
          p = s->contents + s->reloc_count * obj_reloc_entry_size (output_bfd);
2264
          if (obj_reloc_entry_size (output_bfd) == RELOC_STD_SIZE)
2265
            {
2266
              struct reloc_std_external *srel;
2267
 
2268
              srel = (struct reloc_std_external *) p;
2269
              PUT_WORD (output_bfd, r_address, srel->r_address);
2270
              if (bfd_header_big_endian (output_bfd))
2271
                {
2272
                  srel->r_index[0] = (bfd_byte) (h->dynindx >> 16);
2273
                  srel->r_index[1] = (bfd_byte) (h->dynindx >> 8);
2274
                  srel->r_index[2] = (bfd_byte) (h->dynindx);
2275
                  srel->r_type[0] = (RELOC_STD_BITS_EXTERN_BIG
2276
                                     | RELOC_STD_BITS_JMPTABLE_BIG);
2277
                }
2278
              else
2279
                {
2280
                  srel->r_index[2] = (bfd_byte) (h->dynindx >> 16);
2281
                  srel->r_index[1] = (bfd_byte) (h->dynindx >> 8);
2282
                  srel->r_index[0] = (bfd_byte)h->dynindx;
2283
                  srel->r_type[0] = (RELOC_STD_BITS_EXTERN_LITTLE
2284
                                     | RELOC_STD_BITS_JMPTABLE_LITTLE);
2285
                }
2286
            }
2287
          else
2288
            {
2289
              struct reloc_ext_external *erel;
2290
 
2291
              erel = (struct reloc_ext_external *) p;
2292
              PUT_WORD (output_bfd, r_address, erel->r_address);
2293
              if (bfd_header_big_endian (output_bfd))
2294
                {
2295
                  erel->r_index[0] = (bfd_byte) (h->dynindx >> 16);
2296
                  erel->r_index[1] = (bfd_byte) (h->dynindx >> 8);
2297
                  erel->r_index[2] = (bfd_byte)h->dynindx;
2298
                  erel->r_type[0] =
2299
                    (RELOC_EXT_BITS_EXTERN_BIG
2300
                     | (RELOC_JMP_SLOT << RELOC_EXT_BITS_TYPE_SH_BIG));
2301
                }
2302
              else
2303
                {
2304
                  erel->r_index[2] = (bfd_byte) (h->dynindx >> 16);
2305
                  erel->r_index[1] = (bfd_byte) (h->dynindx >> 8);
2306
                  erel->r_index[0] = (bfd_byte)h->dynindx;
2307
                  erel->r_type[0] =
2308
                    (RELOC_EXT_BITS_EXTERN_LITTLE
2309
                     | (RELOC_JMP_SLOT << RELOC_EXT_BITS_TYPE_SH_LITTLE));
2310
                }
2311
              PUT_WORD (output_bfd, (bfd_vma) 0, erel->r_addend);
2312
            }
2313
 
2314
          ++s->reloc_count;
2315
        }
2316
    }
2317
 
2318
  /* If this is not a dynamic symbol, we don't have to do anything
2319
     else.  We only check this after handling the PLT entry, because
2320
     we can have a PLT entry for a nondynamic symbol when linking PIC
2321
     compiled code from a regular object.  */
2322
  if (h->dynindx < 0)
2323
    return true;
2324
 
2325
  switch (h->root.root.type)
2326
    {
2327
    default:
2328
    case bfd_link_hash_new:
2329
      abort ();
2330
      /* Avoid variable not initialized warnings.  */
2331
      return true;
2332
    case bfd_link_hash_undefined:
2333
      type = N_UNDF | N_EXT;
2334
      val = 0;
2335
      break;
2336
    case bfd_link_hash_defined:
2337
    case bfd_link_hash_defweak:
2338
      {
2339
        asection *sec;
2340
        asection *output_section;
2341
 
2342
        sec = h->root.root.u.def.section;
2343
        output_section = sec->output_section;
2344
        BFD_ASSERT (bfd_is_abs_section (output_section)
2345
                    || output_section->owner == output_bfd);
2346
        if (h->plt_offset != 0
2347
            && (h->flags & SUNOS_DEF_REGULAR) == 0)
2348
          {
2349
            type = N_UNDF | N_EXT;
2350
            val = 0;
2351
          }
2352
        else
2353
          {
2354
            if (output_section == obj_textsec (output_bfd))
2355
              type = (h->root.root.type == bfd_link_hash_defined
2356
                      ? N_TEXT
2357
                      : N_WEAKT);
2358
            else if (output_section == obj_datasec (output_bfd))
2359
              type = (h->root.root.type == bfd_link_hash_defined
2360
                      ? N_DATA
2361
                      : N_WEAKD);
2362
            else if (output_section == obj_bsssec (output_bfd))
2363
              type = (h->root.root.type == bfd_link_hash_defined
2364
                      ? N_BSS
2365
                      : N_WEAKB);
2366
            else
2367
              type = (h->root.root.type == bfd_link_hash_defined
2368
                      ? N_ABS
2369
                      : N_WEAKA);
2370
            type |= N_EXT;
2371
            val = (h->root.root.u.def.value
2372
                   + output_section->vma
2373
                   + sec->output_offset);
2374
          }
2375
      }
2376
      break;
2377
    case bfd_link_hash_common:
2378
      type = N_UNDF | N_EXT;
2379
      val = h->root.root.u.c.size;
2380
      break;
2381
    case bfd_link_hash_undefweak:
2382
      type = N_WEAKU;
2383
      val = 0;
2384
      break;
2385
    case bfd_link_hash_indirect:
2386
    case bfd_link_hash_warning:
2387
      /* FIXME: Ignore these for now.  The circumstances under which
2388
         they should be written out are not clear to me.  */
2389
      return true;
2390
    }
2391
 
2392
  s = bfd_get_section_by_name (sunos_hash_table (info)->dynobj, ".dynsym");
2393
  BFD_ASSERT (s != NULL);
2394
  outsym = ((struct external_nlist *)
2395
            (s->contents + h->dynindx * EXTERNAL_NLIST_SIZE));
2396
 
2397
  H_PUT_8 (output_bfd, type, outsym->e_type);
2398
  H_PUT_8 (output_bfd, 0, outsym->e_other);
2399
 
2400
  /* FIXME: The native linker doesn't use 0 for desc.  It seems to use
2401
     one less than the desc value in the shared library, although that
2402
     seems unlikely.  */
2403
  H_PUT_16 (output_bfd, 0, outsym->e_desc);
2404
 
2405
  PUT_WORD (output_bfd, h->dynstr_index, outsym->e_strx);
2406
  PUT_WORD (output_bfd, val, outsym->e_value);
2407
 
2408
  return true;
2409
}
2410
 
2411
/* This is called for each reloc against an external symbol.  If this
2412
   is a reloc which are are going to copy as a dynamic reloc, then
2413
   copy it over, and tell the caller to not bother processing this
2414
   reloc.  */
2415
 
2416
/*ARGSUSED*/
2417
static boolean
2418
sunos_check_dynamic_reloc (info, input_bfd, input_section, harg, reloc,
2419
                           contents, skip, relocationp)
2420
     struct bfd_link_info *info;
2421
     bfd *input_bfd;
2422
     asection *input_section;
2423
     struct aout_link_hash_entry *harg;
2424
     PTR reloc;
2425
     bfd_byte *contents ATTRIBUTE_UNUSED;
2426
     boolean *skip;
2427
     bfd_vma *relocationp;
2428
{
2429
  struct sunos_link_hash_entry *h = (struct sunos_link_hash_entry *) harg;
2430
  bfd *dynobj;
2431
  boolean baserel;
2432
  boolean jmptbl;
2433
  boolean pcrel;
2434
  asection *s;
2435
  bfd_byte *p;
2436
  long indx;
2437
 
2438
  *skip = false;
2439
 
2440
  dynobj = sunos_hash_table (info)->dynobj;
2441
 
2442
  if (h != NULL
2443
      && h->plt_offset != 0
2444
      && (info->shared
2445
          || (h->flags & SUNOS_DEF_REGULAR) == 0))
2446
    {
2447
      asection *splt;
2448
 
2449
      /* Redirect the relocation to the PLT entry.  */
2450
      splt = bfd_get_section_by_name (dynobj, ".plt");
2451
      *relocationp = (splt->output_section->vma
2452
                      + splt->output_offset
2453
                      + h->plt_offset);
2454
    }
2455
 
2456
  if (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE)
2457
    {
2458
      struct reloc_std_external *srel;
2459
 
2460
      srel = (struct reloc_std_external *) reloc;
2461
      if (bfd_header_big_endian (input_bfd))
2462
        {
2463
          baserel = (0 != (srel->r_type[0] & RELOC_STD_BITS_BASEREL_BIG));
2464
          jmptbl = (0 != (srel->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG));
2465
          pcrel = (0 != (srel->r_type[0] & RELOC_STD_BITS_PCREL_BIG));
2466
        }
2467
      else
2468
        {
2469
          baserel = (0 != (srel->r_type[0] & RELOC_STD_BITS_BASEREL_LITTLE));
2470
          jmptbl = (0 != (srel->r_type[0] & RELOC_STD_BITS_JMPTABLE_LITTLE));
2471
          pcrel = (0 != (srel->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE));
2472
        }
2473
    }
2474
  else
2475
    {
2476
      struct reloc_ext_external *erel;
2477
      int r_type;
2478
 
2479
      erel = (struct reloc_ext_external *) reloc;
2480
      if (bfd_header_big_endian (input_bfd))
2481
        r_type = ((erel->r_type[0] & RELOC_EXT_BITS_TYPE_BIG)
2482
                  >> RELOC_EXT_BITS_TYPE_SH_BIG);
2483
      else
2484
        r_type = ((erel->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE)
2485
                  >> RELOC_EXT_BITS_TYPE_SH_LITTLE);
2486
      baserel = (r_type == RELOC_BASE10
2487
                 || r_type == RELOC_BASE13
2488
                 || r_type == RELOC_BASE22);
2489
      jmptbl = r_type == RELOC_JMP_TBL;
2490
      pcrel = (r_type == RELOC_DISP8
2491
               || r_type == RELOC_DISP16
2492
               || r_type == RELOC_DISP32
2493
               || r_type == RELOC_WDISP30
2494
               || r_type == RELOC_WDISP22);
2495
      /* We don't consider the PC10 and PC22 types to be PC relative,
2496
         because they are pcrel_offset.  */
2497
    }
2498
 
2499
  if (baserel)
2500
    {
2501
      bfd_vma *got_offsetp;
2502
      asection *sgot;
2503
 
2504
      if (h != NULL)
2505
        got_offsetp = &h->got_offset;
2506
      else if (adata (input_bfd).local_got_offsets == NULL)
2507
        got_offsetp = NULL;
2508
      else
2509
        {
2510
          struct reloc_std_external *srel;
2511
          int r_index;
2512
 
2513
          srel = (struct reloc_std_external *) reloc;
2514
          if (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE)
2515
            {
2516
              if (bfd_header_big_endian (input_bfd))
2517
                r_index = ((srel->r_index[0] << 16)
2518
                           | (srel->r_index[1] << 8)
2519
                           | srel->r_index[2]);
2520
              else
2521
                r_index = ((srel->r_index[2] << 16)
2522
                           | (srel->r_index[1] << 8)
2523
                           | srel->r_index[0]);
2524
            }
2525
          else
2526
            {
2527
              struct reloc_ext_external *erel;
2528
 
2529
              erel = (struct reloc_ext_external *) reloc;
2530
              if (bfd_header_big_endian (input_bfd))
2531
                r_index = ((erel->r_index[0] << 16)
2532
                           | (erel->r_index[1] << 8)
2533
                           | erel->r_index[2]);
2534
              else
2535
                r_index = ((erel->r_index[2] << 16)
2536
                           | (erel->r_index[1] << 8)
2537
                           | erel->r_index[0]);
2538
            }
2539
 
2540
          got_offsetp = adata (input_bfd).local_got_offsets + r_index;
2541
        }
2542
 
2543
      BFD_ASSERT (got_offsetp != NULL && *got_offsetp != 0);
2544
 
2545
      sgot = bfd_get_section_by_name (dynobj, ".got");
2546
 
2547
      /* We set the least significant bit to indicate whether we have
2548
         already initialized the GOT entry.  */
2549
      if ((*got_offsetp & 1) == 0)
2550
        {
2551
          if (h == NULL
2552
              || (! info->shared
2553
                  && ((h->flags & SUNOS_DEF_DYNAMIC) == 0
2554
                      || (h->flags & SUNOS_DEF_REGULAR) != 0)))
2555
            PUT_WORD (dynobj, *relocationp, sgot->contents + *got_offsetp);
2556
          else
2557
            PUT_WORD (dynobj, 0, sgot->contents + *got_offsetp);
2558
 
2559
          if (info->shared
2560
              || (h != NULL
2561
                  && (h->flags & SUNOS_DEF_DYNAMIC) != 0
2562
                  && (h->flags & SUNOS_DEF_REGULAR) == 0))
2563
            {
2564
              /* We need to create a GLOB_DAT or 32 reloc to tell the
2565
                 dynamic linker to fill in this entry in the table.  */
2566
 
2567
              s = bfd_get_section_by_name (dynobj, ".dynrel");
2568
              BFD_ASSERT (s != NULL);
2569
              BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj)
2570
                          < s->_raw_size);
2571
 
2572
              p = (s->contents
2573
                   + s->reloc_count * obj_reloc_entry_size (dynobj));
2574
 
2575
              if (h != NULL)
2576
                indx = h->dynindx;
2577
              else
2578
                indx = 0;
2579
 
2580
              if (obj_reloc_entry_size (dynobj) == RELOC_STD_SIZE)
2581
                {
2582
                  struct reloc_std_external *srel;
2583
 
2584
                  srel = (struct reloc_std_external *) p;
2585
                  PUT_WORD (dynobj,
2586
                            (*got_offsetp
2587
                             + sgot->output_section->vma
2588
                             + sgot->output_offset),
2589
                            srel->r_address);
2590
                  if (bfd_header_big_endian (dynobj))
2591
                    {
2592
                      srel->r_index[0] = (bfd_byte) (indx >> 16);
2593
                      srel->r_index[1] = (bfd_byte) (indx >> 8);
2594
                      srel->r_index[2] = (bfd_byte)indx;
2595
                      if (h == NULL)
2596
                        srel->r_type[0] = 2 << RELOC_STD_BITS_LENGTH_SH_BIG;
2597
                      else
2598
                        srel->r_type[0] =
2599
                          (RELOC_STD_BITS_EXTERN_BIG
2600
                           | RELOC_STD_BITS_BASEREL_BIG
2601
                           | RELOC_STD_BITS_RELATIVE_BIG
2602
                           | (2 << RELOC_STD_BITS_LENGTH_SH_BIG));
2603
                    }
2604
                  else
2605
                    {
2606
                      srel->r_index[2] = (bfd_byte) (indx >> 16);
2607
                      srel->r_index[1] = (bfd_byte) (indx >> 8);
2608
                      srel->r_index[0] = (bfd_byte)indx;
2609
                      if (h == NULL)
2610
                        srel->r_type[0] = 2 << RELOC_STD_BITS_LENGTH_SH_LITTLE;
2611
                      else
2612
                        srel->r_type[0] =
2613
                          (RELOC_STD_BITS_EXTERN_LITTLE
2614
                           | RELOC_STD_BITS_BASEREL_LITTLE
2615
                           | RELOC_STD_BITS_RELATIVE_LITTLE
2616
                           | (2 << RELOC_STD_BITS_LENGTH_SH_LITTLE));
2617
                    }
2618
                }
2619
              else
2620
                {
2621
                  struct reloc_ext_external *erel;
2622
 
2623
                  erel = (struct reloc_ext_external *) p;
2624
                  PUT_WORD (dynobj,
2625
                            (*got_offsetp
2626
                             + sgot->output_section->vma
2627
                             + sgot->output_offset),
2628
                            erel->r_address);
2629
                  if (bfd_header_big_endian (dynobj))
2630
                    {
2631
                      erel->r_index[0] = (bfd_byte) (indx >> 16);
2632
                      erel->r_index[1] = (bfd_byte) (indx >> 8);
2633
                      erel->r_index[2] = (bfd_byte)indx;
2634
                      if (h == NULL)
2635
                        erel->r_type[0] =
2636
                          RELOC_32 << RELOC_EXT_BITS_TYPE_SH_BIG;
2637
                      else
2638
                        erel->r_type[0] =
2639
                          (RELOC_EXT_BITS_EXTERN_BIG
2640
                           | (RELOC_GLOB_DAT << RELOC_EXT_BITS_TYPE_SH_BIG));
2641
                    }
2642
                  else
2643
                    {
2644
                      erel->r_index[2] = (bfd_byte) (indx >> 16);
2645
                      erel->r_index[1] = (bfd_byte) (indx >> 8);
2646
                      erel->r_index[0] = (bfd_byte)indx;
2647
                      if (h == NULL)
2648
                        erel->r_type[0] =
2649
                          RELOC_32 << RELOC_EXT_BITS_TYPE_SH_LITTLE;
2650
                      else
2651
                        erel->r_type[0] =
2652
                          (RELOC_EXT_BITS_EXTERN_LITTLE
2653
                           | (RELOC_GLOB_DAT
2654
                              << RELOC_EXT_BITS_TYPE_SH_LITTLE));
2655
                    }
2656
                  PUT_WORD (dynobj, 0, erel->r_addend);
2657
                }
2658
 
2659
              ++s->reloc_count;
2660
            }
2661
 
2662
          *got_offsetp |= 1;
2663
        }
2664
 
2665
      *relocationp = (sgot->vma
2666
                      + (*got_offsetp &~ (bfd_vma) 1)
2667
                      - sunos_hash_table (info)->got_base);
2668
 
2669
      /* There is nothing else to do for a base relative reloc.  */
2670
      return true;
2671
    }
2672
 
2673
  if (! sunos_hash_table (info)->dynamic_sections_needed)
2674
    return true;
2675
  if (! info->shared)
2676
    {
2677
      if (h == NULL
2678
          || h->dynindx == -1
2679
          || h->root.root.type != bfd_link_hash_undefined
2680
          || (h->flags & SUNOS_DEF_REGULAR) != 0
2681
          || (h->flags & SUNOS_DEF_DYNAMIC) == 0
2682
          || (h->root.root.u.undef.abfd->flags & DYNAMIC) == 0)
2683
        return true;
2684
    }
2685
  else
2686
    {
2687
      if (h != NULL
2688
          && (h->dynindx == -1
2689
              || jmptbl
2690
              || strcmp (h->root.root.root.string,
2691
                         "__GLOBAL_OFFSET_TABLE_") == 0))
2692
        return true;
2693
    }
2694
 
2695
  /* It looks like this is a reloc we are supposed to copy.  */
2696
 
2697
  s = bfd_get_section_by_name (dynobj, ".dynrel");
2698
  BFD_ASSERT (s != NULL);
2699
  BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj) < s->_raw_size);
2700
 
2701
  p = s->contents + s->reloc_count * obj_reloc_entry_size (dynobj);
2702
 
2703
  /* Copy the reloc over.  */
2704
  memcpy (p, reloc, obj_reloc_entry_size (dynobj));
2705
 
2706
  if (h != NULL)
2707
    indx = h->dynindx;
2708
  else
2709
    indx = 0;
2710
 
2711
  /* Adjust the address and symbol index.  */
2712
  if (obj_reloc_entry_size (dynobj) == RELOC_STD_SIZE)
2713
    {
2714
      struct reloc_std_external *srel;
2715
 
2716
      srel = (struct reloc_std_external *) p;
2717
      PUT_WORD (dynobj,
2718
                (GET_WORD (dynobj, srel->r_address)
2719
                 + input_section->output_section->vma
2720
                 + input_section->output_offset),
2721
                srel->r_address);
2722
      if (bfd_header_big_endian (dynobj))
2723
        {
2724
          srel->r_index[0] = (bfd_byte) (indx >> 16);
2725
          srel->r_index[1] = (bfd_byte) (indx >> 8);
2726
          srel->r_index[2] = (bfd_byte)indx;
2727
        }
2728
      else
2729
        {
2730
          srel->r_index[2] = (bfd_byte) (indx >> 16);
2731
          srel->r_index[1] = (bfd_byte) (indx >> 8);
2732
          srel->r_index[0] = (bfd_byte)indx;
2733
        }
2734
      /* FIXME: We may have to change the addend for a PC relative
2735
         reloc.  */
2736
    }
2737
  else
2738
    {
2739
      struct reloc_ext_external *erel;
2740
 
2741
      erel = (struct reloc_ext_external *) p;
2742
      PUT_WORD (dynobj,
2743
                (GET_WORD (dynobj, erel->r_address)
2744
                 + input_section->output_section->vma
2745
                 + input_section->output_offset),
2746
                erel->r_address);
2747
      if (bfd_header_big_endian (dynobj))
2748
        {
2749
          erel->r_index[0] = (bfd_byte) (indx >> 16);
2750
          erel->r_index[1] = (bfd_byte) (indx >> 8);
2751
          erel->r_index[2] = (bfd_byte)indx;
2752
        }
2753
      else
2754
        {
2755
          erel->r_index[2] = (bfd_byte) (indx >> 16);
2756
          erel->r_index[1] = (bfd_byte) (indx >> 8);
2757
          erel->r_index[0] = (bfd_byte)indx;
2758
        }
2759
      if (pcrel && h != NULL)
2760
        {
2761
          /* Adjust the addend for the change in address.  */
2762
          PUT_WORD (dynobj,
2763
                    (GET_WORD (dynobj, erel->r_addend)
2764
                     - (input_section->output_section->vma
2765
                        + input_section->output_offset
2766
                        - input_section->vma)),
2767
                    erel->r_addend);
2768
        }
2769
    }
2770
 
2771
  ++s->reloc_count;
2772
 
2773
  if (h != NULL)
2774
    *skip = true;
2775
 
2776
  return true;
2777
}
2778
 
2779
/* Finish up the dynamic linking information.  */
2780
 
2781
static boolean
2782
sunos_finish_dynamic_link (abfd, info)
2783
     bfd *abfd;
2784
     struct bfd_link_info *info;
2785
{
2786
  bfd *dynobj;
2787
  asection *o;
2788
  asection *s;
2789
  asection *sdyn;
2790
 
2791
  if (! sunos_hash_table (info)->dynamic_sections_needed
2792
      && ! sunos_hash_table (info)->got_needed)
2793
    return true;
2794
 
2795
  dynobj = sunos_hash_table (info)->dynobj;
2796
 
2797
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2798
  BFD_ASSERT (sdyn != NULL);
2799
 
2800
  /* Finish up the .need section.  The linker emulation code filled it
2801
     in, but with offsets from the start of the section instead of
2802
     real addresses.  Now that we know the section location, we can
2803
     fill in the final values.  */
2804
  s = bfd_get_section_by_name (dynobj, ".need");
2805
  if (s != NULL && s->_raw_size != 0)
2806
    {
2807
      file_ptr filepos;
2808
      bfd_byte *p;
2809
 
2810
      filepos = s->output_section->filepos + s->output_offset;
2811
      p = s->contents;
2812
      while (1)
2813
        {
2814
          bfd_vma val;
2815
 
2816
          PUT_WORD (dynobj, GET_WORD (dynobj, p) + filepos, p);
2817
          val = GET_WORD (dynobj, p + 12);
2818
          if (val == 0)
2819
            break;
2820
          PUT_WORD (dynobj, val + filepos, p + 12);
2821
          p += 16;
2822
        }
2823
    }
2824
 
2825
  /* The first entry in the .got section is the address of the
2826
     dynamic information, unless this is a shared library.  */
2827
  s = bfd_get_section_by_name (dynobj, ".got");
2828
  BFD_ASSERT (s != NULL);
2829
  if (info->shared || sdyn->_raw_size == 0)
2830
    PUT_WORD (dynobj, 0, s->contents);
2831
  else
2832
    PUT_WORD (dynobj, sdyn->output_section->vma + sdyn->output_offset,
2833
              s->contents);
2834
 
2835
  for (o = dynobj->sections; o != NULL; o = o->next)
2836
    {
2837
      if ((o->flags & SEC_HAS_CONTENTS) != 0
2838
          && o->contents != NULL)
2839
        {
2840
          BFD_ASSERT (o->output_section != NULL
2841
                      && o->output_section->owner == abfd);
2842
          if (! bfd_set_section_contents (abfd, o->output_section,
2843
                                          o->contents,
2844
                                          (file_ptr) o->output_offset,
2845
                                          o->_raw_size))
2846
            return false;
2847
        }
2848
    }
2849
 
2850
  if (sdyn->_raw_size > 0)
2851
    {
2852
      struct external_sun4_dynamic esd;
2853
      struct external_sun4_dynamic_link esdl;
2854
      file_ptr pos;
2855
 
2856
      /* Finish up the dynamic link information.  */
2857
      PUT_WORD (dynobj, (bfd_vma) 3, esd.ld_version);
2858
      PUT_WORD (dynobj,
2859
                sdyn->output_section->vma + sdyn->output_offset + sizeof esd,
2860
                esd.ldd);
2861
      PUT_WORD (dynobj,
2862
                (sdyn->output_section->vma
2863
                 + sdyn->output_offset
2864
                 + sizeof esd
2865
                 + EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE),
2866
                esd.ld);
2867
 
2868
      if (! bfd_set_section_contents (abfd, sdyn->output_section, &esd,
2869
                                      (file_ptr) sdyn->output_offset,
2870
                                      (bfd_size_type) sizeof esd))
2871
        return false;
2872
 
2873
      PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_loaded);
2874
 
2875
      s = bfd_get_section_by_name (dynobj, ".need");
2876
      if (s == NULL || s->_raw_size == 0)
2877
        PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_need);
2878
      else
2879
        PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2880
                  esdl.ld_need);
2881
 
2882
      s = bfd_get_section_by_name (dynobj, ".rules");
2883
      if (s == NULL || s->_raw_size == 0)
2884
        PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_rules);
2885
      else
2886
        PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2887
                  esdl.ld_rules);
2888
 
2889
      s = bfd_get_section_by_name (dynobj, ".got");
2890
      BFD_ASSERT (s != NULL);
2891
      PUT_WORD (dynobj, s->output_section->vma + s->output_offset,
2892
                esdl.ld_got);
2893
 
2894
      s = bfd_get_section_by_name (dynobj, ".plt");
2895
      BFD_ASSERT (s != NULL);
2896
      PUT_WORD (dynobj, s->output_section->vma + s->output_offset,
2897
                esdl.ld_plt);
2898
      PUT_WORD (dynobj, s->_raw_size, esdl.ld_plt_sz);
2899
 
2900
      s = bfd_get_section_by_name (dynobj, ".dynrel");
2901
      BFD_ASSERT (s != NULL);
2902
      BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj)
2903
                  == s->_raw_size);
2904
      PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2905
                esdl.ld_rel);
2906
 
2907
      s = bfd_get_section_by_name (dynobj, ".hash");
2908
      BFD_ASSERT (s != NULL);
2909
      PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2910
                esdl.ld_hash);
2911
 
2912
      s = bfd_get_section_by_name (dynobj, ".dynsym");
2913
      BFD_ASSERT (s != NULL);
2914
      PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2915
                esdl.ld_stab);
2916
 
2917
      PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_stab_hash);
2918
 
2919
      PUT_WORD (dynobj, (bfd_vma) sunos_hash_table (info)->bucketcount,
2920
                esdl.ld_buckets);
2921
 
2922
      s = bfd_get_section_by_name (dynobj, ".dynstr");
2923
      BFD_ASSERT (s != NULL);
2924
      PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2925
                esdl.ld_symbols);
2926
      PUT_WORD (dynobj, s->_raw_size, esdl.ld_symb_size);
2927
 
2928
      /* The size of the text area is the size of the .text section
2929
         rounded up to a page boundary.  FIXME: Should the page size be
2930
         conditional on something?  */
2931
      PUT_WORD (dynobj,
2932
                BFD_ALIGN (obj_textsec (abfd)->_raw_size, 0x2000),
2933
                esdl.ld_text);
2934
 
2935
      pos = sdyn->output_offset;
2936
      pos += sizeof esd + EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE;
2937
      if (! bfd_set_section_contents (abfd, sdyn->output_section, &esdl,
2938
                                      pos, (bfd_size_type) sizeof esdl))
2939
        return false;
2940
 
2941
      abfd->flags |= DYNAMIC;
2942
    }
2943
 
2944
  return true;
2945
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.