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