* sunos.c (sunos_add_one_symbol): Only set the sunos specific
[external/binutils.git] / bfd / sunos.c
1 /* BFD backend for SunOS binaries.
2    Copyright (C) 1990, 91, 92, 93, 94 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., 675 Mass Ave, Cambridge, MA 02139, 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 long sunos_canonicalize_dynamic_symtab PARAMS ((bfd *, asymbol **));
33 static long sunos_get_dynamic_reloc_upper_bound PARAMS ((bfd *));
34 static long sunos_canonicalize_dynamic_reloc
35   PARAMS ((bfd *, arelent **, asymbol **));
36 static struct bfd_hash_entry *sunos_link_hash_newfunc
37   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
38 static struct bfd_link_hash_table *sunos_link_hash_table_create
39   PARAMS ((bfd *));
40 static boolean sunos_add_dynamic_symbols
41   PARAMS ((bfd *, struct bfd_link_info *));
42 static boolean sunos_add_one_symbol
43   PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword, asection *,
44            bfd_vma, const char *, boolean, boolean,
45            struct bfd_link_hash_entry **));
46 static boolean sunos_scan_relocs
47   PARAMS ((struct bfd_link_info *, bfd *, asection *, bfd_size_type));
48 static boolean sunos_scan_std_relocs
49   PARAMS ((struct bfd_link_info *, bfd *, asection *,
50            const struct reloc_std_external *, bfd_size_type));
51 static boolean sunos_scan_ext_relocs
52   PARAMS ((struct bfd_link_info *, bfd *, asection *,
53            const struct reloc_ext_external *, bfd_size_type));
54 static boolean sunos_link_dynamic_object
55   PARAMS ((struct bfd_link_info *, bfd *));
56 static boolean sunos_write_dynamic_symbol
57   PARAMS ((bfd *, struct bfd_link_info *, struct aout_link_hash_entry *));
58 static boolean sunos_check_dynamic_reloc
59   PARAMS ((struct bfd_link_info *, bfd *, asection *,
60            struct aout_link_hash_entry *, PTR, boolean *));
61 static boolean sunos_finish_dynamic_link
62   PARAMS ((bfd *, struct bfd_link_info *));
63
64 #define MY_get_dynamic_symtab_upper_bound sunos_get_dynamic_symtab_upper_bound
65 #define MY_canonicalize_dynamic_symtab sunos_canonicalize_dynamic_symtab
66 #define MY_get_dynamic_reloc_upper_bound sunos_get_dynamic_reloc_upper_bound
67 #define MY_canonicalize_dynamic_reloc sunos_canonicalize_dynamic_reloc
68 #define MY_bfd_link_hash_table_create sunos_link_hash_table_create
69 #define MY_add_dynamic_symbols sunos_add_dynamic_symbols
70 #define MY_add_one_symbol sunos_add_one_symbol
71 #define MY_link_dynamic_object sunos_link_dynamic_object
72 #define MY_write_dynamic_symbol sunos_write_dynamic_symbol
73 #define MY_check_dynamic_reloc sunos_check_dynamic_reloc
74 #define MY_finish_dynamic_link sunos_finish_dynamic_link
75
76 /* Include the usual a.out support.  */
77 #include "aoutf1.h"
78
79 /* SunOS shared library support.  We store a pointer to this structure
80    in obj_aout_dynamic_info (abfd).  */
81
82 struct sunos_dynamic_info
83 {
84   /* Whether we found any dynamic information.  */
85   boolean valid;
86   /* Dynamic information.  */
87   struct internal_sun4_dynamic_link dyninfo;
88   /* Number of dynamic symbols.  */
89   long dynsym_count;
90   /* Read in nlists for dynamic symbols.  */
91   struct external_nlist *dynsym;
92   /* asymbol structures for dynamic symbols.  */
93   aout_symbol_type *canonical_dynsym;
94   /* Read in dynamic string table.  */
95   char *dynstr;
96   /* Number of dynamic relocs.  */
97   long dynrel_count;
98   /* Read in dynamic relocs.  This may be reloc_std_external or
99      reloc_ext_external.  */
100   PTR dynrel;
101   /* arelent structures for dynamic relocs.  */
102   arelent *canonical_dynrel;
103 };
104
105 /* The hash table of dynamic symbols is composed of two word entries.
106    See include/aout/sun4.h for details.  */
107
108 #define HASH_ENTRY_SIZE (2 * BYTES_IN_WORD)
109
110 /* Read in the basic dynamic information.  This locates the __DYNAMIC
111    structure and uses it to find the dynamic_link structure.  It
112    creates and saves a sunos_dynamic_info structure.  If it can't find
113    __DYNAMIC, it sets the valid field of the sunos_dynamic_info
114    structure to false to avoid doing this work again.  */
115
116 static boolean
117 sunos_read_dynamic_info (abfd)
118      bfd *abfd;
119 {
120   struct sunos_dynamic_info *info;
121   asection *dynsec;
122   file_ptr dynoff;
123   struct external_sun4_dynamic dyninfo;
124   unsigned long dynver;
125   struct external_sun4_dynamic_link linkinfo;
126
127   if (obj_aout_dynamic_info (abfd) != (PTR) NULL)
128     return true;
129
130   if ((abfd->flags & DYNAMIC) == 0)
131     {
132       bfd_set_error (bfd_error_invalid_operation);
133       return false;
134     }
135
136   info = ((struct sunos_dynamic_info *)
137           bfd_zalloc (abfd, sizeof (struct sunos_dynamic_info)));
138   if (!info)
139     {
140       bfd_set_error (bfd_error_no_memory);
141       return false;
142     }
143   info->valid = false;
144   info->dynsym = NULL;
145   info->dynstr = NULL;
146   info->canonical_dynsym = NULL;
147   info->dynrel = NULL;
148   info->canonical_dynrel = NULL;
149   obj_aout_dynamic_info (abfd) = (PTR) info;
150
151   /* This code used to look for the __DYNAMIC symbol to locate the dynamic
152      linking information.
153      However this inhibits recovering the dynamic symbols from a
154      stripped object file, so blindly assume that the dynamic linking
155      information is located at the start of the data section.
156      We could verify this assumption later by looking through the dynamic
157      symbols for the __DYNAMIC symbol.  */
158   if ((abfd->flags & DYNAMIC) == 0)
159     return true;
160   if (! bfd_get_section_contents (abfd, obj_datasec (abfd), (PTR) &dyninfo,
161                                   (file_ptr) 0, sizeof dyninfo))
162     return true;
163
164   dynver = GET_WORD (abfd, dyninfo.ld_version);
165   if (dynver != 2 && dynver != 3)
166     return true;
167
168   dynoff = GET_WORD (abfd, dyninfo.ld);
169
170   /* dynoff is a virtual address.  It is probably always in the .data
171      section, but this code should work even if it moves.  */
172   if (dynoff < bfd_get_section_vma (abfd, obj_datasec (abfd)))
173     dynsec = obj_textsec (abfd);
174   else
175     dynsec = obj_datasec (abfd);
176   dynoff -= bfd_get_section_vma (abfd, dynsec);
177   if (dynoff < 0 || dynoff > bfd_section_size (abfd, dynsec))
178     return true;
179
180   /* This executable appears to be dynamically linked in a way that we
181      can understand.  */
182   if (! bfd_get_section_contents (abfd, dynsec, (PTR) &linkinfo, dynoff,
183                                   (bfd_size_type) sizeof linkinfo))
184     return true;
185
186   /* Swap in the dynamic link information.  */
187   info->dyninfo.ld_loaded = GET_WORD (abfd, linkinfo.ld_loaded);
188   info->dyninfo.ld_need = GET_WORD (abfd, linkinfo.ld_need);
189   info->dyninfo.ld_rules = GET_WORD (abfd, linkinfo.ld_rules);
190   info->dyninfo.ld_got = GET_WORD (abfd, linkinfo.ld_got);
191   info->dyninfo.ld_plt = GET_WORD (abfd, linkinfo.ld_plt);
192   info->dyninfo.ld_rel = GET_WORD (abfd, linkinfo.ld_rel);
193   info->dyninfo.ld_hash = GET_WORD (abfd, linkinfo.ld_hash);
194   info->dyninfo.ld_stab = GET_WORD (abfd, linkinfo.ld_stab);
195   info->dyninfo.ld_stab_hash = GET_WORD (abfd, linkinfo.ld_stab_hash);
196   info->dyninfo.ld_buckets = GET_WORD (abfd, linkinfo.ld_buckets);
197   info->dyninfo.ld_symbols = GET_WORD (abfd, linkinfo.ld_symbols);
198   info->dyninfo.ld_symb_size = GET_WORD (abfd, linkinfo.ld_symb_size);
199   info->dyninfo.ld_text = GET_WORD (abfd, linkinfo.ld_text);
200   info->dyninfo.ld_plt_sz = GET_WORD (abfd, linkinfo.ld_plt_sz);
201
202   /* The only way to get the size of the symbol information appears to
203      be to determine the distance between it and the string table.  */
204   info->dynsym_count = ((info->dyninfo.ld_symbols - info->dyninfo.ld_stab)
205                         / EXTERNAL_NLIST_SIZE);
206   BFD_ASSERT (info->dynsym_count * EXTERNAL_NLIST_SIZE
207               == info->dyninfo.ld_symbols - info->dyninfo.ld_stab);
208
209   /* Similarly, the relocs end at the hash table.  */
210   info->dynrel_count = ((info->dyninfo.ld_hash - info->dyninfo.ld_rel)
211                         / obj_reloc_entry_size (abfd));
212   BFD_ASSERT (info->dynrel_count * obj_reloc_entry_size (abfd)
213               == info->dyninfo.ld_hash - info->dyninfo.ld_rel);
214
215   info->valid = true;
216
217   return true;
218 }
219
220 /* Return the amount of memory required for the dynamic symbols.  */
221
222 static long
223 sunos_get_dynamic_symtab_upper_bound (abfd)
224      bfd *abfd;
225 {
226   struct sunos_dynamic_info *info;
227
228   if (! sunos_read_dynamic_info (abfd))
229     return -1;
230
231   info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
232   if (! info->valid)
233     {
234       bfd_set_error (bfd_error_no_symbols);
235       return -1;
236     }
237
238   return (info->dynsym_count + 1) * sizeof (asymbol *);
239 }
240
241 /* Read in the dynamic symbols.  */
242
243 static long
244 sunos_canonicalize_dynamic_symtab (abfd, storage)
245      bfd *abfd;
246      asymbol **storage;
247 {
248   struct sunos_dynamic_info *info;
249   long i;
250
251   /* Get the general dynamic information.  */
252   if (obj_aout_dynamic_info (abfd) == NULL)
253     {
254       if (! sunos_read_dynamic_info (abfd))
255           return -1;
256     }
257
258   info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
259   if (! info->valid)
260     {
261       bfd_set_error (bfd_error_no_symbols);
262       return -1;
263     }
264
265   /* Get the dynamic nlist structures.  */
266   if (info->dynsym == (struct external_nlist *) NULL)
267     {
268       info->dynsym = ((struct external_nlist *)
269                       bfd_alloc (abfd,
270                                  (info->dynsym_count
271                                   * EXTERNAL_NLIST_SIZE)));
272       if (info->dynsym == NULL && info->dynsym_count != 0)
273         {
274           bfd_set_error (bfd_error_no_memory);
275           return -1;
276         }
277       if (bfd_seek (abfd, info->dyninfo.ld_stab, SEEK_SET) != 0
278           || (bfd_read ((PTR) info->dynsym, info->dynsym_count,
279                         EXTERNAL_NLIST_SIZE, abfd)
280               != info->dynsym_count * EXTERNAL_NLIST_SIZE))
281         {
282           if (info->dynsym != NULL)
283             {
284               bfd_release (abfd, info->dynsym);
285               info->dynsym = NULL;
286             }
287           return -1;
288         }
289     }
290
291   /* Get the dynamic strings.  */
292   if (info->dynstr == (char *) NULL)
293     {
294       info->dynstr = (char *) bfd_alloc (abfd, info->dyninfo.ld_symb_size);
295       if (info->dynstr == NULL && info->dyninfo.ld_symb_size != 0)
296         {
297           bfd_set_error (bfd_error_no_memory);
298           return -1;
299         }
300       if (bfd_seek (abfd, info->dyninfo.ld_symbols, SEEK_SET) != 0
301           || (bfd_read ((PTR) info->dynstr, 1, info->dyninfo.ld_symb_size,
302                         abfd)
303               != info->dyninfo.ld_symb_size))
304         {
305           if (info->dynstr != NULL)
306             {
307               bfd_release (abfd, info->dynstr);
308               info->dynstr = NULL;
309             }
310           return -1;
311         }
312     }
313
314 #ifdef CHECK_DYNAMIC_HASH
315   /* Check my understanding of the dynamic hash table by making sure
316      that each symbol can be located in the hash table.  */
317   {
318     bfd_size_type table_size;
319     bfd_byte *table;
320     bfd_size_type i;
321
322     if (info->dyninfo.ld_buckets > info->dynsym_count)
323       abort ();
324     table_size = info->dyninfo.ld_stab - info->dyninfo.ld_hash;
325     table = (bfd_byte *) malloc (table_size);
326     if (table == NULL && table_size != 0)
327       abort ();
328     if (bfd_seek (abfd, info->dyninfo.ld_hash, SEEK_SET) != 0
329         || bfd_read ((PTR) table, 1, table_size, abfd) != table_size)
330       abort ();
331     for (i = 0; i < info->dynsym_count; i++)
332       {
333         unsigned char *name;
334         unsigned long hash;
335
336         name = ((unsigned char *) info->dynstr
337                 + GET_WORD (abfd, info->dynsym[i].e_strx));
338         hash = 0;
339         while (*name != '\0')
340           hash = (hash << 1) + *name++;
341         hash &= 0x7fffffff;
342         hash %= info->dyninfo.ld_buckets;
343         while (GET_WORD (abfd, table + hash * HASH_ENTRY_SIZE) != i)
344           {
345             hash = GET_WORD (abfd,
346                              table + hash * HASH_ENTRY_SIZE + BYTES_IN_WORD);
347             if (hash == 0 || hash >= table_size / HASH_ENTRY_SIZE)
348               abort ();
349           }
350       }
351     free (table);
352   }
353 #endif /* CHECK_DYNAMIC_HASH */
354
355   /* Get the asymbol structures corresponding to the dynamic nlist
356      structures.  */
357   if (info->canonical_dynsym == (aout_symbol_type *) NULL)
358     {
359       info->canonical_dynsym = ((aout_symbol_type *)
360                                 bfd_alloc (abfd,
361                                            (info->dynsym_count
362                                             * sizeof (aout_symbol_type))));
363       if (info->canonical_dynsym == NULL && info->dynsym_count != 0)
364         {
365           bfd_set_error (bfd_error_no_memory);
366           return -1;
367         }
368
369       if (! aout_32_translate_symbol_table (abfd, info->canonical_dynsym,
370                                             info->dynsym, info->dynsym_count,
371                                             info->dynstr,
372                                             info->dyninfo.ld_symb_size,
373                                             true))
374         {
375           if (info->canonical_dynsym != NULL)
376             {
377               bfd_release (abfd, info->canonical_dynsym);
378               info->canonical_dynsym = NULL;
379             }
380           return -1;
381         }
382     }
383
384   /* Return pointers to the dynamic asymbol structures.  */
385   for (i = 0; i < info->dynsym_count; i++)
386     *storage++ = (asymbol *) (info->canonical_dynsym + i);
387   *storage = NULL;
388
389   return info->dynsym_count;
390 }
391
392 /* Return the amount of memory required for the dynamic relocs.  */
393
394 static long
395 sunos_get_dynamic_reloc_upper_bound (abfd)
396      bfd *abfd;
397 {
398   struct sunos_dynamic_info *info;
399
400   if (! sunos_read_dynamic_info (abfd))
401     return -1;
402
403   info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
404   if (! info->valid)
405     {
406       bfd_set_error (bfd_error_no_symbols);
407       return -1;
408     }
409
410   return (info->dynrel_count + 1) * sizeof (arelent *);
411 }
412
413 /* Read in the dynamic relocs.  */
414
415 static long
416 sunos_canonicalize_dynamic_reloc (abfd, storage, syms)
417      bfd *abfd;
418      arelent **storage;
419      asymbol **syms;
420 {
421   struct sunos_dynamic_info *info;
422   long i;
423
424   /* Get the general dynamic information.  */
425   if (obj_aout_dynamic_info (abfd) == (PTR) NULL)
426     {
427       if (! sunos_read_dynamic_info (abfd))
428         return -1;
429     }
430
431   info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd);
432   if (! info->valid)
433     {
434       bfd_set_error (bfd_error_no_symbols);
435       return -1;
436     }
437
438   /* Get the dynamic reloc information.  */
439   if (info->dynrel == NULL)
440     {
441       info->dynrel = (PTR) bfd_alloc (abfd,
442                                       (info->dynrel_count
443                                        * obj_reloc_entry_size (abfd)));
444       if (info->dynrel == NULL && info->dynrel_count != 0)
445         {
446           bfd_set_error (bfd_error_no_memory);
447           return -1;
448         }
449       if (bfd_seek (abfd, info->dyninfo.ld_rel, SEEK_SET) != 0
450           || (bfd_read ((PTR) info->dynrel, info->dynrel_count,
451                         obj_reloc_entry_size (abfd), abfd)
452               != info->dynrel_count * obj_reloc_entry_size (abfd)))
453         {
454           if (info->dynrel != NULL)
455             {
456               bfd_release (abfd, info->dynrel);
457               info->dynrel = NULL;
458             }
459           return -1;
460         }
461     }
462
463   /* Get the arelent structures corresponding to the dynamic reloc
464      information.  */
465   if (info->canonical_dynrel == (arelent *) NULL)
466     {
467       arelent *to;
468
469       info->canonical_dynrel = ((arelent *)
470                                 bfd_alloc (abfd,
471                                            (info->dynrel_count
472                                             * sizeof (arelent))));
473       if (info->canonical_dynrel == NULL && info->dynrel_count != 0)
474         {
475           bfd_set_error (bfd_error_no_memory);
476           return -1;
477         }
478       
479       to = info->canonical_dynrel;
480
481       if (obj_reloc_entry_size (abfd) == RELOC_EXT_SIZE)
482         {
483           register struct reloc_ext_external *p;
484           struct reloc_ext_external *pend;
485
486           p = (struct reloc_ext_external *) info->dynrel;
487           pend = p + info->dynrel_count;
488           for (; p < pend; p++, to++)
489             NAME(aout,swap_ext_reloc_in) (abfd, p, to, syms);
490         }
491       else
492         {
493           register struct reloc_std_external *p;
494           struct reloc_std_external *pend;
495
496           p = (struct reloc_std_external *) info->dynrel;
497           pend = p + info->dynrel_count;
498           for (; p < pend; p++, to++)
499             NAME(aout,swap_std_reloc_in) (abfd, p, to, syms);
500         }
501     }
502
503   /* Return pointers to the dynamic arelent structures.  */
504   for (i = 0; i < info->dynrel_count; i++)
505     *storage++ = info->canonical_dynrel + i;
506   *storage = NULL;
507
508   return info->dynrel_count;
509 }
510 \f
511 /* Code to handle linking of SunOS shared libraries.  */
512
513 /* A SPARC procedure linkage table entry is 12 bytes.  The first entry
514    in the table is a jump which is filled in by the runtime linker.
515    The remaining entries are branches back to the first entry,
516    followed by an index into the relocation table encoded to look like
517    a sethi of %g0.  */
518
519 #define SPARC_PLT_ENTRY_SIZE (12)
520
521 static const bfd_byte sparc_plt_first_entry[SPARC_PLT_ENTRY_SIZE] =
522 {
523   /* sethi %hi(0),%g1; address filled in by runtime linker.  */
524   0x3, 0, 0, 0,
525   /* jmp %g1; offset filled in by runtime linker.  */
526   0x81, 0xc0, 0x60, 0,
527   /* nop */
528   0x1, 0, 0, 0
529 };
530
531 /* save %sp, -96, %sp */
532 #define SPARC_PLT_ENTRY_WORD0 0x9de3bfa0
533 /* call; address filled in later.  */
534 #define SPARC_PLT_ENTRY_WORD1 0x40000000
535 /* sethi; reloc index filled in later.  */
536 #define SPARC_PLT_ENTRY_WORD2 0x01000000
537
538 /* An m68k procedure linkage table entry is 8 bytes.  The first entry
539    in the table is a jump which is filled in the by the runtime
540    linker.  The remaining entries are branches back to the first
541    entry, followed by a two byte index into the relocation table.  */
542
543 #define M68K_PLT_ENTRY_SIZE (8)
544
545 static const bfd_byte m68k_plt_first_entry[M68K_PLT_ENTRY_SIZE] =
546 {
547   /* jmps @# */
548   0x4e, 0xf9,
549   /* Filled in by runtime linker with a magic address.  */
550   0, 0, 0, 0,
551   /* Not used?  */
552   0, 0
553 };
554
555 /* bsrl */
556 #define M68K_PLT_ENTRY_WORD0 (0x61ff)
557 /* Remaining words filled in later.  */
558
559 /* An entry in the SunOS linker hash table.  */
560
561 struct sunos_link_hash_entry
562 {
563   struct aout_link_hash_entry root;
564
565   /* If this is a dynamic symbol, this is its index into the dynamic
566      symbol table.  This is initialized to -1.  As the linker looks at
567      the input files, it changes this to -2 if it will be added to the
568      dynamic symbol table.  After all the input files have been seen,
569      the linker will know whether to build a dynamic symbol table; if
570      it does build one, this becomes the index into the table.  */
571   long dynindx;
572
573   /* If this is a dynamic symbol, this is the index of the name in the
574      dynamic symbol string table.  */
575   long dynstr_index;
576
577   /* Some linker flags.  */
578   unsigned char flags;
579   /* Symbol is referenced by a regular object.  */
580 #define SUNOS_REF_REGULAR 01
581   /* Symbol is defined by a regular object.  */
582 #define SUNOS_DEF_REGULAR 02
583   /* Symbol is referenced by a dynamic object.  */
584 #define SUNOS_REF_DYNAMIC 010
585   /* Symbol is defined by a dynamic object.  */
586 #define SUNOS_DEF_DYNAMIC 020
587 };
588
589 /* The SunOS linker hash table.  */
590
591 struct sunos_link_hash_table
592 {
593   struct aout_link_hash_table root;
594
595   /* The first dynamic object found during the link.  */
596   bfd *dynobj;
597
598   /* The number of dynamic symbols.  */
599   size_t dynsymcount;
600
601   /* The number of buckets in the hash table.  */
602   size_t bucketcount;
603 };
604
605 /* Routine to create an entry in an SunOS link hash table.  */
606
607 static struct bfd_hash_entry *
608 sunos_link_hash_newfunc (entry, table, string)
609      struct bfd_hash_entry *entry;
610      struct bfd_hash_table *table;
611      const char *string;
612 {
613   struct sunos_link_hash_entry *ret = (struct sunos_link_hash_entry *) entry;
614
615   /* Allocate the structure if it has not already been allocated by a
616      subclass.  */
617   if (ret == (struct sunos_link_hash_entry *) NULL)
618     ret = ((struct sunos_link_hash_entry *)
619            bfd_hash_allocate (table, sizeof (struct sunos_link_hash_entry)));
620   if (ret == (struct sunos_link_hash_entry *) NULL)
621     {
622       bfd_set_error (bfd_error_no_memory);
623       return (struct bfd_hash_entry *) ret;
624     }
625
626   /* Call the allocation method of the superclass.  */
627   ret = ((struct sunos_link_hash_entry *)
628          NAME(aout,link_hash_newfunc) ((struct bfd_hash_entry *) ret,
629                                        table, string));
630   if (ret != NULL)
631     {
632       /* Set local fields.  */
633       ret->dynindx = -1;
634       ret->dynstr_index = -1;
635       ret->flags = 0;
636     }
637
638   return (struct bfd_hash_entry *) ret;
639 }
640
641 /* Create a SunOS link hash table.  */
642
643 static struct bfd_link_hash_table *
644 sunos_link_hash_table_create (abfd)
645      bfd *abfd;
646 {
647   struct sunos_link_hash_table *ret;
648
649   ret = ((struct sunos_link_hash_table *)
650          malloc (sizeof (struct sunos_link_hash_table)));
651   if (ret == (struct sunos_link_hash_table *) NULL)
652     {
653       bfd_set_error (bfd_error_no_memory);
654       return (struct bfd_link_hash_table *) NULL;
655     }
656   if (! NAME(aout,link_hash_table_init) (&ret->root, abfd,
657                                          sunos_link_hash_newfunc))
658     {
659       free (ret);
660       return (struct bfd_link_hash_table *) NULL;
661     }
662
663   ret->dynobj = NULL;
664   ret->dynsymcount = 0;
665   ret->bucketcount = 0;
666
667   return &ret->root.root;
668 }
669
670 /* Look up an entry in an SunOS link hash table.  */
671
672 #define sunos_link_hash_lookup(table, string, create, copy, follow) \
673   ((struct sunos_link_hash_entry *) \
674    aout_link_hash_lookup (&(table)->root, (string), (create), (copy),\
675                           (follow)))
676
677 /* Traverse a SunOS link hash table.  */
678
679 #define sunos_link_hash_traverse(table, func, info)                     \
680   (aout_link_hash_traverse                                              \
681    (&(table)->root,                                                     \
682     (boolean (*) PARAMS ((struct aout_link_hash_entry *, PTR))) (func), \
683     (info)))
684
685 /* Get the SunOS link hash table from the info structure.  This is
686    just a cast.  */
687
688 #define sunos_hash_table(p) ((struct sunos_link_hash_table *) ((p)->hash))
689
690 static boolean sunos_scan_dynamic_symbol
691   PARAMS ((struct sunos_link_hash_entry *, PTR));
692
693 /* Add dynamic symbols during a link.  This is called by the a.out
694    backend linker when it encounters an object with the DYNAMIC flag
695    set.  */
696
697 static boolean
698 sunos_add_dynamic_symbols (abfd, info)
699      bfd *abfd;
700      struct bfd_link_info *info;
701 {
702   asection *s;
703
704   /* We do not want to include the sections in a dynamic object in the
705      output file.  We hack by simply clobbering the list of sections
706      in the BFD.  This could be handled more cleanly by, say, a new
707      section flag; the existing SEC_NEVER_LOAD flag is not the one we
708      want, because that one still implies that the section takes up
709      space in the output file.  */
710   abfd->sections = NULL;
711
712   /* The native linker seems to just ignore dynamic objects when -r is
713      used.  */
714   if (info->relocateable)
715     return true;
716
717   /* There's no hope of using a dynamic object which does not exactly
718      match the format of the output file.  */
719   if (info->hash->creator != abfd->xvec)
720     {
721       bfd_set_error (bfd_error_invalid_operation);
722       return false;
723     }
724
725   /* If this is the first dynamic object, create some new sections to
726      hold dynamic linking information.  We need to put these sections
727      somewhere, and the first dynamic object is as good a place as
728      any.  The linker script will look for these special section names
729      and put them in the right place in the output file.  See
730      include/aout/sun4.h for more details of the dynamic linking
731      information.  */
732   if (sunos_hash_table (info)->dynobj == NULL)
733     {
734       flagword flags;
735       asection *sdyn;
736
737       sunos_hash_table (info)->dynobj = abfd;
738       
739       flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
740
741       /* The .dynamic section holds the basic dynamic information: the
742          sun4_dynamic structure, the dynamic debugger information, and
743          the sun4_dynamic_link structure.  */
744       s = bfd_make_section (abfd, ".dynamic");
745       if (s == NULL
746           || ! bfd_set_section_flags (abfd, s, flags)
747           || ! bfd_set_section_alignment (abfd, s, 2))
748         return false;
749       sdyn = s;
750
751       /* The .need section holds the list of names of shared objets
752          which must be included at runtime.  The address of this
753          section is put in the ld_need field.  */
754       s = bfd_make_section (abfd, ".need");
755       if (s == NULL
756           || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
757           || ! bfd_set_section_alignment (abfd, s, 2))
758         return false;
759
760       /* The .rules section holds the path to search for shared
761          objects.  The address of this section is put in the ld_rules
762          field.  */
763       s = bfd_make_section (abfd, ".rules");
764       if (s == NULL
765           || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
766           || ! bfd_set_section_alignment (abfd, s, 2))
767         return false;
768
769       /* The .got section holds the global offset table.  I don't
770          really know how this works, actually.  It seems to only be
771          used for PIC code.  The address minus four is put in the
772          ld_got field.  */
773       s = bfd_make_section (abfd, ".got");
774       if (s == NULL
775           || ! bfd_set_section_flags (abfd, s, flags)
776           || ! bfd_set_section_alignment (abfd, s, 2))
777         return false;
778       s->_raw_size = BYTES_IN_WORD;
779
780       /* The .plt section holds the procedure linkage table.  The
781          address is put in the ld_plt field.  */
782       s = bfd_make_section (abfd, ".plt");
783       if (s == NULL
784           || ! bfd_set_section_flags (abfd, s, flags | SEC_CODE)
785           || ! bfd_set_section_alignment (abfd, s, 2))
786         return false;
787
788       /* The .dynrel section holds the dynamic relocs.  The address is
789          put in the ld_rel field.  */
790       s = bfd_make_section (abfd, ".dynrel");
791       if (s == NULL
792           || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
793           || ! bfd_set_section_alignment (abfd, s, 2))
794         return false;
795
796       /* The .hash section holds the dynamic hash table.  The address
797          is put in the ld_hash field.  */
798       s = bfd_make_section (abfd, ".hash");
799       if (s == NULL
800           || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
801           || ! bfd_set_section_alignment (abfd, s, 2))
802         return false;
803
804       /* The .dynsym section holds the dynamic symbols.  The address
805          is put in the ld_stab field.  */
806       s = bfd_make_section (abfd, ".dynsym");
807       if (s == NULL
808           || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
809           || ! bfd_set_section_alignment (abfd, s, 2))
810         return false;
811
812       /* The .dynstr section holds the dynamic symbol string table.
813          The address is put in the ld_symbols field.  */
814       s = bfd_make_section (abfd, ".dynstr");
815       if (s == NULL
816           || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
817           || ! bfd_set_section_alignment (abfd, s, 2))
818         return false;
819     }
820
821   return true;
822 }
823
824 /* Function to add a single symbol to the linker hash table.  This is
825    a wrapper around _bfd_generic_link_add_one_symbol which handles the
826    tweaking needed for dynamic linking support.  */
827
828 static boolean
829 sunos_add_one_symbol (info, abfd, name, flags, section, value, string,
830                       copy, collect, hashp)
831      struct bfd_link_info *info;
832      bfd *abfd;
833      const char *name;
834      flagword flags;
835      asection *section;
836      bfd_vma value;
837      const char *string;
838      boolean copy;
839      boolean collect;
840      struct bfd_link_hash_entry **hashp;
841 {
842   struct sunos_link_hash_entry *h;
843   int new_flag;
844
845   h = sunos_link_hash_lookup (sunos_hash_table (info), name, true, copy,
846                               false);
847   if (h == NULL)
848     return false;
849
850   if (hashp != NULL)
851     *hashp = (struct bfd_link_hash_entry *) h;
852
853   /* Treat a common symbol in a dynamic object as defined in the .bss
854      section of the dynamic object.  We don't want to allocate space
855      for it in our process image.  */
856   if ((abfd->flags & DYNAMIC) != 0
857       && bfd_is_com_section (section))
858     section = obj_bsssec (abfd);
859
860   if (! bfd_is_und_section (section)
861       && h->root.root.type != bfd_link_hash_new
862       && h->root.root.type != bfd_link_hash_undefined)
863     {
864       /* We are defining the symbol, and it is already defined.  This
865          is a potential multiple definition error.  */
866       if ((abfd->flags & DYNAMIC) != 0)
867         {
868           /* The definition we are adding is from a dynamic object.
869              We do not want this new definition to override the
870              existing definition, so we pretend it is just a
871              reference.  */
872           section = bfd_und_section_ptr;
873         }
874       else if ((h->root.root.type == bfd_link_hash_defined
875                 && h->root.root.u.def.section->owner != NULL
876                 && (h->root.root.u.def.section->owner->flags & DYNAMIC) != 0)
877                || (h->root.root.type == bfd_link_hash_common
878                    && ((h->root.root.u.c.section->owner->flags & DYNAMIC)
879                        != 0)))
880         {
881           /* The existing definition is from a dynamic object.  We
882              want to override it with the definition we just found.
883              Clobber the existing definition.  */
884           h->root.root.type = bfd_link_hash_new;
885         }
886     }
887
888   /* Do the usual procedure for adding a symbol.  */
889   if (! _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section,
890                                           value, string, copy, collect,
891                                           hashp))
892     return false;
893
894   if (abfd->xvec == info->hash->creator)
895     {
896       /* Set a flag in the hash table entry indicating the type of
897          reference or definition we just found.  Keep a count of the
898          number of dynamic symbols we find.  A dynamic symbol is one
899          which is referenced or defined by both a regular object and a
900          shared object.  */
901       if ((abfd->flags & DYNAMIC) == 0)
902         {
903           if (bfd_is_und_section (section))
904             new_flag = SUNOS_REF_REGULAR;
905           else
906             new_flag = SUNOS_DEF_REGULAR;
907         }
908       else
909         {
910           if (bfd_is_und_section (section))
911             new_flag = SUNOS_REF_DYNAMIC;
912           else
913             new_flag = SUNOS_DEF_DYNAMIC;
914         }
915       h->flags |= new_flag;
916
917       if (h->dynindx == -1
918           && (h->flags & (SUNOS_DEF_REGULAR | SUNOS_REF_REGULAR)) != 0)
919         {
920           ++sunos_hash_table (info)->dynsymcount;
921           h->dynindx = -2;
922         }
923     }
924
925   return true;
926 }
927
928 /* Record an assignment made to a symbol by a linker script.  We need
929    this in case some dynamic object refers to this symbol.  */
930
931 boolean
932 bfd_sunos_record_link_assignment (output_bfd, info, name)
933      bfd *output_bfd;
934      struct bfd_link_info *info;
935      const char *name;
936 {
937   struct sunos_link_hash_entry *h;
938
939   /* This is called after we have examined all the input objects.  If
940      the symbol does not exist, it merely means that no object refers
941      to it, and we can just ignore it at this point.  */
942   h = sunos_link_hash_lookup (sunos_hash_table (info), name,
943                               false, false, false);
944   if (h == NULL)
945     return true;
946
947   h->flags |= SUNOS_DEF_REGULAR;
948
949   if (h->dynindx == -1)
950     {
951       ++sunos_hash_table (info)->dynsymcount;
952       h->dynindx = -2;
953     }
954
955   return true;
956 }
957
958 /* Set up the sizes and contents of the dynamic sections created in
959    sunos_add_dynamic_symbols.  This is called by the SunOS linker
960    emulation before_allocation routine.  We must set the sizes of the
961    sections before the linker sets the addresses of the various
962    sections.  This unfortunately requires reading all the relocs so
963    that we can work out which ones need to become dynamic relocs.  If
964    info->keep_memory is true, we keep the relocs in memory; otherwise,
965    we discard them, and will read them again later.  */
966
967 boolean
968 bfd_sunos_size_dynamic_sections (output_bfd, info, sdynptr, sneedptr,
969                                  srulesptr)
970      bfd *output_bfd;
971      struct bfd_link_info *info;
972      asection **sdynptr;
973      asection **sneedptr;
974      asection **srulesptr;
975 {
976   bfd *dynobj;
977   size_t dynsymcount;
978   asection *s;
979   size_t bucketcount;
980   size_t hashalloc;
981   size_t i;
982   bfd *sub;
983
984   *sdynptr = NULL;
985   *sneedptr = NULL;
986   *srulesptr = NULL;
987
988   dynobj = sunos_hash_table (info)->dynobj;
989   dynsymcount = sunos_hash_table (info)->dynsymcount;
990
991   /* If there were no dynamic objects in the link, there is nothing to
992      do here.  */
993   if (dynobj == NULL)
994     return true;
995
996   /* The .dynamic section is always the same size.  */
997   s = bfd_get_section_by_name (dynobj, ".dynamic");
998   BFD_ASSERT (s != NULL);
999   s->_raw_size = (sizeof (struct external_sun4_dynamic)
1000                   + EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE
1001                   + sizeof (struct external_sun4_dynamic_link));
1002
1003   /* Set the size of the .dynsym and .hash sections.  We counted the
1004      number of dynamic symbols as we read the input files.  We will
1005      build the dynamic symbol table (.dynsym) and the hash table
1006      (.hash) when we build the final symbol table, because until then
1007      we do not know the correct value to give the symbols.  We build
1008      the dynamic symbol string table (.dynstr) in a traversal of the
1009      symbol table using sunos_scan_dynamic_symbol.  */
1010   s = bfd_get_section_by_name (dynobj, ".dynsym");
1011   BFD_ASSERT (s != NULL);
1012   s->_raw_size = dynsymcount * sizeof (struct external_nlist);
1013   s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size);
1014   if (s->contents == NULL && s->_raw_size != 0)
1015     {
1016       bfd_set_error (bfd_error_no_memory);
1017       return false;
1018     }
1019       
1020   /* The number of buckets is just the number of symbols divided by
1021      four.  The compute the final size of the hash table, we must
1022      actually compute the hash table.  Normally we need exactly as
1023      many entries in the hash table as there are dynamic symbols, but
1024      if some of the buckets are not used we will need additional
1025      entries.  In the worse case, every symbol will hash to the same
1026      bucket, and we will need BUCKETCOUNT - 1 extra entries.  */
1027   if (dynsymcount >= 4)
1028     bucketcount = dynsymcount / 4;
1029   else if (dynsymcount > 0)
1030     bucketcount = dynsymcount;
1031   else
1032     bucketcount = 1;
1033   s = bfd_get_section_by_name (dynobj, ".hash");
1034   BFD_ASSERT (s != NULL);
1035   hashalloc = (dynsymcount + bucketcount - 1) * HASH_ENTRY_SIZE;
1036   s->contents = (bfd_byte *) bfd_alloc (dynobj, hashalloc);
1037   if (s->contents == NULL && dynsymcount > 0)
1038     {
1039       bfd_set_error (bfd_error_no_memory);
1040       return false;
1041     }
1042   memset (s->contents, 0, hashalloc);
1043   for (i = 0; i < bucketcount; i++)
1044     PUT_WORD (output_bfd, (bfd_vma) -1, s->contents + i * HASH_ENTRY_SIZE);
1045   s->_raw_size = bucketcount * HASH_ENTRY_SIZE;
1046
1047   sunos_hash_table (info)->bucketcount = bucketcount;
1048
1049   /* Look through all the input BFD's and read their relocs.  It would
1050      be better if we didn't have to do this, but there is no other way
1051      to determine the number of dynamic relocs we need, and, more
1052      importantly, there is no other way to know which symbols should
1053      get an entry in the procedure linkage table.  */
1054   for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
1055     {
1056       if ((sub->flags & DYNAMIC) == 0)
1057         {
1058           if (! sunos_scan_relocs (info, sub, obj_textsec (sub),
1059                                    exec_hdr (sub)->a_trsize)
1060               || ! sunos_scan_relocs (info, sub, obj_datasec (sub),
1061                                       exec_hdr (sub)->a_drsize))
1062             return false;
1063         }
1064     }
1065
1066   /* Scan all the symbols, place them in the dynamic symbol table, and
1067      build the dynamic hash table.  We reuse dynsymcount as a counter
1068      for the number of symbols we have added so far.  */
1069   sunos_hash_table (info)->dynsymcount = 0;
1070   sunos_link_hash_traverse (sunos_hash_table (info),
1071                             sunos_scan_dynamic_symbol,
1072                             (PTR) info);
1073   BFD_ASSERT (sunos_hash_table (info)->dynsymcount == dynsymcount);
1074
1075   /* The SunOS native linker seems to align the total size of the
1076      symbol strings to a multiple of 8.  I don't know if this is
1077      important, but it can't hurt much.  */
1078   s = bfd_get_section_by_name (dynobj, ".dynstr");
1079   BFD_ASSERT (s != NULL);
1080   if ((s->_raw_size & 7) != 0)
1081     {
1082       bfd_size_type add;
1083       bfd_byte *contents;
1084
1085       add = 8 - (s->_raw_size & 7);
1086       contents = (bfd_byte *) realloc (s->contents, s->_raw_size + add);
1087       if (contents == NULL)
1088         {
1089           bfd_set_error (bfd_error_no_memory);
1090           return false;
1091         }
1092       memset (contents + s->_raw_size, 0, add);
1093       s->contents = contents;
1094       s->_raw_size += add;
1095     }
1096
1097   /* Now that we have worked out the sizes of the procedure linkage
1098      table and the dynamic relocs, allocate storage for them.  */
1099   s = bfd_get_section_by_name (dynobj, ".plt");
1100   BFD_ASSERT (s != NULL);
1101   if (s->_raw_size != 0)
1102     {
1103       s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
1104       if (s->contents == NULL)
1105         {
1106           bfd_set_error (bfd_error_no_memory);
1107           return false;
1108         }
1109
1110       /* Fill in the first entry in the table.  */
1111       switch (bfd_get_arch (dynobj))
1112         {
1113         case bfd_arch_sparc:
1114           memcpy (s->contents, sparc_plt_first_entry, SPARC_PLT_ENTRY_SIZE);
1115           break;
1116
1117         case bfd_arch_m68k:
1118           memcpy (s->contents, m68k_plt_first_entry, M68K_PLT_ENTRY_SIZE);
1119           break;
1120
1121         default:
1122           abort ();
1123         }
1124     }
1125
1126   s = bfd_get_section_by_name (dynobj, ".dynrel");
1127   if (s->_raw_size != 0)
1128     {
1129       s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
1130       if (s->contents == NULL)
1131         {
1132           bfd_set_error (bfd_error_no_memory);
1133           return false;
1134         }
1135     }
1136   /* We use the reloc_count field to keep track of how many of the
1137      relocs we have output so far.  */
1138   s->reloc_count = 0;
1139
1140   /* Make space for the global offset table.  */
1141   s = bfd_get_section_by_name (dynobj, ".got");
1142   s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
1143   if (s->contents == NULL)
1144     {
1145       bfd_set_error (bfd_error_no_memory);
1146       return false;
1147     }
1148
1149   *sdynptr = bfd_get_section_by_name (dynobj, ".dynamic");
1150   *sneedptr = bfd_get_section_by_name (dynobj, ".need");
1151   *srulesptr = bfd_get_section_by_name (dynobj, ".rules");
1152
1153   return true;
1154 }
1155
1156 /* Scan the relocs for an input section.  */
1157
1158 static boolean
1159 sunos_scan_relocs (info, abfd, sec, rel_size)
1160      struct bfd_link_info *info;
1161      bfd *abfd;
1162      asection *sec;
1163      bfd_size_type rel_size;
1164 {
1165   PTR relocs;
1166   PTR free_relocs = NULL;
1167
1168   if (rel_size == 0)
1169     return true;
1170
1171   if (! info->keep_memory)
1172     relocs = free_relocs = malloc (rel_size);
1173   else
1174     {
1175       aout_section_data (sec) =
1176         ((struct aout_section_data_struct *)
1177          bfd_alloc (abfd, sizeof (struct aout_section_data_struct)));
1178       if (aout_section_data (sec) == NULL)
1179         relocs = NULL;
1180       else
1181         relocs = aout_section_data (sec)->relocs = malloc (rel_size);
1182     }
1183   if (relocs == NULL)
1184     {
1185       bfd_set_error (bfd_error_no_memory);
1186       return false;
1187     }
1188
1189   if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
1190       || bfd_read (relocs, 1, rel_size, abfd) != rel_size)
1191     goto error_return;
1192
1193   if (obj_reloc_entry_size (abfd) == RELOC_STD_SIZE)
1194     {
1195       if (! sunos_scan_std_relocs (info, abfd, sec,
1196                                    (struct reloc_std_external *) relocs,
1197                                    rel_size))
1198         goto error_return;
1199     }
1200   else
1201     {
1202       if (! sunos_scan_ext_relocs (info, abfd, sec,
1203                                    (struct reloc_ext_external *) relocs,
1204                                    rel_size))
1205         goto error_return;
1206     }
1207
1208   if (free_relocs != NULL)
1209     free (free_relocs);
1210
1211   return true;
1212
1213  error_return:
1214   if (free_relocs != NULL)
1215     free (free_relocs);
1216   return false;
1217 }
1218
1219 /* Scan the relocs for an input section using standard relocs.  We
1220    need to figure out what to do for each reloc against a dynamic
1221    symbol.  If the symbol is in the .text section, an entry is made in
1222    the procedure linkage table.  Note that this will do the wrong
1223    thing if the symbol is actually data; I don't think the Sun 3
1224    native linker handles this case correctly either.  If the symbol is
1225    not in the .text section, we must preserve the reloc as a dynamic
1226    reloc.  FIXME: We should also handle the PIC relocs here by
1227    building global offset table entries.  */
1228
1229 static boolean
1230 sunos_scan_std_relocs (info, abfd, sec, relocs, rel_size)
1231      struct bfd_link_info *info;
1232      bfd *abfd;
1233      asection *sec;
1234      const struct reloc_std_external *relocs;
1235      bfd_size_type rel_size;
1236 {
1237   bfd *dynobj;
1238   asection *splt;
1239   asection *srel;
1240   struct sunos_link_hash_entry **sym_hashes;
1241   const struct reloc_std_external *rel, *relend;
1242
1243   /* We only know how to handle m68k plt entries.  */
1244   if (bfd_get_arch (abfd) != bfd_arch_m68k)
1245     {
1246       bfd_set_error (bfd_error_invalid_target);
1247       return false;
1248     }
1249
1250   dynobj = sunos_hash_table (info)->dynobj;
1251   splt = bfd_get_section_by_name (dynobj, ".plt");
1252   srel = bfd_get_section_by_name (dynobj, ".dynrel");
1253   BFD_ASSERT (splt != NULL && srel != NULL);
1254   sym_hashes = (struct sunos_link_hash_entry **) obj_aout_sym_hashes (abfd);
1255
1256   relend = relocs + rel_size / RELOC_STD_SIZE;
1257   for (rel = relocs; rel < relend; rel++)
1258     {
1259       int r_index;
1260       struct sunos_link_hash_entry *h;
1261
1262       /* We only want relocs against external symbols.  */
1263       if (abfd->xvec->header_byteorder_big_p)
1264         {
1265           if ((rel->r_type[0] & RELOC_STD_BITS_EXTERN_BIG) == 0)
1266             continue;
1267         }
1268       else
1269         {
1270           if ((rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE) == 0)
1271             continue;
1272         }
1273
1274       /* Get the symbol index.  */
1275       if (abfd->xvec->header_byteorder_big_p)
1276         {
1277           r_index   =  ((rel->r_index[0] << 16)
1278                         | (rel->r_index[1] << 8)
1279                         | rel->r_index[2]);
1280         }
1281       else
1282         {
1283           r_index   = ((rel->r_index[2] << 16)
1284                        | (rel->r_index[1] << 8)
1285                        | rel->r_index[0]);
1286         }
1287
1288       /* Get the hash table entry.  */
1289       h = sym_hashes[r_index];
1290       if (h == NULL)
1291         {
1292           /* This should not normally happen, but it will in any case
1293              be caught in the relocation phase.  */
1294           continue;
1295         }
1296
1297       /* At this point common symbols have already been allocated, so
1298          we don't have to worry about them.  We need to consider that
1299          we may have already seen this symbol and marked it undefined;
1300          if the symbols is really undefined, then SUNOS_DEF_DYNAMIC
1301          will be zero.  */
1302       if (h->root.root.type != bfd_link_hash_defined
1303           && h->root.root.type != bfd_link_hash_undefined)
1304         continue;
1305
1306       if ((h->flags & SUNOS_DEF_DYNAMIC) == 0
1307           || (h->flags & SUNOS_DEF_REGULAR) != 0)
1308         continue;
1309
1310       BFD_ASSERT ((h->flags & SUNOS_REF_REGULAR) != 0);
1311       BFD_ASSERT (h->root.root.type == bfd_link_hash_defined
1312                   ? (h->root.root.u.def.section->owner->flags & DYNAMIC) != 0
1313                   : (h->root.root.u.undef.abfd->flags & DYNAMIC) != 0);
1314
1315       /* This reloc is against a symbol defined only by a dynamic
1316          object.  */
1317
1318       if (h->root.root.type == bfd_link_hash_undefined)
1319         {
1320           /* Presumably this symbol was marked as being undefined by
1321              an earlier reloc.  */
1322           srel->_raw_size += RELOC_STD_SIZE;
1323         }
1324       else if ((h->root.root.u.def.section->flags & SEC_CODE) == 0)
1325         {
1326           bfd *sub;
1327
1328           /* This reloc is not in the .text section.  It must be
1329              copied into the dynamic relocs.  We mark the symbol as
1330              being undefined.  */
1331           srel->_raw_size += RELOC_STD_SIZE;
1332           sub = h->root.root.u.def.section->owner;
1333           h->root.root.type = bfd_link_hash_undefined;
1334           h->root.root.u.undef.abfd = sub;
1335         }
1336       else
1337         {
1338           /* This symbol is in the .text section.  We must give it an
1339              entry in the procedure linkage table, if we have not
1340              already done so.  We change the definition of the symbol
1341              to the .plt section; this will cause relocs against it to
1342              be handled correctly.  */
1343           if (h->root.root.u.def.section != splt)
1344             {
1345               if (splt->_raw_size == 0)
1346                 splt->_raw_size = M68K_PLT_ENTRY_SIZE;
1347               h->root.root.u.def.section = splt;
1348               h->root.root.u.def.value = splt->_raw_size;
1349               splt->_raw_size += M68K_PLT_ENTRY_SIZE;
1350
1351               /* We will also need a dynamic reloc entry.  */
1352               srel->_raw_size += RELOC_STD_SIZE;
1353             }
1354         }
1355     }
1356
1357   return true;
1358 }
1359
1360 /* Scan the relocs for an input section using extended relocs.  We
1361    need to figure out what to do for each reloc against a dynamic
1362    symbol.  If the reloc is a WDISP30, and the symbol is in the .text
1363    section, an entry is made in the procedure linkage table.
1364    Otherwise, we must preserve the reloc as a dynamic reloc.  FIXME:
1365    We should also handle the PIC relocs here by building global offset
1366    table entries.  */
1367
1368 static boolean
1369 sunos_scan_ext_relocs (info, abfd, sec, relocs, rel_size)
1370      struct bfd_link_info *info;
1371      bfd *abfd;
1372      asection *sec;
1373      const struct reloc_ext_external *relocs;
1374      bfd_size_type rel_size;
1375 {
1376   bfd *dynobj;
1377   asection *splt;
1378   asection *srel;
1379   struct sunos_link_hash_entry **sym_hashes;
1380   const struct reloc_ext_external *rel, *relend;
1381
1382   /* We only know how to handle SPARC plt entries.  */
1383   if (bfd_get_arch (abfd) != bfd_arch_sparc)
1384     {
1385       bfd_set_error (bfd_error_invalid_target);
1386       return false;
1387     }
1388
1389   dynobj = sunos_hash_table (info)->dynobj;
1390   splt = bfd_get_section_by_name (dynobj, ".plt");
1391   srel = bfd_get_section_by_name (dynobj, ".dynrel");
1392   BFD_ASSERT (splt != NULL && srel != NULL);
1393   sym_hashes = (struct sunos_link_hash_entry **) obj_aout_sym_hashes (abfd);
1394
1395   relend = relocs + rel_size / RELOC_EXT_SIZE;
1396   for (rel = relocs; rel < relend; rel++)
1397     {
1398       int r_index;
1399       int r_type;
1400       struct sunos_link_hash_entry *h;
1401
1402       /* We only want relocs against external symbols.  */
1403       if (abfd->xvec->header_byteorder_big_p)
1404         {
1405           if ((rel->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG) == 0)
1406             continue;
1407         }
1408       else
1409         {
1410           if ((rel->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE) == 0)
1411             continue;
1412         }
1413
1414       /* Get the symbol index and reloc type.  */
1415       if (abfd->xvec->header_byteorder_big_p)
1416         {
1417           r_index   =  ((rel->r_index[0] << 16)
1418                         | (rel->r_index[1] << 8)
1419                         | rel->r_index[2]);
1420           r_type   = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_BIG)
1421                       >> RELOC_EXT_BITS_TYPE_SH_BIG);
1422         }
1423       else
1424         {
1425           r_index   = ((rel->r_index[2] << 16)
1426                        | (rel->r_index[1] << 8)
1427                        | rel->r_index[0]);
1428           r_type   = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE)
1429                       >> RELOC_EXT_BITS_TYPE_SH_LITTLE);
1430         }
1431
1432       /* Get the hash table entry.  */
1433       h = sym_hashes[r_index];
1434       if (h == NULL)
1435         {
1436           /* This should not normally happen, but it will in any case
1437              be caught in the relocation phase.  */
1438           continue;
1439         }
1440
1441       /* At this point common symbols have already been allocated, so
1442          we don't have to worry about them.  We need to consider that
1443          we may have already seen this symbol and marked it undefined;
1444          if the symbols is really undefined, then SUNOS_DEF_DYNAMIC
1445          will be zero.  */
1446       if (h->root.root.type != bfd_link_hash_defined
1447           && h->root.root.type != bfd_link_hash_undefined)
1448         continue;
1449
1450       if ((h->flags & SUNOS_DEF_DYNAMIC) == 0
1451           || (h->flags & SUNOS_DEF_REGULAR) != 0)
1452         continue;
1453
1454       BFD_ASSERT ((h->flags & SUNOS_REF_REGULAR) != 0);
1455       BFD_ASSERT (h->root.root.type == bfd_link_hash_defined
1456                   ? (h->root.root.u.def.section->owner->flags & DYNAMIC) != 0
1457                   : (h->root.root.u.undef.abfd->flags & DYNAMIC) != 0);
1458
1459       /* This reloc is against a symbol defined only by a dynamic
1460          object.  */
1461
1462       if (h->root.root.type == bfd_link_hash_undefined)
1463         {
1464           /* Presumably this symbol was marked as being undefined by
1465              an earlier reloc.  */
1466           srel->_raw_size += RELOC_EXT_SIZE;
1467         }
1468       else if ((h->root.root.u.def.section->flags & SEC_CODE) == 0)
1469         {
1470           bfd *sub;
1471
1472           /* This reloc is not in the .text section.  It must be
1473              copied into the dynamic relocs.  We mark the symbol as
1474              being undefined.  */
1475           srel->_raw_size += RELOC_EXT_SIZE;
1476           sub = h->root.root.u.def.section->owner;
1477           h->root.root.type = bfd_link_hash_undefined;
1478           h->root.root.u.undef.abfd = sub;
1479         }
1480       else
1481         {
1482           /* This symbol is in the .text section.  We must give it an
1483              entry in the procedure linkage table, if we have not
1484              already done so.  We change the definition of the symbol
1485              to the .plt section; this will cause relocs against it to
1486              be handled correctly.  */
1487           if (h->root.root.u.def.section != splt)
1488             {
1489               if (splt->_raw_size == 0)
1490                 splt->_raw_size = SPARC_PLT_ENTRY_SIZE;
1491               h->root.root.u.def.section = splt;
1492               h->root.root.u.def.value = splt->_raw_size;
1493               splt->_raw_size += SPARC_PLT_ENTRY_SIZE;
1494
1495               /* We will also need a dynamic reloc entry.  */
1496               srel->_raw_size += RELOC_EXT_SIZE;
1497             }
1498         }
1499     }
1500
1501   return true;
1502 }
1503
1504 /* Build the hash table of dynamic symbols, and to mark as written all
1505    symbols from dynamic objects which we do not plan to write out.  */
1506
1507 static boolean
1508 sunos_scan_dynamic_symbol (h, data)
1509      struct sunos_link_hash_entry *h;
1510      PTR data;
1511 {
1512   struct bfd_link_info *info = (struct bfd_link_info *) data;
1513
1514   /* Set the written flag for symbols we do not want to write out as
1515      part of the regular symbol table.  This is all symbols which are
1516      not defined in a regular object file.  For some reason symbols
1517      which are referenced by a regular object and defined by a dynamic
1518      object do not seem to show up in the regular symbol table.  */
1519   if ((h->flags & SUNOS_DEF_REGULAR) == 0)
1520     h->root.written = true;
1521
1522   /* If this symbol is defined by a dynamic object and referenced by a
1523      regular object, see whether we gave it a reasonable value while
1524      scanning the relocs.  */
1525
1526   if ((h->flags & SUNOS_DEF_REGULAR) == 0
1527       && (h->flags & SUNOS_DEF_DYNAMIC) != 0
1528       && (h->flags & SUNOS_REF_REGULAR) != 0)
1529     {
1530       if (h->root.root.type == bfd_link_hash_defined
1531           && ((h->root.root.u.def.section->owner->flags & DYNAMIC) != 0)
1532           && h->root.root.u.def.section->output_section == NULL)
1533         {
1534           bfd *sub;
1535
1536           /* This symbol is currently defined in a dynamic section
1537              which is not being put into the output file.  This
1538              implies that there is no reloc against the symbol.  I'm
1539              not sure why this case would ever occur.  In any case, we
1540              change the symbol to be undefined.  */
1541           sub = h->root.root.u.def.section->owner;
1542           h->root.root.type = bfd_link_hash_undefined;
1543           h->root.root.u.undef.abfd = sub;
1544         }
1545     }
1546
1547   /* If this symbol is defined or referenced by a regular file, add it
1548      to the dynamic symbols.  */
1549   if ((h->flags & (SUNOS_DEF_REGULAR | SUNOS_REF_REGULAR)) != 0)
1550     {
1551       asection *s;
1552       size_t len;
1553       bfd_byte *contents;
1554       unsigned char *name;
1555       unsigned long hash;
1556       bfd *dynobj;
1557
1558       BFD_ASSERT (h->dynindx == -2);
1559
1560       h->dynindx = sunos_hash_table (info)->dynsymcount;
1561       ++sunos_hash_table (info)->dynsymcount;
1562
1563       len = strlen (h->root.root.root.string);
1564
1565       /* We don't bother to construct a BFD hash table for the strings
1566          which are the names of the dynamic symbols.  Using a hash
1567          table for the regular symbols is beneficial, because the
1568          regular symbols includes the debugging symbols, which have
1569          long names and are often duplicated in several object files.
1570          There are no debugging symbols in the dynamic symbols.  */
1571       s = bfd_get_section_by_name (sunos_hash_table (info)->dynobj,
1572                                    ".dynstr");
1573       BFD_ASSERT (s != NULL);
1574       if (s->contents == NULL)
1575         contents = (bfd_byte *) malloc (len + 1);
1576       else
1577         contents = (bfd_byte *) realloc (s->contents, s->_raw_size + len + 1);
1578       if (contents == NULL)
1579         {
1580           bfd_set_error (bfd_error_no_memory);
1581           return false;
1582         }
1583       s->contents = contents;
1584
1585       h->dynstr_index = s->_raw_size;
1586       strcpy (contents + s->_raw_size, h->root.root.root.string);
1587       s->_raw_size += len + 1;
1588
1589       /* Add it to the dynamic hash table.  */
1590       name = (unsigned char *) h->root.root.root.string;
1591       hash = 0;
1592       while (*name != '\0')
1593         hash = (hash << 1) + *name++;
1594       hash &= 0x7fffffff;
1595       hash %= sunos_hash_table (info)->bucketcount;
1596
1597       dynobj = sunos_hash_table (info)->dynobj;
1598       s = bfd_get_section_by_name (dynobj, ".hash");
1599       BFD_ASSERT (s != NULL);
1600
1601       if (GET_SWORD (dynobj, s->contents + hash * HASH_ENTRY_SIZE) == -1)
1602         PUT_WORD (dynobj, h->dynindx, s->contents + hash * HASH_ENTRY_SIZE);
1603       else
1604         {
1605           bfd_vma next;
1606
1607           next = GET_WORD (dynobj,
1608                            (s->contents
1609                             + hash * HASH_ENTRY_SIZE
1610                             + BYTES_IN_WORD));
1611           PUT_WORD (dynobj, s->_raw_size / HASH_ENTRY_SIZE,
1612                     s->contents + hash * HASH_ENTRY_SIZE + BYTES_IN_WORD);
1613           PUT_WORD (dynobj, h->dynindx, s->contents + s->_raw_size);
1614           PUT_WORD (dynobj, next, s->contents + s->_raw_size + BYTES_IN_WORD);
1615           s->_raw_size += HASH_ENTRY_SIZE;
1616         }
1617     }
1618
1619   return true;
1620 }
1621
1622 /* Link a dynamic object.  We actually don't have anything to do at
1623    this point.  This entry point exists to prevent the regular linker
1624    code from doing anything with the object.  */
1625
1626 /*ARGSUSED*/
1627 static boolean
1628 sunos_link_dynamic_object (info, abfd)
1629      struct bfd_link_info *info;
1630      bfd *abfd;
1631 {
1632   return true;
1633 }
1634
1635
1636 /* Write out a dynamic symbol.  This is called by the final traversal
1637    over the symbol table.  */
1638
1639 static boolean
1640 sunos_write_dynamic_symbol (output_bfd, info, harg)
1641      bfd *output_bfd;
1642      struct bfd_link_info *info;
1643      struct aout_link_hash_entry *harg;
1644 {
1645   struct sunos_link_hash_entry *h = (struct sunos_link_hash_entry *) harg;
1646   boolean plt;
1647   int type;
1648   bfd_vma val;
1649   asection *s;
1650   struct external_nlist *outsym;
1651
1652   if (h->dynindx < 0)
1653     return true;
1654
1655   plt = false;
1656   switch (h->root.root.type)
1657     {
1658     default:
1659     case bfd_link_hash_new:
1660       abort ();
1661       /* Avoid variable not initialized warnings.  */
1662       return true;
1663     case bfd_link_hash_undefined:
1664       type = N_UNDF | N_EXT;
1665       val = 0;
1666       break;
1667     case bfd_link_hash_defined:
1668       {
1669         asection *sec;
1670         asection *output_section;
1671
1672         sec = h->root.root.u.def.section;
1673         output_section = sec->output_section;
1674         BFD_ASSERT (bfd_is_abs_section (output_section)
1675                     || output_section->owner == output_bfd);
1676         if (strcmp (sec->name, ".plt") == 0)
1677           {
1678             plt = true;
1679             type = N_UNDF | N_EXT;
1680             val = 0;
1681           }
1682         else
1683           {
1684             if (output_section == obj_textsec (output_bfd))
1685               type = N_TEXT | N_EXT;
1686             else if (output_section == obj_datasec (output_bfd))
1687               type = N_DATA | N_EXT;
1688             else if (output_section == obj_bsssec (output_bfd))
1689               type = N_BSS | N_EXT;
1690             else
1691               type = N_ABS | N_EXT;
1692             val = (h->root.root.u.def.value
1693                    + output_section->vma
1694                    + sec->output_offset);
1695           }
1696       }
1697       break;
1698     case bfd_link_hash_common:
1699       type = N_UNDF | N_EXT;
1700       val = h->root.root.u.c.size;
1701       break;
1702     case bfd_link_hash_weak:
1703       type = N_WEAKU;
1704       val = 0;
1705       break;
1706     case bfd_link_hash_indirect:
1707     case bfd_link_hash_warning:
1708       /* FIXME: Ignore these for now.  The circumstances under which
1709          they should be written out are not clear to me.  */
1710       return true;
1711     }
1712
1713   s = bfd_get_section_by_name (sunos_hash_table (info)->dynobj, ".dynsym");
1714   BFD_ASSERT (s != NULL);
1715   outsym = ((struct external_nlist *)
1716             (s->contents + h->dynindx * EXTERNAL_NLIST_SIZE));
1717
1718   bfd_h_put_8 (output_bfd, type, outsym->e_type);
1719   bfd_h_put_8 (output_bfd, 0, outsym->e_other);
1720
1721   /* FIXME: The native linker doesn't use 0 for desc.  It seems to use
1722      one less than the desc value in the shared library, although that
1723      seems unlikely.  */
1724   bfd_h_put_16 (output_bfd, 0, outsym->e_desc);
1725
1726   PUT_WORD (output_bfd, h->dynstr_index, outsym->e_strx);
1727   PUT_WORD (output_bfd, val, outsym->e_value);
1728
1729   /* If this symbol is in the procedure linkage table, fill in the
1730      table entry.  */
1731   if (plt)
1732     {
1733       bfd_byte *p;
1734       asection *s;
1735       bfd_vma r_address;
1736
1737       p = h->root.root.u.def.section->contents + h->root.root.u.def.value;
1738
1739       s = bfd_get_section_by_name (sunos_hash_table (info)->dynobj, ".dynrel");
1740       BFD_ASSERT (s != NULL);
1741
1742       r_address = (h->root.root.u.def.section->output_section->vma
1743                    + h->root.root.u.def.section->output_offset
1744                    + h->root.root.u.def.value);
1745
1746       switch (bfd_get_arch (output_bfd))
1747         {
1748         case bfd_arch_sparc:
1749           bfd_put_32 (output_bfd, SPARC_PLT_ENTRY_WORD0, p);
1750           bfd_put_32 (output_bfd,
1751                       (SPARC_PLT_ENTRY_WORD1
1752                        + (((- (h->root.root.u.def.value + 4) >> 2)
1753                            & 0x3fffffff))),
1754                       p + 4);
1755           bfd_put_32 (output_bfd, SPARC_PLT_ENTRY_WORD2 + s->reloc_count,
1756                       p + 8);
1757           break;
1758
1759         case bfd_arch_m68k:
1760           bfd_put_16 (output_bfd, M68K_PLT_ENTRY_WORD0, p);
1761           bfd_put_32 (output_bfd, (- (h->root.root.u.def.value + 2)), p + 2);
1762           bfd_put_16 (output_bfd, s->reloc_count, p + 6);
1763           r_address += 2;
1764           break;
1765
1766         default:
1767           abort ();
1768         }
1769
1770       /* We also need to add a jump table reloc.  */
1771       p = s->contents + s->reloc_count * obj_reloc_entry_size (output_bfd);
1772       if (obj_reloc_entry_size (output_bfd) == RELOC_STD_SIZE)
1773         {
1774           struct reloc_std_external *srel;
1775
1776           srel = (struct reloc_std_external *) p;
1777           PUT_WORD (output_bfd, r_address, srel->r_address);
1778           if (output_bfd->xvec->header_byteorder_big_p)
1779             {
1780               srel->r_index[0] = h->dynindx >> 16;
1781               srel->r_index[1] = h->dynindx >> 8;
1782               srel->r_index[2] = h->dynindx;
1783               srel->r_type[0] = (RELOC_STD_BITS_EXTERN_BIG
1784                                  | RELOC_STD_BITS_JMPTABLE_BIG);
1785             }
1786           else
1787             {
1788               srel->r_index[2] = h->dynindx >> 16;
1789               srel->r_index[1] = h->dynindx >> 8;
1790               srel->r_index[0] = h->dynindx;
1791               srel->r_type[0] = (RELOC_STD_BITS_EXTERN_LITTLE
1792                                  | RELOC_STD_BITS_JMPTABLE_LITTLE);
1793             }
1794         }
1795       else
1796         {
1797           struct reloc_ext_external *erel;
1798
1799           erel = (struct reloc_ext_external *) p;
1800           PUT_WORD (output_bfd, r_address, erel->r_address);
1801           if (output_bfd->xvec->header_byteorder_big_p)
1802             {
1803               erel->r_index[0] = h->dynindx >> 16;
1804               erel->r_index[1] = h->dynindx >> 8;
1805               erel->r_index[2] = h->dynindx;
1806               erel->r_type[0] = (RELOC_EXT_BITS_EXTERN_BIG
1807                                  | (22 << RELOC_EXT_BITS_TYPE_SH_BIG));
1808             }
1809           else
1810             {
1811               erel->r_index[2] = h->dynindx >> 16;
1812               erel->r_index[1] = h->dynindx >> 8;
1813               erel->r_index[0] = h->dynindx;
1814               erel->r_type[0] = (RELOC_EXT_BITS_EXTERN_LITTLE
1815                                  | (22 << RELOC_EXT_BITS_TYPE_SH_LITTLE));
1816             }
1817           PUT_WORD (output_bfd, (bfd_vma) 0, erel->r_addend);
1818         }
1819
1820       ++s->reloc_count;
1821     }
1822
1823   return true;
1824 }
1825
1826 /* This is called for each reloc against an external symbol.  If this
1827    is a reloc which are are going to copy as a dynamic reloc, then
1828    copy it over, and tell the caller to not bother processing this
1829    reloc.  */
1830
1831 /*ARGSUSED*/
1832 static boolean
1833 sunos_check_dynamic_reloc (info, input_bfd, input_section, harg, reloc, skip)
1834      struct bfd_link_info *info;
1835      bfd *input_bfd;
1836      asection *input_section;
1837      struct aout_link_hash_entry *harg;
1838      PTR reloc;
1839      boolean *skip;
1840 {
1841   struct sunos_link_hash_entry *h = (struct sunos_link_hash_entry *) harg;
1842   bfd *dynobj;
1843   asection *srel;
1844   bfd_byte *p;
1845
1846   *skip = false;
1847
1848   dynobj = sunos_hash_table (info)->dynobj;
1849
1850   if (dynobj == NULL
1851       || h->dynindx == -1
1852       || h->root.root.type != bfd_link_hash_undefined
1853       || (h->flags & SUNOS_DEF_REGULAR) != 0
1854       || (h->flags & SUNOS_DEF_DYNAMIC) == 0
1855       || (h->root.root.u.undef.abfd->flags & DYNAMIC) == 0)
1856     return true;
1857
1858   /* It looks this is a reloc we are supposed to copy.  */
1859
1860   srel = bfd_get_section_by_name (dynobj, ".dynrel");
1861   BFD_ASSERT (srel != NULL);
1862
1863   p = srel->contents + srel->reloc_count * obj_reloc_entry_size (dynobj);
1864
1865   /* Copy the reloc over.  */
1866   memcpy (p, reloc, obj_reloc_entry_size (dynobj));
1867
1868   /* Adjust the address and symbol index.  */
1869   if (obj_reloc_entry_size (dynobj) == RELOC_STD_SIZE)
1870     {
1871       struct reloc_std_external *srel;
1872
1873       srel = (struct reloc_std_external *) p;
1874       PUT_WORD (dynobj,
1875                 (GET_WORD (dynobj, srel->r_address)
1876                  + input_section->output_section->vma
1877                  + input_section->output_offset),
1878                 srel->r_address);
1879       if (dynobj->xvec->header_byteorder_big_p)
1880         {
1881           srel->r_index[0] = h->dynindx >> 16;
1882           srel->r_index[1] = h->dynindx >> 8;
1883           srel->r_index[2] = h->dynindx;
1884         }
1885       else
1886         {
1887           srel->r_index[2] = h->dynindx >> 16;
1888           srel->r_index[1] = h->dynindx >> 8;
1889           srel->r_index[0] = h->dynindx;
1890         }
1891     }
1892   else
1893     {
1894       struct reloc_ext_external *erel;
1895
1896       erel = (struct reloc_ext_external *) p;
1897       PUT_WORD (dynobj,
1898                 (GET_WORD (dynobj, erel->r_address)
1899                  + input_section->output_section->vma
1900                  + input_section->output_offset),
1901                 erel->r_address);
1902       if (dynobj->xvec->header_byteorder_big_p)
1903         {
1904           erel->r_index[0] = h->dynindx >> 16;
1905           erel->r_index[1] = h->dynindx >> 8;
1906           erel->r_index[2] = h->dynindx;
1907         }
1908       else
1909         {
1910           erel->r_index[2] = h->dynindx >> 16;
1911           erel->r_index[1] = h->dynindx >> 8;
1912           erel->r_index[0] = h->dynindx;
1913         }
1914     }
1915
1916   ++srel->reloc_count;
1917
1918   *skip = true;
1919
1920   return true;
1921 }
1922
1923 /* Finish up the dynamic linking information.  */
1924
1925 static boolean
1926 sunos_finish_dynamic_link (abfd, info)
1927      bfd *abfd;
1928      struct bfd_link_info *info;
1929 {
1930   bfd *dynobj;
1931   asection *o;
1932   asection *s;
1933   asection *sdyn;
1934   struct external_sun4_dynamic esd;
1935   struct external_sun4_dynamic_link esdl;
1936
1937   dynobj = sunos_hash_table (info)->dynobj;
1938   if (dynobj == NULL)
1939     return true;
1940
1941   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1942   BFD_ASSERT (sdyn != NULL);
1943
1944   /* Finish up the .need section.  The linker emulation code filled it
1945      in, but with offsets from the start of the section instead of
1946      real addresses.  Now that we know the section location, we can
1947      fill in the final values.  */
1948   s = bfd_get_section_by_name (dynobj, ".need");
1949   BFD_ASSERT (s != NULL);
1950   if (s->_raw_size != 0)
1951     {
1952       file_ptr filepos;
1953       bfd_byte *p;
1954
1955       filepos = s->output_section->filepos + s->output_offset;
1956       p = s->contents;
1957       while (1)
1958         {
1959           bfd_vma val;
1960
1961           PUT_WORD (dynobj, GET_WORD (dynobj, p) + filepos, p);
1962           val = GET_WORD (dynobj, p + 12);
1963           if (val == 0)
1964             break;
1965           PUT_WORD (dynobj, val + filepos, p + 12);
1966           p += 16;
1967         }
1968     }
1969
1970   /* The first entry in the .got section is the address of the dynamic
1971      information.  */
1972   s = bfd_get_section_by_name (dynobj, ".got");
1973   BFD_ASSERT (s != NULL);
1974   PUT_WORD (dynobj, sdyn->output_section->vma + sdyn->output_offset,
1975             s->contents);
1976
1977   for (o = dynobj->sections; o != NULL; o = o->next)
1978     {
1979       if ((o->flags & SEC_HAS_CONTENTS) != 0
1980           && o->contents != NULL)
1981         {
1982           BFD_ASSERT (o->output_section != NULL
1983                       && o->output_section->owner == abfd);
1984           if (! bfd_set_section_contents (abfd, o->output_section,
1985                                           o->contents, o->output_offset,
1986                                           o->_raw_size))
1987             return false;
1988         }
1989     }
1990
1991   /* Finish up the dynamic link information.  */
1992   PUT_WORD (dynobj, (bfd_vma) 3, esd.ld_version);
1993   PUT_WORD (dynobj,
1994             sdyn->output_section->vma + sdyn->output_offset + sizeof esd,
1995             esd.ldd);
1996   PUT_WORD (dynobj,
1997             (sdyn->output_section->vma
1998              + sdyn->output_offset
1999              + sizeof esd
2000              + EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE),
2001             esd.ld);
2002
2003   if (! bfd_set_section_contents (abfd, sdyn->output_section, &esd,
2004                                   sdyn->output_offset, sizeof esd))
2005     return false;
2006
2007
2008   PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_loaded);
2009
2010   s = bfd_get_section_by_name (dynobj, ".need");
2011   BFD_ASSERT (s != NULL);
2012   if (s->_raw_size == 0)
2013     PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_need);
2014   else
2015     PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2016               esdl.ld_need);
2017
2018   s = bfd_get_section_by_name (dynobj, ".rules");
2019   BFD_ASSERT (s != NULL);
2020   if (s->_raw_size == 0)
2021     PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_rules);
2022   else
2023     PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2024               esdl.ld_rules);
2025
2026   s = bfd_get_section_by_name (dynobj, ".got");
2027   BFD_ASSERT (s != NULL);
2028   PUT_WORD (dynobj, s->output_section->vma + s->output_offset, esdl.ld_got);
2029
2030   s = bfd_get_section_by_name (dynobj, ".plt");
2031   BFD_ASSERT (s != NULL);
2032   PUT_WORD (dynobj, s->output_section->vma + s->output_offset, esdl.ld_plt);
2033   PUT_WORD (dynobj, s->_raw_size, esdl.ld_plt_sz);
2034
2035   s = bfd_get_section_by_name (dynobj, ".dynrel");
2036   BFD_ASSERT (s != NULL);
2037   BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj) == s->_raw_size);
2038   PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2039             esdl.ld_rel);
2040
2041   s = bfd_get_section_by_name (dynobj, ".hash");
2042   BFD_ASSERT (s != NULL);
2043   PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2044             esdl.ld_hash);
2045
2046   s = bfd_get_section_by_name (dynobj, ".dynsym");
2047   BFD_ASSERT (s != NULL);
2048   PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2049             esdl.ld_stab);
2050
2051   PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_stab_hash);
2052
2053   PUT_WORD (dynobj, (bfd_vma) sunos_hash_table (info)->bucketcount,
2054             esdl.ld_buckets);
2055
2056   s = bfd_get_section_by_name (dynobj, ".dynstr");
2057   BFD_ASSERT (s != NULL);
2058   PUT_WORD (dynobj, s->output_section->filepos + s->output_offset,
2059             esdl.ld_symbols);
2060   PUT_WORD (dynobj, s->_raw_size, esdl.ld_symb_size);
2061
2062   /* The size of the text area is the size of the .text section
2063      rounded up to a page boundary.  FIXME: Should the page size be
2064      conditional on something?  */
2065   PUT_WORD (dynobj,
2066             BFD_ALIGN (obj_textsec (abfd)->_raw_size, 0x2000),
2067             esdl.ld_text);
2068   
2069   if (! bfd_set_section_contents (abfd, sdyn->output_section, &esdl,
2070                                   (sdyn->output_offset
2071                                    + sizeof esd
2072                                    + EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE),
2073                                   sizeof esdl))
2074     return false;
2075
2076   abfd->flags |= DYNAMIC;
2077
2078   return true;
2079 }