* sparc-opc.c (sparc_opcodes): Mark all insns that reference
[deliverable/binutils-gdb.git] / bfd / cofflink.c
CommitLineData
69645d10 1/* COFF specific linker code.
d25079a0 2 Copyright 1994, 1995 Free Software Foundation, Inc.
69645d10
ILT
3 Written by Ian Lance Taylor, Cygnus Support.
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
943fbd5b 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
69645d10
ILT
20
21/* This file contains the COFF backend linker code. */
22
23#include "bfd.h"
24#include "sysdep.h"
25#include "bfdlink.h"
26#include "libbfd.h"
27#include "coff/internal.h"
28#include "libcoff.h"
29
30#define STRING_SIZE_SIZE (4)
31
32/* Information we keep for each section in the output file when doing
33 a relocateable link. */
34
35struct coff_link_section_info
36{
37 /* The relocs to be output. */
38 struct internal_reloc *relocs;
39 /* For each reloc against a global symbol whose index was not known
40 when the reloc was handled, the global hash table entry. */
41 struct coff_link_hash_entry **rel_hashes;
42};
43
44/* Information that we pass around while doing the final link step. */
45
46struct coff_final_link_info
47{
48 /* General link information. */
49 struct bfd_link_info *info;
50 /* Output BFD. */
51 bfd *output_bfd;
52 /* Used to indicate failure in traversal routine. */
53 boolean failed;
54 /* Hash table for long symbol name. */
55 struct bfd_strtab_hash *strtab;
56 /* When doing a relocateable link, an array of information kept for
57 each output section, indexed by the target_index field. */
58 struct coff_link_section_info *section_info;
59 /* Symbol index of last C_FILE symbol (-1 if none). */
60 long last_file_index;
61 /* Contents of last C_FILE symbol. */
62 struct internal_syment last_file;
63 /* Buffer large enough to hold swapped symbols of any input file. */
64 struct internal_syment *internal_syms;
65 /* Buffer large enough to hold sections of symbols of any input file. */
66 asection **sec_ptrs;
67 /* Buffer large enough to hold output indices of symbols of any
68 input file. */
69 long *sym_indices;
70 /* Buffer large enough to hold output symbols for any input file. */
71 bfd_byte *outsyms;
72 /* Buffer large enough to hold external line numbers for any input
73 section. */
74 bfd_byte *linenos;
75 /* Buffer large enough to hold any input section. */
76 bfd_byte *contents;
77 /* Buffer large enough to hold external relocs of any input section. */
78 bfd_byte *external_relocs;
79 /* Buffer large enough to hold swapped relocs of any input section. */
80 struct internal_reloc *internal_relocs;
d25079a0 81
69645d10
ILT
82};
83
84static struct bfd_hash_entry *coff_link_hash_newfunc
85 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
86static boolean coff_link_add_object_symbols
87 PARAMS ((bfd *, struct bfd_link_info *));
88static boolean coff_link_check_archive_element
89 PARAMS ((bfd *, struct bfd_link_info *, boolean *));
ff31ebda
KR
90static INLINE const char *_bfd_coff_internal_syment_name
91 PARAMS ((bfd *, const struct internal_syment *, char *));
69645d10
ILT
92static boolean coff_link_check_ar_symbols
93 PARAMS ((bfd *, struct bfd_link_info *, boolean *));
94static boolean coff_link_add_symbols PARAMS ((bfd *, struct bfd_link_info *));
95static boolean coff_link_input_bfd
96 PARAMS ((struct coff_final_link_info *, bfd *));
97static boolean coff_write_global_sym
98 PARAMS ((struct coff_link_hash_entry *, PTR));
99static boolean coff_reloc_link_order
100 PARAMS ((bfd *, struct coff_final_link_info *, asection *,
101 struct bfd_link_order *));
102
103/* Create an entry in a COFF linker hash table. */
104
105static struct bfd_hash_entry *
106coff_link_hash_newfunc (entry, table, string)
107 struct bfd_hash_entry *entry;
108 struct bfd_hash_table *table;
109 const char *string;
110{
111 struct coff_link_hash_entry *ret = (struct coff_link_hash_entry *) entry;
112
113 /* Allocate the structure if it has not already been allocated by a
114 subclass. */
115 if (ret == (struct coff_link_hash_entry *) NULL)
116 ret = ((struct coff_link_hash_entry *)
117 bfd_hash_allocate (table, sizeof (struct coff_link_hash_entry)));
118 if (ret == (struct coff_link_hash_entry *) NULL)
119 {
120 bfd_set_error (bfd_error_no_memory);
121 return (struct bfd_hash_entry *) ret;
122 }
123
124 /* Call the allocation method of the superclass. */
125 ret = ((struct coff_link_hash_entry *)
126 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
127 table, string));
128 if (ret != (struct coff_link_hash_entry *) NULL)
129 {
130 /* Set local fields. */
131 ret->indx = -1;
132 ret->type = T_NULL;
133 ret->class = C_NULL;
134 ret->numaux = 0;
135 ret->auxbfd = NULL;
136 ret->aux = NULL;
137 }
138
139 return (struct bfd_hash_entry *) ret;
140}
141
142/* Create a COFF linker hash table. */
143
144struct bfd_link_hash_table *
145_bfd_coff_link_hash_table_create (abfd)
146 bfd *abfd;
147{
148 struct coff_link_hash_table *ret;
149
150 ret = ((struct coff_link_hash_table *)
e3364701 151 bfd_alloc (abfd, sizeof (struct coff_link_hash_table)));
69645d10
ILT
152 if (ret == NULL)
153 {
154 bfd_set_error (bfd_error_no_memory);
155 return NULL;
156 }
157 if (! _bfd_link_hash_table_init (&ret->root, abfd,
158 coff_link_hash_newfunc))
159 {
160 free (ret);
161 return (struct bfd_link_hash_table *) NULL;
162 }
163 return &ret->root;
164}
165
166/* Given a COFF BFD, add symbols to the global hash table as
167 appropriate. */
168
169boolean
170_bfd_coff_link_add_symbols (abfd, info)
171 bfd *abfd;
172 struct bfd_link_info *info;
173{
174 switch (bfd_get_format (abfd))
175 {
176 case bfd_object:
177 return coff_link_add_object_symbols (abfd, info);
178 case bfd_archive:
179 return (_bfd_generic_link_add_archive_symbols
180 (abfd, info, coff_link_check_archive_element));
181 default:
182 bfd_set_error (bfd_error_wrong_format);
183 return false;
184 }
185}
186
187/* Add symbols from a COFF object file. */
188
189static boolean
190coff_link_add_object_symbols (abfd, info)
191 bfd *abfd;
192 struct bfd_link_info *info;
193{
ff31ebda 194 if (! _bfd_coff_get_external_symbols (abfd))
69645d10
ILT
195 return false;
196 if (! coff_link_add_symbols (abfd, info))
197 return false;
198 if (! info->keep_memory)
199 {
ff31ebda 200 if (! _bfd_coff_free_symbols (abfd))
69645d10
ILT
201 return false;
202 }
203 return true;
204}
205
206/* Check a single archive element to see if we need to include it in
207 the link. *PNEEDED is set according to whether this element is
208 needed in the link or not. This is called via
209 _bfd_generic_link_add_archive_symbols. */
210
211static boolean
212coff_link_check_archive_element (abfd, info, pneeded)
213 bfd *abfd;
214 struct bfd_link_info *info;
215 boolean *pneeded;
216{
ff31ebda 217 if (! _bfd_coff_get_external_symbols (abfd))
69645d10
ILT
218 return false;
219
220 if (! coff_link_check_ar_symbols (abfd, info, pneeded))
221 return false;
222
223 if (*pneeded)
224 {
225 if (! coff_link_add_symbols (abfd, info))
226 return false;
227 }
228
229 if (! info->keep_memory || ! *pneeded)
230 {
ff31ebda 231 if (! _bfd_coff_free_symbols (abfd))
69645d10
ILT
232 return false;
233 }
234
235 return true;
236}
237
ff31ebda
KR
238/* Get the name of a symbol. The caller must pass in a buffer of size
239 >= SYMNMLEN + 1. */
69645d10 240
ff31ebda
KR
241static INLINE const char *
242_bfd_coff_internal_syment_name (abfd, sym, buf)
69645d10 243 bfd *abfd;
ff31ebda
KR
244 const struct internal_syment *sym;
245 char *buf;
69645d10 246{
ff31ebda
KR
247 /* FIXME: It's not clear this will work correctly if sizeof
248 (_n_zeroes) != 4. */
249 if (sym->_n._n_n._n_zeroes != 0
250 || sym->_n._n_n._n_offset == 0)
69645d10 251 {
ff31ebda
KR
252 memcpy (buf, sym->_n._n_name, SYMNMLEN);
253 buf[SYMNMLEN] = '\0';
254 return buf;
69645d10
ILT
255 }
256 else
257 {
ff31ebda 258 const char *strings;
69645d10 259
ff31ebda
KR
260 BFD_ASSERT (sym->_n._n_n._n_offset >= STRING_SIZE_SIZE);
261 strings = obj_coff_strings (abfd);
262 if (strings == NULL)
263 {
264 strings = _bfd_coff_read_string_table (abfd);
265 if (strings == NULL)
266 return NULL;
267 }
268 return strings + sym->_n._n_n._n_offset;
69645d10 269 }
69645d10
ILT
270}
271
272/* Look through the symbols to see if this object file should be
273 included in the link. */
274
275static boolean
276coff_link_check_ar_symbols (abfd, info, pneeded)
277 bfd *abfd;
278 struct bfd_link_info *info;
279 boolean *pneeded;
280{
281 boolean (*sym_is_global) PARAMS ((bfd *, struct internal_syment *));
69645d10
ILT
282 bfd_size_type symesz;
283 bfd_byte *esym;
284 bfd_byte *esym_end;
285
286 *pneeded = false;
287
288 sym_is_global = coff_backend_info (abfd)->_bfd_coff_sym_is_global;
69645d10
ILT
289
290 symesz = bfd_coff_symesz (abfd);
291 esym = (bfd_byte *) obj_coff_external_syms (abfd);
292 esym_end = esym + obj_raw_syment_count (abfd) * symesz;
293 while (esym < esym_end)
294 {
295 struct internal_syment sym;
296
297 bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym);
298
299 if ((sym.n_sclass == C_EXT
300 || (sym_is_global && (*sym_is_global) (abfd, &sym)))
301 && (sym.n_scnum != 0 || sym.n_value != 0))
302 {
303 const char *name;
304 char buf[SYMNMLEN + 1];
305 struct bfd_link_hash_entry *h;
306
307 /* This symbol is externally visible, and is defined by this
308 object file. */
309
ff31ebda
KR
310 name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
311 if (name == NULL)
312 return false;
69645d10
ILT
313 h = bfd_link_hash_lookup (info->hash, name, false, false, true);
314
315 /* We are only interested in symbols that are currently
316 undefined. If a symbol is currently known to be common,
317 COFF linkers do not bring in an object file which defines
318 it. */
319 if (h != (struct bfd_link_hash_entry *) NULL
320 && h->type == bfd_link_hash_undefined)
321 {
322 if (! (*info->callbacks->add_archive_element) (info, abfd, name))
323 return false;
324 *pneeded = true;
325 return true;
326 }
327 }
328
329 esym += (sym.n_numaux + 1) * symesz;
330 }
331
332 /* We do not need this object file. */
333 return true;
334}
335
336/* Add all the symbols from an object file to the hash table. */
337
338static boolean
339coff_link_add_symbols (abfd, info)
340 bfd *abfd;
341 struct bfd_link_info *info;
342{
343 boolean (*sym_is_global) PARAMS ((bfd *, struct internal_syment *));
69645d10
ILT
344 boolean default_copy;
345 bfd_size_type symcount;
346 struct coff_link_hash_entry **sym_hash;
347 bfd_size_type symesz;
348 bfd_byte *esym;
349 bfd_byte *esym_end;
350
351 sym_is_global = coff_backend_info (abfd)->_bfd_coff_sym_is_global;
69645d10
ILT
352
353 if (info->keep_memory)
354 default_copy = false;
355 else
356 default_copy = true;
357
358 symcount = obj_raw_syment_count (abfd);
359
360 /* We keep a list of the linker hash table entries that correspond
361 to particular symbols. */
362 sym_hash = ((struct coff_link_hash_entry **)
363 bfd_alloc (abfd,
364 ((size_t) symcount
365 * sizeof (struct coff_link_hash_entry *))));
366 if (sym_hash == NULL && symcount != 0)
367 {
368 bfd_set_error (bfd_error_no_memory);
369 return false;
370 }
371 obj_coff_sym_hashes (abfd) = sym_hash;
372 memset (sym_hash, 0,
373 (size_t) symcount * sizeof (struct coff_link_hash_entry *));
374
375 symesz = bfd_coff_symesz (abfd);
376 BFD_ASSERT (symesz == bfd_coff_auxesz (abfd));
377 esym = (bfd_byte *) obj_coff_external_syms (abfd);
378 esym_end = esym + symcount * symesz;
379 while (esym < esym_end)
380 {
381 struct internal_syment sym;
382 boolean copy;
383
384 bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym);
385
386 if (sym.n_sclass == C_EXT
387 || (sym_is_global && (*sym_is_global) (abfd, &sym)))
388 {
389 const char *name;
390 char buf[SYMNMLEN + 1];
391 flagword flags;
392 asection *section;
393 bfd_vma value;
394
395 /* This symbol is externally visible. */
396
ff31ebda
KR
397 name = _bfd_coff_internal_syment_name (abfd, &sym, buf);
398 if (name == NULL)
399 return false;
400
401 /* We must copy the name into memory if we got it from the
402 syment itself, rather than the string table. */
69645d10 403 copy = default_copy;
ff31ebda
KR
404 if (sym._n._n_n._n_zeroes != 0
405 || sym._n._n_n._n_offset == 0)
406 copy = true;
69645d10
ILT
407
408 value = sym.n_value;
409
410 if (sym.n_scnum == 0)
411 {
412 if (value == 0)
413 {
414 flags = 0;
415 section = bfd_und_section_ptr;
416 }
417 else
418 {
419 flags = BSF_GLOBAL;
420 section = bfd_com_section_ptr;
421 }
422 }
423 else
424 {
425 flags = BSF_EXPORT | BSF_GLOBAL;
426 section = coff_section_from_bfd_index (abfd, sym.n_scnum);
427 value -= section->vma;
428 }
429
430 if (! (_bfd_generic_link_add_one_symbol
431 (info, abfd, name, flags, section, value,
432 (const char *) NULL, copy, false,
433 (struct bfd_link_hash_entry **) sym_hash)))
434 return false;
435
436 if (info->hash->creator->flavour == bfd_get_flavour (abfd))
437 {
438 if (((*sym_hash)->class == C_NULL
439 && (*sym_hash)->type == T_NULL)
440 || sym.n_scnum != 0
441 || (sym.n_value != 0
442 && (*sym_hash)->root.type != bfd_link_hash_defined))
443 {
444 (*sym_hash)->class = sym.n_sclass;
445 (*sym_hash)->type = sym.n_type;
446 (*sym_hash)->numaux = sym.n_numaux;
447 (*sym_hash)->auxbfd = abfd;
448 if (sym.n_numaux != 0)
449 {
450 union internal_auxent *alloc;
451 unsigned int i;
452 bfd_byte *eaux;
453 union internal_auxent *iaux;
454
d25079a0
SC
455 alloc = ((union internal_auxent *)
456 bfd_hash_allocate (&info->hash->table,
457 (sym.n_numaux
458 * sizeof (*alloc))));
69645d10
ILT
459 if (alloc == NULL)
460 {
461 bfd_set_error (bfd_error_no_memory);
462 return false;
463 }
464 for (i = 0, eaux = esym + symesz, iaux = alloc;
465 i < sym.n_numaux;
466 i++, eaux += symesz, iaux++)
467 bfd_coff_swap_aux_in (abfd, (PTR) eaux, sym.n_type,
468 sym.n_sclass, i, sym.n_numaux,
469 (PTR) iaux);
470 (*sym_hash)->aux = alloc;
471 }
472 }
473 }
474 }
475
476 esym += (sym.n_numaux + 1) * symesz;
477 sym_hash += sym.n_numaux + 1;
478 }
479
480 return true;
481}
482
e9614321 483
69645d10
ILT
484/* Do the final link step. */
485
486boolean
487_bfd_coff_final_link (abfd, info)
488 bfd *abfd;
489 struct bfd_link_info *info;
490{
491 bfd_size_type symesz;
492 struct coff_final_link_info finfo;
493 asection *o;
494 struct bfd_link_order *p;
495 size_t max_contents_size;
496 size_t max_sym_count;
497 size_t max_lineno_count;
498 size_t max_reloc_count;
499 size_t max_output_reloc_count;
500 file_ptr rel_filepos;
501 unsigned int relsz;
502 file_ptr line_filepos;
503 unsigned int linesz;
504 bfd *sub;
505 bfd_byte *external_relocs = NULL;
506 char strbuf[STRING_SIZE_SIZE];
507
508 symesz = bfd_coff_symesz (abfd);
509
510 finfo.info = info;
511 finfo.output_bfd = abfd;
512 finfo.strtab = NULL;
513 finfo.section_info = NULL;
514 finfo.last_file_index = -1;
515 finfo.internal_syms = NULL;
516 finfo.sec_ptrs = NULL;
517 finfo.sym_indices = NULL;
518 finfo.outsyms = NULL;
519 finfo.linenos = NULL;
520 finfo.contents = NULL;
521 finfo.external_relocs = NULL;
522 finfo.internal_relocs = NULL;
523
e9614321 524 coff_data (abfd)->link_info = info;
d25079a0 525
69645d10
ILT
526 finfo.strtab = _bfd_stringtab_init ();
527 if (finfo.strtab == NULL)
528 goto error_return;
529
530 /* Compute the file positions for all the sections. */
531 if (! abfd->output_has_begun)
532 bfd_coff_compute_section_file_positions (abfd);
533
534 /* Count the line numbers and relocation entries required for the
535 output file. Set the file positions for the relocs. */
536 rel_filepos = obj_relocbase (abfd);
537 relsz = bfd_coff_relsz (abfd);
538 max_contents_size = 0;
539 max_lineno_count = 0;
540 max_reloc_count = 0;
541 for (o = abfd->sections; o != NULL; o = o->next)
542 {
543 o->reloc_count = 0;
544 o->lineno_count = 0;
545 for (p = o->link_order_head; p != NULL; p = p->next)
546 {
547 if (p->type == bfd_indirect_link_order)
548 {
549 asection *sec;
550
551 sec = p->u.indirect.section;
552
553 if (info->strip == strip_none
554 || info->strip == strip_some)
555 o->lineno_count += sec->lineno_count;
556
557 if (info->relocateable)
558 o->reloc_count += sec->reloc_count;
559
560 if (sec->_raw_size > max_contents_size)
561 max_contents_size = sec->_raw_size;
562 if (sec->lineno_count > max_lineno_count)
563 max_lineno_count = sec->lineno_count;
564 if (sec->reloc_count > max_reloc_count)
565 max_reloc_count = sec->reloc_count;
566 }
567 else if (info->relocateable
568 && (p->type == bfd_section_reloc_link_order
569 || p->type == bfd_symbol_reloc_link_order))
570 ++o->reloc_count;
571 }
572 if (o->reloc_count == 0)
573 o->rel_filepos = 0;
574 else
575 {
576 o->flags |= SEC_RELOC;
577 o->rel_filepos = rel_filepos;
578 rel_filepos += o->reloc_count * relsz;
579 }
580 }
581
582 /* If doing a relocateable link, allocate space for the pointers we
583 need to keep. */
584 if (info->relocateable)
585 {
586 unsigned int i;
587
2a895595
ILT
588 /* We use section_count + 1, rather than section_count, because
589 the target_index fields are 1 based. */
69645d10 590 finfo.section_info = ((struct coff_link_section_info *)
2a895595 591 malloc ((abfd->section_count + 1)
69645d10
ILT
592 * sizeof (struct coff_link_section_info)));
593 if (finfo.section_info == NULL)
594 {
595 bfd_set_error (bfd_error_no_memory);
596 goto error_return;
597 }
2a895595 598 for (i = 0; i <= abfd->section_count; i++)
69645d10
ILT
599 {
600 finfo.section_info[i].relocs = NULL;
601 finfo.section_info[i].rel_hashes = NULL;
602 }
603 }
604
605 /* We now know the size of the relocs, so we can determine the file
606 positions of the line numbers. */
607 line_filepos = rel_filepos;
608 linesz = bfd_coff_linesz (abfd);
609 max_output_reloc_count = 0;
610 for (o = abfd->sections; o != NULL; o = o->next)
611 {
612 if (o->lineno_count == 0)
613 o->line_filepos = 0;
614 else
615 {
616 o->line_filepos = line_filepos;
617 line_filepos += o->lineno_count * linesz;
618 }
619
620 if (o->reloc_count != 0)
621 {
622 /* We don't know the indices of global symbols until we have
623 written out all the local symbols. For each section in
624 the output file, we keep an array of pointers to hash
625 table entries. Each entry in the array corresponds to a
626 reloc. When we find a reloc against a global symbol, we
627 set the corresponding entry in this array so that we can
628 fix up the symbol index after we have written out all the
629 local symbols.
630
631 Because of this problem, we also keep the relocs in
632 memory until the end of the link. This wastes memory,
633 but only when doing a relocateable link, which is not the
634 common case. */
635 BFD_ASSERT (info->relocateable);
636 finfo.section_info[o->target_index].relocs =
637 ((struct internal_reloc *)
638 malloc (o->reloc_count * sizeof (struct internal_reloc)));
639 finfo.section_info[o->target_index].rel_hashes =
640 ((struct coff_link_hash_entry **)
641 malloc (o->reloc_count
642 * sizeof (struct coff_link_hash_entry *)));
643 if (finfo.section_info[o->target_index].relocs == NULL
644 || finfo.section_info[o->target_index].rel_hashes == NULL)
645 {
646 bfd_set_error (bfd_error_no_memory);
647 goto error_return;
648 }
649
650 if (o->reloc_count > max_output_reloc_count)
651 max_output_reloc_count = o->reloc_count;
652 }
653
654 /* Reset the reloc and lineno counts, so that we can use them to
655 count the number of entries we have output so far. */
656 o->reloc_count = 0;
657 o->lineno_count = 0;
658 }
659
660 obj_sym_filepos (abfd) = line_filepos;
661
662 /* Figure out the largest number of symbols in an input BFD. Take
663 the opportunity to clear the output_has_begun fields of all the
664 input BFD's. */
665 max_sym_count = 0;
666 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
667 {
668 size_t sz;
669
670 sub->output_has_begun = false;
671 sz = obj_raw_syment_count (sub);
672 if (sz > max_sym_count)
673 max_sym_count = sz;
674 }
675
676 /* Allocate some buffers used while linking. */
677 finfo.internal_syms = ((struct internal_syment *)
678 malloc (max_sym_count
679 * sizeof (struct internal_syment)));
680 finfo.sec_ptrs = (asection **) malloc (max_sym_count * sizeof (asection *));
681 finfo.sym_indices = (long *) malloc (max_sym_count * sizeof (long));
ff31ebda
KR
682 finfo.outsyms = ((bfd_byte *)
683 malloc ((size_t) ((max_sym_count + 1) * symesz)));
69645d10
ILT
684 finfo.linenos = (bfd_byte *) malloc (max_lineno_count
685 * bfd_coff_linesz (abfd));
686 finfo.contents = (bfd_byte *) malloc (max_contents_size);
687 finfo.external_relocs = (bfd_byte *) malloc (max_reloc_count * relsz);
688 if (! info->relocateable)
689 finfo.internal_relocs = ((struct internal_reloc *)
690 malloc (max_reloc_count
691 * sizeof (struct internal_reloc)));
692 if ((finfo.internal_syms == NULL && max_sym_count > 0)
693 || (finfo.sec_ptrs == NULL && max_sym_count > 0)
694 || (finfo.sym_indices == NULL && max_sym_count > 0)
695 || finfo.outsyms == NULL
696 || (finfo.linenos == NULL && max_lineno_count > 0)
697 || (finfo.contents == NULL && max_contents_size > 0)
698 || (finfo.external_relocs == NULL && max_reloc_count > 0)
699 || (! info->relocateable
700 && finfo.internal_relocs == NULL
701 && max_reloc_count > 0))
702 {
703 bfd_set_error (bfd_error_no_memory);
704 goto error_return;
705 }
706
707 /* We now know the position of everything in the file, except that
708 we don't know the size of the symbol table and therefore we don't
709 know where the string table starts. We just build the string
710 table in memory as we go along. We process all the relocations
711 for a single input file at once. */
712 obj_raw_syment_count (abfd) = 0;
713 for (o = abfd->sections; o != NULL; o = o->next)
714 {
715 for (p = o->link_order_head; p != NULL; p = p->next)
716 {
717 if (p->type == bfd_indirect_link_order
718 && (bfd_get_flavour (p->u.indirect.section->owner)
719 == bfd_target_coff_flavour))
720 {
721 sub = p->u.indirect.section->owner;
722 if (! sub->output_has_begun)
723 {
724 if (! coff_link_input_bfd (&finfo, sub))
725 goto error_return;
726 sub->output_has_begun = true;
727 }
728 }
729 else if (p->type == bfd_section_reloc_link_order
730 || p->type == bfd_symbol_reloc_link_order)
731 {
732 if (! coff_reloc_link_order (abfd, &finfo, o, p))
733 goto error_return;
734 }
735 else
736 {
737 if (! _bfd_default_link_order (abfd, info, o, p))
738 goto error_return;
739 }
740 }
741 }
742
743 /* Free up the buffers used by coff_link_input_bfd. */
744 if (finfo.internal_syms != NULL)
745 {
746 free (finfo.internal_syms);
747 finfo.internal_syms = NULL;
748 }
749 if (finfo.sec_ptrs != NULL)
750 {
751 free (finfo.sec_ptrs);
752 finfo.sec_ptrs = NULL;
753 }
754 if (finfo.sym_indices != NULL)
755 {
756 free (finfo.sym_indices);
757 finfo.sym_indices = NULL;
758 }
759 if (finfo.linenos != NULL)
760 {
761 free (finfo.linenos);
762 finfo.linenos = NULL;
763 }
764 if (finfo.contents != NULL)
765 {
766 free (finfo.contents);
767 finfo.contents = NULL;
768 }
769 if (finfo.external_relocs != NULL)
770 {
771 free (finfo.external_relocs);
772 finfo.external_relocs = NULL;
773 }
774 if (finfo.internal_relocs != NULL)
775 {
776 free (finfo.internal_relocs);
777 finfo.internal_relocs = NULL;
778 }
779
780 /* The value of the last C_FILE symbol is supposed to be the symbol
781 index of the first external symbol. Write it out again if
782 necessary. */
783 if (finfo.last_file_index != -1
ae115e51 784 && (unsigned int) finfo.last_file.n_value != obj_raw_syment_count (abfd))
69645d10
ILT
785 {
786 finfo.last_file.n_value = obj_raw_syment_count (abfd);
787 bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
788 (PTR) finfo.outsyms);
789 if (bfd_seek (abfd,
790 (obj_sym_filepos (abfd)
791 + finfo.last_file_index * symesz),
792 SEEK_SET) != 0
793 || bfd_write (finfo.outsyms, symesz, 1, abfd) != symesz)
794 return false;
795 }
796
797 /* Write out the global symbols. */
798 finfo.failed = false;
799 coff_link_hash_traverse (coff_hash_table (info), coff_write_global_sym,
800 (PTR) &finfo);
801 if (finfo.failed)
802 goto error_return;
803
804 /* The outsyms buffer is used by coff_write_global_sym. */
805 if (finfo.outsyms != NULL)
806 {
807 free (finfo.outsyms);
808 finfo.outsyms = NULL;
809 }
810
811 if (info->relocateable)
812 {
813 /* Now that we have written out all the global symbols, we know
814 the symbol indices to use for relocs against them, and we can
815 finally write out the relocs. */
816 external_relocs = (bfd_byte *) malloc (max_output_reloc_count * relsz);
817 if (external_relocs == NULL)
818 {
819 bfd_set_error (bfd_error_no_memory);
820 goto error_return;
821 }
822
823 for (o = abfd->sections; o != NULL; o = o->next)
824 {
825 struct internal_reloc *irel;
826 struct internal_reloc *irelend;
827 struct coff_link_hash_entry **rel_hash;
828 bfd_byte *erel;
829
830 if (o->reloc_count == 0)
831 continue;
832
833 irel = finfo.section_info[o->target_index].relocs;
834 irelend = irel + o->reloc_count;
835 rel_hash = finfo.section_info[o->target_index].rel_hashes;
836 erel = external_relocs;
837 for (; irel < irelend; irel++, rel_hash++, erel += relsz)
838 {
839 if (*rel_hash != NULL)
840 {
841 BFD_ASSERT ((*rel_hash)->indx >= 0);
842 irel->r_symndx = (*rel_hash)->indx;
843 }
844 bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel);
845 }
846
847 if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
848 || bfd_write ((PTR) external_relocs, relsz, o->reloc_count,
849 abfd) != relsz * o->reloc_count)
850 goto error_return;
851 }
852
853 free (external_relocs);
854 external_relocs = NULL;
855 }
856
857 /* Free up the section information. */
858 if (finfo.section_info != NULL)
859 {
860 unsigned int i;
861
862 for (i = 0; i < abfd->section_count; i++)
863 {
864 if (finfo.section_info[i].relocs != NULL)
865 free (finfo.section_info[i].relocs);
866 if (finfo.section_info[i].rel_hashes != NULL)
867 free (finfo.section_info[i].rel_hashes);
868 }
869 free (finfo.section_info);
870 finfo.section_info = NULL;
871 }
872
873 /* Write out the string table. */
874 if (bfd_seek (abfd,
875 (obj_sym_filepos (abfd)
876 + obj_raw_syment_count (abfd) * symesz),
877 SEEK_SET) != 0)
878 return false;
879
880#if STRING_SIZE_SIZE == 4
881 bfd_h_put_32 (abfd,
882 _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE,
d25079a0 883 (bfd_byte *) strbuf);
69645d10
ILT
884#else
885 #error Change bfd_h_put_32
886#endif
887
888 if (bfd_write (strbuf, 1, STRING_SIZE_SIZE, abfd) != STRING_SIZE_SIZE)
889 return false;
890
891 if (! _bfd_stringtab_emit (abfd, finfo.strtab))
892 return false;
893
894 _bfd_stringtab_free (finfo.strtab);
895
896 /* Setting bfd_get_symcount to 0 will cause write_object_contents to
897 not try to write out the symbols. */
898 bfd_get_symcount (abfd) = 0;
899
900 return true;
901
902 error_return:
903 if (finfo.strtab != NULL)
904 _bfd_stringtab_free (finfo.strtab);
905 if (finfo.section_info != NULL)
906 {
907 unsigned int i;
908
909 for (i = 0; i < abfd->section_count; i++)
910 {
911 if (finfo.section_info[i].relocs != NULL)
912 free (finfo.section_info[i].relocs);
913 if (finfo.section_info[i].rel_hashes != NULL)
914 free (finfo.section_info[i].rel_hashes);
915 }
916 free (finfo.section_info);
917 }
918 if (finfo.internal_syms != NULL)
919 free (finfo.internal_syms);
920 if (finfo.sec_ptrs != NULL)
921 free (finfo.sec_ptrs);
922 if (finfo.sym_indices != NULL)
923 free (finfo.sym_indices);
924 if (finfo.outsyms != NULL)
925 free (finfo.outsyms);
926 if (finfo.linenos != NULL)
927 free (finfo.linenos);
928 if (finfo.contents != NULL)
929 free (finfo.contents);
930 if (finfo.external_relocs != NULL)
931 free (finfo.external_relocs);
932 if (finfo.internal_relocs != NULL)
933 free (finfo.internal_relocs);
934 if (external_relocs != NULL)
935 free (external_relocs);
936 return false;
937}
938
ff31ebda
KR
939/* Read in and swap the relocs. This returns a buffer holding the
940 relocs for section SEC in file ABFD. If CACHE is true and
941 INTERNAL_RELOCS is NULL, the relocs read in wil be saved in case
942 the function is called again. If EXTERNAL_RELOCS is not NULL, it
943 is a buffer large enough to hold the unswapped relocs. If
944 INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold
945 the swapped relocs. If REQUIRE_INTERNAL is true, then the return
946 value must be INTERNAL_RELOCS. The function returns NULL on error. */
947
948struct internal_reloc *
949_bfd_coff_read_internal_relocs (abfd, sec, cache, external_relocs,
950 require_internal, internal_relocs)
951 bfd *abfd;
952 asection *sec;
953 boolean cache;
954 bfd_byte *external_relocs;
955 boolean require_internal;
956 struct internal_reloc *internal_relocs;
957{
958 bfd_size_type relsz;
959 bfd_byte *free_external = NULL;
960 struct internal_reloc *free_internal = NULL;
961 bfd_byte *erel;
962 bfd_byte *erel_end;
963 struct internal_reloc *irel;
964
965 if (coff_section_data (abfd, sec) != NULL
966 && coff_section_data (abfd, sec)->relocs != NULL)
967 {
968 if (! require_internal)
969 return coff_section_data (abfd, sec)->relocs;
970 memcpy (internal_relocs, coff_section_data (abfd, sec)->relocs,
971 sec->reloc_count * sizeof (struct internal_reloc));
972 return internal_relocs;
973 }
974
975 relsz = bfd_coff_relsz (abfd);
976
977 if (external_relocs == NULL)
978 {
979 free_external = (bfd_byte *) malloc (sec->reloc_count * relsz);
980 if (free_external == NULL && sec->reloc_count > 0)
981 {
982 bfd_set_error (bfd_error_no_memory);
983 goto error_return;
984 }
985 external_relocs = free_external;
986 }
987
988 if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0
989 || (bfd_read (external_relocs, relsz, sec->reloc_count, abfd)
990 != relsz * sec->reloc_count))
991 goto error_return;
992
993 if (internal_relocs == NULL)
994 {
995 free_internal = ((struct internal_reloc *)
996 malloc (sec->reloc_count
997 * sizeof (struct internal_reloc)));
998 if (free_internal == NULL && sec->reloc_count > 0)
999 {
1000 bfd_set_error (bfd_error_no_memory);
1001 goto error_return;
1002 }
1003 internal_relocs = free_internal;
1004 }
1005
1006 /* Swap in the relocs. */
1007 erel = external_relocs;
1008 erel_end = erel + relsz * sec->reloc_count;
1009 irel = internal_relocs;
1010 for (; erel < erel_end; erel += relsz, irel++)
1011 bfd_coff_swap_reloc_in (abfd, (PTR) erel, (PTR) irel);
1012
1013 if (free_external != NULL)
1014 {
1015 free (free_external);
1016 free_external = NULL;
1017 }
1018
1019 if (cache && free_internal != NULL)
1020 {
1021 if (coff_section_data (abfd, sec) == NULL)
1022 {
1023 sec->used_by_bfd = ((PTR) bfd_zalloc (abfd,
1024 sizeof (struct coff_section_tdata)));
1025 if (sec->used_by_bfd == NULL)
1026 {
1027 bfd_set_error (bfd_error_no_memory);
1028 goto error_return;
1029 }
1030 coff_section_data (abfd, sec)->contents = NULL;
1031 }
1032 coff_section_data (abfd, sec)->relocs = free_internal;
1033 }
1034
1035 return internal_relocs;
1036
1037 error_return:
1038 if (free_external != NULL)
1039 free (free_external);
1040 if (free_internal != NULL)
1041 free (free_internal);
1042 return NULL;
1043}
1044
ae115e51
ILT
1045
1046
1047/* parse out a -heap <reserved>,<commit> line */
1048
1049static char *
1050dores_com (ptr, output_bfd, heap)
1051 char *ptr;
1052 bfd *output_bfd;
1053 int heap;
1054{
1055 if (coff_data(output_bfd)->pe)
1056 {
1057 int val = strtoul (ptr, &ptr, 0);
1058 if (heap)
1059 pe_data(output_bfd)->pe_opthdr.SizeOfHeapReserve =val;
1060 else
1061 pe_data(output_bfd)->pe_opthdr.SizeOfStackReserve =val;
1062
1063 if (ptr[0] == ',')
1064 {
1065 int val = strtoul (ptr+1, &ptr, 0);
1066 if (heap)
1067 pe_data(output_bfd)->pe_opthdr.SizeOfHeapCommit =val;
1068 else
1069 pe_data(output_bfd)->pe_opthdr.SizeOfStackCommit =val;
1070 }
1071 }
1072 return ptr;
1073}
1074
1075static char *get_name(ptr, dst)
1076char *ptr;
1077char **dst;
1078{
1079 while (*ptr == ' ')
1080 ptr++;
1081 *dst = ptr;
1082 while (*ptr && *ptr != ' ')
1083 ptr++;
1084 *ptr = 0;
1085 return ptr+1;
1086}
1087/* Process any magic embedded commands in a section called .drectve */
1088
1089int
1090process_embedded_commands (output_bfd, info, abfd)
1091 bfd *output_bfd;
1092 struct bfd_link_info *info;
1093 bfd *abfd;
1094{
1095 asection *sec = bfd_get_section_by_name (abfd, ".drectve");
1096 char *s;
1097 char *e;
1098 char *copy;
1099 if (!sec)
1100 return 1;
1101
1102 copy = malloc ((size_t) sec->_raw_size);
1103 if (!copy)
1104 {
1105 bfd_set_error (bfd_error_no_memory);
1106 return 0;
1107 }
1108 if (! bfd_get_section_contents(abfd, sec, copy, 0, sec->_raw_size))
1109 {
1110 free (copy);
1111 return 0;
1112 }
1113 e = copy + sec->_raw_size;
1114 for (s = copy; s < e ; )
1115 {
1116 if (s[0]!= '-') {
1117 s++;
1118 continue;
1119 }
1120 if (strncmp (s,"-attr", 5) == 0)
1121 {
1122 char *name;
1123 char *attribs;
1124 asection *asec;
1125
1126 int loop = 1;
1127 int had_write = 0;
1128 int had_read = 0;
1129 int had_exec= 0;
1130 int had_shared= 0;
1131 s += 5;
1132 s = get_name(s, &name);
1133 s = get_name(s, &attribs);
1134 while (loop) {
1135 switch (*attribs++)
1136 {
1137 case 'W':
1138 had_write = 1;
1139 break;
1140 case 'R':
1141 had_read = 1;
1142 break;
1143 case 'S':
1144 had_shared = 1;
1145 break;
1146 case 'X':
1147 had_exec = 1;
1148 break;
1149 default:
1150 loop = 0;
1151 }
1152 }
1153 asec = bfd_get_section_by_name (abfd, name);
1154 if (asec) {
1155 if (had_exec)
1156 asec->flags |= SEC_CODE;
1157 if (!had_write)
1158 asec->flags |= SEC_READONLY;
1159 }
1160 }
1161 else if (strncmp (s,"-heap", 5) == 0)
1162 {
1163 s = dores_com (s+5, output_bfd, 1);
1164 }
1165 else if (strncmp (s,"-stack", 6) == 0)
1166 {
1167 s = dores_com (s+6, output_bfd, 0);
1168 }
1169 else
1170 s++;
1171 }
1172 free (copy);
1173 return 1;
1174}
1175
69645d10
ILT
1176/* Link an input file into the linker output file. This function
1177 handles all the sections and relocations of the input file at once. */
1178
1179static boolean
1180coff_link_input_bfd (finfo, input_bfd)
1181 struct coff_final_link_info *finfo;
1182 bfd *input_bfd;
1183{
1184 boolean (*sym_is_global) PARAMS ((bfd *, struct internal_syment *));
d25079a0
SC
1185 boolean (*adjust_symndx) PARAMS ((bfd *, struct bfd_link_info *, bfd *,
1186 asection *, struct internal_reloc *,
1187 boolean *));
69645d10
ILT
1188 bfd *output_bfd;
1189 const char *strings;
1190 bfd_size_type syment_base;
1191 unsigned int n_tmask;
1192 unsigned int n_btshft;
1193 boolean copy, hash;
1194 bfd_size_type isymesz;
1195 bfd_size_type osymesz;
1196 bfd_size_type linesz;
1197 bfd_byte *esym;
1198 bfd_byte *esym_end;
1199 struct internal_syment *isymp;
1200 asection **secpp;
1201 long *indexp;
ae115e51 1202 unsigned long output_index;
69645d10
ILT
1203 bfd_byte *outsym;
1204 struct coff_link_hash_entry **sym_hash;
69645d10
ILT
1205 asection *o;
1206
1207 /* Move all the symbols to the output file. */
1208
1209 output_bfd = finfo->output_bfd;
1210 sym_is_global = coff_backend_info (input_bfd)->_bfd_coff_sym_is_global;
1211 strings = NULL;
1212 syment_base = obj_raw_syment_count (output_bfd);
1213 isymesz = bfd_coff_symesz (input_bfd);
1214 osymesz = bfd_coff_symesz (output_bfd);
1215 linesz = bfd_coff_linesz (input_bfd);
1216 BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd));
1217
1218 n_tmask = coff_data (input_bfd)->local_n_tmask;
1219 n_btshft = coff_data (input_bfd)->local_n_btshft;
1220
1221 /* Define macros so that ISFCN, et. al., macros work correctly. */
1222#define N_TMASK n_tmask
1223#define N_BTSHFT n_btshft
1224
1225 copy = false;
1226 if (! finfo->info->keep_memory)
1227 copy = true;
1228 hash = true;
1229 if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
1230 hash = false;
1231
ff31ebda 1232 if (! _bfd_coff_get_external_symbols (input_bfd))
69645d10
ILT
1233 return false;
1234
1235 esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
1236 esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
1237 isymp = finfo->internal_syms;
1238 secpp = finfo->sec_ptrs;
1239 indexp = finfo->sym_indices;
1240 output_index = syment_base;
1241 outsym = finfo->outsyms;
d25079a0 1242
ae115e51 1243 if (coff_data(output_bfd)->pe)
d25079a0 1244 {
ae115e51 1245 if (!process_embedded_commands (output_bfd, finfo->info, input_bfd))
d25079a0
SC
1246 return false;
1247 }
1248
69645d10
ILT
1249 while (esym < esym_end)
1250 {
1251 struct internal_syment isym;
1252 boolean skip;
1253 boolean global;
1254 int add;
1255
1256 bfd_coff_swap_sym_in (input_bfd, (PTR) esym, (PTR) isymp);
1257
1258 /* Make a copy of *isymp so that the relocate_section function
1259 always sees the original values. This is more reliable than
1260 always recomputing the symbol value even if we are stripping
1261 the symbol. */
1262 isym = *isymp;
1263
2a895595
ILT
1264 if (isym.n_scnum != 0)
1265 *secpp = coff_section_from_bfd_index (input_bfd, isym.n_scnum);
1266 else
1267 {
1268 if (isym.n_value == 0)
1269 *secpp = bfd_und_section_ptr;
1270 else
1271 *secpp = bfd_com_section_ptr;
1272 }
1273
69645d10
ILT
1274 *indexp = -1;
1275
1276 skip = false;
1277 global = false;
1278 add = 1 + isym.n_numaux;
1279
1280 /* If we are stripping all symbols, we want to skip this one. */
1281 if (finfo->info->strip == strip_all)
1282 skip = true;
1283
1284 if (! skip)
1285 {
1286 if (isym.n_sclass == C_EXT
1287 || (sym_is_global && (*sym_is_global) (input_bfd, &isym)))
1288 {
1289 /* This is a global symbol. Global symbols come at the
1290 end of the symbol table, so skip them for now.
1291 Function symbols, however, are an exception, and are
1292 not moved to the end. */
1293 global = true;
1294 if (! ISFCN (isym.n_type))
1295 skip = true;
1296 }
1297 else
1298 {
1299 /* This is a local symbol. Skip it if we are discarding
1300 local symbols. */
1301 if (finfo->info->discard == discard_all)
1302 skip = true;
1303 }
1304 }
1305
1306 /* If we stripping debugging symbols, and this is a debugging
1307 symbol, then skip it. */
1308 if (! skip
1309 && finfo->info->strip == strip_debugger
1310 && isym.n_scnum == N_DEBUG)
1311 skip = true;
1312
1313 /* If some symbols are stripped based on the name, work out the
1314 name and decide whether to skip this symbol. */
1315 if (! skip
1316 && (finfo->info->strip == strip_some
1317 || finfo->info->discard == discard_l))
1318 {
1319 const char *name;
1320 char buf[SYMNMLEN + 1];
1321
ff31ebda
KR
1322 name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf);
1323 if (name == NULL)
1324 return false;
69645d10
ILT
1325
1326 if ((finfo->info->strip == strip_some
1327 && (bfd_hash_lookup (finfo->info->keep_hash, name, false,
1328 false) == NULL))
1329 || (! global
1330 && finfo->info->discard == discard_l
1331 && strncmp (name, finfo->info->lprefix,
1332 finfo->info->lprefix_len) == 0))
1333 skip = true;
1334 }
1335
1336 /* We now know whether we are to skip this symbol or not. */
1337 if (! skip)
1338 {
1339 /* Adjust the symbol in order to output it. */
1340
1341 if (isym._n._n_n._n_zeroes == 0
1342 && isym._n._n_n._n_offset != 0)
1343 {
1344 const char *name;
1345 bfd_size_type indx;
1346
1347 /* This symbol has a long name. Enter it in the string
1348 table we are building. Note that we do not check
1349 bfd_coff_symname_in_debug. That is only true for
1350 XCOFF, and XCOFF requires different linking code
1351 anyhow. */
ff31ebda
KR
1352 name = _bfd_coff_internal_syment_name (input_bfd, &isym,
1353 (char *) NULL);
1354 if (name == NULL)
1355 return false;
69645d10
ILT
1356 indx = _bfd_stringtab_add (finfo->strtab, name, hash, copy);
1357 if (indx == (bfd_size_type) -1)
1358 return false;
1359 isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
1360 }
1361
1362 if (isym.n_scnum > 0)
1363 {
1364 isym.n_scnum = (*secpp)->output_section->target_index;
1365 isym.n_value += ((*secpp)->output_section->vma
1366 + (*secpp)->output_offset
1367 - (*secpp)->vma);
1368 }
1369
1370 /* The value of a C_FILE symbol is the symbol index of the
1371 next C_FILE symbol. The value of the last C_FILE symbol
1372 is the symbol index to the first external symbol
1373 (actually, coff_renumber_symbols does not get this
1374 right--it just sets the value of the last C_FILE symbol
1375 to zero--and nobody has ever complained about it). We
1376 try to get this right, below, just before we write the
1377 symbols out, but in the general case we may have to write
1378 the symbol out twice. */
1379 if (isym.n_sclass == C_FILE)
1380 {
1381 if (finfo->last_file_index != -1
ae115e51 1382 && finfo->last_file.n_value != (long) output_index)
69645d10
ILT
1383 {
1384 /* We must correct the value of the last C_FILE entry. */
1385 finfo->last_file.n_value = output_index;
ae115e51 1386 if ((bfd_size_type) finfo->last_file_index >= syment_base)
69645d10
ILT
1387 {
1388 /* The last C_FILE symbol is in this input file. */
1389 bfd_coff_swap_sym_out (output_bfd,
1390 (PTR) &finfo->last_file,
1391 (PTR) (finfo->outsyms
1392 + ((finfo->last_file_index
1393 - syment_base)
1394 * osymesz)));
1395 }
1396 else
1397 {
1398 /* We have already written out the last C_FILE
1399 symbol. We need to write it out again. We
1400 borrow *outsym temporarily. */
1401 bfd_coff_swap_sym_out (output_bfd,
1402 (PTR) &finfo->last_file,
1403 (PTR) outsym);
1404 if (bfd_seek (output_bfd,
1405 (obj_sym_filepos (output_bfd)
1406 + finfo->last_file_index * osymesz),
1407 SEEK_SET) != 0
1408 || (bfd_write (outsym, osymesz, 1, output_bfd)
1409 != osymesz))
1410 return false;
1411 }
1412 }
1413
1414 finfo->last_file_index = output_index;
1415 finfo->last_file = isym;
1416 }
1417
1418 /* Output the symbol. */
1419
1420 bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym);
1421
1422 *indexp = output_index;
1423
1424 if (global)
1425 {
1426 long indx;
1427 struct coff_link_hash_entry *h;
1428
1429 indx = ((esym - (bfd_byte *) obj_coff_external_syms (input_bfd))
1430 / isymesz);
1431 h = obj_coff_sym_hashes (input_bfd)[indx];
1432 BFD_ASSERT (h != NULL);
1433 h->indx = output_index;
1434 }
1435
1436 output_index += add;
1437 outsym += add * osymesz;
1438 }
1439
1440 esym += add * isymesz;
1441 isymp += add;
1442 ++secpp;
1443 ++indexp;
1444 for (--add; add > 0; --add)
1445 {
1446 *secpp++ = NULL;
1447 *indexp++ = -1;
1448 }
1449 }
1450
1451 /* Fix up the aux entries. This must be done in a separate pass,
1452 because we don't know the correct symbol indices until we have
1453 already decided which symbols we are going to keep. */
1454
1455 esym = (bfd_byte *) obj_coff_external_syms (input_bfd);
1456 esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz;
1457 isymp = finfo->internal_syms;
1458 indexp = finfo->sym_indices;
1459 sym_hash = obj_coff_sym_hashes (input_bfd);
1460 outsym = finfo->outsyms;
1461 while (esym < esym_end)
1462 {
1463 int add;
1464
1465 add = 1 + isymp->n_numaux;
1466
1467 if (*indexp < 0
1468 && (*sym_hash == NULL
1469 || (*sym_hash)->auxbfd != input_bfd))
1470 esym += add * isymesz;
1471 else
1472 {
1473 struct coff_link_hash_entry *h;
1474 int i;
1475
1476 h = NULL;
1477 if (*indexp < 0)
1478 {
1479 h = *sym_hash;
1480 BFD_ASSERT (h->numaux == isymp->n_numaux);
1481 }
1482
1483 esym += isymesz;
1484
1485 if (h == NULL)
1486 outsym += osymesz;
1487
1488 /* Handle the aux entries. This handling is based on
1489 coff_pointerize_aux. I don't know if it always correct. */
1490 for (i = 0; i < isymp->n_numaux && esym < esym_end; i++)
1491 {
1492 union internal_auxent aux;
1493 union internal_auxent *auxp;
1494
1495 if (h != NULL)
1496 auxp = h->aux + i;
1497 else
1498 {
1499 bfd_coff_swap_aux_in (input_bfd, (PTR) esym, isymp->n_type,
1500 isymp->n_sclass, i, isymp->n_numaux,
1501 (PTR) &aux);
1502 auxp = &aux;
1503 }
1504
1505 if (isymp->n_sclass == C_FILE)
1506 {
1507 /* If this is a long filename, we must put it in the
1508 string table. */
d25079a0
SC
1509 if (auxp->x_file.x_n.x_zeroes == 0
1510 && auxp->x_file.x_n.x_offset != 0)
69645d10
ILT
1511 {
1512 const char *filename;
1513 bfd_size_type indx;
1514
1515 BFD_ASSERT (auxp->x_file.x_n.x_offset
1516 >= STRING_SIZE_SIZE);
1517 if (strings == NULL)
1518 {
ff31ebda 1519 strings = _bfd_coff_read_string_table (input_bfd);
69645d10
ILT
1520 if (strings == NULL)
1521 return false;
1522 }
1523 filename = strings + auxp->x_file.x_n.x_offset;
1524 indx = _bfd_stringtab_add (finfo->strtab, filename,
1525 hash, copy);
1526 if (indx == (bfd_size_type) -1)
1527 return false;
1528 auxp->x_file.x_n.x_offset = STRING_SIZE_SIZE + indx;
1529 }
1530 }
1531 else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL)
1532 {
ae115e51 1533 unsigned long indx;
69645d10
ILT
1534
1535 if (ISFCN (isymp->n_type)
1536 || ISTAG (isymp->n_sclass)
1537 || isymp->n_sclass == C_BLOCK)
1538 {
1539 indx = auxp->x_sym.x_fcnary.x_fcn.x_endndx.l;
1540 if (indx > 0
1541 && indx < obj_raw_syment_count (input_bfd))
1542 {
1543 /* We look forward through the symbol for
1544 the index of the next symbol we are going
1545 to include. I don't know if this is
1546 entirely right. */
1547 while (finfo->sym_indices[indx] < 0
1548 && indx < obj_raw_syment_count (input_bfd))
1549 ++indx;
1550 if (indx >= obj_raw_syment_count (input_bfd))
1551 indx = output_index;
1552 else
1553 indx = finfo->sym_indices[indx];
1554 auxp->x_sym.x_fcnary.x_fcn.x_endndx.l = indx;
1555 }
1556 }
1557
1558 indx = auxp->x_sym.x_tagndx.l;
1559 if (indx > 0 && indx < obj_raw_syment_count (input_bfd))
1560 {
ae115e51
ILT
1561 long symindx;
1562
1563 symindx = finfo->sym_indices[indx];
1564 if (symindx < 0)
69645d10
ILT
1565 auxp->x_sym.x_tagndx.l = 0;
1566 else
ae115e51 1567 auxp->x_sym.x_tagndx.l = symindx;
69645d10
ILT
1568 }
1569 }
1570
1571 if (h == NULL)
1572 {
1573 bfd_coff_swap_aux_out (output_bfd, (PTR) auxp, isymp->n_type,
1574 isymp->n_sclass, i, isymp->n_numaux,
1575 (PTR) outsym);
1576 outsym += osymesz;
1577 }
1578
1579 esym += isymesz;
1580 }
1581 }
1582
1583 indexp += add;
1584 isymp += add;
1585 sym_hash += add;
1586 }
1587
1588 /* Relocate the line numbers, unless we are stripping them. */
1589 if (finfo->info->strip == strip_none
1590 || finfo->info->strip == strip_some)
1591 {
1592 for (o = input_bfd->sections; o != NULL; o = o->next)
1593 {
1594 bfd_vma offset;
1595 bfd_byte *eline;
1596 bfd_byte *elineend;
1597
3ea928f5
SC
1598 /* FIXME: If SEC_HAS_CONTENTS is not for the section, then
1599 build_link_order in ldwrite.c will not have created a
1600 link order, which means that we will not have seen this
1601 input section in _bfd_coff_final_link, which means that
1602 we will not have allocated space for the line numbers of
1603 this section. I don't think line numbers can be
1604 meaningful for a section which does not have
1605 SEC_HAS_CONTENTS set, but, if they do, this must be
1606 changed. */
1607 if (o->lineno_count == 0
1608 || (o->output_section->flags & SEC_HAS_CONTENTS) == 0)
69645d10
ILT
1609 continue;
1610
1611 if (bfd_seek (input_bfd, o->line_filepos, SEEK_SET) != 0
1612 || bfd_read (finfo->linenos, linesz, o->lineno_count,
1613 input_bfd) != linesz * o->lineno_count)
1614 return false;
1615
1616 offset = o->output_section->vma + o->output_offset - o->vma;
1617 eline = finfo->linenos;
1618 elineend = eline + linesz * o->lineno_count;
1619 for (; eline < elineend; eline += linesz)
1620 {
1621 struct internal_lineno iline;
1622
1623 bfd_coff_swap_lineno_in (input_bfd, (PTR) eline, (PTR) &iline);
1624
1625 if (iline.l_lnno != 0)
1626 iline.l_addr.l_paddr += offset;
1627 else if (iline.l_addr.l_symndx >= 0
ae115e51 1628 && ((unsigned long) iline.l_addr.l_symndx
69645d10
ILT
1629 < obj_raw_syment_count (input_bfd)))
1630 {
1631 long indx;
1632
1633 indx = finfo->sym_indices[iline.l_addr.l_symndx];
1634
1635 if (indx < 0)
1636 {
1637 /* These line numbers are attached to a symbol
1638 which we are stripping. We should really
1639 just discard the line numbers, but that would
1640 be a pain because we have already counted
1641 them. */
1642 indx = 0;
1643 }
1644 else
1645 {
1646 struct internal_syment is;
1647 union internal_auxent ia;
1648
1649 /* Fix up the lnnoptr field in the aux entry of
1650 the symbol. It turns out that we can't do
1651 this when we modify the symbol aux entries,
1652 because gas sometimes screws up the lnnoptr
1653 field and makes it an offset from the start
1654 of the line numbers rather than an absolute
1655 file index. */
1656 bfd_coff_swap_sym_in (output_bfd,
1657 (PTR) (finfo->outsyms
1658 + ((indx - syment_base)
1659 * osymesz)),
1660 (PTR) &is);
1661 if ((ISFCN (is.n_type)
1662 || is.n_sclass == C_BLOCK)
1663 && is.n_numaux >= 1)
1664 {
1665 PTR auxptr;
1666
1667 auxptr = (PTR) (finfo->outsyms
1668 + ((indx - syment_base + 1)
1669 * osymesz));
1670 bfd_coff_swap_aux_in (output_bfd, auxptr,
1671 is.n_type, is.n_sclass,
1672 0, is.n_numaux, (PTR) &ia);
1673 ia.x_sym.x_fcnary.x_fcn.x_lnnoptr =
1674 (o->output_section->line_filepos
1675 + o->output_section->lineno_count * linesz
1676 + eline - finfo->linenos);
1677 bfd_coff_swap_aux_out (output_bfd, (PTR) &ia,
1678 is.n_type, is.n_sclass, 0,
1679 is.n_numaux, auxptr);
1680 }
1681 }
1682
1683 iline.l_addr.l_symndx = indx;
1684 }
1685
1686 bfd_coff_swap_lineno_out (output_bfd, (PTR) &iline, (PTR) eline);
1687 }
1688
1689 if (bfd_seek (output_bfd,
1690 (o->output_section->line_filepos
1691 + o->output_section->lineno_count * linesz),
1692 SEEK_SET) != 0
1693 || bfd_write (finfo->linenos, linesz, o->lineno_count,
1694 output_bfd) != linesz * o->lineno_count)
1695 return false;
1696
1697 o->output_section->lineno_count += o->lineno_count;
1698 }
1699 }
1700
1701 /* If we swapped out a C_FILE symbol, guess that the next C_FILE
1702 symbol will be the first symbol in the next input file. In the
1703 normal case, this will save us from writing out the C_FILE symbol
1704 again. */
d25079a0 1705 if (finfo->last_file_index != -1
ae115e51 1706 && (bfd_size_type) finfo->last_file_index >= syment_base)
69645d10
ILT
1707 {
1708 finfo->last_file.n_value = output_index;
1709 bfd_coff_swap_sym_out (output_bfd, (PTR) &finfo->last_file,
1710 (PTR) (finfo->outsyms
d25079a0
SC
1711 + ((finfo->last_file_index - syment_base)
1712 * osymesz)));
69645d10
ILT
1713 }
1714
1715 /* Write the modified symbols to the output file. */
1716 if (outsym > finfo->outsyms)
1717 {
1718 if (bfd_seek (output_bfd,
1719 obj_sym_filepos (output_bfd) + syment_base * osymesz,
1720 SEEK_SET) != 0
ae115e51
ILT
1721 || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1,
1722 output_bfd)
1723 != (bfd_size_type) (outsym - finfo->outsyms)))
69645d10
ILT
1724 return false;
1725
1726 BFD_ASSERT ((obj_raw_syment_count (output_bfd)
1727 + (outsym - finfo->outsyms) / osymesz)
1728 == output_index);
1729
1730 obj_raw_syment_count (output_bfd) = output_index;
1731 }
1732
1733 /* Relocate the contents of each section. */
d25079a0 1734 adjust_symndx = coff_backend_info (input_bfd)->_bfd_coff_adjust_symndx;
69645d10
ILT
1735 for (o = input_bfd->sections; o != NULL; o = o->next)
1736 {
ff31ebda
KR
1737 bfd_byte *contents;
1738
69645d10 1739 if ((o->flags & SEC_HAS_CONTENTS) == 0)
aa4b3dc5
ILT
1740 {
1741 if ((o->flags & SEC_RELOC) != 0
1742 && o->reloc_count != 0)
1743 {
1744 ((*_bfd_error_handler)
1745 ("%s: relocs in section `%s', but it has no contents",
1746 bfd_get_filename (input_bfd),
1747 bfd_get_section_name (input_bfd, o)));
1748 bfd_set_error (bfd_error_no_contents);
1749 return false;
1750 }
1751
1752 continue;
1753 }
69645d10 1754
ff31ebda
KR
1755 if (coff_section_data (input_bfd, o) != NULL
1756 && coff_section_data (input_bfd, o)->contents != NULL)
1757 contents = coff_section_data (input_bfd, o)->contents;
1758 else
1759 {
1760 if (! bfd_get_section_contents (input_bfd, o, finfo->contents,
1761 (file_ptr) 0, o->_raw_size))
1762 return false;
1763 contents = finfo->contents;
1764 }
69645d10
ILT
1765
1766 if ((o->flags & SEC_RELOC) != 0)
1767 {
1768 int target_index;
1769 struct internal_reloc *internal_relocs;
69645d10
ILT
1770 struct internal_reloc *irel;
1771
1772 /* Read in the relocs. */
69645d10 1773 target_index = o->output_section->target_index;
ff31ebda
KR
1774 internal_relocs = (_bfd_coff_read_internal_relocs
1775 (input_bfd, o, false, finfo->external_relocs,
1776 finfo->info->relocateable,
1777 (finfo->info->relocateable
1778 ? (finfo->section_info[target_index].relocs
1779 + o->output_section->reloc_count)
1780 : finfo->internal_relocs)));
1781 if (internal_relocs == NULL)
1782 return false;
69645d10
ILT
1783
1784 /* Call processor specific code to relocate the section
1785 contents. */
1786 if (! bfd_coff_relocate_section (output_bfd, finfo->info,
1787 input_bfd, o,
ff31ebda 1788 contents,
69645d10
ILT
1789 internal_relocs,
1790 finfo->internal_syms,
1791 finfo->sec_ptrs))
1792 return false;
1793
1794 if (finfo->info->relocateable)
1795 {
1796 bfd_vma offset;
1797 struct internal_reloc *irelend;
1798 struct coff_link_hash_entry **rel_hash;
1799
1800 offset = o->output_section->vma + o->output_offset - o->vma;
69645d10
ILT
1801 irel = internal_relocs;
1802 irelend = irel + o->reloc_count;
2a895595
ILT
1803 rel_hash = (finfo->section_info[target_index].rel_hashes
1804 + o->output_section->reloc_count);
69645d10
ILT
1805 for (; irel < irelend; irel++, rel_hash++)
1806 {
1807 struct coff_link_hash_entry *h;
d25079a0 1808 boolean adjusted;
69645d10
ILT
1809
1810 *rel_hash = NULL;
1811
1812 /* Adjust the reloc address and symbol index. */
1813
1814 irel->r_vaddr += offset;
1815
2a895595
ILT
1816 if (irel->r_symndx == -1)
1817 continue;
1818
d25079a0
SC
1819 if (adjust_symndx)
1820 {
1821 if (! (*adjust_symndx) (output_bfd, finfo->info,
1822 input_bfd, o, irel,
1823 &adjusted))
1824 return false;
1825 if (adjusted)
1826 continue;
1827 }
1828
69645d10
ILT
1829 h = obj_coff_sym_hashes (input_bfd)[irel->r_symndx];
1830 if (h != NULL)
1831 {
1832 /* This is a global symbol. */
1833 if (h->indx >= 0)
1834 irel->r_symndx = h->indx;
1835 else
1836 {
1837 /* This symbol is being written at the end
1838 of the file, and we do not yet know the
1839 symbol index. We save the pointer to the
1840 hash table entry in the rel_hash list.
1841 We set the indx field to -2 to indicate
1842 that this symbol must not be stripped. */
1843 *rel_hash = h;
1844 h->indx = -2;
1845 }
1846 }
1847 else
1848 {
1849 long indx;
1850
1851 indx = finfo->sym_indices[irel->r_symndx];
1852 if (indx != -1)
1853 irel->r_symndx = indx;
1854 else
1855 {
1856 struct internal_syment *is;
1857 const char *name;
1858 char buf[SYMNMLEN + 1];
1859
1860 /* This reloc is against a symbol we are
1861 stripping. It would be possible to
1862 handle this case, but I don't think it's
1863 worth it. */
1864 is = finfo->internal_syms + irel->r_symndx;
1865
ff31ebda
KR
1866 name = (_bfd_coff_internal_syment_name
1867 (input_bfd, is, buf));
1868 if (name == NULL)
1869 return false;
69645d10
ILT
1870
1871 if (! ((*finfo->info->callbacks->unattached_reloc)
1872 (finfo->info, name, input_bfd, o,
1873 irel->r_vaddr)))
1874 return false;
1875 }
1876 }
1877 }
1878
1879 o->output_section->reloc_count += o->reloc_count;
1880 }
1881 }
1882
1883 /* Write out the modified section contents. */
1884 if (! bfd_set_section_contents (output_bfd, o->output_section,
ff31ebda 1885 contents, o->output_offset,
69645d10
ILT
1886 (o->_cooked_size != 0
1887 ? o->_cooked_size
1888 : o->_raw_size)))
1889 return false;
1890 }
1891
1892 if (! finfo->info->keep_memory)
1893 {
ff31ebda 1894 if (! _bfd_coff_free_symbols (input_bfd))
69645d10
ILT
1895 return false;
1896 }
1897
1898 return true;
1899}
1900
1901/* Write out a global symbol. Called via coff_link_hash_traverse. */
1902
1903static boolean
1904coff_write_global_sym (h, data)
1905 struct coff_link_hash_entry *h;
1906 PTR data;
1907{
1908 struct coff_final_link_info *finfo = (struct coff_final_link_info *) data;
1909 bfd *output_bfd;
1910 struct internal_syment isym;
1911 bfd_size_type symesz;
1912 unsigned int i;
1913
1914 output_bfd = finfo->output_bfd;
1915
1916 if (h->indx >= 0)
1917 return true;
1918
1919 if (h->indx != -2
1920 && (finfo->info->strip == strip_all
1921 || (finfo->info->strip == strip_some
1922 && (bfd_hash_lookup (finfo->info->keep_hash,
1923 h->root.root.string, false, false)
1924 == NULL))))
1925 return true;
1926
1927 switch (h->root.type)
1928 {
1929 default:
1930 case bfd_link_hash_new:
1931 abort ();
1932 return false;
1933
1934 case bfd_link_hash_undefined:
d25079a0 1935 case bfd_link_hash_undefweak:
69645d10
ILT
1936 isym.n_scnum = N_UNDEF;
1937 isym.n_value = 0;
1938 break;
1939
1940 case bfd_link_hash_defined:
d25079a0 1941 case bfd_link_hash_defweak:
69645d10
ILT
1942 {
1943 asection *sec;
1944
1945 sec = h->root.u.def.section->output_section;
1946 if (bfd_is_abs_section (sec))
1947 isym.n_scnum = N_ABS;
1948 else
1949 isym.n_scnum = sec->target_index;
1950 isym.n_value = (h->root.u.def.value
1951 + sec->vma
1952 + h->root.u.def.section->output_offset);
1953 }
1954 break;
1955
1956 case bfd_link_hash_common:
1957 isym.n_scnum = N_UNDEF;
1958 isym.n_value = h->root.u.c.size;
1959 break;
1960
1961 case bfd_link_hash_indirect:
1962 case bfd_link_hash_warning:
1963 /* Just ignore these. They can't be handled anyhow. */
1964 return true;
1965 }
1966
1967 if (strlen (h->root.root.string) <= SYMNMLEN)
1968 strncpy (isym._n._n_name, h->root.root.string, SYMNMLEN);
1969 else
1970 {
1971 boolean hash;
1972 bfd_size_type indx;
1973
1974 hash = true;
1975 if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0)
1976 hash = false;
1977 indx = _bfd_stringtab_add (finfo->strtab, h->root.root.string, hash,
1978 false);
1979 if (indx == (bfd_size_type) -1)
1980 {
1981 finfo->failed = true;
1982 return false;
1983 }
1984 isym._n._n_n._n_zeroes = 0;
1985 isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx;
1986 }
1987
1988 isym.n_sclass = h->class;
1989 isym.n_type = h->type;
1990
1991 if (isym.n_sclass == C_NULL)
1992 isym.n_sclass = C_EXT;
1993
1994 isym.n_numaux = h->numaux;
1995
1996 bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) finfo->outsyms);
1997
1998 symesz = bfd_coff_symesz (output_bfd);
1999
2000 if (bfd_seek (output_bfd,
2001 (obj_sym_filepos (output_bfd)
2002 + obj_raw_syment_count (output_bfd) * symesz),
2003 SEEK_SET) != 0
2004 || bfd_write (finfo->outsyms, symesz, 1, output_bfd) != symesz)
2005 {
2006 finfo->failed = true;
2007 return false;
2008 }
2009
2010 h->indx = obj_raw_syment_count (output_bfd);
2011
2012 ++obj_raw_syment_count (output_bfd);
2013
2014 /* Write out any associated aux entries. There normally will be
2015 none. If there are any, I have no idea how to modify them. */
2016 for (i = 0; i < isym.n_numaux; i++)
2017 {
2018 bfd_coff_swap_aux_out (output_bfd, (PTR) (h->aux + i), isym.n_type,
2019 isym.n_sclass, i, isym.n_numaux,
2020 (PTR) finfo->outsyms);
2021 if (bfd_write (finfo->outsyms, symesz, 1, output_bfd) != symesz)
2022 {
2023 finfo->failed = true;
2024 return false;
2025 }
2026 ++obj_raw_syment_count (output_bfd);
2027 }
2028
2029 return true;
2030}
2031
2032/* Handle a link order which is supposed to generate a reloc. */
2033
2034static boolean
2035coff_reloc_link_order (output_bfd, finfo, output_section, link_order)
2036 bfd *output_bfd;
2037 struct coff_final_link_info *finfo;
2038 asection *output_section;
2039 struct bfd_link_order *link_order;
2040{
d25079a0 2041 reloc_howto_type *howto;
69645d10
ILT
2042 struct internal_reloc *irel;
2043 struct coff_link_hash_entry **rel_hash_ptr;
2044
2045 howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
2046 if (howto == NULL)
2047 {
2048 bfd_set_error (bfd_error_bad_value);
2049 return false;
2050 }
2051
2052 if (link_order->u.reloc.p->addend != 0)
2053 {
2054 bfd_size_type size;
2055 bfd_byte *buf;
2056 bfd_reloc_status_type rstat;
2057 boolean ok;
2058
2059 size = bfd_get_reloc_size (howto);
2060 buf = (bfd_byte *) bfd_zmalloc (size);
2061 if (buf == NULL)
2062 {
2063 bfd_set_error (bfd_error_no_memory);
2064 return false;
2065 }
2066
2067 rstat = _bfd_relocate_contents (howto, output_bfd,
2068 link_order->u.reloc.p->addend, buf);
2069 switch (rstat)
2070 {
2071 case bfd_reloc_ok:
2072 break;
2073 default:
2074 case bfd_reloc_outofrange:
2075 abort ();
2076 case bfd_reloc_overflow:
2077 if (! ((*finfo->info->callbacks->reloc_overflow)
2078 (finfo->info,
2079 (link_order->type == bfd_section_reloc_link_order
2080 ? bfd_section_name (output_bfd,
2081 link_order->u.reloc.p->u.section)
2082 : link_order->u.reloc.p->u.name),
2083 howto->name, link_order->u.reloc.p->addend,
2084 (bfd *) NULL, (asection *) NULL, (bfd_vma) 0)))
2085 {
2086 free (buf);
2087 return false;
2088 }
2089 break;
2090 }
2091 ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf,
2092 (file_ptr) link_order->offset, size);
2093 free (buf);
2094 if (! ok)
2095 return false;
2096 }
2097
2098 /* Store the reloc information in the right place. It will get
2099 swapped and written out at the end of the final_link routine. */
2100
2101 irel = (finfo->section_info[output_section->target_index].relocs
2102 + output_section->reloc_count);
2103 rel_hash_ptr = (finfo->section_info[output_section->target_index].rel_hashes
2104 + output_section->reloc_count);
2105
2106 memset (irel, 0, sizeof (struct internal_reloc));
2107 *rel_hash_ptr = NULL;
2108
2109 irel->r_vaddr = output_section->vma + link_order->offset;
2110
2111 if (link_order->type == bfd_section_reloc_link_order)
2112 {
2113 /* We need to somehow locate a symbol in the right section. The
2114 symbol must either have a value of zero, or we must adjust
2115 the addend by the value of the symbol. FIXME: Write this
2116 when we need it. The old linker couldn't handle this anyhow. */
2117 abort ();
2118 *rel_hash_ptr = NULL;
2119 irel->r_symndx = 0;
2120 }
2121 else
2122 {
2123 struct coff_link_hash_entry *h;
2124
2125 h = coff_link_hash_lookup (coff_hash_table (finfo->info),
2126 link_order->u.reloc.p->u.name,
2127 false, false, true);
2128 if (h != NULL)
2129 {
2130 if (h->indx >= 0)
2131 irel->r_symndx = h->indx;
2132 else
2133 {
2134 /* Set the index to -2 to force this symbol to get
2135 written out. */
2136 h->indx = -2;
2137 *rel_hash_ptr = h;
2138 irel->r_symndx = 0;
2139 }
2140 }
2141 else
2142 {
2143 if (! ((*finfo->info->callbacks->unattached_reloc)
2144 (finfo->info, link_order->u.reloc.p->u.name, (bfd *) NULL,
2145 (asection *) NULL, (bfd_vma) 0)))
2146 return false;
2147 irel->r_symndx = 0;
2148 }
2149 }
2150
2151 /* FIXME: Is this always right? */
2152 irel->r_type = howto->type;
2153
2154 /* r_size is only used on the RS/6000, which needs its own linker
2155 routines anyhow. r_extern is only used for ECOFF. */
2156
2157 /* FIXME: What is the right value for r_offset? Is zero OK? */
2158
2159 ++output_section->reloc_count;
2160
2161 return true;
2162}
2a895595
ILT
2163
2164/* A basic reloc handling routine which may be used by processors with
2165 simple relocs. */
2166
2167boolean
2168_bfd_coff_generic_relocate_section (output_bfd, info, input_bfd,
2169 input_section, contents, relocs, syms,
2170 sections)
2171 bfd *output_bfd;
2172 struct bfd_link_info *info;
2173 bfd *input_bfd;
2174 asection *input_section;
2175 bfd_byte *contents;
2176 struct internal_reloc *relocs;
2177 struct internal_syment *syms;
2178 asection **sections;
2179{
2180 struct internal_reloc *rel;
2181 struct internal_reloc *relend;
2182
d25079a0 2183
2a895595
ILT
2184 rel = relocs;
2185 relend = rel + input_section->reloc_count;
2186 for (; rel < relend; rel++)
2187 {
2188 long symndx;
2189 struct coff_link_hash_entry *h;
2190 struct internal_syment *sym;
2191 bfd_vma addend;
2192 bfd_vma val;
d25079a0 2193 reloc_howto_type *howto;
2a895595
ILT
2194 bfd_reloc_status_type rstat;
2195
2196 symndx = rel->r_symndx;
2197
2198 if (symndx == -1)
2199 {
2200 h = NULL;
2201 sym = NULL;
2202 }
2203 else
2204 {
2205 h = obj_coff_sym_hashes (input_bfd)[symndx];
2206 sym = syms + symndx;
2207 }
2208
2209 /* COFF treats common symbols in one of two ways. Either the
2210 size of the symbol is included in the section contents, or it
2211 is not. We assume that the size is not included, and force
2212 the rtype_to_howto function to adjust the addend as needed. */
d25079a0 2213
2a895595
ILT
2214 if (sym != NULL && sym->n_scnum != 0)
2215 addend = - sym->n_value;
2216 else
2217 addend = 0;
2218
d25079a0 2219
2a895595
ILT
2220 howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h,
2221 sym, &addend);
2222 if (howto == NULL)
2223 return false;
2224
2225 val = 0;
2226
2227 if (h == NULL)
2228 {
2229 asection *sec;
2230
2231 if (symndx == -1)
2232 {
2233 sec = bfd_abs_section_ptr;
2234 val = 0;
2235 }
2236 else
2237 {
2238 sec = sections[symndx];
d25079a0 2239 val = (sec->output_section->vma
2a895595
ILT
2240 + sec->output_offset
2241 + sym->n_value
2242 - sec->vma);
2243 }
2244 }
2245 else
2246 {
d25079a0
SC
2247 if (h->root.type == bfd_link_hash_defined
2248 || h->root.type == bfd_link_hash_defweak)
2a895595
ILT
2249 {
2250 asection *sec;
2251
2252 sec = h->root.u.def.section;
2253 val = (h->root.u.def.value
2254 + sec->output_section->vma
2255 + sec->output_offset);
d25079a0 2256 }
ff31ebda 2257
2a895595
ILT
2258 else if (! info->relocateable)
2259 {
2260 if (! ((*info->callbacks->undefined_symbol)
2261 (info, h->root.root.string, input_bfd, input_section,
2262 rel->r_vaddr - input_section->vma)))
2263 return false;
2264 }
2265 }
2266
89665c85
SC
2267 if (info->base_file)
2268 {
2269 /* So if this is non pcrelative, and is referenced
2270 to a section or a common symbol, then it needs a reloc */
2271 if (!howto->pc_relative
ae115e51 2272 && sym && (sym->n_scnum || sym->n_value))
89665c85
SC
2273 {
2274 /* relocation to a symbol in a section which
2275 isn't absolute - we output the address here
2276 to a file */
ece22cd0 2277 bfd_vma addr = rel->r_vaddr
89665c85
SC
2278 + input_section->output_offset
2279 + input_section->output_section->vma;
ae115e51
ILT
2280 if (coff_data(output_bfd)->pe)
2281 addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
be89267c 2282 fwrite (&addr, 1,4, (FILE *) info->base_file);
89665c85
SC
2283 }
2284 }
d25079a0 2285
2a895595
ILT
2286 rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
2287 contents,
2288 rel->r_vaddr - input_section->vma,
2289 val, addend);
2290
2291 switch (rstat)
2292 {
2293 default:
2294 abort ();
2295 case bfd_reloc_ok:
2296 break;
2297 case bfd_reloc_overflow:
2298 {
2299 const char *name;
2300 char buf[SYMNMLEN + 1];
2301
2302 if (symndx == -1)
2303 name = "*ABS*";
2304 else if (h != NULL)
2305 name = h->root.root.string;
2a895595
ILT
2306 else
2307 {
ff31ebda
KR
2308 name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
2309 if (name == NULL)
2310 return false;
2a895595
ILT
2311 }
2312
2313 if (! ((*info->callbacks->reloc_overflow)
2314 (info, name, howto->name, (bfd_vma) 0, input_bfd,
2315 input_section, rel->r_vaddr - input_section->vma)))
2316 return false;
2317 }
2318 }
2319 }
2320
2321 return true;
2322}
This page took 0.136791 seconds and 4 git commands to generate.