1 /* BFD back-end for PowerPC Microsoft Portable Executable files.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4 Free Software Foundation, Inc.
6 Original version pieced together by Kim Knuttila (krk@cygnus.com)
8 There is nothing new under the sun. This file draws a lot on other
9 coff files, in particular, those for the rs/6000, alpha, mips, and
10 intel backends, and the PE work for the arm.
12 This file is part of BFD, the Binary File Descriptor library.
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 3 of the License, or
17 (at your option) any later version.
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, 51 Franklin Street - Fifth Floor,
27 Boston, MA 02110-1301, USA. */
31 - relocs generated by gas
32 - ld will link files, but they do not run.
33 - dlltool will not produce correct output in some .reloc cases, and will
34 not produce the right glue code for dll function calls. */
40 #include "coff/powerpc.h"
41 #include "coff/internal.h"
49 #define BADMAG(x) PPCBADMAG(x)
53 /* This file is compiled more than once, but we only compile the
54 final_link routine once. */
55 extern bfd_boolean ppc_bfd_coff_final_link
56 PARAMS ((bfd *, struct bfd_link_info *));
57 extern void dump_toc PARAMS ((PTR));
59 /* The toc is a set of bfd_vma fields. We use the fact that valid
60 addresses are even (i.e. the bit representing "1" is off) to allow
61 us to encode a little extra information in the field
62 - Unallocated addresses are initialized to 1.
63 - Allocated addresses are even numbers.
64 The first time we actually write a reference to the toc in the bfd,
65 we want to record that fact in a fixup file (if it is asked for), so
66 we keep track of whether or not an address has been written by marking
67 the low order bit with a "1" upon writing. */
69 #define SET_UNALLOCATED(x) ((x) = 1)
70 #define IS_UNALLOCATED(x) ((x) == 1)
72 #define IS_WRITTEN(x) ((x) & 1)
73 #define MARK_AS_WRITTEN(x) ((x) |= 1)
74 #define MAKE_ADDR_AGAIN(x) ((x) &= ~1)
76 /* Turn on this check if you suspect something amiss in the hash tables. */
79 /* Need a 7 char string for an eye catcher. */
82 #define HASH_CHECK_DCL char eye_catcher[8];
83 #define HASH_CHECK_INIT(ret) strcpy(ret->eye_catcher, EYE)
84 #define HASH_CHECK(addr) \
85 if (strcmp(addr->eye_catcher, EYE) != 0) \
88 _("File %s, line %d, Hash check failure, bad eye %8s\n"), \
89 __FILE__, __LINE__, addr->eye_catcher); \
95 #define HASH_CHECK_DCL
96 #define HASH_CHECK_INIT(ret)
97 #define HASH_CHECK(addr)
101 /* In order not to add an int to every hash table item for every coff
102 linker, we define our own hash table, derived from the coff one. */
104 /* PE linker hash table entries. */
106 struct ppc_coff_link_hash_entry
108 struct coff_link_hash_entry root; /* First entry, as required. */
110 /* As we wonder around the relocs, we'll keep the assigned toc_offset
112 bfd_vma toc_offset; /* Our addition, as required. */
114 unsigned long int glue_insn;
119 /* PE linker hash table. */
121 struct ppc_coff_link_hash_table
123 struct coff_link_hash_table root; /* First entry, as required. */
126 static struct bfd_hash_entry *ppc_coff_link_hash_newfunc
127 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *,
129 static struct bfd_link_hash_table *ppc_coff_link_hash_table_create
131 static bfd_boolean coff_ppc_relocate_section
132 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
133 struct internal_reloc *, struct internal_syment *, asection **));
134 static reloc_howto_type *coff_ppc_rtype_to_howto
135 PARAMS ((bfd *, asection *, struct internal_reloc *,
136 struct coff_link_hash_entry *, struct internal_syment *,
139 /* Routine to create an entry in the link hash table. */
141 static struct bfd_hash_entry *
142 ppc_coff_link_hash_newfunc (entry, table, string)
143 struct bfd_hash_entry *entry;
144 struct bfd_hash_table *table;
147 struct ppc_coff_link_hash_entry *ret =
148 (struct ppc_coff_link_hash_entry *) entry;
150 /* Allocate the structure if it has not already been allocated by a
152 if (ret == (struct ppc_coff_link_hash_entry *) NULL)
153 ret = (struct ppc_coff_link_hash_entry *)
154 bfd_hash_allocate (table,
155 sizeof (struct ppc_coff_link_hash_entry));
157 if (ret == (struct ppc_coff_link_hash_entry *) NULL)
160 /* Call the allocation method of the superclass. */
161 ret = ((struct ppc_coff_link_hash_entry *)
162 _bfd_coff_link_hash_newfunc ((struct bfd_hash_entry *) ret,
167 /* Initialize the local fields. */
168 SET_UNALLOCATED (ret->toc_offset);
169 ret->symbol_is_glue = 0;
172 HASH_CHECK_INIT (ret);
175 return (struct bfd_hash_entry *) ret;
178 /* Initialize a PE linker hash table. */
181 ppc_coff_link_hash_table_init (struct ppc_coff_link_hash_table *table,
183 struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *,
184 struct bfd_hash_table *,
186 unsigned int entsize)
188 return _bfd_coff_link_hash_table_init (&table->root, abfd, newfunc, entsize);
191 /* Create a PE linker hash table. */
193 static struct bfd_link_hash_table *
194 ppc_coff_link_hash_table_create (abfd)
197 struct ppc_coff_link_hash_table *ret;
198 bfd_size_type amt = sizeof (struct ppc_coff_link_hash_table);
200 ret = (struct ppc_coff_link_hash_table *) bfd_malloc (amt);
203 if (!ppc_coff_link_hash_table_init (ret, abfd,
204 ppc_coff_link_hash_newfunc,
205 sizeof (struct ppc_coff_link_hash_entry)))
208 return (struct bfd_link_hash_table *) NULL;
210 return &ret->root.root;
213 /* Now, tailor coffcode.h to use our hash stuff. */
215 #define coff_bfd_link_hash_table_create ppc_coff_link_hash_table_create
217 /* The nt loader points the toc register to &toc + 32768, in order to
218 use the complete range of a 16-bit displacement. We have to adjust
219 for this when we fix up loads displaced off the toc reg. */
220 #define TOC_LOAD_ADJUSTMENT (-32768)
221 #define TOC_SECTION_NAME ".private.toc"
223 /* The main body of code is in coffcode.h. */
225 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
227 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
228 from smaller values. Start with zero, widen, *then* decrement. */
229 #define MINUS_ONE (((bfd_vma)0) - 1)
231 /* These should definitely go in a header file somewhere... */
234 #define IMAGE_REL_PPC_ABSOLUTE 0x0000
237 #define IMAGE_REL_PPC_ADDR64 0x0001
240 #define IMAGE_REL_PPC_ADDR32 0x0002
242 /* 26-bit address, shifted left 2 (branch absolute) */
243 #define IMAGE_REL_PPC_ADDR24 0x0003
246 #define IMAGE_REL_PPC_ADDR16 0x0004
248 /* 16-bit address, shifted left 2 (load doubleword) */
249 #define IMAGE_REL_PPC_ADDR14 0x0005
251 /* 26-bit PC-relative offset, shifted left 2 (branch relative) */
252 #define IMAGE_REL_PPC_REL24 0x0006
254 /* 16-bit PC-relative offset, shifted left 2 (br cond relative) */
255 #define IMAGE_REL_PPC_REL14 0x0007
257 /* 16-bit offset from TOC base */
258 #define IMAGE_REL_PPC_TOCREL16 0x0008
260 /* 16-bit offset from TOC base, shifted left 2 (load doubleword) */
261 #define IMAGE_REL_PPC_TOCREL14 0x0009
263 /* 32-bit addr w/o image base */
264 #define IMAGE_REL_PPC_ADDR32NB 0x000A
266 /* va of containing section (as in an image sectionhdr) */
267 #define IMAGE_REL_PPC_SECREL 0x000B
269 /* sectionheader number */
270 #define IMAGE_REL_PPC_SECTION 0x000C
272 /* substitute TOC restore instruction iff symbol is glue code */
273 #define IMAGE_REL_PPC_IFGLUE 0x000D
275 /* symbol is glue code; virtual address is TOC restore instruction */
276 #define IMAGE_REL_PPC_IMGLUE 0x000E
278 /* va of containing section (limited to 16 bits) */
279 #define IMAGE_REL_PPC_SECREL16 0x000F
281 /* Stuff to handle immediate data when the number of bits in the
282 data is greater than the number of bits in the immediate field
283 We need to do (usually) 32 bit arithmetic on 16 bit chunks. */
284 #define IMAGE_REL_PPC_REFHI 0x0010
285 #define IMAGE_REL_PPC_REFLO 0x0011
286 #define IMAGE_REL_PPC_PAIR 0x0012
288 /* This is essentially the same as tocrel16, with TOCDEFN assumed. */
289 #define IMAGE_REL_PPC_TOCREL16_DEFN 0x0013
291 /* Flag bits in IMAGE_RELOCATION.TYPE. */
293 /* Subtract reloc value rather than adding it. */
294 #define IMAGE_REL_PPC_NEG 0x0100
296 /* Fix branch prediction bit to predict branch taken. */
297 #define IMAGE_REL_PPC_BRTAKEN 0x0200
299 /* Fix branch prediction bit to predict branch not taken. */
300 #define IMAGE_REL_PPC_BRNTAKEN 0x0400
302 /* TOC slot defined in file (or, data in toc). */
303 #define IMAGE_REL_PPC_TOCDEFN 0x0800
305 /* Masks to isolate above values in IMAGE_RELOCATION.Type. */
306 #define IMAGE_REL_PPC_TYPEMASK 0x00FF
307 #define IMAGE_REL_PPC_FLAGMASK 0x0F00
309 #define EXTRACT_TYPE(x) ((x) & IMAGE_REL_PPC_TYPEMASK)
310 #define EXTRACT_FLAGS(x) ((x) & IMAGE_REL_PPC_FLAGMASK)
311 #define EXTRACT_JUNK(x) \
312 ((x) & ~(IMAGE_REL_PPC_TYPEMASK | IMAGE_REL_PPC_FLAGMASK))
314 /* Static helper functions to make relocation work. */
315 /* (Work In Progress) */
317 static bfd_reloc_status_type ppc_refhi_reloc PARAMS ((bfd *abfd,
324 static bfd_reloc_status_type ppc_pair_reloc PARAMS ((bfd *abfd,
332 static bfd_reloc_status_type ppc_toc16_reloc PARAMS ((bfd *abfd,
340 static bfd_reloc_status_type ppc_section_reloc PARAMS ((bfd *abfd,
348 static bfd_reloc_status_type ppc_secrel_reloc PARAMS ((bfd *abfd,
356 static bfd_reloc_status_type ppc_imglue_reloc PARAMS ((bfd *abfd,
364 static bfd_boolean in_reloc_p PARAMS((bfd *abfd, reloc_howto_type *howto));
366 /* FIXME: It'll take a while to get through all of these. I only need a few to
367 get us started, so those I'll make sure work. Those marked FIXME are either
368 completely unverified or have a specific unknown marked in the comment. */
370 /* Relocation entries for Windows/NT on PowerPC.
372 From the document "" we find the following listed as used relocs:
375 ADDR[64|32|16] : fields that hold addresses in data fields or the
376 16 bit displacement field on a load/store.
377 ADDR[24|14] : fields that hold addresses in branch and cond
378 branches. These represent [26|16] bit addresses.
379 The low order 2 bits are preserved.
380 REL[24|14] : branches relative to the Instruction Address
381 register. These represent [26|16] bit addresses,
382 as before. The instruction field will be zero, and
383 the address of the SYM will be inserted at link time.
384 TOCREL16 : 16 bit displacement field referring to a slot in
386 TOCREL14 : 16 bit displacement field, similar to REL14 or ADDR14.
387 ADDR32NB : 32 bit address relative to the virtual origin.
388 (On the alpha, this is always a linker generated thunk)
389 (i.e. 32bit addr relative to the image base)
390 SECREL : The value is relative to the start of the section
391 containing the symbol.
392 SECTION : access to the header containing the item. Supports the
395 In particular, note that the document does not indicate that the
396 relocations listed in the header file are used. */
399 static reloc_howto_type ppc_coff_howto_table[] =
401 /* IMAGE_REL_PPC_ABSOLUTE 0x0000 NOP */
403 HOWTO (IMAGE_REL_PPC_ABSOLUTE, /* type */
405 0, /* size (0 = byte, 1 = short, 2 = long) */
407 FALSE, /* pc_relative */
409 complain_overflow_dont, /* dont complain_on_overflow */
410 0, /* special_function */
411 "ABSOLUTE", /* name */
412 FALSE, /* partial_inplace */
415 FALSE), /* pcrel_offset */
417 /* IMAGE_REL_PPC_ADDR64 0x0001 64-bit address */
419 HOWTO(IMAGE_REL_PPC_ADDR64, /* type */
421 3, /* size (0 = byte, 1 = short, 2 = long) */
423 FALSE, /* pc_relative */
425 complain_overflow_bitfield, /* complain_on_overflow */
426 0, /* special_function */
428 TRUE, /* partial_inplace */
429 MINUS_ONE, /* src_mask */
430 MINUS_ONE, /* dst_mask */
431 FALSE), /* pcrel_offset */
433 /* IMAGE_REL_PPC_ADDR32 0x0002 32-bit address */
435 HOWTO (IMAGE_REL_PPC_ADDR32, /* type */
437 2, /* size (0 = byte, 1 = short, 2 = long) */
439 FALSE, /* pc_relative */
441 complain_overflow_bitfield, /* complain_on_overflow */
442 0, /* special_function */
444 TRUE, /* partial_inplace */
445 0xffffffff, /* src_mask */
446 0xffffffff, /* dst_mask */
447 FALSE), /* pcrel_offset */
449 /* IMAGE_REL_PPC_ADDR24 0x0003 26-bit address, shifted left 2 (branch absolute) */
450 /* the LI field is in bit 6 through bit 29 is 24 bits, + 2 for the shift */
451 /* Of course, That's the IBM approved bit numbering, which is not what */
452 /* anyone else uses.... The li field is in bit 2 thru 25 */
454 HOWTO (IMAGE_REL_PPC_ADDR24, /* type */
456 2, /* size (0 = byte, 1 = short, 2 = long) */
458 FALSE, /* pc_relative */
460 complain_overflow_bitfield, /* complain_on_overflow */
461 0, /* special_function */
463 TRUE, /* partial_inplace */
464 0x07fffffc, /* src_mask */
465 0x07fffffc, /* dst_mask */
466 FALSE), /* pcrel_offset */
468 /* IMAGE_REL_PPC_ADDR16 0x0004 16-bit address */
470 HOWTO (IMAGE_REL_PPC_ADDR16, /* type */
472 1, /* size (0 = byte, 1 = short, 2 = long) */
474 FALSE, /* pc_relative */
476 complain_overflow_signed, /* complain_on_overflow */
477 0, /* special_function */
479 TRUE, /* partial_inplace */
480 0xffff, /* src_mask */
481 0xffff, /* dst_mask */
482 FALSE), /* pcrel_offset */
484 /* IMAGE_REL_PPC_ADDR14 0x0005 */
485 /* 16-bit address, shifted left 2 (load doubleword) */
486 /* FIXME: the mask is likely wrong, and the bit position may be as well */
488 HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
490 1, /* size (0 = byte, 1 = short, 2 = long) */
492 FALSE, /* pc_relative */
494 complain_overflow_signed, /* complain_on_overflow */
495 0, /* special_function */
497 TRUE, /* partial_inplace */
498 0xffff, /* src_mask */
499 0xffff, /* dst_mask */
500 FALSE), /* pcrel_offset */
502 /* IMAGE_REL_PPC_REL24 0x0006 */
503 /* 26-bit PC-relative offset, shifted left 2 (branch relative) */
505 HOWTO (IMAGE_REL_PPC_REL24, /* type */
507 2, /* size (0 = byte, 1 = short, 2 = long) */
509 TRUE, /* pc_relative */
511 complain_overflow_signed, /* complain_on_overflow */
512 0, /* special_function */
514 TRUE, /* partial_inplace */
515 0x3fffffc, /* src_mask */
516 0x3fffffc, /* dst_mask */
517 FALSE), /* pcrel_offset */
519 /* IMAGE_REL_PPC_REL14 0x0007 */
520 /* 16-bit PC-relative offset, shifted left 2 (br cond relative) */
521 /* FIXME: the mask is likely wrong, and the bit position may be as well */
522 /* FIXME: how does it know how far to shift? */
524 HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
526 1, /* size (0 = byte, 1 = short, 2 = long) */
528 FALSE, /* pc_relative */
530 complain_overflow_signed, /* complain_on_overflow */
531 0, /* special_function */
533 TRUE, /* partial_inplace */
534 0xffff, /* src_mask */
535 0xffff, /* dst_mask */
536 TRUE), /* pcrel_offset */
538 /* IMAGE_REL_PPC_TOCREL16 0x0008 */
539 /* 16-bit offset from TOC base */
541 HOWTO (IMAGE_REL_PPC_TOCREL16,/* type */
543 1, /* size (0 = byte, 1 = short, 2 = long) */
545 FALSE, /* pc_relative */
547 complain_overflow_dont, /* complain_on_overflow */
548 ppc_toc16_reloc, /* special_function */
549 "TOCREL16", /* name */
550 FALSE, /* partial_inplace */
551 0xffff, /* src_mask */
552 0xffff, /* dst_mask */
553 FALSE), /* pcrel_offset */
555 /* IMAGE_REL_PPC_TOCREL14 0x0009 */
556 /* 16-bit offset from TOC base, shifted left 2 (load doubleword) */
558 HOWTO (IMAGE_REL_PPC_TOCREL14,/* type */
560 1, /* size (0 = byte, 1 = short, 2 = long) */
562 FALSE, /* pc_relative */
564 complain_overflow_signed, /* complain_on_overflow */
565 0, /* special_function */
566 "TOCREL14", /* name */
567 FALSE, /* partial_inplace */
568 0xffff, /* src_mask */
569 0xffff, /* dst_mask */
570 FALSE), /* pcrel_offset */
572 /* IMAGE_REL_PPC_ADDR32NB 0x000A */
573 /* 32-bit addr w/ image base */
575 HOWTO (IMAGE_REL_PPC_ADDR32NB,/* type */
577 2, /* size (0 = byte, 1 = short, 2 = long) */
579 FALSE, /* pc_relative */
581 complain_overflow_signed, /* complain_on_overflow */
582 0, /* special_function */
583 "ADDR32NB", /* name */
584 TRUE, /* partial_inplace */
585 0xffffffff, /* src_mask */
586 0xffffffff, /* dst_mask */
587 FALSE), /* pcrel_offset */
589 /* IMAGE_REL_PPC_SECREL 0x000B */
590 /* va of containing section (as in an image sectionhdr) */
592 HOWTO (IMAGE_REL_PPC_SECREL,/* type */
594 2, /* size (0 = byte, 1 = short, 2 = long) */
596 FALSE, /* pc_relative */
598 complain_overflow_signed, /* complain_on_overflow */
599 ppc_secrel_reloc, /* special_function */
601 TRUE, /* partial_inplace */
602 0xffffffff, /* src_mask */
603 0xffffffff, /* dst_mask */
604 TRUE), /* pcrel_offset */
606 /* IMAGE_REL_PPC_SECTION 0x000C */
607 /* sectionheader number */
609 HOWTO (IMAGE_REL_PPC_SECTION,/* type */
611 2, /* size (0 = byte, 1 = short, 2 = long) */
613 FALSE, /* pc_relative */
615 complain_overflow_signed, /* complain_on_overflow */
616 ppc_section_reloc, /* special_function */
617 "SECTION", /* name */
618 TRUE, /* partial_inplace */
619 0xffffffff, /* src_mask */
620 0xffffffff, /* dst_mask */
621 TRUE), /* pcrel_offset */
623 /* IMAGE_REL_PPC_IFGLUE 0x000D */
624 /* substitute TOC restore instruction iff symbol is glue code */
626 HOWTO (IMAGE_REL_PPC_IFGLUE,/* type */
628 2, /* size (0 = byte, 1 = short, 2 = long) */
630 FALSE, /* pc_relative */
632 complain_overflow_signed, /* complain_on_overflow */
633 0, /* special_function */
635 TRUE, /* partial_inplace */
636 0xffffffff, /* src_mask */
637 0xffffffff, /* dst_mask */
638 FALSE), /* pcrel_offset */
640 /* IMAGE_REL_PPC_IMGLUE 0x000E */
641 /* symbol is glue code; virtual address is TOC restore instruction */
643 HOWTO (IMAGE_REL_PPC_IMGLUE,/* type */
645 2, /* size (0 = byte, 1 = short, 2 = long) */
647 FALSE, /* pc_relative */
649 complain_overflow_dont, /* complain_on_overflow */
650 ppc_imglue_reloc, /* special_function */
652 FALSE, /* partial_inplace */
653 0xffffffff, /* src_mask */
654 0xffffffff, /* dst_mask */
655 FALSE), /* pcrel_offset */
657 /* IMAGE_REL_PPC_SECREL16 0x000F */
658 /* va of containing section (limited to 16 bits) */
660 HOWTO (IMAGE_REL_PPC_SECREL16,/* type */
662 1, /* size (0 = byte, 1 = short, 2 = long) */
664 FALSE, /* pc_relative */
666 complain_overflow_signed, /* complain_on_overflow */
667 0, /* special_function */
668 "SECREL16", /* name */
669 TRUE, /* partial_inplace */
670 0xffff, /* src_mask */
671 0xffff, /* dst_mask */
672 TRUE), /* pcrel_offset */
674 /* IMAGE_REL_PPC_REFHI 0x0010 */
676 HOWTO (IMAGE_REL_PPC_REFHI, /* type */
678 1, /* size (0 = byte, 1 = short, 2 = long) */
680 FALSE, /* pc_relative */
682 complain_overflow_signed, /* complain_on_overflow */
683 ppc_refhi_reloc, /* special_function */
685 TRUE, /* partial_inplace */
686 0xffffffff, /* src_mask */
687 0xffffffff, /* dst_mask */
688 FALSE), /* pcrel_offset */
690 /* IMAGE_REL_PPC_REFLO 0x0011 */
692 HOWTO (IMAGE_REL_PPC_REFLO, /* type */
694 1, /* size (0 = byte, 1 = short, 2 = long) */
696 FALSE, /* pc_relative */
698 complain_overflow_signed, /* complain_on_overflow */
699 ppc_refhi_reloc, /* special_function */
701 TRUE, /* partial_inplace */
702 0xffffffff, /* src_mask */
703 0xffffffff, /* dst_mask */
704 FALSE), /* pcrel_offset */
706 /* IMAGE_REL_PPC_PAIR 0x0012 */
708 HOWTO (IMAGE_REL_PPC_PAIR, /* type */
710 1, /* size (0 = byte, 1 = short, 2 = long) */
712 FALSE, /* pc_relative */
714 complain_overflow_signed, /* complain_on_overflow */
715 ppc_pair_reloc, /* special_function */
717 TRUE, /* partial_inplace */
718 0xffffffff, /* src_mask */
719 0xffffffff, /* dst_mask */
720 FALSE), /* pcrel_offset */
722 /* IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 */
723 /* 16-bit offset from TOC base, without causing a definition */
725 HOWTO ( (IMAGE_REL_PPC_TOCREL16 | IMAGE_REL_PPC_TOCDEFN), /* type */
727 1, /* size (0 = byte, 1 = short, 2 = long) */
729 FALSE, /* pc_relative */
731 complain_overflow_dont, /* complain_on_overflow */
732 0, /* special_function */
733 "TOCREL16, TOCDEFN", /* name */
734 FALSE, /* partial_inplace */
735 0xffff, /* src_mask */
736 0xffff, /* dst_mask */
737 FALSE), /* pcrel_offset */
741 /* Some really cheezy macros that can be turned on to test stderr :-) */
750 fprintf (stderr,_("Unimplemented Relocation -- %s\n"),x); \
754 #define DUMP_RELOC(n,r) \
756 fprintf (stderr,"%s sym %d, addr %d, addend %d\n", \
757 n, (*(r->sym_ptr_ptr))->name, \
758 r->address, r->addend); \
761 /* Given a reloc name, n, and a pointer to an internal_reloc,
762 dump out interesting information on the contents
764 #define n_name _n._n_name
765 #define n_zeroes _n._n_n._n_zeroes
766 #define n_offset _n._n_n._n_offset */
768 #define DUMP_RELOC2(n,r) \
770 fprintf (stderr,"%s sym %d, r_vaddr %d %s\n", \
771 n, r->r_symndx, r->r_vaddr, \
772 (((r->r_type) & IMAGE_REL_PPC_TOCDEFN) == 0) \
778 #define DUMP_RELOC(n,r)
779 #define DUMP_RELOC2(n,r)
782 /* TOC construction and management routines. */
784 /* This file is compiled twice, and these variables are defined in one
785 of the compilations. FIXME: This is confusing and weird. Also,
786 BFD should not use global variables. */
787 extern bfd * bfd_of_toc_owner;
788 extern long int global_toc_size;
789 extern long int import_table_size;
790 extern long int first_thunk_address;
791 extern long int thunk_size;
809 struct list_ele *next;
811 enum ref_category cat;
816 extern struct list_ele *head;
817 extern struct list_ele *tail;
819 static void record_toc
820 PARAMS ((asection *, bfd_signed_vma, enum ref_category, const char *));
823 record_toc (toc_section, our_toc_offset, cat, name)
824 asection *toc_section;
825 bfd_signed_vma our_toc_offset;
826 enum ref_category cat;
829 /* Add this entry to our toc addr-offset-name list. */
830 bfd_size_type amt = sizeof (struct list_ele);
831 struct list_ele *t = (struct list_ele *) bfd_malloc (amt);
836 t->offset = our_toc_offset;
839 t->addr = toc_section->output_offset + our_toc_offset;
853 #ifdef COFF_IMAGE_WITH_PE
855 static bfd_boolean ppc_record_toc_entry
856 PARAMS ((bfd *, struct bfd_link_info *, asection *, int, enum toc_type));
857 static void ppc_mark_symbol_as_glue
858 PARAMS ((bfd *, int, struct internal_reloc *));
860 /* Record a toc offset against a symbol. */
862 ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
864 struct bfd_link_info *info ATTRIBUTE_UNUSED;
865 asection *sec ATTRIBUTE_UNUSED;
867 enum toc_type toc_kind ATTRIBUTE_UNUSED;
869 struct ppc_coff_link_hash_entry *h;
876 h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
884 local_syms = obj_coff_local_toc_table(abfd);
891 /* allocate a table */
892 amt = (bfd_size_type) obj_raw_syment_count (abfd) * sizeof (int);
893 local_syms = (int *) bfd_zalloc (abfd, amt);
896 obj_coff_local_toc_table (abfd) = local_syms;
898 for (i = 0; i < obj_raw_syment_count (abfd); ++i)
900 SET_UNALLOCATED (local_syms[i]);
904 if (IS_UNALLOCATED(local_syms[sym]))
906 local_syms[sym] = global_toc_size;
907 global_toc_size += 4;
909 /* The size must fit in a 16-bit displacement. */
910 if (global_toc_size > 65535)
912 (*_bfd_error_handler) (_("TOC overflow"));
913 bfd_set_error (bfd_error_file_too_big);
920 name = h->root.root.root.string;
922 /* Check to see if there's a toc slot allocated. If not, do it
923 here. It will be used in relocate_section. */
924 if (IS_UNALLOCATED(h->toc_offset))
926 h->toc_offset = global_toc_size;
927 global_toc_size += 4;
929 /* The size must fit in a 16-bit displacement. */
930 if (global_toc_size >= 65535)
932 (*_bfd_error_handler) (_("TOC overflow"));
933 bfd_set_error (bfd_error_file_too_big);
942 /* Record a toc offset against a symbol. */
944 ppc_mark_symbol_as_glue(abfd, sym, rel)
947 struct internal_reloc *rel;
949 struct ppc_coff_link_hash_entry *h;
951 h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
955 h->symbol_is_glue = 1;
956 h->glue_insn = bfd_get_32 (abfd, (bfd_byte *) &rel->r_vaddr);
961 #endif /* COFF_IMAGE_WITH_PE */
963 /* Return TRUE if this relocation should
964 appear in the output .reloc section. */
966 static bfd_boolean in_reloc_p(abfd, howto)
967 bfd * abfd ATTRIBUTE_UNUSED;
968 reloc_howto_type *howto;
971 (! howto->pc_relative)
972 && (howto->type != IMAGE_REL_PPC_ADDR32NB)
973 && (howto->type != IMAGE_REL_PPC_TOCREL16)
974 && (howto->type != IMAGE_REL_PPC_IMGLUE)
975 && (howto->type != IMAGE_REL_PPC_IFGLUE)
976 && (howto->type != IMAGE_REL_PPC_SECREL)
977 && (howto->type != IMAGE_REL_PPC_SECTION)
978 && (howto->type != IMAGE_REL_PPC_SECREL16)
979 && (howto->type != IMAGE_REL_PPC_REFHI)
980 && (howto->type != IMAGE_REL_PPC_REFLO)
981 && (howto->type != IMAGE_REL_PPC_PAIR)
982 && (howto->type != IMAGE_REL_PPC_TOCREL16_DEFN) ;
986 write_base_file_entry (bfd *obfd, struct bfd_link_info *info, bfd_vma addr)
988 if (coff_data (obfd)->pe)
989 addr -= pe_data (obfd)->pe_opthdr.ImageBase;
990 if (fwrite (&addr, sizeof (addr), 1, (FILE *) info->base_file) == 1)
993 bfd_set_error (bfd_error_system_call);
997 /* The reloc processing routine for the optimized COFF linker. */
1000 coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
1001 contents, relocs, syms, sections)
1003 struct bfd_link_info *info;
1005 asection *input_section;
1007 struct internal_reloc *relocs;
1008 struct internal_syment *syms;
1009 asection **sections;
1011 struct internal_reloc *rel;
1012 struct internal_reloc *relend;
1015 asection *toc_section = 0;
1017 reloc_howto_type *howto = 0;
1019 /* If we are performing a relocatable link, we don't need to do a
1020 thing. The caller will take care of adjusting the reloc
1021 addresses and symbol indices. */
1022 if (info->relocatable)
1029 relend = rel + input_section->reloc_count;
1030 for (; rel < relend; rel++)
1033 struct ppc_coff_link_hash_entry *h;
1034 struct internal_syment *sym;
1038 bfd_reloc_status_type rstat;
1041 unsigned short r_type = EXTRACT_TYPE (rel->r_type);
1042 unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
1044 symndx = rel->r_symndx;
1045 loc = contents + rel->r_vaddr - input_section->vma;
1047 /* FIXME: check bounds on r_type */
1048 howto = ppc_coff_howto_table + r_type;
1057 h = (struct ppc_coff_link_hash_entry *)
1058 (obj_coff_sym_hashes (input_bfd)[symndx]);
1064 sym = syms + symndx;
1067 if (r_type == IMAGE_REL_PPC_IMGLUE && h == 0)
1069 /* An IMGLUE reloc must have a name. Something is very wrong. */
1076 /* FIXME: PAIR unsupported in the following code. */
1080 sec = bfd_abs_section_ptr;
1083 sec = sections[symndx];
1084 val = (sec->output_section->vma
1085 + sec->output_offset
1087 if (! obj_pe (output_bfd))
1095 if (h->root.root.type == bfd_link_hash_defined
1096 || h->root.root.type == bfd_link_hash_defweak)
1098 sec = h->root.root.u.def.section;
1099 val = (h->root.root.u.def.value
1100 + sec->output_section->vma
1101 + sec->output_offset);
1105 if (! ((*info->callbacks->undefined_symbol)
1106 (info, h->root.root.root.string, input_bfd, input_section,
1107 rel->r_vaddr - input_section->vma, TRUE)))
1112 rstat = bfd_reloc_ok;
1114 /* Each case must do its own relocation, setting rstat appropriately. */
1118 (*_bfd_error_handler)
1119 (_("%B: unsupported relocation type 0x%02x"), input_bfd, r_type);
1120 bfd_set_error (bfd_error_bad_value);
1122 case IMAGE_REL_PPC_TOCREL16:
1124 bfd_signed_vma our_toc_offset;
1127 DUMP_RELOC2(howto->name, rel);
1129 if (toc_section == 0)
1131 toc_section = bfd_get_section_by_name (bfd_of_toc_owner,
1134 if ( toc_section == NULL )
1136 /* There is no toc section. Something is very wrong. */
1141 /* Amazing bit tricks present. As we may have seen earlier, we
1142 use the 1 bit to tell us whether or not a toc offset has been
1143 allocated. Now that they've all been allocated, we will use
1144 the 1 bit to tell us if we've written this particular toc
1149 /* It is a file local symbol. */
1150 int *local_toc_table;
1153 sym = syms + symndx;
1154 name = sym->_n._n_name;
1156 local_toc_table = obj_coff_local_toc_table(input_bfd);
1157 our_toc_offset = local_toc_table[symndx];
1159 if (IS_WRITTEN(our_toc_offset))
1161 /* If it has been written out, it is marked with the
1162 1 bit. Fix up our offset, but do not write it out
1164 MAKE_ADDR_AGAIN(our_toc_offset);
1168 /* Write out the toc entry. */
1169 record_toc (toc_section, our_toc_offset, priv,
1172 bfd_put_32 (output_bfd, val,
1173 toc_section->contents + our_toc_offset);
1175 MARK_AS_WRITTEN(local_toc_table[symndx]);
1181 const char *name = h->root.root.root.string;
1182 our_toc_offset = h->toc_offset;
1184 if ((r_flags & IMAGE_REL_PPC_TOCDEFN)
1185 == IMAGE_REL_PPC_TOCDEFN )
1187 /* This is unbelievable cheese. Some knowledgable asm
1188 hacker has decided to use r2 as a base for loading
1189 a value. He/She does this by setting the tocdefn bit,
1190 and not supplying a toc definition. The behaviour is
1191 then to use the difference between the value of the
1192 symbol and the actual location of the toc as the toc
1195 In fact, what is usually happening is, because the
1196 Import Address Table is mapped immediately following
1197 the toc, some trippy library code trying for speed on
1198 dll linkage, takes advantage of that and considers
1199 the IAT to be part of the toc, thus saving a load. */
1201 our_toc_offset = val - (toc_section->output_section->vma
1202 + toc_section->output_offset);
1204 /* The size must still fit in a 16-bit displacement. */
1205 if ((bfd_vma) our_toc_offset >= 65535)
1207 (*_bfd_error_handler)
1208 (_("%B: Relocation for %s of %lx exceeds Toc size limit"),
1210 (unsigned long) our_toc_offset);
1211 bfd_set_error (bfd_error_bad_value);
1215 record_toc (toc_section, our_toc_offset, pub,
1218 else if (IS_WRITTEN (our_toc_offset))
1220 /* If it has been written out, it is marked with the
1221 1 bit. Fix up our offset, but do not write it out
1223 MAKE_ADDR_AGAIN(our_toc_offset);
1227 record_toc(toc_section, our_toc_offset, pub,
1230 /* Write out the toc entry. */
1231 bfd_put_32 (output_bfd, val,
1232 toc_section->contents + our_toc_offset);
1234 MARK_AS_WRITTEN(h->toc_offset);
1235 /* The tricky part is that this is the address that
1236 needs a .reloc entry for it. */
1241 if (fixit && info->base_file)
1243 /* So if this is non pcrelative, and is referenced
1244 to a section or a common symbol, then it needs a reloc. */
1246 /* Relocation to a symbol in a section which
1247 isn't absolute - we output the address here
1249 bfd_vma addr = (toc_section->output_section->vma
1250 + toc_section->output_offset + our_toc_offset);
1252 if (!write_base_file_entry (output_bfd, info, addr))
1256 /* FIXME: this test is conservative. */
1257 if ((r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN
1258 && (bfd_vma) our_toc_offset > toc_section->size)
1260 (*_bfd_error_handler)
1261 (_("%B: Relocation exceeds allocated TOC (%lx)"),
1262 input_bfd, (unsigned long) toc_section->size);
1263 bfd_set_error (bfd_error_bad_value);
1267 /* Now we know the relocation for this toc reference. */
1268 relocation = our_toc_offset + TOC_LOAD_ADJUSTMENT;
1269 rstat = _bfd_relocate_contents (howto, input_bfd, relocation, loc);
1272 case IMAGE_REL_PPC_IFGLUE:
1274 /* To solve this, we need to know whether or not the symbol
1275 appearing on the call instruction is a glue function or not.
1276 A glue function must announce itself via a IMGLUE reloc, and
1277 the reloc contains the required toc restore instruction. */
1279 const char *my_name;
1281 DUMP_RELOC2 (howto->name, rel);
1285 my_name = h->root.root.root.string;
1286 if (h->symbol_is_glue == 1)
1288 x = bfd_get_32 (input_bfd, loc);
1289 bfd_put_32 (input_bfd, (bfd_vma) h->glue_insn, loc);
1294 case IMAGE_REL_PPC_SECREL:
1295 /* Unimplemented: codeview debugging information. */
1296 /* For fast access to the header of the section
1297 containing the item. */
1299 case IMAGE_REL_PPC_SECTION:
1300 /* Unimplemented: codeview debugging information. */
1301 /* Is used to indicate that the value should be relative
1302 to the beginning of the section that contains the
1305 case IMAGE_REL_PPC_ABSOLUTE:
1307 const char *my_name;
1310 my_name = (syms+symndx)->_n._n_name;
1312 my_name = h->root.root.root.string;
1314 (*_bfd_error_handler)
1315 (_("Warning: unsupported reloc %s <file %B, section %A>\n"
1316 "sym %ld (%s), r_vaddr %ld (%lx)"),
1317 input_bfd, input_section, howto->name,
1318 rel->r_symndx, my_name, (long) rel->r_vaddr,
1319 (unsigned long) rel->r_vaddr);
1322 case IMAGE_REL_PPC_IMGLUE:
1324 /* There is nothing to do now. This reloc was noted in the first
1325 pass over the relocs, and the glue instruction extracted. */
1326 const char *my_name;
1328 if (h->symbol_is_glue == 1)
1330 my_name = h->root.root.root.string;
1332 (*_bfd_error_handler)
1333 (_("%B: Out of order IMGLUE reloc for %s"), input_bfd, my_name);
1334 bfd_set_error (bfd_error_bad_value);
1338 case IMAGE_REL_PPC_ADDR32NB:
1340 const char *name = 0;
1342 DUMP_RELOC2 (howto->name, rel);
1344 if (CONST_STRNEQ (input_section->name, ".idata$2") && first_thunk_address == 0)
1346 /* Set magic values. */
1348 struct coff_link_hash_entry *myh;
1350 myh = coff_link_hash_lookup (coff_hash_table (info),
1352 FALSE, FALSE, TRUE);
1353 first_thunk_address = myh->root.u.def.value +
1354 sec->output_section->vma +
1355 sec->output_offset -
1356 pe_data(output_bfd)->pe_opthdr.ImageBase;
1358 idata5offset = myh->root.u.def.value;
1359 myh = coff_link_hash_lookup (coff_hash_table (info),
1361 FALSE, FALSE, TRUE);
1363 thunk_size = myh->root.u.def.value - idata5offset;
1364 myh = coff_link_hash_lookup (coff_hash_table (info),
1366 FALSE, FALSE, TRUE);
1367 import_table_size = myh->root.u.def.value;
1372 /* It is a file local symbol. */
1373 sym = syms + symndx;
1374 name = sym->_n._n_name;
1380 name = h->root.root.root.string;
1381 if (strcmp (".idata$2", name) == 0)
1382 target = "__idata2_magic__";
1383 else if (strcmp (".idata$4", name) == 0)
1384 target = "__idata4_magic__";
1385 else if (strcmp (".idata$5", name) == 0)
1386 target = "__idata5_magic__";
1390 struct coff_link_hash_entry *myh;
1392 myh = coff_link_hash_lookup (coff_hash_table (info),
1394 FALSE, FALSE, TRUE);
1397 /* Missing magic cookies. Something is very wrong. */
1401 val = myh->root.u.def.value +
1402 sec->output_section->vma + sec->output_offset;
1403 if (first_thunk_address == 0)
1406 myh = coff_link_hash_lookup (coff_hash_table (info),
1408 FALSE, FALSE, TRUE);
1409 first_thunk_address = myh->root.u.def.value +
1410 sec->output_section->vma +
1411 sec->output_offset -
1412 pe_data(output_bfd)->pe_opthdr.ImageBase;
1414 idata5offset = myh->root.u.def.value;
1415 myh = coff_link_hash_lookup (coff_hash_table (info),
1417 FALSE, FALSE, TRUE);
1419 thunk_size = myh->root.u.def.value - idata5offset;
1420 myh = coff_link_hash_lookup (coff_hash_table (info),
1422 FALSE, FALSE, TRUE);
1423 import_table_size = myh->root.u.def.value;
1428 rstat = _bfd_relocate_contents (howto,
1431 pe_data (output_bfd)->pe_opthdr.ImageBase,
1436 case IMAGE_REL_PPC_REL24:
1437 DUMP_RELOC2(howto->name, rel);
1438 val -= (input_section->output_section->vma
1439 + input_section->output_offset);
1441 rstat = _bfd_relocate_contents (howto,
1446 case IMAGE_REL_PPC_ADDR16:
1447 case IMAGE_REL_PPC_ADDR24:
1448 case IMAGE_REL_PPC_ADDR32:
1449 DUMP_RELOC2(howto->name, rel);
1450 rstat = _bfd_relocate_contents (howto,
1457 if (info->base_file)
1459 /* So if this is non pcrelative, and is referenced
1460 to a section or a common symbol, then it needs a reloc. */
1461 if (sym && pe_data(output_bfd)->in_reloc_p (output_bfd, howto))
1463 /* Relocation to a symbol in a section which
1464 isn't absolute - we output the address here
1466 bfd_vma addr = (rel->r_vaddr
1467 - input_section->vma
1468 + input_section->output_offset
1469 + input_section->output_section->vma);
1471 if (!write_base_file_entry (output_bfd, info, addr))
1482 case bfd_reloc_overflow:
1485 char buf[SYMNMLEN + 1];
1491 else if (sym == NULL)
1493 else if (sym->_n._n_n._n_zeroes == 0
1494 && sym->_n._n_n._n_offset != 0)
1495 name = obj_coff_strings (input_bfd) + sym->_n._n_n._n_offset;
1498 strncpy (buf, sym->_n._n_name, SYMNMLEN);
1499 buf[SYMNMLEN] = '\0';
1503 if (! ((*info->callbacks->reloc_overflow)
1504 (info, (h ? &h->root.root : NULL), name, howto->name,
1505 (bfd_vma) 0, input_bfd,
1506 input_section, rel->r_vaddr - input_section->vma)))
1515 #ifdef COFF_IMAGE_WITH_PE
1517 /* FIXME: BFD should not use global variables. This file is compiled
1518 twice, and these variables are shared. This is confusing and
1521 long int global_toc_size = 4;
1523 bfd* bfd_of_toc_owner = 0;
1525 long int import_table_size;
1526 long int first_thunk_address;
1527 long int thunk_size;
1529 struct list_ele *head;
1530 struct list_ele *tail;
1533 h1 = N_("\n\t\t\tTOC MAPPING\n\n");
1535 h2 = N_(" TOC disassembly Comments Name\n");
1537 h3 = N_(" Offset spelling (if present)\n");
1543 FILE *file = (FILE *) vfile;
1546 fprintf (file, _(h1));
1547 fprintf (file, _(h2));
1548 fprintf (file, _(h3));
1550 for (t = head; t != 0; t=t->next)
1552 const char *cat = "";
1555 cat = _("private ");
1556 else if (t->cat == pub)
1558 else if (t->cat == tocdata)
1559 cat = _("data-in-toc ");
1561 if (t->offset > global_toc_size)
1563 if (t->offset <= global_toc_size + thunk_size)
1564 cat = _("IAT reference ");
1568 _("**** global_toc_size %ld(%lx), thunk_size %ld(%lx)\n"),
1569 global_toc_size, global_toc_size,
1570 thunk_size, thunk_size);
1571 cat = _("Out of bounds!");
1576 " %04lx (%d)", (unsigned long) t->offset, t->offset - 32768);
1583 fprintf (file, "\n");
1587 ppc_allocate_toc_section (info)
1588 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1593 static char test_char = '1';
1595 if ( global_toc_size == 0 ) /* FIXME: does this get me in trouble? */
1598 if (bfd_of_toc_owner == 0)
1599 /* No toc owner? Something is very wrong. */
1602 s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME);
1604 /* No toc section? Something is very wrong. */
1607 amt = global_toc_size;
1608 foo = (bfd_byte *) bfd_alloc (bfd_of_toc_owner, amt);
1609 memset(foo, test_char, (size_t) global_toc_size);
1611 s->size = global_toc_size;
1618 ppc_process_before_allocation (abfd, info)
1620 struct bfd_link_info *info;
1623 struct internal_reloc *i, *rel;
1625 /* Here we have a bfd that is to be included on the link. We have a hook
1626 to do reloc rummaging, before section sizes are nailed down. */
1627 _bfd_coff_get_external_symbols (abfd);
1629 /* Rummage around all the relocs and map the toc. */
1630 sec = abfd->sections;
1635 for (; sec != 0; sec = sec->next)
1637 if (sec->reloc_count == 0)
1640 /* load the relocs */
1641 /* FIXME: there may be a storage leak here */
1642 i=_bfd_coff_read_internal_relocs(abfd,sec,1,0,0,0);
1647 for (rel = i; rel < i + sec->reloc_count; ++rel)
1649 unsigned short r_type = EXTRACT_TYPE (rel->r_type);
1650 unsigned short r_flags = EXTRACT_FLAGS (rel->r_type);
1651 bfd_boolean ok = TRUE;
1653 DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, rel);
1657 case IMAGE_REL_PPC_TOCREL16:
1658 /* If TOCDEFN is on, ignore as someone else has allocated the
1660 if ((r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN)
1661 ok = ppc_record_toc_entry(abfd, info, sec,
1662 rel->r_symndx, default_toc);
1666 case IMAGE_REL_PPC_IMGLUE:
1667 ppc_mark_symbol_as_glue (abfd, rel->r_symndx, rel);
1680 static bfd_reloc_status_type
1681 ppc_refhi_reloc (abfd, reloc_entry, symbol, data,
1682 input_section, output_bfd, error_message)
1683 bfd *abfd ATTRIBUTE_UNUSED;
1684 arelent *reloc_entry ATTRIBUTE_UNUSED;
1685 asymbol *symbol ATTRIBUTE_UNUSED;
1686 PTR data ATTRIBUTE_UNUSED;
1687 asection *input_section ATTRIBUTE_UNUSED;
1689 char **error_message ATTRIBUTE_UNUSED;
1692 DUMP_RELOC("REFHI",reloc_entry);
1694 if (output_bfd == (bfd *) NULL)
1695 return bfd_reloc_continue;
1697 return bfd_reloc_undefined;
1700 static bfd_reloc_status_type
1701 ppc_pair_reloc (abfd, reloc_entry, symbol, data,
1702 input_section, output_bfd, error_message)
1703 bfd *abfd ATTRIBUTE_UNUSED;
1704 arelent *reloc_entry ATTRIBUTE_UNUSED;
1705 asymbol *symbol ATTRIBUTE_UNUSED;
1706 PTR data ATTRIBUTE_UNUSED;
1707 asection *input_section ATTRIBUTE_UNUSED;
1709 char **error_message ATTRIBUTE_UNUSED;
1712 DUMP_RELOC("PAIR",reloc_entry);
1714 if (output_bfd == (bfd *) NULL)
1715 return bfd_reloc_continue;
1717 return bfd_reloc_undefined;
1720 static bfd_reloc_status_type
1721 ppc_toc16_reloc (abfd, reloc_entry, symbol, data,
1722 input_section, output_bfd, error_message)
1723 bfd *abfd ATTRIBUTE_UNUSED;
1724 arelent *reloc_entry ATTRIBUTE_UNUSED;
1725 asymbol *symbol ATTRIBUTE_UNUSED;
1726 PTR data ATTRIBUTE_UNUSED;
1727 asection *input_section ATTRIBUTE_UNUSED;
1729 char **error_message ATTRIBUTE_UNUSED;
1731 UN_IMPL ("TOCREL16");
1732 DUMP_RELOC ("TOCREL16",reloc_entry);
1734 if (output_bfd == (bfd *) NULL)
1735 return bfd_reloc_continue;
1737 return bfd_reloc_ok;
1740 static bfd_reloc_status_type
1741 ppc_secrel_reloc (abfd, reloc_entry, symbol, data,
1742 input_section, output_bfd, error_message)
1743 bfd *abfd ATTRIBUTE_UNUSED;
1744 arelent *reloc_entry ATTRIBUTE_UNUSED;
1745 asymbol *symbol ATTRIBUTE_UNUSED;
1746 PTR data ATTRIBUTE_UNUSED;
1747 asection *input_section ATTRIBUTE_UNUSED;
1749 char **error_message ATTRIBUTE_UNUSED;
1752 DUMP_RELOC("SECREL",reloc_entry);
1754 if (output_bfd == (bfd *) NULL)
1755 return bfd_reloc_continue;
1757 return bfd_reloc_ok;
1760 static bfd_reloc_status_type
1761 ppc_section_reloc (abfd, reloc_entry, symbol, data,
1762 input_section, output_bfd, error_message)
1763 bfd *abfd ATTRIBUTE_UNUSED;
1764 arelent *reloc_entry ATTRIBUTE_UNUSED;
1765 asymbol *symbol ATTRIBUTE_UNUSED;
1766 PTR data ATTRIBUTE_UNUSED;
1767 asection *input_section ATTRIBUTE_UNUSED;
1769 char **error_message ATTRIBUTE_UNUSED;
1772 DUMP_RELOC("SECTION",reloc_entry);
1774 if (output_bfd == (bfd *) NULL)
1775 return bfd_reloc_continue;
1777 return bfd_reloc_ok;
1780 static bfd_reloc_status_type
1781 ppc_imglue_reloc (abfd, reloc_entry, symbol, data,
1782 input_section, output_bfd, error_message)
1783 bfd *abfd ATTRIBUTE_UNUSED;
1784 arelent *reloc_entry ATTRIBUTE_UNUSED;
1785 asymbol *symbol ATTRIBUTE_UNUSED;
1786 PTR data ATTRIBUTE_UNUSED;
1787 asection *input_section ATTRIBUTE_UNUSED;
1789 char **error_message ATTRIBUTE_UNUSED;
1792 DUMP_RELOC("IMGLUE",reloc_entry);
1794 if (output_bfd == (bfd *) NULL)
1795 return bfd_reloc_continue;
1797 return bfd_reloc_ok;
1800 #define MAX_RELOC_INDEX \
1801 (sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]) - 1)
1803 /* FIXME: There is a possibility that when we read in a reloc from a file,
1804 that there are some bits encoded in the upper portion of the
1805 type field. Not yet implemented. */
1806 static void ppc_coff_rtype2howto PARAMS ((arelent *, struct internal_reloc *));
1809 ppc_coff_rtype2howto (relent, internal)
1811 struct internal_reloc *internal;
1813 /* We can encode one of three things in the type field, aside from the
1815 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
1816 value, rather than an addition value
1817 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
1818 the branch is expected to be taken or not.
1819 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
1820 For now, we just strip this stuff to find the type, and ignore it other
1822 reloc_howto_type *howto;
1823 unsigned short r_type = EXTRACT_TYPE (internal->r_type);
1824 unsigned short r_flags = EXTRACT_FLAGS(internal->r_type);
1825 unsigned short junk = EXTRACT_JUNK (internal->r_type);
1827 /* The masking process only slices off the bottom byte for r_type. */
1828 if ( r_type > MAX_RELOC_INDEX )
1831 /* Check for absolute crap. */
1837 case IMAGE_REL_PPC_ADDR16:
1838 case IMAGE_REL_PPC_REL24:
1839 case IMAGE_REL_PPC_ADDR24:
1840 case IMAGE_REL_PPC_ADDR32:
1841 case IMAGE_REL_PPC_IFGLUE:
1842 case IMAGE_REL_PPC_ADDR32NB:
1843 case IMAGE_REL_PPC_SECTION:
1844 case IMAGE_REL_PPC_SECREL:
1845 DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
1846 howto = ppc_coff_howto_table + r_type;
1848 case IMAGE_REL_PPC_IMGLUE:
1849 DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
1850 howto = ppc_coff_howto_table + r_type;
1852 case IMAGE_REL_PPC_TOCREL16:
1853 DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
1854 if (r_flags & IMAGE_REL_PPC_TOCDEFN)
1855 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN;
1857 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
1861 _("Warning: Unsupported reloc %s [%d] used -- it may not work.\n"),
1862 ppc_coff_howto_table[r_type].name,
1864 howto = ppc_coff_howto_table + r_type;
1868 relent->howto = howto;
1871 static reloc_howto_type *
1872 coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
1873 bfd *abfd ATTRIBUTE_UNUSED;
1875 struct internal_reloc *rel;
1876 struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
1877 struct internal_syment *sym ATTRIBUTE_UNUSED;
1880 reloc_howto_type *howto;
1882 /* We can encode one of three things in the type field, aside from the
1884 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
1885 value, rather than an addition value
1886 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
1887 the branch is expected to be taken or not.
1888 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
1889 For now, we just strip this stuff to find the type, and ignore it other
1892 unsigned short r_type = EXTRACT_TYPE (rel->r_type);
1893 unsigned short r_flags = EXTRACT_FLAGS (rel->r_type);
1894 unsigned short junk = EXTRACT_JUNK (rel->r_type);
1896 /* The masking process only slices off the bottom byte for r_type. */
1897 if (r_type > MAX_RELOC_INDEX)
1900 /* Check for absolute crap. */
1906 case IMAGE_REL_PPC_ADDR32NB:
1907 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1908 *addendp -= pe_data(sec->output_section->owner)->pe_opthdr.ImageBase;
1909 howto = ppc_coff_howto_table + r_type;
1911 case IMAGE_REL_PPC_TOCREL16:
1912 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1913 if (r_flags & IMAGE_REL_PPC_TOCDEFN)
1914 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN;
1916 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
1918 case IMAGE_REL_PPC_ADDR16:
1919 case IMAGE_REL_PPC_REL24:
1920 case IMAGE_REL_PPC_ADDR24:
1921 case IMAGE_REL_PPC_ADDR32:
1922 case IMAGE_REL_PPC_IFGLUE:
1923 case IMAGE_REL_PPC_SECTION:
1924 case IMAGE_REL_PPC_SECREL:
1925 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1926 howto = ppc_coff_howto_table + r_type;
1928 case IMAGE_REL_PPC_IMGLUE:
1929 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1930 howto = ppc_coff_howto_table + r_type;
1934 _("Warning: Unsupported reloc %s [%d] used -- it may not work.\n"),
1935 ppc_coff_howto_table[r_type].name,
1937 howto = ppc_coff_howto_table + r_type;
1944 /* A cheesy little macro to make the code a little more readable. */
1945 #define HOW2MAP(bfd_rtype,ppc_rtype) \
1946 case bfd_rtype: return &ppc_coff_howto_table[ppc_rtype]
1948 static reloc_howto_type *ppc_coff_reloc_type_lookup
1949 PARAMS ((bfd *, bfd_reloc_code_real_type));
1951 static reloc_howto_type *
1952 ppc_coff_reloc_type_lookup (abfd, code)
1953 bfd *abfd ATTRIBUTE_UNUSED;
1954 bfd_reloc_code_real_type code;
1958 HOW2MAP(BFD_RELOC_32_GOTOFF, IMAGE_REL_PPC_IMGLUE);
1959 HOW2MAP(BFD_RELOC_16_GOT_PCREL, IMAGE_REL_PPC_IFGLUE);
1960 HOW2MAP(BFD_RELOC_16, IMAGE_REL_PPC_ADDR16);
1961 HOW2MAP(BFD_RELOC_PPC_B26, IMAGE_REL_PPC_REL24);
1962 HOW2MAP(BFD_RELOC_PPC_BA26, IMAGE_REL_PPC_ADDR24);
1963 HOW2MAP(BFD_RELOC_PPC_TOC16, IMAGE_REL_PPC_TOCREL16);
1964 HOW2MAP(BFD_RELOC_16_GOTOFF, IMAGE_REL_PPC_TOCREL16_DEFN);
1965 HOW2MAP(BFD_RELOC_32, IMAGE_REL_PPC_ADDR32);
1966 HOW2MAP(BFD_RELOC_RVA, IMAGE_REL_PPC_ADDR32NB);
1973 static reloc_howto_type *
1974 ppc_coff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1980 i < sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]);
1982 if (ppc_coff_howto_table[i].name != NULL
1983 && strcasecmp (ppc_coff_howto_table[i].name, r_name) == 0)
1984 return &ppc_coff_howto_table[i];
1989 /* Tailor coffcode.h -- macro heaven. */
1991 #define RTYPE2HOWTO(cache_ptr, dst) ppc_coff_rtype2howto (cache_ptr, dst)
1993 /* We use the special COFF backend linker, with our own special touch. */
1995 #define coff_bfd_reloc_type_lookup ppc_coff_reloc_type_lookup
1996 #define coff_bfd_reloc_name_lookup ppc_coff_reloc_name_lookup
1997 #define coff_rtype_to_howto coff_ppc_rtype_to_howto
1998 #define coff_relocate_section coff_ppc_relocate_section
1999 #define coff_bfd_final_link ppc_bfd_coff_final_link
2001 #ifndef COFF_IMAGE_WITH_PE
2004 #define SELECT_RELOC(internal, howto) {internal.r_type=howto->type;}
2006 #define COFF_PAGE_SIZE 0x1000
2008 /* FIXME: This controls some code that used to be in peicode.h and is
2009 now in peigen.c. It will not control the code in peigen.c. If
2010 anybody wants to get this working, you will need to fix that. */
2011 #define POWERPC_LE_PE
2013 #define COFF_SECTION_ALIGNMENT_ENTRIES \
2014 { COFF_SECTION_NAME_EXACT_MATCH (".idata$2"), \
2015 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
2016 { COFF_SECTION_NAME_EXACT_MATCH (".idata$3"), \
2017 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
2018 { COFF_SECTION_NAME_EXACT_MATCH (".idata$4"), \
2019 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
2020 { COFF_SECTION_NAME_EXACT_MATCH (".idata$5"), \
2021 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
2022 { COFF_SECTION_NAME_EXACT_MATCH (".idata$6"), \
2023 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }, \
2024 { COFF_SECTION_NAME_EXACT_MATCH (".reloc"), \
2025 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }
2027 #include "coffcode.h"
2029 #ifndef COFF_IMAGE_WITH_PE
2031 static bfd_boolean ppc_do_last PARAMS ((bfd *));
2032 static bfd *ppc_get_last PARAMS ((void));
2038 if (abfd == bfd_of_toc_owner)
2047 return bfd_of_toc_owner;
2050 /* This piece of machinery exists only to guarantee that the bfd that holds
2051 the toc section is written last.
2053 This does depend on bfd_make_section attaching a new section to the
2054 end of the section list for the bfd.
2056 This is otherwise intended to be functionally the same as
2057 cofflink.c:_bfd_coff_final_link(). It is specifically different only
2058 where the POWERPC_LE_PE macro modifies the code. It is left in as a
2059 precise form of comment. krk@cygnus.com */
2061 /* Do the final link step. */
2064 ppc_bfd_coff_final_link (abfd, info)
2066 struct bfd_link_info *info;
2068 bfd_size_type symesz;
2069 struct coff_final_link_info finfo;
2070 bfd_boolean debug_merge_allocated;
2072 struct bfd_link_order *p;
2073 bfd_size_type max_sym_count;
2074 bfd_size_type max_lineno_count;
2075 bfd_size_type max_reloc_count;
2076 bfd_size_type max_output_reloc_count;
2077 bfd_size_type max_contents_size;
2078 file_ptr rel_filepos;
2080 file_ptr line_filepos;
2081 unsigned int linesz;
2083 bfd_byte *external_relocs = NULL;
2084 char strbuf[STRING_SIZE_SIZE];
2087 symesz = bfd_coff_symesz (abfd);
2090 finfo.output_bfd = abfd;
2091 finfo.strtab = NULL;
2092 finfo.section_info = NULL;
2093 finfo.last_file_index = -1;
2094 finfo.last_bf_index = -1;
2095 finfo.internal_syms = NULL;
2096 finfo.sec_ptrs = NULL;
2097 finfo.sym_indices = NULL;
2098 finfo.outsyms = NULL;
2099 finfo.linenos = NULL;
2100 finfo.contents = NULL;
2101 finfo.external_relocs = NULL;
2102 finfo.internal_relocs = NULL;
2103 debug_merge_allocated = FALSE;
2105 coff_data (abfd)->link_info = info;
2107 finfo.strtab = _bfd_stringtab_init ();
2108 if (finfo.strtab == NULL)
2111 if (! coff_debug_merge_hash_table_init (&finfo.debug_merge))
2113 debug_merge_allocated = TRUE;
2115 /* Compute the file positions for all the sections. */
2116 if (! abfd->output_has_begun)
2118 if (! bfd_coff_compute_section_file_positions (abfd))
2122 /* Count the line numbers and relocation entries required for the
2123 output file. Set the file positions for the relocs. */
2124 rel_filepos = obj_relocbase (abfd);
2125 relsz = bfd_coff_relsz (abfd);
2126 max_contents_size = 0;
2127 max_lineno_count = 0;
2128 max_reloc_count = 0;
2130 for (o = abfd->sections; o != NULL; o = o->next)
2133 o->lineno_count = 0;
2135 for (p = o->map_head.link_order; p != NULL; p = p->next)
2137 if (p->type == bfd_indirect_link_order)
2141 sec = p->u.indirect.section;
2143 /* Mark all sections which are to be included in the
2144 link. This will normally be every section. We need
2145 to do this so that we can identify any sections which
2146 the linker has decided to not include. */
2147 sec->linker_mark = TRUE;
2149 if (info->strip == strip_none
2150 || info->strip == strip_some)
2151 o->lineno_count += sec->lineno_count;
2153 if (info->relocatable)
2154 o->reloc_count += sec->reloc_count;
2156 if (sec->rawsize > max_contents_size)
2157 max_contents_size = sec->rawsize;
2158 if (sec->size > max_contents_size)
2159 max_contents_size = sec->size;
2160 if (sec->lineno_count > max_lineno_count)
2161 max_lineno_count = sec->lineno_count;
2162 if (sec->reloc_count > max_reloc_count)
2163 max_reloc_count = sec->reloc_count;
2165 else if (info->relocatable
2166 && (p->type == bfd_section_reloc_link_order
2167 || p->type == bfd_symbol_reloc_link_order))
2170 if (o->reloc_count == 0)
2174 o->flags |= SEC_RELOC;
2175 o->rel_filepos = rel_filepos;
2176 rel_filepos += o->reloc_count * relsz;
2180 /* If doing a relocatable link, allocate space for the pointers we
2182 if (info->relocatable)
2186 /* We use section_count + 1, rather than section_count, because
2187 the target_index fields are 1 based. */
2188 amt = abfd->section_count + 1;
2189 amt *= sizeof (struct coff_link_section_info);
2190 finfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
2192 if (finfo.section_info == NULL)
2195 for (i = 0; i <= abfd->section_count; i++)
2197 finfo.section_info[i].relocs = NULL;
2198 finfo.section_info[i].rel_hashes = NULL;
2202 /* We now know the size of the relocs, so we can determine the file
2203 positions of the line numbers. */
2204 line_filepos = rel_filepos;
2205 linesz = bfd_coff_linesz (abfd);
2206 max_output_reloc_count = 0;
2208 for (o = abfd->sections; o != NULL; o = o->next)
2210 if (o->lineno_count == 0)
2211 o->line_filepos = 0;
2214 o->line_filepos = line_filepos;
2215 line_filepos += o->lineno_count * linesz;
2218 if (o->reloc_count != 0)
2220 /* We don't know the indices of global symbols until we have
2221 written out all the local symbols. For each section in
2222 the output file, we keep an array of pointers to hash
2223 table entries. Each entry in the array corresponds to a
2224 reloc. When we find a reloc against a global symbol, we
2225 set the corresponding entry in this array so that we can
2226 fix up the symbol index after we have written out all the
2229 Because of this problem, we also keep the relocs in
2230 memory until the end of the link. This wastes memory,
2231 but only when doing a relocatable link, which is not the
2233 BFD_ASSERT (info->relocatable);
2234 amt = o->reloc_count;
2235 amt *= sizeof (struct internal_reloc);
2236 finfo.section_info[o->target_index].relocs =
2237 (struct internal_reloc *) bfd_malloc (amt);
2238 amt = o->reloc_count;
2239 amt *= sizeof (struct coff_link_hash_entry *);
2240 finfo.section_info[o->target_index].rel_hashes =
2241 (struct coff_link_hash_entry **) bfd_malloc (amt);
2242 if (finfo.section_info[o->target_index].relocs == NULL
2243 || finfo.section_info[o->target_index].rel_hashes == NULL)
2246 if (o->reloc_count > max_output_reloc_count)
2247 max_output_reloc_count = o->reloc_count;
2250 /* Reset the reloc and lineno counts, so that we can use them to
2251 count the number of entries we have output so far. */
2253 o->lineno_count = 0;
2256 obj_sym_filepos (abfd) = line_filepos;
2258 /* Figure out the largest number of symbols in an input BFD. Take
2259 the opportunity to clear the output_has_begun fields of all the
2262 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
2266 sub->output_has_begun = FALSE;
2267 sz = obj_raw_syment_count (sub);
2268 if (sz > max_sym_count)
2272 /* Allocate some buffers used while linking. */
2273 amt = max_sym_count * sizeof (struct internal_syment);
2274 finfo.internal_syms = (struct internal_syment *) bfd_malloc (amt);
2275 amt = max_sym_count * sizeof (asection *);
2276 finfo.sec_ptrs = (asection **) bfd_malloc (amt);
2277 amt = max_sym_count * sizeof (long);
2278 finfo.sym_indices = (long *) bfd_malloc (amt);
2279 amt = (max_sym_count + 1) * symesz;
2280 finfo.outsyms = (bfd_byte *) bfd_malloc (amt);
2281 amt = max_lineno_count * bfd_coff_linesz (abfd);
2282 finfo.linenos = (bfd_byte *) bfd_malloc (amt);
2283 finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
2284 finfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz);
2285 if (! info->relocatable)
2287 amt = max_reloc_count * sizeof (struct internal_reloc);
2288 finfo.internal_relocs = (struct internal_reloc *) bfd_malloc (amt);
2290 if ((finfo.internal_syms == NULL && max_sym_count > 0)
2291 || (finfo.sec_ptrs == NULL && max_sym_count > 0)
2292 || (finfo.sym_indices == NULL && max_sym_count > 0)
2293 || finfo.outsyms == NULL
2294 || (finfo.linenos == NULL && max_lineno_count > 0)
2295 || (finfo.contents == NULL && max_contents_size > 0)
2296 || (finfo.external_relocs == NULL && max_reloc_count > 0)
2297 || (! info->relocatable
2298 && finfo.internal_relocs == NULL
2299 && max_reloc_count > 0))
2302 /* We now know the position of everything in the file, except that
2303 we don't know the size of the symbol table and therefore we don't
2304 know where the string table starts. We just build the string
2305 table in memory as we go along. We process all the relocations
2306 for a single input file at once. */
2307 obj_raw_syment_count (abfd) = 0;
2309 if (coff_backend_info (abfd)->_bfd_coff_start_final_link)
2311 if (! bfd_coff_start_final_link (abfd, info))
2315 for (o = abfd->sections; o != NULL; o = o->next)
2317 for (p = o->map_head.link_order; p != NULL; p = p->next)
2319 if (p->type == bfd_indirect_link_order
2320 && (bfd_get_flavour (p->u.indirect.section->owner)
2321 == bfd_target_coff_flavour))
2323 sub = p->u.indirect.section->owner;
2324 #ifdef POWERPC_LE_PE
2325 if (! sub->output_has_begun && !ppc_do_last(sub))
2327 if (! sub->output_has_begun)
2330 if (! _bfd_coff_link_input_bfd (&finfo, sub))
2332 sub->output_has_begun = TRUE;
2335 else if (p->type == bfd_section_reloc_link_order
2336 || p->type == bfd_symbol_reloc_link_order)
2338 if (! _bfd_coff_reloc_link_order (abfd, &finfo, o, p))
2343 if (! _bfd_default_link_order (abfd, info, o, p))
2349 #ifdef POWERPC_LE_PE
2351 bfd* last_one = ppc_get_last();
2354 if (! _bfd_coff_link_input_bfd (&finfo, last_one))
2357 last_one->output_has_begun = TRUE;
2361 /* Free up the buffers used by _bfd_coff_link_input_bfd. */
2362 coff_debug_merge_hash_table_free (&finfo.debug_merge);
2363 debug_merge_allocated = FALSE;
2365 if (finfo.internal_syms != NULL)
2367 free (finfo.internal_syms);
2368 finfo.internal_syms = NULL;
2370 if (finfo.sec_ptrs != NULL)
2372 free (finfo.sec_ptrs);
2373 finfo.sec_ptrs = NULL;
2375 if (finfo.sym_indices != NULL)
2377 free (finfo.sym_indices);
2378 finfo.sym_indices = NULL;
2380 if (finfo.linenos != NULL)
2382 free (finfo.linenos);
2383 finfo.linenos = NULL;
2385 if (finfo.contents != NULL)
2387 free (finfo.contents);
2388 finfo.contents = NULL;
2390 if (finfo.external_relocs != NULL)
2392 free (finfo.external_relocs);
2393 finfo.external_relocs = NULL;
2395 if (finfo.internal_relocs != NULL)
2397 free (finfo.internal_relocs);
2398 finfo.internal_relocs = NULL;
2401 /* The value of the last C_FILE symbol is supposed to be the symbol
2402 index of the first external symbol. Write it out again if
2404 if (finfo.last_file_index != -1
2405 && (unsigned int) finfo.last_file.n_value != obj_raw_syment_count (abfd))
2409 finfo.last_file.n_value = obj_raw_syment_count (abfd);
2410 bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
2411 (PTR) finfo.outsyms);
2412 pos = obj_sym_filepos (abfd) + finfo.last_file_index * symesz;
2413 if (bfd_seek (abfd, pos, SEEK_SET) != 0
2414 || bfd_bwrite (finfo.outsyms, symesz, abfd) != symesz)
2418 /* Write out the global symbols. */
2419 finfo.failed = FALSE;
2420 coff_link_hash_traverse (coff_hash_table (info), _bfd_coff_write_global_sym,
2425 /* The outsyms buffer is used by _bfd_coff_write_global_sym. */
2426 if (finfo.outsyms != NULL)
2428 free (finfo.outsyms);
2429 finfo.outsyms = NULL;
2432 if (info->relocatable)
2434 /* Now that we have written out all the global symbols, we know
2435 the symbol indices to use for relocs against them, and we can
2436 finally write out the relocs. */
2437 amt = max_output_reloc_count * relsz;
2438 external_relocs = (bfd_byte *) bfd_malloc (amt);
2439 if (external_relocs == NULL)
2442 for (o = abfd->sections; o != NULL; o = o->next)
2444 struct internal_reloc *irel;
2445 struct internal_reloc *irelend;
2446 struct coff_link_hash_entry **rel_hash;
2449 if (o->reloc_count == 0)
2452 irel = finfo.section_info[o->target_index].relocs;
2453 irelend = irel + o->reloc_count;
2454 rel_hash = finfo.section_info[o->target_index].rel_hashes;
2455 erel = external_relocs;
2456 for (; irel < irelend; irel++, rel_hash++, erel += relsz)
2458 if (*rel_hash != NULL)
2460 BFD_ASSERT ((*rel_hash)->indx >= 0);
2461 irel->r_symndx = (*rel_hash)->indx;
2463 bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel);
2466 amt = relsz * o->reloc_count;
2467 if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
2468 || bfd_bwrite ((PTR) external_relocs, amt, abfd) != amt)
2472 free (external_relocs);
2473 external_relocs = NULL;
2476 /* Free up the section information. */
2477 if (finfo.section_info != NULL)
2481 for (i = 0; i < abfd->section_count; i++)
2483 if (finfo.section_info[i].relocs != NULL)
2484 free (finfo.section_info[i].relocs);
2485 if (finfo.section_info[i].rel_hashes != NULL)
2486 free (finfo.section_info[i].rel_hashes);
2488 free (finfo.section_info);
2489 finfo.section_info = NULL;
2492 /* If we have optimized stabs strings, output them. */
2493 if (coff_hash_table (info)->stab_info.stabstr != NULL)
2495 if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info))
2499 /* Write out the string table. */
2500 if (obj_raw_syment_count (abfd) != 0)
2504 pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz;
2505 if (bfd_seek (abfd, pos, SEEK_SET) != 0)
2508 #if STRING_SIZE_SIZE == 4
2510 _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE,
2513 #error Change H_PUT_32 above
2516 if (bfd_bwrite (strbuf, (bfd_size_type) STRING_SIZE_SIZE, abfd)
2517 != STRING_SIZE_SIZE)
2520 if (! _bfd_stringtab_emit (abfd, finfo.strtab))
2524 _bfd_stringtab_free (finfo.strtab);
2526 /* Setting bfd_get_symcount to 0 will cause write_object_contents to
2527 not try to write out the symbols. */
2528 bfd_get_symcount (abfd) = 0;
2533 if (debug_merge_allocated)
2534 coff_debug_merge_hash_table_free (&finfo.debug_merge);
2535 if (finfo.strtab != NULL)
2536 _bfd_stringtab_free (finfo.strtab);
2537 if (finfo.section_info != NULL)
2541 for (i = 0; i < abfd->section_count; i++)
2543 if (finfo.section_info[i].relocs != NULL)
2544 free (finfo.section_info[i].relocs);
2545 if (finfo.section_info[i].rel_hashes != NULL)
2546 free (finfo.section_info[i].rel_hashes);
2548 free (finfo.section_info);
2550 if (finfo.internal_syms != NULL)
2551 free (finfo.internal_syms);
2552 if (finfo.sec_ptrs != NULL)
2553 free (finfo.sec_ptrs);
2554 if (finfo.sym_indices != NULL)
2555 free (finfo.sym_indices);
2556 if (finfo.outsyms != NULL)
2557 free (finfo.outsyms);
2558 if (finfo.linenos != NULL)
2559 free (finfo.linenos);
2560 if (finfo.contents != NULL)
2561 free (finfo.contents);
2562 if (finfo.external_relocs != NULL)
2563 free (finfo.external_relocs);
2564 if (finfo.internal_relocs != NULL)
2565 free (finfo.internal_relocs);
2566 if (external_relocs != NULL)
2567 free (external_relocs);
2572 /* Forward declaration for use by alternative_target field. */
2573 #ifdef TARGET_BIG_SYM
2574 extern const bfd_target TARGET_BIG_SYM;
2577 /* The transfer vectors that lead the outside world to all of the above. */
2579 #ifdef TARGET_LITTLE_SYM
2580 const bfd_target TARGET_LITTLE_SYM =
2582 TARGET_LITTLE_NAME, /* name or coff-arm-little */
2583 bfd_target_coff_flavour,
2584 BFD_ENDIAN_LITTLE, /* data byte order is little */
2585 BFD_ENDIAN_LITTLE, /* header byte order is little */
2587 (HAS_RELOC | EXEC_P | /* FIXME: object flags */
2588 HAS_LINENO | HAS_DEBUG |
2589 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
2591 #ifndef COFF_WITH_PE
2592 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
2594 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
2595 | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
2598 0, /* leading char */
2599 '/', /* ar_pad_char */
2600 15, /* ar_max_namelen??? FIXMEmgo */
2602 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2603 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2604 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
2606 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2607 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2608 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
2610 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
2611 bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p },
2612 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
2614 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
2615 _bfd_write_archive_contents, bfd_false},
2617 BFD_JUMP_TABLE_GENERIC (coff),
2618 BFD_JUMP_TABLE_COPY (coff),
2619 BFD_JUMP_TABLE_CORE (_bfd_nocore),
2620 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
2621 BFD_JUMP_TABLE_SYMBOLS (coff),
2622 BFD_JUMP_TABLE_RELOCS (coff),
2623 BFD_JUMP_TABLE_WRITE (coff),
2624 BFD_JUMP_TABLE_LINK (coff),
2625 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
2627 /* Alternative_target. */
2628 #ifdef TARGET_BIG_SYM
2638 #ifdef TARGET_BIG_SYM
2639 const bfd_target TARGET_BIG_SYM =
2642 bfd_target_coff_flavour,
2643 BFD_ENDIAN_BIG, /* data byte order is big */
2644 BFD_ENDIAN_BIG, /* header byte order is big */
2646 (HAS_RELOC | EXEC_P | /* FIXME: object flags */
2647 HAS_LINENO | HAS_DEBUG |
2648 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
2650 #ifndef COFF_WITH_PE
2651 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
2653 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
2654 | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
2657 0, /* leading char */
2658 '/', /* ar_pad_char */
2659 15, /* ar_max_namelen??? FIXMEmgo */
2661 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
2662 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
2663 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
2665 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
2666 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
2667 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
2669 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
2670 bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p },
2671 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
2673 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
2674 _bfd_write_archive_contents, bfd_false},
2676 BFD_JUMP_TABLE_GENERIC (coff),
2677 BFD_JUMP_TABLE_COPY (coff),
2678 BFD_JUMP_TABLE_CORE (_bfd_nocore),
2679 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
2680 BFD_JUMP_TABLE_SYMBOLS (coff),
2681 BFD_JUMP_TABLE_RELOCS (coff),
2682 BFD_JUMP_TABLE_WRITE (coff),
2683 BFD_JUMP_TABLE_LINK (coff),
2684 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
2686 /* Alternative_target. */
2687 #ifdef TARGET_LITTLE_SYM
2688 & TARGET_LITTLE_SYM,