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