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