* sunos.c (sunos_add_one_symbol): Only set the sunos specific
[binutils-gdb.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 }