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
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 2 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, 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, 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. */
41 #include "coff/powerpc.h"
42 #include "coff/internal.h"
50 #define BADMAG(x) PPCBADMAG(x)
54 /* This file is compiled more than once, but we only compile the
55 final_link routine once. */
56 extern bfd_boolean ppc_bfd_coff_final_link
57 PARAMS ((bfd
*, struct bfd_link_info
*));
58 extern void dump_toc
PARAMS ((PTR
));
60 /* The toc is a set of bfd_vma fields. We use the fact that valid
61 addresses are even (i.e. the bit representing "1" is off) to allow
62 us to encode a little extra information in the field
63 - Unallocated addresses are initialized to 1.
64 - Allocated addresses are even numbers.
65 The first time we actually write a reference to the toc in the bfd,
66 we want to record that fact in a fixup file (if it is asked for), so
67 we keep track of whether or not an address has been written by marking
68 the low order bit with a "1" upon writing. */
70 #define SET_UNALLOCATED(x) ((x) = 1)
71 #define IS_UNALLOCATED(x) ((x) == 1)
73 #define IS_WRITTEN(x) ((x) & 1)
74 #define MARK_AS_WRITTEN(x) ((x) |= 1)
75 #define MAKE_ADDR_AGAIN(x) ((x) &= ~1)
77 /* Turn on this check if you suspect something amiss in the hash tables. */
80 /* Need a 7 char string for an eye catcher. */
83 #define HASH_CHECK_DCL char eye_catcher[8];
84 #define HASH_CHECK_INIT(ret) strcpy(ret->eye_catcher, EYE)
85 #define HASH_CHECK(addr) \
86 if (strcmp(addr->eye_catcher, EYE) != 0) \
89 _("File %s, line %d, Hash check failure, bad eye %8s\n"), \
90 __FILE__, __LINE__, addr->eye_catcher); \
96 #define HASH_CHECK_DCL
97 #define HASH_CHECK_INIT(ret)
98 #define HASH_CHECK(addr)
102 /* In order not to add an int to every hash table item for every coff
103 linker, we define our own hash table, derived from the coff one. */
105 /* PE linker hash table entries. */
107 struct ppc_coff_link_hash_entry
109 struct coff_link_hash_entry root
; /* First entry, as required. */
111 /* As we wonder around the relocs, we'll keep the assigned toc_offset
113 bfd_vma toc_offset
; /* Our addition, as required. */
115 unsigned long int glue_insn
;
120 /* PE linker hash table. */
122 struct ppc_coff_link_hash_table
124 struct coff_link_hash_table root
; /* First entry, as required. */
127 static struct bfd_hash_entry
*ppc_coff_link_hash_newfunc
128 PARAMS ((struct bfd_hash_entry
*, struct bfd_hash_table
*,
130 static bfd_boolean ppc_coff_link_hash_table_init
131 PARAMS ((struct ppc_coff_link_hash_table
*, bfd
*,
132 struct bfd_hash_entry
*(*) (struct bfd_hash_entry
*,
133 struct bfd_hash_table
*,
135 static struct bfd_link_hash_table
*ppc_coff_link_hash_table_create
137 static bfd_boolean coff_ppc_relocate_section
138 PARAMS ((bfd
*, struct bfd_link_info
*, bfd
*, asection
*, bfd_byte
*,
139 struct internal_reloc
*, struct internal_syment
*, asection
**));
140 static reloc_howto_type
*coff_ppc_rtype_to_howto
141 PARAMS ((bfd
*, asection
*, struct internal_reloc
*,
142 struct coff_link_hash_entry
*, struct internal_syment
*,
145 /* Routine to create an entry in the link hash table. */
147 static struct bfd_hash_entry
*
148 ppc_coff_link_hash_newfunc (entry
, table
, string
)
149 struct bfd_hash_entry
*entry
;
150 struct bfd_hash_table
*table
;
153 struct ppc_coff_link_hash_entry
*ret
=
154 (struct ppc_coff_link_hash_entry
*) entry
;
156 /* Allocate the structure if it has not already been allocated by a
158 if (ret
== (struct ppc_coff_link_hash_entry
*) NULL
)
159 ret
= (struct ppc_coff_link_hash_entry
*)
160 bfd_hash_allocate (table
,
161 sizeof (struct ppc_coff_link_hash_entry
));
163 if (ret
== (struct ppc_coff_link_hash_entry
*) NULL
)
166 /* Call the allocation method of the superclass. */
167 ret
= ((struct ppc_coff_link_hash_entry
*)
168 _bfd_coff_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
173 /* Initialize the local fields. */
174 SET_UNALLOCATED (ret
->toc_offset
);
175 ret
->symbol_is_glue
= 0;
178 HASH_CHECK_INIT (ret
);
181 return (struct bfd_hash_entry
*) ret
;
184 /* Initialize a PE linker hash table. */
187 ppc_coff_link_hash_table_init (table
, abfd
, newfunc
)
188 struct ppc_coff_link_hash_table
*table
;
190 struct bfd_hash_entry
*(*newfunc
) PARAMS ((struct bfd_hash_entry
*,
191 struct bfd_hash_table
*,
194 return _bfd_coff_link_hash_table_init (&table
->root
, abfd
, newfunc
);
197 /* Create a PE linker hash table. */
199 static struct bfd_link_hash_table
*
200 ppc_coff_link_hash_table_create (abfd
)
203 struct ppc_coff_link_hash_table
*ret
;
204 bfd_size_type amt
= sizeof (struct ppc_coff_link_hash_table
);
206 ret
= (struct ppc_coff_link_hash_table
*) bfd_malloc (amt
);
209 if (! ppc_coff_link_hash_table_init (ret
, abfd
,
210 ppc_coff_link_hash_newfunc
))
213 return (struct bfd_link_hash_table
*) NULL
;
215 return &ret
->root
.root
;
218 /* Now, tailor coffcode.h to use our hash stuff. */
220 #define coff_bfd_link_hash_table_create ppc_coff_link_hash_table_create
222 /* The nt loader points the toc register to &toc + 32768, in order to
223 use the complete range of a 16-bit displacement. We have to adjust
224 for this when we fix up loads displaced off the toc reg. */
225 #define TOC_LOAD_ADJUSTMENT (-32768)
226 #define TOC_SECTION_NAME ".private.toc"
228 /* The main body of code is in coffcode.h. */
230 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
232 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
233 from smaller values. Start with zero, widen, *then* decrement. */
234 #define MINUS_ONE (((bfd_vma)0) - 1)
236 /* These should definitely go in a header file somewhere... */
239 #define IMAGE_REL_PPC_ABSOLUTE 0x0000
242 #define IMAGE_REL_PPC_ADDR64 0x0001
245 #define IMAGE_REL_PPC_ADDR32 0x0002
247 /* 26-bit address, shifted left 2 (branch absolute) */
248 #define IMAGE_REL_PPC_ADDR24 0x0003
251 #define IMAGE_REL_PPC_ADDR16 0x0004
253 /* 16-bit address, shifted left 2 (load doubleword) */
254 #define IMAGE_REL_PPC_ADDR14 0x0005
256 /* 26-bit PC-relative offset, shifted left 2 (branch relative) */
257 #define IMAGE_REL_PPC_REL24 0x0006
259 /* 16-bit PC-relative offset, shifted left 2 (br cond relative) */
260 #define IMAGE_REL_PPC_REL14 0x0007
262 /* 16-bit offset from TOC base */
263 #define IMAGE_REL_PPC_TOCREL16 0x0008
265 /* 16-bit offset from TOC base, shifted left 2 (load doubleword) */
266 #define IMAGE_REL_PPC_TOCREL14 0x0009
268 /* 32-bit addr w/o image base */
269 #define IMAGE_REL_PPC_ADDR32NB 0x000A
271 /* va of containing section (as in an image sectionhdr) */
272 #define IMAGE_REL_PPC_SECREL 0x000B
274 /* sectionheader number */
275 #define IMAGE_REL_PPC_SECTION 0x000C
277 /* substitute TOC restore instruction iff symbol is glue code */
278 #define IMAGE_REL_PPC_IFGLUE 0x000D
280 /* symbol is glue code; virtual address is TOC restore instruction */
281 #define IMAGE_REL_PPC_IMGLUE 0x000E
283 /* va of containing section (limited to 16 bits) */
284 #define IMAGE_REL_PPC_SECREL16 0x000F
286 /* Stuff to handle immediate data when the number of bits in the
287 data is greater than the number of bits in the immediate field
288 We need to do (usually) 32 bit arithmetic on 16 bit chunks. */
289 #define IMAGE_REL_PPC_REFHI 0x0010
290 #define IMAGE_REL_PPC_REFLO 0x0011
291 #define IMAGE_REL_PPC_PAIR 0x0012
293 /* This is essentially the same as tocrel16, with TOCDEFN assumed. */
294 #define IMAGE_REL_PPC_TOCREL16_DEFN 0x0013
296 /* Flag bits in IMAGE_RELOCATION.TYPE. */
298 /* Subtract reloc value rather than adding it. */
299 #define IMAGE_REL_PPC_NEG 0x0100
301 /* Fix branch prediction bit to predict branch taken. */
302 #define IMAGE_REL_PPC_BRTAKEN 0x0200
304 /* Fix branch prediction bit to predict branch not taken. */
305 #define IMAGE_REL_PPC_BRNTAKEN 0x0400
307 /* TOC slot defined in file (or, data in toc). */
308 #define IMAGE_REL_PPC_TOCDEFN 0x0800
310 /* Masks to isolate above values in IMAGE_RELOCATION.Type. */
311 #define IMAGE_REL_PPC_TYPEMASK 0x00FF
312 #define IMAGE_REL_PPC_FLAGMASK 0x0F00
314 #define EXTRACT_TYPE(x) ((x) & IMAGE_REL_PPC_TYPEMASK)
315 #define EXTRACT_FLAGS(x) ((x) & IMAGE_REL_PPC_FLAGMASK)
316 #define EXTRACT_JUNK(x) \
317 ((x) & ~(IMAGE_REL_PPC_TYPEMASK | IMAGE_REL_PPC_FLAGMASK))
319 /* Static helper functions to make relocation work. */
320 /* (Work In Progress) */
322 static bfd_reloc_status_type ppc_refhi_reloc
PARAMS ((bfd
*abfd
,
329 static bfd_reloc_status_type ppc_pair_reloc
PARAMS ((bfd
*abfd
,
337 static bfd_reloc_status_type ppc_toc16_reloc
PARAMS ((bfd
*abfd
,
345 static bfd_reloc_status_type ppc_section_reloc
PARAMS ((bfd
*abfd
,
353 static bfd_reloc_status_type ppc_secrel_reloc
PARAMS ((bfd
*abfd
,
361 static bfd_reloc_status_type ppc_imglue_reloc
PARAMS ((bfd
*abfd
,
369 static bfd_boolean in_reloc_p
PARAMS((bfd
*abfd
, reloc_howto_type
*howto
));
371 /* FIXME: It'll take a while to get through all of these. I only need a few to
372 get us started, so those I'll make sure work. Those marked FIXME are either
373 completely unverified or have a specific unknown marked in the comment. */
375 /* Relocation entries for Windows/NT on PowerPC.
377 From the document "" we find the following listed as used relocs:
380 ADDR[64|32|16] : fields that hold addresses in data fields or the
381 16 bit displacement field on a load/store.
382 ADDR[24|14] : fields that hold addresses in branch and cond
383 branches. These represent [26|16] bit addresses.
384 The low order 2 bits are preserved.
385 REL[24|14] : branches relative to the Instruction Address
386 register. These represent [26|16] bit addresses,
387 as before. The instruction field will be zero, and
388 the address of the SYM will be inserted at link time.
389 TOCREL16 : 16 bit displacement field referring to a slot in
391 TOCREL14 : 16 bit displacement field, similar to REL14 or ADDR14.
392 ADDR32NB : 32 bit address relative to the virtual origin.
393 (On the alpha, this is always a linker generated thunk)
394 (i.e. 32bit addr relative to the image base)
395 SECREL : The value is relative to the start of the section
396 containing the symbol.
397 SECTION : access to the header containing the item. Supports the
400 In particular, note that the document does not indicate that the
401 relocations listed in the header file are used. */
404 static reloc_howto_type ppc_coff_howto_table
[] =
406 /* IMAGE_REL_PPC_ABSOLUTE 0x0000 NOP */
408 HOWTO (IMAGE_REL_PPC_ABSOLUTE
, /* type */
410 0, /* size (0 = byte, 1 = short, 2 = long) */
412 FALSE
, /* pc_relative */
414 complain_overflow_dont
, /* dont complain_on_overflow */
415 0, /* special_function */
416 "ABSOLUTE", /* name */
417 FALSE
, /* partial_inplace */
420 FALSE
), /* pcrel_offset */
422 /* IMAGE_REL_PPC_ADDR64 0x0001 64-bit address */
424 HOWTO(IMAGE_REL_PPC_ADDR64
, /* type */
426 3, /* size (0 = byte, 1 = short, 2 = long) */
428 FALSE
, /* pc_relative */
430 complain_overflow_bitfield
, /* complain_on_overflow */
431 0, /* special_function */
433 TRUE
, /* partial_inplace */
434 MINUS_ONE
, /* src_mask */
435 MINUS_ONE
, /* dst_mask */
436 FALSE
), /* pcrel_offset */
438 /* IMAGE_REL_PPC_ADDR32 0x0002 32-bit address */
440 HOWTO (IMAGE_REL_PPC_ADDR32
, /* type */
442 2, /* size (0 = byte, 1 = short, 2 = long) */
444 FALSE
, /* pc_relative */
446 complain_overflow_bitfield
, /* complain_on_overflow */
447 0, /* special_function */
449 TRUE
, /* partial_inplace */
450 0xffffffff, /* src_mask */
451 0xffffffff, /* dst_mask */
452 FALSE
), /* pcrel_offset */
454 /* IMAGE_REL_PPC_ADDR24 0x0003 26-bit address, shifted left 2 (branch absolute) */
455 /* the LI field is in bit 6 through bit 29 is 24 bits, + 2 for the shift */
456 /* Of course, That's the IBM approved bit numbering, which is not what */
457 /* anyone else uses.... The li field is in bit 2 thru 25 */
459 HOWTO (IMAGE_REL_PPC_ADDR24
, /* type */
461 2, /* size (0 = byte, 1 = short, 2 = long) */
463 FALSE
, /* pc_relative */
465 complain_overflow_bitfield
, /* complain_on_overflow */
466 0, /* special_function */
468 TRUE
, /* partial_inplace */
469 0x07fffffc, /* src_mask */
470 0x07fffffc, /* dst_mask */
471 FALSE
), /* pcrel_offset */
473 /* IMAGE_REL_PPC_ADDR16 0x0004 16-bit address */
475 HOWTO (IMAGE_REL_PPC_ADDR16
, /* type */
477 1, /* size (0 = byte, 1 = short, 2 = long) */
479 FALSE
, /* pc_relative */
481 complain_overflow_signed
, /* complain_on_overflow */
482 0, /* special_function */
484 TRUE
, /* partial_inplace */
485 0xffff, /* src_mask */
486 0xffff, /* dst_mask */
487 FALSE
), /* pcrel_offset */
489 /* IMAGE_REL_PPC_ADDR14 0x0005 */
490 /* 16-bit address, shifted left 2 (load doubleword) */
491 /* FIXME: the mask is likely wrong, and the bit position may be as well */
493 HOWTO (IMAGE_REL_PPC_ADDR14
, /* type */
495 1, /* size (0 = byte, 1 = short, 2 = long) */
497 FALSE
, /* pc_relative */
499 complain_overflow_signed
, /* complain_on_overflow */
500 0, /* special_function */
502 TRUE
, /* partial_inplace */
503 0xffff, /* src_mask */
504 0xffff, /* dst_mask */
505 FALSE
), /* pcrel_offset */
507 /* IMAGE_REL_PPC_REL24 0x0006 */
508 /* 26-bit PC-relative offset, shifted left 2 (branch relative) */
510 HOWTO (IMAGE_REL_PPC_REL24
, /* type */
512 2, /* size (0 = byte, 1 = short, 2 = long) */
514 TRUE
, /* pc_relative */
516 complain_overflow_signed
, /* complain_on_overflow */
517 0, /* special_function */
519 TRUE
, /* partial_inplace */
520 0x3fffffc, /* src_mask */
521 0x3fffffc, /* dst_mask */
522 FALSE
), /* pcrel_offset */
524 /* IMAGE_REL_PPC_REL14 0x0007 */
525 /* 16-bit PC-relative offset, shifted left 2 (br cond relative) */
526 /* FIXME: the mask is likely wrong, and the bit position may be as well */
527 /* FIXME: how does it know how far to shift? */
529 HOWTO (IMAGE_REL_PPC_ADDR14
, /* type */
531 1, /* size (0 = byte, 1 = short, 2 = long) */
533 FALSE
, /* pc_relative */
535 complain_overflow_signed
, /* complain_on_overflow */
536 0, /* special_function */
538 TRUE
, /* partial_inplace */
539 0xffff, /* src_mask */
540 0xffff, /* dst_mask */
541 TRUE
), /* pcrel_offset */
543 /* IMAGE_REL_PPC_TOCREL16 0x0008 */
544 /* 16-bit offset from TOC base */
546 HOWTO (IMAGE_REL_PPC_TOCREL16
,/* type */
548 1, /* size (0 = byte, 1 = short, 2 = long) */
550 FALSE
, /* pc_relative */
552 complain_overflow_dont
, /* complain_on_overflow */
553 ppc_toc16_reloc
, /* special_function */
554 "TOCREL16", /* name */
555 FALSE
, /* partial_inplace */
556 0xffff, /* src_mask */
557 0xffff, /* dst_mask */
558 FALSE
), /* pcrel_offset */
560 /* IMAGE_REL_PPC_TOCREL14 0x0009 */
561 /* 16-bit offset from TOC base, shifted left 2 (load doubleword) */
563 HOWTO (IMAGE_REL_PPC_TOCREL14
,/* type */
565 1, /* size (0 = byte, 1 = short, 2 = long) */
567 FALSE
, /* pc_relative */
569 complain_overflow_signed
, /* complain_on_overflow */
570 0, /* special_function */
571 "TOCREL14", /* name */
572 FALSE
, /* partial_inplace */
573 0xffff, /* src_mask */
574 0xffff, /* dst_mask */
575 FALSE
), /* pcrel_offset */
577 /* IMAGE_REL_PPC_ADDR32NB 0x000A */
578 /* 32-bit addr w/ image base */
580 HOWTO (IMAGE_REL_PPC_ADDR32NB
,/* type */
582 2, /* size (0 = byte, 1 = short, 2 = long) */
584 FALSE
, /* pc_relative */
586 complain_overflow_signed
, /* complain_on_overflow */
587 0, /* special_function */
588 "ADDR32NB", /* name */
589 TRUE
, /* partial_inplace */
590 0xffffffff, /* src_mask */
591 0xffffffff, /* dst_mask */
592 FALSE
), /* pcrel_offset */
594 /* IMAGE_REL_PPC_SECREL 0x000B */
595 /* va of containing section (as in an image sectionhdr) */
597 HOWTO (IMAGE_REL_PPC_SECREL
,/* type */
599 2, /* size (0 = byte, 1 = short, 2 = long) */
601 FALSE
, /* pc_relative */
603 complain_overflow_signed
, /* complain_on_overflow */
604 ppc_secrel_reloc
, /* special_function */
606 TRUE
, /* partial_inplace */
607 0xffffffff, /* src_mask */
608 0xffffffff, /* dst_mask */
609 TRUE
), /* pcrel_offset */
611 /* IMAGE_REL_PPC_SECTION 0x000C */
612 /* sectionheader number */
614 HOWTO (IMAGE_REL_PPC_SECTION
,/* type */
616 2, /* size (0 = byte, 1 = short, 2 = long) */
618 FALSE
, /* pc_relative */
620 complain_overflow_signed
, /* complain_on_overflow */
621 ppc_section_reloc
, /* special_function */
622 "SECTION", /* name */
623 TRUE
, /* partial_inplace */
624 0xffffffff, /* src_mask */
625 0xffffffff, /* dst_mask */
626 TRUE
), /* pcrel_offset */
628 /* IMAGE_REL_PPC_IFGLUE 0x000D */
629 /* substitute TOC restore instruction iff symbol is glue code */
631 HOWTO (IMAGE_REL_PPC_IFGLUE
,/* type */
633 2, /* size (0 = byte, 1 = short, 2 = long) */
635 FALSE
, /* pc_relative */
637 complain_overflow_signed
, /* complain_on_overflow */
638 0, /* special_function */
640 TRUE
, /* partial_inplace */
641 0xffffffff, /* src_mask */
642 0xffffffff, /* dst_mask */
643 FALSE
), /* pcrel_offset */
645 /* IMAGE_REL_PPC_IMGLUE 0x000E */
646 /* symbol is glue code; virtual address is TOC restore instruction */
648 HOWTO (IMAGE_REL_PPC_IMGLUE
,/* type */
650 2, /* size (0 = byte, 1 = short, 2 = long) */
652 FALSE
, /* pc_relative */
654 complain_overflow_dont
, /* complain_on_overflow */
655 ppc_imglue_reloc
, /* special_function */
657 FALSE
, /* partial_inplace */
658 0xffffffff, /* src_mask */
659 0xffffffff, /* dst_mask */
660 FALSE
), /* pcrel_offset */
662 /* IMAGE_REL_PPC_SECREL16 0x000F */
663 /* va of containing section (limited to 16 bits) */
665 HOWTO (IMAGE_REL_PPC_SECREL16
,/* type */
667 1, /* size (0 = byte, 1 = short, 2 = long) */
669 FALSE
, /* pc_relative */
671 complain_overflow_signed
, /* complain_on_overflow */
672 0, /* special_function */
673 "SECREL16", /* name */
674 TRUE
, /* partial_inplace */
675 0xffff, /* src_mask */
676 0xffff, /* dst_mask */
677 TRUE
), /* pcrel_offset */
679 /* IMAGE_REL_PPC_REFHI 0x0010 */
681 HOWTO (IMAGE_REL_PPC_REFHI
, /* type */
683 1, /* size (0 = byte, 1 = short, 2 = long) */
685 FALSE
, /* pc_relative */
687 complain_overflow_signed
, /* complain_on_overflow */
688 ppc_refhi_reloc
, /* special_function */
690 TRUE
, /* partial_inplace */
691 0xffffffff, /* src_mask */
692 0xffffffff, /* dst_mask */
693 FALSE
), /* pcrel_offset */
695 /* IMAGE_REL_PPC_REFLO 0x0011 */
697 HOWTO (IMAGE_REL_PPC_REFLO
, /* type */
699 1, /* size (0 = byte, 1 = short, 2 = long) */
701 FALSE
, /* pc_relative */
703 complain_overflow_signed
, /* complain_on_overflow */
704 ppc_refhi_reloc
, /* special_function */
706 TRUE
, /* partial_inplace */
707 0xffffffff, /* src_mask */
708 0xffffffff, /* dst_mask */
709 FALSE
), /* pcrel_offset */
711 /* IMAGE_REL_PPC_PAIR 0x0012 */
713 HOWTO (IMAGE_REL_PPC_PAIR
, /* type */
715 1, /* size (0 = byte, 1 = short, 2 = long) */
717 FALSE
, /* pc_relative */
719 complain_overflow_signed
, /* complain_on_overflow */
720 ppc_pair_reloc
, /* special_function */
722 TRUE
, /* partial_inplace */
723 0xffffffff, /* src_mask */
724 0xffffffff, /* dst_mask */
725 FALSE
), /* pcrel_offset */
727 /* IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 */
728 /* 16-bit offset from TOC base, without causing a definition */
730 HOWTO ( (IMAGE_REL_PPC_TOCREL16
| IMAGE_REL_PPC_TOCDEFN
), /* type */
732 1, /* size (0 = byte, 1 = short, 2 = long) */
734 FALSE
, /* pc_relative */
736 complain_overflow_dont
, /* complain_on_overflow */
737 0, /* special_function */
738 "TOCREL16, TOCDEFN", /* name */
739 FALSE
, /* partial_inplace */
740 0xffff, /* src_mask */
741 0xffff, /* dst_mask */
742 FALSE
), /* pcrel_offset */
746 /* Some really cheezy macros that can be turned on to test stderr :-) */
755 fprintf (stderr,_("Unimplemented Relocation -- %s\n"),x); \
759 #define DUMP_RELOC(n,r) \
761 fprintf (stderr,"%s sym %d, addr %d, addend %d\n", \
762 n, (*(r->sym_ptr_ptr))->name, \
763 r->address, r->addend); \
766 /* Given a reloc name, n, and a pointer to an internal_reloc,
767 dump out interesting information on the contents
769 #define n_name _n._n_name
770 #define n_zeroes _n._n_n._n_zeroes
771 #define n_offset _n._n_n._n_offset */
773 #define DUMP_RELOC2(n,r) \
775 fprintf (stderr,"%s sym %d, r_vaddr %d %s\n", \
776 n, r->r_symndx, r->r_vaddr, \
777 (((r->r_type) & IMAGE_REL_PPC_TOCDEFN) == 0) \
783 #define DUMP_RELOC(n,r)
784 #define DUMP_RELOC2(n,r)
787 /* TOC construction and management routines. */
789 /* This file is compiled twice, and these variables are defined in one
790 of the compilations. FIXME: This is confusing and weird. Also,
791 BFD should not use global variables. */
792 extern bfd
* bfd_of_toc_owner
;
793 extern long int global_toc_size
;
794 extern long int import_table_size
;
795 extern long int first_thunk_address
;
796 extern long int thunk_size
;
814 struct list_ele
*next
;
816 enum ref_category cat
;
821 extern struct list_ele
*head
;
822 extern struct list_ele
*tail
;
824 static void record_toc
825 PARAMS ((asection
*, bfd_signed_vma
, enum ref_category
, const char *));
828 record_toc (toc_section
, our_toc_offset
, cat
, name
)
829 asection
*toc_section
;
830 bfd_signed_vma our_toc_offset
;
831 enum ref_category cat
;
834 /* Add this entry to our toc addr-offset-name list. */
835 bfd_size_type amt
= sizeof (struct list_ele
);
836 struct list_ele
*t
= (struct list_ele
*) bfd_malloc (amt
);
841 t
->offset
= our_toc_offset
;
844 t
->addr
= toc_section
->output_offset
+ our_toc_offset
;
858 #ifdef COFF_IMAGE_WITH_PE
860 static bfd_boolean ppc_record_toc_entry
861 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*, int, enum toc_type
));
862 static void ppc_mark_symbol_as_glue
863 PARAMS ((bfd
*, int, struct internal_reloc
*));
865 /* Record a toc offset against a symbol. */
867 ppc_record_toc_entry(abfd
, info
, sec
, sym
, toc_kind
)
869 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
870 asection
*sec ATTRIBUTE_UNUSED
;
872 enum toc_type toc_kind ATTRIBUTE_UNUSED
;
874 struct ppc_coff_link_hash_entry
*h
;
881 h
= (struct ppc_coff_link_hash_entry
*) (obj_coff_sym_hashes (abfd
)[sym
]);
889 local_syms
= obj_coff_local_toc_table(abfd
);
896 /* allocate a table */
897 amt
= (bfd_size_type
) obj_raw_syment_count (abfd
) * sizeof (int);
898 local_syms
= (int *) bfd_zalloc (abfd
, amt
);
901 obj_coff_local_toc_table (abfd
) = local_syms
;
903 for (i
= 0; i
< obj_raw_syment_count (abfd
); ++i
)
905 SET_UNALLOCATED (local_syms
[i
]);
909 if (IS_UNALLOCATED(local_syms
[sym
]))
911 local_syms
[sym
] = global_toc_size
;
912 global_toc_size
+= 4;
914 /* The size must fit in a 16-bit displacement. */
915 if (global_toc_size
> 65535)
917 (*_bfd_error_handler
) (_("TOC overflow"));
918 bfd_set_error (bfd_error_file_too_big
);
925 name
= h
->root
.root
.root
.string
;
927 /* Check to see if there's a toc slot allocated. If not, do it
928 here. It will be used in relocate_section. */
929 if (IS_UNALLOCATED(h
->toc_offset
))
931 h
->toc_offset
= global_toc_size
;
932 global_toc_size
+= 4;
934 /* The size must fit in a 16-bit displacement. */
935 if (global_toc_size
>= 65535)
937 (*_bfd_error_handler
) (_("TOC overflow"));
938 bfd_set_error (bfd_error_file_too_big
);
947 /* Record a toc offset against a symbol. */
949 ppc_mark_symbol_as_glue(abfd
, sym
, rel
)
952 struct internal_reloc
*rel
;
954 struct ppc_coff_link_hash_entry
*h
;
956 h
= (struct ppc_coff_link_hash_entry
*) (obj_coff_sym_hashes (abfd
)[sym
]);
960 h
->symbol_is_glue
= 1;
961 h
->glue_insn
= bfd_get_32 (abfd
, (bfd_byte
*) &rel
->r_vaddr
);
966 #endif /* COFF_IMAGE_WITH_PE */
968 /* Return TRUE if this relocation should
969 appear in the output .reloc section. */
971 static bfd_boolean
in_reloc_p(abfd
, howto
)
972 bfd
* abfd ATTRIBUTE_UNUSED
;
973 reloc_howto_type
*howto
;
976 (! howto
->pc_relative
)
977 && (howto
->type
!= IMAGE_REL_PPC_ADDR32NB
)
978 && (howto
->type
!= IMAGE_REL_PPC_TOCREL16
)
979 && (howto
->type
!= IMAGE_REL_PPC_IMGLUE
)
980 && (howto
->type
!= IMAGE_REL_PPC_IFGLUE
)
981 && (howto
->type
!= IMAGE_REL_PPC_SECREL
)
982 && (howto
->type
!= IMAGE_REL_PPC_SECTION
)
983 && (howto
->type
!= IMAGE_REL_PPC_SECREL16
)
984 && (howto
->type
!= IMAGE_REL_PPC_REFHI
)
985 && (howto
->type
!= IMAGE_REL_PPC_REFLO
)
986 && (howto
->type
!= IMAGE_REL_PPC_PAIR
)
987 && (howto
->type
!= IMAGE_REL_PPC_TOCREL16_DEFN
) ;
990 /* The reloc processing routine for the optimized COFF linker. */
993 coff_ppc_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
994 contents
, relocs
, syms
, sections
)
996 struct bfd_link_info
*info
;
998 asection
*input_section
;
1000 struct internal_reloc
*relocs
;
1001 struct internal_syment
*syms
;
1002 asection
**sections
;
1004 struct internal_reloc
*rel
;
1005 struct internal_reloc
*relend
;
1008 asection
*toc_section
= 0;
1010 reloc_howto_type
*howto
= 0;
1012 /* If we are performing a relocatable link, we don't need to do a
1013 thing. The caller will take care of adjusting the reloc
1014 addresses and symbol indices. */
1015 if (info
->relocatable
)
1022 relend
= rel
+ input_section
->reloc_count
;
1023 for (; rel
< relend
; rel
++)
1026 struct ppc_coff_link_hash_entry
*h
;
1027 struct internal_syment
*sym
;
1031 bfd_reloc_status_type rstat
;
1034 unsigned short r_type
= EXTRACT_TYPE (rel
->r_type
);
1035 unsigned short r_flags
= EXTRACT_FLAGS(rel
->r_type
);
1037 symndx
= rel
->r_symndx
;
1038 loc
= contents
+ rel
->r_vaddr
- input_section
->vma
;
1040 /* FIXME: check bounds on r_type */
1041 howto
= ppc_coff_howto_table
+ r_type
;
1050 h
= (struct ppc_coff_link_hash_entry
*)
1051 (obj_coff_sym_hashes (input_bfd
)[symndx
]);
1057 sym
= syms
+ symndx
;
1060 if (r_type
== IMAGE_REL_PPC_IMGLUE
&& h
== 0)
1062 /* An IMGLUE reloc must have a name. Something is very wrong. */
1069 /* FIXME: PAIR unsupported in the following code. */
1073 sec
= bfd_abs_section_ptr
;
1076 sec
= sections
[symndx
];
1077 val
= (sec
->output_section
->vma
1078 + sec
->output_offset
1080 if (! obj_pe (output_bfd
))
1088 if (h
->root
.root
.type
== bfd_link_hash_defined
1089 || h
->root
.root
.type
== bfd_link_hash_defweak
)
1091 sec
= h
->root
.root
.u
.def
.section
;
1092 val
= (h
->root
.root
.u
.def
.value
1093 + sec
->output_section
->vma
1094 + sec
->output_offset
);
1098 if (! ((*info
->callbacks
->undefined_symbol
)
1099 (info
, h
->root
.root
.root
.string
, input_bfd
, input_section
,
1100 rel
->r_vaddr
- input_section
->vma
, TRUE
)))
1105 rstat
= bfd_reloc_ok
;
1107 /* Each case must do its own relocation, setting rstat appropriately. */
1111 (*_bfd_error_handler
)
1112 (_("%B: unsupported relocation type 0x%02x"), input_bfd
, r_type
);
1113 bfd_set_error (bfd_error_bad_value
);
1115 case IMAGE_REL_PPC_TOCREL16
:
1117 bfd_signed_vma our_toc_offset
;
1120 DUMP_RELOC2(howto
->name
, rel
);
1122 if (toc_section
== 0)
1124 toc_section
= bfd_get_section_by_name (bfd_of_toc_owner
,
1127 if ( toc_section
== NULL
)
1129 /* There is no toc section. Something is very wrong. */
1134 /* Amazing bit tricks present. As we may have seen earlier, we
1135 use the 1 bit to tell us whether or not a toc offset has been
1136 allocated. Now that they've all been allocated, we will use
1137 the 1 bit to tell us if we've written this particular toc
1142 /* It is a file local symbol. */
1143 int *local_toc_table
;
1146 sym
= syms
+ symndx
;
1147 name
= sym
->_n
._n_name
;
1149 local_toc_table
= obj_coff_local_toc_table(input_bfd
);
1150 our_toc_offset
= local_toc_table
[symndx
];
1152 if (IS_WRITTEN(our_toc_offset
))
1154 /* If it has been written out, it is marked with the
1155 1 bit. Fix up our offset, but do not write it out
1157 MAKE_ADDR_AGAIN(our_toc_offset
);
1161 /* Write out the toc entry. */
1162 record_toc (toc_section
, our_toc_offset
, priv
,
1165 bfd_put_32 (output_bfd
, val
,
1166 toc_section
->contents
+ our_toc_offset
);
1168 MARK_AS_WRITTEN(local_toc_table
[symndx
]);
1174 const char *name
= h
->root
.root
.root
.string
;
1175 our_toc_offset
= h
->toc_offset
;
1177 if ((r_flags
& IMAGE_REL_PPC_TOCDEFN
)
1178 == IMAGE_REL_PPC_TOCDEFN
)
1180 /* This is unbelievable cheese. Some knowledgable asm
1181 hacker has decided to use r2 as a base for loading
1182 a value. He/She does this by setting the tocdefn bit,
1183 and not supplying a toc definition. The behaviour is
1184 then to use the difference between the value of the
1185 symbol and the actual location of the toc as the toc
1188 In fact, what is usually happening is, because the
1189 Import Address Table is mapped immediately following
1190 the toc, some trippy library code trying for speed on
1191 dll linkage, takes advantage of that and considers
1192 the IAT to be part of the toc, thus saving a load. */
1194 our_toc_offset
= val
- (toc_section
->output_section
->vma
1195 + toc_section
->output_offset
);
1197 /* The size must still fit in a 16-bit displacement. */
1198 if ((bfd_vma
) our_toc_offset
>= 65535)
1200 (*_bfd_error_handler
)
1201 (_("%B: Relocation for %s of %lx exceeds Toc size limit"),
1203 (unsigned long) our_toc_offset
);
1204 bfd_set_error (bfd_error_bad_value
);
1208 record_toc (toc_section
, our_toc_offset
, pub
,
1211 else if (IS_WRITTEN (our_toc_offset
))
1213 /* If it has been written out, it is marked with the
1214 1 bit. Fix up our offset, but do not write it out
1216 MAKE_ADDR_AGAIN(our_toc_offset
);
1220 record_toc(toc_section
, our_toc_offset
, pub
,
1223 /* Write out the toc entry. */
1224 bfd_put_32 (output_bfd
, val
,
1225 toc_section
->contents
+ our_toc_offset
);
1227 MARK_AS_WRITTEN(h
->toc_offset
);
1228 /* The tricky part is that this is the address that
1229 needs a .reloc entry for it. */
1234 if (fixit
&& info
->base_file
)
1236 /* So if this is non pcrelative, and is referenced
1237 to a section or a common symbol, then it needs a reloc. */
1239 /* Relocation to a symbol in a section which
1240 isn't absolute - we output the address here
1242 bfd_vma addr
= (toc_section
->output_section
->vma
1243 + toc_section
->output_offset
+ our_toc_offset
);
1245 if (coff_data (output_bfd
)->pe
)
1246 addr
-= pe_data(output_bfd
)->pe_opthdr
.ImageBase
;
1248 fwrite (&addr
, 1,4, (FILE *) info
->base_file
);
1251 /* FIXME: this test is conservative. */
1252 if ((r_flags
& IMAGE_REL_PPC_TOCDEFN
) != IMAGE_REL_PPC_TOCDEFN
1253 && (bfd_vma
) our_toc_offset
> toc_section
->size
)
1255 (*_bfd_error_handler
)
1256 (_("%B: Relocation exceeds allocated TOC (%lx)"),
1257 input_bfd
, (unsigned long) toc_section
->size
);
1258 bfd_set_error (bfd_error_bad_value
);
1262 /* Now we know the relocation for this toc reference. */
1263 relocation
= our_toc_offset
+ TOC_LOAD_ADJUSTMENT
;
1264 rstat
= _bfd_relocate_contents (howto
, input_bfd
, relocation
, loc
);
1267 case IMAGE_REL_PPC_IFGLUE
:
1269 /* To solve this, we need to know whether or not the symbol
1270 appearing on the call instruction is a glue function or not.
1271 A glue function must announce itself via a IMGLUE reloc, and
1272 the reloc contains the required toc restore instruction. */
1274 const char *my_name
;
1276 DUMP_RELOC2 (howto
->name
, rel
);
1280 my_name
= h
->root
.root
.root
.string
;
1281 if (h
->symbol_is_glue
== 1)
1283 x
= bfd_get_32 (input_bfd
, loc
);
1284 bfd_put_32 (input_bfd
, (bfd_vma
) h
->glue_insn
, loc
);
1289 case IMAGE_REL_PPC_SECREL
:
1290 /* Unimplemented: codeview debugging information. */
1291 /* For fast access to the header of the section
1292 containing the item. */
1294 case IMAGE_REL_PPC_SECTION
:
1295 /* Unimplemented: codeview debugging information. */
1296 /* Is used to indicate that the value should be relative
1297 to the beginning of the section that contains the
1300 case IMAGE_REL_PPC_ABSOLUTE
:
1302 const char *my_name
;
1305 my_name
= (syms
+symndx
)->_n
._n_name
;
1307 my_name
= h
->root
.root
.root
.string
;
1309 (*_bfd_error_handler
)
1310 (_("Warning: unsupported reloc %s <file %B, section %A>\n"
1311 "sym %ld (%s), r_vaddr %ld (%lx)"),
1312 input_bfd
, input_section
, howto
->name
,
1313 rel
->r_symndx
, my_name
, (long) rel
->r_vaddr
,
1314 (unsigned long) rel
->r_vaddr
);
1317 case IMAGE_REL_PPC_IMGLUE
:
1319 /* There is nothing to do now. This reloc was noted in the first
1320 pass over the relocs, and the glue instruction extracted. */
1321 const char *my_name
;
1323 if (h
->symbol_is_glue
== 1)
1325 my_name
= h
->root
.root
.root
.string
;
1327 (*_bfd_error_handler
)
1328 (_("%B: Out of order IMGLUE reloc for %s"), input_bfd
, my_name
);
1329 bfd_set_error (bfd_error_bad_value
);
1333 case IMAGE_REL_PPC_ADDR32NB
:
1335 const char *name
= 0;
1337 DUMP_RELOC2 (howto
->name
, rel
);
1339 if (strncmp(".idata$2",input_section
->name
,8) == 0 && first_thunk_address
== 0)
1341 /* Set magic values. */
1343 struct coff_link_hash_entry
*myh
;
1345 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1347 FALSE
, FALSE
, TRUE
);
1348 first_thunk_address
= myh
->root
.u
.def
.value
+
1349 sec
->output_section
->vma
+
1350 sec
->output_offset
-
1351 pe_data(output_bfd
)->pe_opthdr
.ImageBase
;
1353 idata5offset
= myh
->root
.u
.def
.value
;
1354 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1356 FALSE
, FALSE
, TRUE
);
1358 thunk_size
= myh
->root
.u
.def
.value
- idata5offset
;
1359 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1361 FALSE
, FALSE
, TRUE
);
1362 import_table_size
= myh
->root
.u
.def
.value
;
1367 /* It is a file local symbol. */
1368 sym
= syms
+ symndx
;
1369 name
= sym
->_n
._n_name
;
1375 name
= h
->root
.root
.root
.string
;
1376 if (strcmp (".idata$2", name
) == 0)
1377 target
= "__idata2_magic__";
1378 else if (strcmp (".idata$4", name
) == 0)
1379 target
= "__idata4_magic__";
1380 else if (strcmp (".idata$5", name
) == 0)
1381 target
= "__idata5_magic__";
1385 struct coff_link_hash_entry
*myh
;
1387 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1389 FALSE
, FALSE
, TRUE
);
1392 /* Missing magic cookies. Something is very wrong. */
1396 val
= myh
->root
.u
.def
.value
+
1397 sec
->output_section
->vma
+ sec
->output_offset
;
1398 if (first_thunk_address
== 0)
1401 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1403 FALSE
, FALSE
, TRUE
);
1404 first_thunk_address
= myh
->root
.u
.def
.value
+
1405 sec
->output_section
->vma
+
1406 sec
->output_offset
-
1407 pe_data(output_bfd
)->pe_opthdr
.ImageBase
;
1409 idata5offset
= myh
->root
.u
.def
.value
;
1410 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1412 FALSE
, FALSE
, TRUE
);
1414 thunk_size
= myh
->root
.u
.def
.value
- idata5offset
;
1415 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1417 FALSE
, FALSE
, TRUE
);
1418 import_table_size
= myh
->root
.u
.def
.value
;
1423 rstat
= _bfd_relocate_contents (howto
,
1426 pe_data (output_bfd
)->pe_opthdr
.ImageBase
,
1431 case IMAGE_REL_PPC_REL24
:
1432 DUMP_RELOC2(howto
->name
, rel
);
1433 val
-= (input_section
->output_section
->vma
1434 + input_section
->output_offset
);
1436 rstat
= _bfd_relocate_contents (howto
,
1441 case IMAGE_REL_PPC_ADDR16
:
1442 case IMAGE_REL_PPC_ADDR24
:
1443 case IMAGE_REL_PPC_ADDR32
:
1444 DUMP_RELOC2(howto
->name
, rel
);
1445 rstat
= _bfd_relocate_contents (howto
,
1452 if (info
->base_file
)
1454 /* So if this is non pcrelative, and is referenced
1455 to a section or a common symbol, then it needs a reloc. */
1456 if (sym
&& pe_data(output_bfd
)->in_reloc_p (output_bfd
, howto
))
1458 /* Relocation to a symbol in a section which
1459 isn't absolute - we output the address here
1461 bfd_vma addr
= rel
->r_vaddr
1462 - input_section
->vma
1463 + input_section
->output_offset
1464 + input_section
->output_section
->vma
;
1466 if (coff_data (output_bfd
)->pe
)
1467 addr
-= pe_data (output_bfd
)->pe_opthdr
.ImageBase
;
1469 fwrite (&addr
, 1,4, (FILE *) info
->base_file
);
1479 case bfd_reloc_overflow
:
1482 char buf
[SYMNMLEN
+ 1];
1488 else if (sym
== NULL
)
1490 else if (sym
->_n
._n_n
._n_zeroes
== 0
1491 && sym
->_n
._n_n
._n_offset
!= 0)
1492 name
= obj_coff_strings (input_bfd
) + sym
->_n
._n_n
._n_offset
;
1495 strncpy (buf
, sym
->_n
._n_name
, SYMNMLEN
);
1496 buf
[SYMNMLEN
] = '\0';
1500 if (! ((*info
->callbacks
->reloc_overflow
)
1501 (info
, (h
? &h
->root
.root
: NULL
), name
, howto
->name
,
1502 (bfd_vma
) 0, input_bfd
,
1503 input_section
, rel
->r_vaddr
- input_section
->vma
)))
1512 #ifdef COFF_IMAGE_WITH_PE
1514 /* FIXME: BFD should not use global variables. This file is compiled
1515 twice, and these variables are shared. This is confusing and
1518 long int global_toc_size
= 4;
1520 bfd
* bfd_of_toc_owner
= 0;
1522 long int import_table_size
;
1523 long int first_thunk_address
;
1524 long int thunk_size
;
1526 struct list_ele
*head
;
1527 struct list_ele
*tail
;
1530 h1
= N_("\n\t\t\tTOC MAPPING\n\n");
1532 h2
= N_(" TOC disassembly Comments Name\n");
1534 h3
= N_(" Offset spelling (if present)\n");
1540 FILE *file
= (FILE *) vfile
;
1543 fprintf (file
, _(h1
));
1544 fprintf (file
, _(h2
));
1545 fprintf (file
, _(h3
));
1547 for (t
= head
; t
!= 0; t
=t
->next
)
1549 const char *cat
= "";
1552 cat
= _("private ");
1553 else if (t
->cat
== pub
)
1555 else if (t
->cat
== tocdata
)
1556 cat
= _("data-in-toc ");
1558 if (t
->offset
> global_toc_size
)
1560 if (t
->offset
<= global_toc_size
+ thunk_size
)
1561 cat
= _("IAT reference ");
1565 _("**** global_toc_size %ld(%lx), thunk_size %ld(%lx)\n"),
1566 global_toc_size
, global_toc_size
,
1567 thunk_size
, thunk_size
);
1568 cat
= _("Out of bounds!");
1573 " %04lx (%d)", (unsigned long) t
->offset
, t
->offset
- 32768);
1580 fprintf (file
, "\n");
1584 ppc_allocate_toc_section (info
)
1585 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
1590 static char test_char
= '1';
1592 if ( global_toc_size
== 0 ) /* FIXME: does this get me in trouble? */
1595 if (bfd_of_toc_owner
== 0)
1596 /* No toc owner? Something is very wrong. */
1599 s
= bfd_get_section_by_name ( bfd_of_toc_owner
, TOC_SECTION_NAME
);
1601 /* No toc section? Something is very wrong. */
1604 amt
= global_toc_size
;
1605 foo
= (bfd_byte
*) bfd_alloc (bfd_of_toc_owner
, amt
);
1606 memset(foo
, test_char
, (size_t) global_toc_size
);
1608 s
->size
= global_toc_size
;
1615 ppc_process_before_allocation (abfd
, info
)
1617 struct bfd_link_info
*info
;
1620 struct internal_reloc
*i
, *rel
;
1622 /* Here we have a bfd that is to be included on the link. We have a hook
1623 to do reloc rummaging, before section sizes are nailed down. */
1624 _bfd_coff_get_external_symbols (abfd
);
1626 /* Rummage around all the relocs and map the toc. */
1627 sec
= abfd
->sections
;
1632 for (; sec
!= 0; sec
= sec
->next
)
1634 if (sec
->reloc_count
== 0)
1637 /* load the relocs */
1638 /* FIXME: there may be a storage leak here */
1639 i
=_bfd_coff_read_internal_relocs(abfd
,sec
,1,0,0,0);
1644 for (rel
= i
; rel
< i
+ sec
->reloc_count
; ++rel
)
1646 unsigned short r_type
= EXTRACT_TYPE (rel
->r_type
);
1647 unsigned short r_flags
= EXTRACT_FLAGS (rel
->r_type
);
1648 bfd_boolean ok
= TRUE
;
1650 DUMP_RELOC2 (ppc_coff_howto_table
[r_type
].name
, rel
);
1654 case IMAGE_REL_PPC_TOCREL16
:
1655 /* If TOCDEFN is on, ignore as someone else has allocated the
1657 if ((r_flags
& IMAGE_REL_PPC_TOCDEFN
) != IMAGE_REL_PPC_TOCDEFN
)
1658 ok
= ppc_record_toc_entry(abfd
, info
, sec
,
1659 rel
->r_symndx
, default_toc
);
1663 case IMAGE_REL_PPC_IMGLUE
:
1664 ppc_mark_symbol_as_glue (abfd
, rel
->r_symndx
, rel
);
1677 static bfd_reloc_status_type
1678 ppc_refhi_reloc (abfd
, reloc_entry
, symbol
, data
,
1679 input_section
, output_bfd
, error_message
)
1680 bfd
*abfd ATTRIBUTE_UNUSED
;
1681 arelent
*reloc_entry ATTRIBUTE_UNUSED
;
1682 asymbol
*symbol ATTRIBUTE_UNUSED
;
1683 PTR data ATTRIBUTE_UNUSED
;
1684 asection
*input_section ATTRIBUTE_UNUSED
;
1686 char **error_message ATTRIBUTE_UNUSED
;
1689 DUMP_RELOC("REFHI",reloc_entry
);
1691 if (output_bfd
== (bfd
*) NULL
)
1692 return bfd_reloc_continue
;
1694 return bfd_reloc_undefined
;
1697 static bfd_reloc_status_type
1698 ppc_pair_reloc (abfd
, reloc_entry
, symbol
, data
,
1699 input_section
, output_bfd
, error_message
)
1700 bfd
*abfd ATTRIBUTE_UNUSED
;
1701 arelent
*reloc_entry ATTRIBUTE_UNUSED
;
1702 asymbol
*symbol ATTRIBUTE_UNUSED
;
1703 PTR data ATTRIBUTE_UNUSED
;
1704 asection
*input_section ATTRIBUTE_UNUSED
;
1706 char **error_message ATTRIBUTE_UNUSED
;
1709 DUMP_RELOC("PAIR",reloc_entry
);
1711 if (output_bfd
== (bfd
*) NULL
)
1712 return bfd_reloc_continue
;
1714 return bfd_reloc_undefined
;
1717 static bfd_reloc_status_type
1718 ppc_toc16_reloc (abfd
, reloc_entry
, symbol
, data
,
1719 input_section
, output_bfd
, error_message
)
1720 bfd
*abfd ATTRIBUTE_UNUSED
;
1721 arelent
*reloc_entry ATTRIBUTE_UNUSED
;
1722 asymbol
*symbol ATTRIBUTE_UNUSED
;
1723 PTR data ATTRIBUTE_UNUSED
;
1724 asection
*input_section ATTRIBUTE_UNUSED
;
1726 char **error_message ATTRIBUTE_UNUSED
;
1728 UN_IMPL ("TOCREL16");
1729 DUMP_RELOC ("TOCREL16",reloc_entry
);
1731 if (output_bfd
== (bfd
*) NULL
)
1732 return bfd_reloc_continue
;
1734 return bfd_reloc_ok
;
1737 static bfd_reloc_status_type
1738 ppc_secrel_reloc (abfd
, reloc_entry
, symbol
, data
,
1739 input_section
, output_bfd
, error_message
)
1740 bfd
*abfd ATTRIBUTE_UNUSED
;
1741 arelent
*reloc_entry ATTRIBUTE_UNUSED
;
1742 asymbol
*symbol ATTRIBUTE_UNUSED
;
1743 PTR data ATTRIBUTE_UNUSED
;
1744 asection
*input_section ATTRIBUTE_UNUSED
;
1746 char **error_message ATTRIBUTE_UNUSED
;
1749 DUMP_RELOC("SECREL",reloc_entry
);
1751 if (output_bfd
== (bfd
*) NULL
)
1752 return bfd_reloc_continue
;
1754 return bfd_reloc_ok
;
1757 static bfd_reloc_status_type
1758 ppc_section_reloc (abfd
, reloc_entry
, symbol
, data
,
1759 input_section
, output_bfd
, error_message
)
1760 bfd
*abfd ATTRIBUTE_UNUSED
;
1761 arelent
*reloc_entry ATTRIBUTE_UNUSED
;
1762 asymbol
*symbol ATTRIBUTE_UNUSED
;
1763 PTR data ATTRIBUTE_UNUSED
;
1764 asection
*input_section ATTRIBUTE_UNUSED
;
1766 char **error_message ATTRIBUTE_UNUSED
;
1769 DUMP_RELOC("SECTION",reloc_entry
);
1771 if (output_bfd
== (bfd
*) NULL
)
1772 return bfd_reloc_continue
;
1774 return bfd_reloc_ok
;
1777 static bfd_reloc_status_type
1778 ppc_imglue_reloc (abfd
, reloc_entry
, symbol
, data
,
1779 input_section
, output_bfd
, error_message
)
1780 bfd
*abfd ATTRIBUTE_UNUSED
;
1781 arelent
*reloc_entry ATTRIBUTE_UNUSED
;
1782 asymbol
*symbol ATTRIBUTE_UNUSED
;
1783 PTR data ATTRIBUTE_UNUSED
;
1784 asection
*input_section ATTRIBUTE_UNUSED
;
1786 char **error_message ATTRIBUTE_UNUSED
;
1789 DUMP_RELOC("IMGLUE",reloc_entry
);
1791 if (output_bfd
== (bfd
*) NULL
)
1792 return bfd_reloc_continue
;
1794 return bfd_reloc_ok
;
1797 #define MAX_RELOC_INDEX \
1798 (sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]) - 1)
1800 /* FIXME: There is a possibility that when we read in a reloc from a file,
1801 that there are some bits encoded in the upper portion of the
1802 type field. Not yet implemented. */
1803 static void ppc_coff_rtype2howto
PARAMS ((arelent
*, struct internal_reloc
*));
1806 ppc_coff_rtype2howto (relent
, internal
)
1808 struct internal_reloc
*internal
;
1810 /* We can encode one of three things in the type field, aside from the
1812 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
1813 value, rather than an addition value
1814 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
1815 the branch is expected to be taken or not.
1816 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
1817 For now, we just strip this stuff to find the type, and ignore it other
1819 reloc_howto_type
*howto
;
1820 unsigned short r_type
= EXTRACT_TYPE (internal
->r_type
);
1821 unsigned short r_flags
= EXTRACT_FLAGS(internal
->r_type
);
1822 unsigned short junk
= EXTRACT_JUNK (internal
->r_type
);
1824 /* The masking process only slices off the bottom byte for r_type. */
1825 if ( r_type
> MAX_RELOC_INDEX
)
1828 /* Check for absolute crap. */
1834 case IMAGE_REL_PPC_ADDR16
:
1835 case IMAGE_REL_PPC_REL24
:
1836 case IMAGE_REL_PPC_ADDR24
:
1837 case IMAGE_REL_PPC_ADDR32
:
1838 case IMAGE_REL_PPC_IFGLUE
:
1839 case IMAGE_REL_PPC_ADDR32NB
:
1840 case IMAGE_REL_PPC_SECTION
:
1841 case IMAGE_REL_PPC_SECREL
:
1842 DUMP_RELOC2 (ppc_coff_howto_table
[r_type
].name
, internal
);
1843 howto
= ppc_coff_howto_table
+ r_type
;
1845 case IMAGE_REL_PPC_IMGLUE
:
1846 DUMP_RELOC2 (ppc_coff_howto_table
[r_type
].name
, internal
);
1847 howto
= ppc_coff_howto_table
+ r_type
;
1849 case IMAGE_REL_PPC_TOCREL16
:
1850 DUMP_RELOC2 (ppc_coff_howto_table
[r_type
].name
, internal
);
1851 if (r_flags
& IMAGE_REL_PPC_TOCDEFN
)
1852 howto
= ppc_coff_howto_table
+ IMAGE_REL_PPC_TOCREL16_DEFN
;
1854 howto
= ppc_coff_howto_table
+ IMAGE_REL_PPC_TOCREL16
;
1858 _("Warning: Unsupported reloc %s [%d] used -- it may not work.\n"),
1859 ppc_coff_howto_table
[r_type
].name
,
1861 howto
= ppc_coff_howto_table
+ r_type
;
1865 relent
->howto
= howto
;
1868 static reloc_howto_type
*
1869 coff_ppc_rtype_to_howto (abfd
, sec
, rel
, h
, sym
, addendp
)
1870 bfd
*abfd ATTRIBUTE_UNUSED
;
1872 struct internal_reloc
*rel
;
1873 struct coff_link_hash_entry
*h ATTRIBUTE_UNUSED
;
1874 struct internal_syment
*sym ATTRIBUTE_UNUSED
;
1877 reloc_howto_type
*howto
;
1879 /* We can encode one of three things in the type field, aside from the
1881 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
1882 value, rather than an addition value
1883 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
1884 the branch is expected to be taken or not.
1885 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
1886 For now, we just strip this stuff to find the type, and ignore it other
1889 unsigned short r_type
= EXTRACT_TYPE (rel
->r_type
);
1890 unsigned short r_flags
= EXTRACT_FLAGS (rel
->r_type
);
1891 unsigned short junk
= EXTRACT_JUNK (rel
->r_type
);
1893 /* The masking process only slices off the bottom byte for r_type. */
1894 if (r_type
> MAX_RELOC_INDEX
)
1897 /* Check for absolute crap. */
1903 case IMAGE_REL_PPC_ADDR32NB
:
1904 DUMP_RELOC2(ppc_coff_howto_table
[r_type
].name
, rel
);
1905 *addendp
-= pe_data(sec
->output_section
->owner
)->pe_opthdr
.ImageBase
;
1906 howto
= ppc_coff_howto_table
+ r_type
;
1908 case IMAGE_REL_PPC_TOCREL16
:
1909 DUMP_RELOC2(ppc_coff_howto_table
[r_type
].name
, rel
);
1910 if (r_flags
& IMAGE_REL_PPC_TOCDEFN
)
1911 howto
= ppc_coff_howto_table
+ IMAGE_REL_PPC_TOCREL16_DEFN
;
1913 howto
= ppc_coff_howto_table
+ IMAGE_REL_PPC_TOCREL16
;
1915 case IMAGE_REL_PPC_ADDR16
:
1916 case IMAGE_REL_PPC_REL24
:
1917 case IMAGE_REL_PPC_ADDR24
:
1918 case IMAGE_REL_PPC_ADDR32
:
1919 case IMAGE_REL_PPC_IFGLUE
:
1920 case IMAGE_REL_PPC_SECTION
:
1921 case IMAGE_REL_PPC_SECREL
:
1922 DUMP_RELOC2(ppc_coff_howto_table
[r_type
].name
, rel
);
1923 howto
= ppc_coff_howto_table
+ r_type
;
1925 case IMAGE_REL_PPC_IMGLUE
:
1926 DUMP_RELOC2(ppc_coff_howto_table
[r_type
].name
, rel
);
1927 howto
= ppc_coff_howto_table
+ r_type
;
1931 _("Warning: Unsupported reloc %s [%d] used -- it may not work.\n"),
1932 ppc_coff_howto_table
[r_type
].name
,
1934 howto
= ppc_coff_howto_table
+ r_type
;
1941 /* A cheesy little macro to make the code a little more readable. */
1942 #define HOW2MAP(bfd_rtype,ppc_rtype) \
1943 case bfd_rtype: return &ppc_coff_howto_table[ppc_rtype]
1945 static reloc_howto_type
*ppc_coff_reloc_type_lookup
1946 PARAMS ((bfd
*, bfd_reloc_code_real_type
));
1948 static reloc_howto_type
*
1949 ppc_coff_reloc_type_lookup (abfd
, code
)
1950 bfd
*abfd ATTRIBUTE_UNUSED
;
1951 bfd_reloc_code_real_type code
;
1955 HOW2MAP(BFD_RELOC_32_GOTOFF
, IMAGE_REL_PPC_IMGLUE
);
1956 HOW2MAP(BFD_RELOC_16_GOT_PCREL
, IMAGE_REL_PPC_IFGLUE
);
1957 HOW2MAP(BFD_RELOC_16
, IMAGE_REL_PPC_ADDR16
);
1958 HOW2MAP(BFD_RELOC_PPC_B26
, IMAGE_REL_PPC_REL24
);
1959 HOW2MAP(BFD_RELOC_PPC_BA26
, IMAGE_REL_PPC_ADDR24
);
1960 HOW2MAP(BFD_RELOC_PPC_TOC16
, IMAGE_REL_PPC_TOCREL16
);
1961 HOW2MAP(BFD_RELOC_16_GOTOFF
, IMAGE_REL_PPC_TOCREL16_DEFN
);
1962 HOW2MAP(BFD_RELOC_32
, IMAGE_REL_PPC_ADDR32
);
1963 HOW2MAP(BFD_RELOC_RVA
, IMAGE_REL_PPC_ADDR32NB
);
1971 /* Tailor coffcode.h -- macro heaven. */
1973 #define RTYPE2HOWTO(cache_ptr, dst) ppc_coff_rtype2howto (cache_ptr, dst)
1975 /* We use the special COFF backend linker, with our own special touch. */
1977 #define coff_bfd_reloc_type_lookup ppc_coff_reloc_type_lookup
1978 #define coff_rtype_to_howto coff_ppc_rtype_to_howto
1979 #define coff_relocate_section coff_ppc_relocate_section
1980 #define coff_bfd_final_link ppc_bfd_coff_final_link
1982 #ifndef COFF_IMAGE_WITH_PE
1985 #define SELECT_RELOC(internal, howto) {internal.r_type=howto->type;}
1987 #define COFF_PAGE_SIZE 0x1000
1989 /* FIXME: This controls some code that used to be in peicode.h and is
1990 now in peigen.c. It will not control the code in peigen.c. If
1991 anybody wants to get this working, you will need to fix that. */
1992 #define POWERPC_LE_PE
1994 #define COFF_SECTION_ALIGNMENT_ENTRIES \
1995 { COFF_SECTION_NAME_EXACT_MATCH (".idata$2"), \
1996 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
1997 { COFF_SECTION_NAME_EXACT_MATCH (".idata$3"), \
1998 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
1999 { COFF_SECTION_NAME_EXACT_MATCH (".idata$4"), \
2000 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
2001 { COFF_SECTION_NAME_EXACT_MATCH (".idata$5"), \
2002 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
2003 { COFF_SECTION_NAME_EXACT_MATCH (".idata$6"), \
2004 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }, \
2005 { COFF_SECTION_NAME_EXACT_MATCH (".reloc"), \
2006 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }
2008 #include "coffcode.h"
2010 #ifndef COFF_IMAGE_WITH_PE
2012 static bfd_boolean ppc_do_last
PARAMS ((bfd
*));
2013 static bfd
*ppc_get_last
PARAMS ((void));
2019 if (abfd
== bfd_of_toc_owner
)
2028 return bfd_of_toc_owner
;
2031 /* This piece of machinery exists only to guarantee that the bfd that holds
2032 the toc section is written last.
2034 This does depend on bfd_make_section attaching a new section to the
2035 end of the section list for the bfd.
2037 This is otherwise intended to be functionally the same as
2038 cofflink.c:_bfd_coff_final_link(). It is specifically different only
2039 where the POWERPC_LE_PE macro modifies the code. It is left in as a
2040 precise form of comment. krk@cygnus.com */
2042 /* Do the final link step. */
2045 ppc_bfd_coff_final_link (abfd
, info
)
2047 struct bfd_link_info
*info
;
2049 bfd_size_type symesz
;
2050 struct coff_final_link_info finfo
;
2051 bfd_boolean debug_merge_allocated
;
2053 struct bfd_link_order
*p
;
2054 bfd_size_type max_sym_count
;
2055 bfd_size_type max_lineno_count
;
2056 bfd_size_type max_reloc_count
;
2057 bfd_size_type max_output_reloc_count
;
2058 bfd_size_type max_contents_size
;
2059 file_ptr rel_filepos
;
2061 file_ptr line_filepos
;
2062 unsigned int linesz
;
2064 bfd_byte
*external_relocs
= NULL
;
2065 char strbuf
[STRING_SIZE_SIZE
];
2068 symesz
= bfd_coff_symesz (abfd
);
2071 finfo
.output_bfd
= abfd
;
2072 finfo
.strtab
= NULL
;
2073 finfo
.section_info
= NULL
;
2074 finfo
.last_file_index
= -1;
2075 finfo
.last_bf_index
= -1;
2076 finfo
.internal_syms
= NULL
;
2077 finfo
.sec_ptrs
= NULL
;
2078 finfo
.sym_indices
= NULL
;
2079 finfo
.outsyms
= NULL
;
2080 finfo
.linenos
= NULL
;
2081 finfo
.contents
= NULL
;
2082 finfo
.external_relocs
= NULL
;
2083 finfo
.internal_relocs
= NULL
;
2084 debug_merge_allocated
= FALSE
;
2086 coff_data (abfd
)->link_info
= info
;
2088 finfo
.strtab
= _bfd_stringtab_init ();
2089 if (finfo
.strtab
== NULL
)
2092 if (! coff_debug_merge_hash_table_init (&finfo
.debug_merge
))
2094 debug_merge_allocated
= TRUE
;
2096 /* Compute the file positions for all the sections. */
2097 if (! abfd
->output_has_begun
)
2099 if (! bfd_coff_compute_section_file_positions (abfd
))
2103 /* Count the line numbers and relocation entries required for the
2104 output file. Set the file positions for the relocs. */
2105 rel_filepos
= obj_relocbase (abfd
);
2106 relsz
= bfd_coff_relsz (abfd
);
2107 max_contents_size
= 0;
2108 max_lineno_count
= 0;
2109 max_reloc_count
= 0;
2111 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
2114 o
->lineno_count
= 0;
2116 for (p
= o
->link_order_head
; p
!= NULL
; p
= p
->next
)
2118 if (p
->type
== bfd_indirect_link_order
)
2122 sec
= p
->u
.indirect
.section
;
2124 /* Mark all sections which are to be included in the
2125 link. This will normally be every section. We need
2126 to do this so that we can identify any sections which
2127 the linker has decided to not include. */
2128 sec
->linker_mark
= TRUE
;
2130 if (info
->strip
== strip_none
2131 || info
->strip
== strip_some
)
2132 o
->lineno_count
+= sec
->lineno_count
;
2134 if (info
->relocatable
)
2135 o
->reloc_count
+= sec
->reloc_count
;
2137 if (sec
->rawsize
> max_contents_size
)
2138 max_contents_size
= sec
->rawsize
;
2139 if (sec
->size
> max_contents_size
)
2140 max_contents_size
= sec
->size
;
2141 if (sec
->lineno_count
> max_lineno_count
)
2142 max_lineno_count
= sec
->lineno_count
;
2143 if (sec
->reloc_count
> max_reloc_count
)
2144 max_reloc_count
= sec
->reloc_count
;
2146 else if (info
->relocatable
2147 && (p
->type
== bfd_section_reloc_link_order
2148 || p
->type
== bfd_symbol_reloc_link_order
))
2151 if (o
->reloc_count
== 0)
2155 o
->flags
|= SEC_RELOC
;
2156 o
->rel_filepos
= rel_filepos
;
2157 rel_filepos
+= o
->reloc_count
* relsz
;
2161 /* If doing a relocatable link, allocate space for the pointers we
2163 if (info
->relocatable
)
2167 /* We use section_count + 1, rather than section_count, because
2168 the target_index fields are 1 based. */
2169 amt
= abfd
->section_count
+ 1;
2170 amt
*= sizeof (struct coff_link_section_info
);
2171 finfo
.section_info
= (struct coff_link_section_info
*) bfd_malloc (amt
);
2173 if (finfo
.section_info
== NULL
)
2176 for (i
= 0; i
<= abfd
->section_count
; i
++)
2178 finfo
.section_info
[i
].relocs
= NULL
;
2179 finfo
.section_info
[i
].rel_hashes
= NULL
;
2183 /* We now know the size of the relocs, so we can determine the file
2184 positions of the line numbers. */
2185 line_filepos
= rel_filepos
;
2186 linesz
= bfd_coff_linesz (abfd
);
2187 max_output_reloc_count
= 0;
2189 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
2191 if (o
->lineno_count
== 0)
2192 o
->line_filepos
= 0;
2195 o
->line_filepos
= line_filepos
;
2196 line_filepos
+= o
->lineno_count
* linesz
;
2199 if (o
->reloc_count
!= 0)
2201 /* We don't know the indices of global symbols until we have
2202 written out all the local symbols. For each section in
2203 the output file, we keep an array of pointers to hash
2204 table entries. Each entry in the array corresponds to a
2205 reloc. When we find a reloc against a global symbol, we
2206 set the corresponding entry in this array so that we can
2207 fix up the symbol index after we have written out all the
2210 Because of this problem, we also keep the relocs in
2211 memory until the end of the link. This wastes memory,
2212 but only when doing a relocatable link, which is not the
2214 BFD_ASSERT (info
->relocatable
);
2215 amt
= o
->reloc_count
;
2216 amt
*= sizeof (struct internal_reloc
);
2217 finfo
.section_info
[o
->target_index
].relocs
=
2218 (struct internal_reloc
*) bfd_malloc (amt
);
2219 amt
= o
->reloc_count
;
2220 amt
*= sizeof (struct coff_link_hash_entry
*);
2221 finfo
.section_info
[o
->target_index
].rel_hashes
=
2222 (struct coff_link_hash_entry
**) bfd_malloc (amt
);
2223 if (finfo
.section_info
[o
->target_index
].relocs
== NULL
2224 || finfo
.section_info
[o
->target_index
].rel_hashes
== NULL
)
2227 if (o
->reloc_count
> max_output_reloc_count
)
2228 max_output_reloc_count
= o
->reloc_count
;
2231 /* Reset the reloc and lineno counts, so that we can use them to
2232 count the number of entries we have output so far. */
2234 o
->lineno_count
= 0;
2237 obj_sym_filepos (abfd
) = line_filepos
;
2239 /* Figure out the largest number of symbols in an input BFD. Take
2240 the opportunity to clear the output_has_begun fields of all the
2243 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link_next
)
2247 sub
->output_has_begun
= FALSE
;
2248 sz
= obj_raw_syment_count (sub
);
2249 if (sz
> max_sym_count
)
2253 /* Allocate some buffers used while linking. */
2254 amt
= max_sym_count
* sizeof (struct internal_syment
);
2255 finfo
.internal_syms
= (struct internal_syment
*) bfd_malloc (amt
);
2256 amt
= max_sym_count
* sizeof (asection
*);
2257 finfo
.sec_ptrs
= (asection
**) bfd_malloc (amt
);
2258 amt
= max_sym_count
* sizeof (long);
2259 finfo
.sym_indices
= (long *) bfd_malloc (amt
);
2260 amt
= (max_sym_count
+ 1) * symesz
;
2261 finfo
.outsyms
= (bfd_byte
*) bfd_malloc (amt
);
2262 amt
= max_lineno_count
* bfd_coff_linesz (abfd
);
2263 finfo
.linenos
= (bfd_byte
*) bfd_malloc (amt
);
2264 finfo
.contents
= (bfd_byte
*) bfd_malloc (max_contents_size
);
2265 finfo
.external_relocs
= (bfd_byte
*) bfd_malloc (max_reloc_count
* relsz
);
2266 if (! info
->relocatable
)
2268 amt
= max_reloc_count
* sizeof (struct internal_reloc
);
2269 finfo
.internal_relocs
= (struct internal_reloc
*) bfd_malloc (amt
);
2271 if ((finfo
.internal_syms
== NULL
&& max_sym_count
> 0)
2272 || (finfo
.sec_ptrs
== NULL
&& max_sym_count
> 0)
2273 || (finfo
.sym_indices
== NULL
&& max_sym_count
> 0)
2274 || finfo
.outsyms
== NULL
2275 || (finfo
.linenos
== NULL
&& max_lineno_count
> 0)
2276 || (finfo
.contents
== NULL
&& max_contents_size
> 0)
2277 || (finfo
.external_relocs
== NULL
&& max_reloc_count
> 0)
2278 || (! info
->relocatable
2279 && finfo
.internal_relocs
== NULL
2280 && max_reloc_count
> 0))
2283 /* We now know the position of everything in the file, except that
2284 we don't know the size of the symbol table and therefore we don't
2285 know where the string table starts. We just build the string
2286 table in memory as we go along. We process all the relocations
2287 for a single input file at once. */
2288 obj_raw_syment_count (abfd
) = 0;
2290 if (coff_backend_info (abfd
)->_bfd_coff_start_final_link
)
2292 if (! bfd_coff_start_final_link (abfd
, info
))
2296 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
2298 for (p
= o
->link_order_head
; p
!= NULL
; p
= p
->next
)
2300 if (p
->type
== bfd_indirect_link_order
2301 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
2302 == bfd_target_coff_flavour
))
2304 sub
= p
->u
.indirect
.section
->owner
;
2305 #ifdef POWERPC_LE_PE
2306 if (! sub
->output_has_begun
&& !ppc_do_last(sub
))
2308 if (! sub
->output_has_begun
)
2311 if (! _bfd_coff_link_input_bfd (&finfo
, sub
))
2313 sub
->output_has_begun
= TRUE
;
2316 else if (p
->type
== bfd_section_reloc_link_order
2317 || p
->type
== bfd_symbol_reloc_link_order
)
2319 if (! _bfd_coff_reloc_link_order (abfd
, &finfo
, o
, p
))
2324 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
2330 #ifdef POWERPC_LE_PE
2332 bfd
* last_one
= ppc_get_last();
2335 if (! _bfd_coff_link_input_bfd (&finfo
, last_one
))
2338 last_one
->output_has_begun
= TRUE
;
2342 /* Free up the buffers used by _bfd_coff_link_input_bfd. */
2343 coff_debug_merge_hash_table_free (&finfo
.debug_merge
);
2344 debug_merge_allocated
= FALSE
;
2346 if (finfo
.internal_syms
!= NULL
)
2348 free (finfo
.internal_syms
);
2349 finfo
.internal_syms
= NULL
;
2351 if (finfo
.sec_ptrs
!= NULL
)
2353 free (finfo
.sec_ptrs
);
2354 finfo
.sec_ptrs
= NULL
;
2356 if (finfo
.sym_indices
!= NULL
)
2358 free (finfo
.sym_indices
);
2359 finfo
.sym_indices
= NULL
;
2361 if (finfo
.linenos
!= NULL
)
2363 free (finfo
.linenos
);
2364 finfo
.linenos
= NULL
;
2366 if (finfo
.contents
!= NULL
)
2368 free (finfo
.contents
);
2369 finfo
.contents
= NULL
;
2371 if (finfo
.external_relocs
!= NULL
)
2373 free (finfo
.external_relocs
);
2374 finfo
.external_relocs
= NULL
;
2376 if (finfo
.internal_relocs
!= NULL
)
2378 free (finfo
.internal_relocs
);
2379 finfo
.internal_relocs
= NULL
;
2382 /* The value of the last C_FILE symbol is supposed to be the symbol
2383 index of the first external symbol. Write it out again if
2385 if (finfo
.last_file_index
!= -1
2386 && (unsigned int) finfo
.last_file
.n_value
!= obj_raw_syment_count (abfd
))
2390 finfo
.last_file
.n_value
= obj_raw_syment_count (abfd
);
2391 bfd_coff_swap_sym_out (abfd
, (PTR
) &finfo
.last_file
,
2392 (PTR
) finfo
.outsyms
);
2393 pos
= obj_sym_filepos (abfd
) + finfo
.last_file_index
* symesz
;
2394 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
2395 || bfd_bwrite (finfo
.outsyms
, symesz
, abfd
) != symesz
)
2399 /* Write out the global symbols. */
2400 finfo
.failed
= FALSE
;
2401 coff_link_hash_traverse (coff_hash_table (info
), _bfd_coff_write_global_sym
,
2406 /* The outsyms buffer is used by _bfd_coff_write_global_sym. */
2407 if (finfo
.outsyms
!= NULL
)
2409 free (finfo
.outsyms
);
2410 finfo
.outsyms
= NULL
;
2413 if (info
->relocatable
)
2415 /* Now that we have written out all the global symbols, we know
2416 the symbol indices to use for relocs against them, and we can
2417 finally write out the relocs. */
2418 amt
= max_output_reloc_count
* relsz
;
2419 external_relocs
= (bfd_byte
*) bfd_malloc (amt
);
2420 if (external_relocs
== NULL
)
2423 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
2425 struct internal_reloc
*irel
;
2426 struct internal_reloc
*irelend
;
2427 struct coff_link_hash_entry
**rel_hash
;
2430 if (o
->reloc_count
== 0)
2433 irel
= finfo
.section_info
[o
->target_index
].relocs
;
2434 irelend
= irel
+ o
->reloc_count
;
2435 rel_hash
= finfo
.section_info
[o
->target_index
].rel_hashes
;
2436 erel
= external_relocs
;
2437 for (; irel
< irelend
; irel
++, rel_hash
++, erel
+= relsz
)
2439 if (*rel_hash
!= NULL
)
2441 BFD_ASSERT ((*rel_hash
)->indx
>= 0);
2442 irel
->r_symndx
= (*rel_hash
)->indx
;
2444 bfd_coff_swap_reloc_out (abfd
, (PTR
) irel
, (PTR
) erel
);
2447 amt
= relsz
* o
->reloc_count
;
2448 if (bfd_seek (abfd
, o
->rel_filepos
, SEEK_SET
) != 0
2449 || bfd_bwrite ((PTR
) external_relocs
, amt
, abfd
) != amt
)
2453 free (external_relocs
);
2454 external_relocs
= NULL
;
2457 /* Free up the section information. */
2458 if (finfo
.section_info
!= NULL
)
2462 for (i
= 0; i
< abfd
->section_count
; i
++)
2464 if (finfo
.section_info
[i
].relocs
!= NULL
)
2465 free (finfo
.section_info
[i
].relocs
);
2466 if (finfo
.section_info
[i
].rel_hashes
!= NULL
)
2467 free (finfo
.section_info
[i
].rel_hashes
);
2469 free (finfo
.section_info
);
2470 finfo
.section_info
= NULL
;
2473 /* If we have optimized stabs strings, output them. */
2474 if (coff_hash_table (info
)->stab_info
.stabstr
!= NULL
)
2476 if (! _bfd_write_stab_strings (abfd
, &coff_hash_table (info
)->stab_info
))
2480 /* Write out the string table. */
2481 if (obj_raw_syment_count (abfd
) != 0)
2485 pos
= obj_sym_filepos (abfd
) + obj_raw_syment_count (abfd
) * symesz
;
2486 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0)
2489 #if STRING_SIZE_SIZE == 4
2491 _bfd_stringtab_size (finfo
.strtab
) + STRING_SIZE_SIZE
,
2494 #error Change H_PUT_32 above
2497 if (bfd_bwrite (strbuf
, (bfd_size_type
) STRING_SIZE_SIZE
, abfd
)
2498 != STRING_SIZE_SIZE
)
2501 if (! _bfd_stringtab_emit (abfd
, finfo
.strtab
))
2505 _bfd_stringtab_free (finfo
.strtab
);
2507 /* Setting bfd_get_symcount to 0 will cause write_object_contents to
2508 not try to write out the symbols. */
2509 bfd_get_symcount (abfd
) = 0;
2514 if (debug_merge_allocated
)
2515 coff_debug_merge_hash_table_free (&finfo
.debug_merge
);
2516 if (finfo
.strtab
!= NULL
)
2517 _bfd_stringtab_free (finfo
.strtab
);
2518 if (finfo
.section_info
!= NULL
)
2522 for (i
= 0; i
< abfd
->section_count
; i
++)
2524 if (finfo
.section_info
[i
].relocs
!= NULL
)
2525 free (finfo
.section_info
[i
].relocs
);
2526 if (finfo
.section_info
[i
].rel_hashes
!= NULL
)
2527 free (finfo
.section_info
[i
].rel_hashes
);
2529 free (finfo
.section_info
);
2531 if (finfo
.internal_syms
!= NULL
)
2532 free (finfo
.internal_syms
);
2533 if (finfo
.sec_ptrs
!= NULL
)
2534 free (finfo
.sec_ptrs
);
2535 if (finfo
.sym_indices
!= NULL
)
2536 free (finfo
.sym_indices
);
2537 if (finfo
.outsyms
!= NULL
)
2538 free (finfo
.outsyms
);
2539 if (finfo
.linenos
!= NULL
)
2540 free (finfo
.linenos
);
2541 if (finfo
.contents
!= NULL
)
2542 free (finfo
.contents
);
2543 if (finfo
.external_relocs
!= NULL
)
2544 free (finfo
.external_relocs
);
2545 if (finfo
.internal_relocs
!= NULL
)
2546 free (finfo
.internal_relocs
);
2547 if (external_relocs
!= NULL
)
2548 free (external_relocs
);
2553 /* Forward declaration for use by alternative_target field. */
2554 #ifdef TARGET_BIG_SYM
2555 extern const bfd_target TARGET_BIG_SYM
;
2558 /* The transfer vectors that lead the outside world to all of the above. */
2560 #ifdef TARGET_LITTLE_SYM
2561 const bfd_target TARGET_LITTLE_SYM
=
2563 TARGET_LITTLE_NAME
, /* name or coff-arm-little */
2564 bfd_target_coff_flavour
,
2565 BFD_ENDIAN_LITTLE
, /* data byte order is little */
2566 BFD_ENDIAN_LITTLE
, /* header byte order is little */
2568 (HAS_RELOC
| EXEC_P
| /* FIXME: object flags */
2569 HAS_LINENO
| HAS_DEBUG
|
2570 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| D_PAGED
),
2572 #ifndef COFF_WITH_PE
2573 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* section flags */
2575 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
/* section flags */
2576 | SEC_LINK_ONCE
| SEC_LINK_DUPLICATES
),
2579 0, /* leading char */
2580 '/', /* ar_pad_char */
2581 15, /* ar_max_namelen??? FIXMEmgo */
2583 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
2584 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
2585 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* data */
2587 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
2588 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
2589 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* hdrs */
2591 {_bfd_dummy_target
, coff_object_p
, /* bfd_check_format */
2592 bfd_generic_archive_p
, /* _bfd_dummy_target */ coff_object_p
},
2593 {bfd_false
, coff_mkobject
, _bfd_generic_mkarchive
, /* bfd_set_format */
2595 {bfd_false
, coff_write_object_contents
, /* bfd_write_contents */
2596 _bfd_write_archive_contents
, bfd_false
},
2598 BFD_JUMP_TABLE_GENERIC (coff
),
2599 BFD_JUMP_TABLE_COPY (coff
),
2600 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
2601 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff
),
2602 BFD_JUMP_TABLE_SYMBOLS (coff
),
2603 BFD_JUMP_TABLE_RELOCS (coff
),
2604 BFD_JUMP_TABLE_WRITE (coff
),
2605 BFD_JUMP_TABLE_LINK (coff
),
2606 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),
2608 /* Alternative_target. */
2609 #ifdef TARGET_BIG_SYM
2619 #ifdef TARGET_BIG_SYM
2620 const bfd_target TARGET_BIG_SYM
=
2623 bfd_target_coff_flavour
,
2624 BFD_ENDIAN_BIG
, /* data byte order is big */
2625 BFD_ENDIAN_BIG
, /* header byte order is big */
2627 (HAS_RELOC
| EXEC_P
| /* FIXME: object flags */
2628 HAS_LINENO
| HAS_DEBUG
|
2629 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| D_PAGED
),
2631 #ifndef COFF_WITH_PE
2632 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* section flags */
2634 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
/* section flags */
2635 | SEC_LINK_ONCE
| SEC_LINK_DUPLICATES
),
2638 0, /* leading char */
2639 '/', /* ar_pad_char */
2640 15, /* ar_max_namelen??? FIXMEmgo */
2642 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
2643 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
2644 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* data */
2646 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
2647 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
2648 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* hdrs */
2650 {_bfd_dummy_target
, coff_object_p
, /* bfd_check_format */
2651 bfd_generic_archive_p
, /* _bfd_dummy_target */ coff_object_p
},
2652 {bfd_false
, coff_mkobject
, _bfd_generic_mkarchive
, /* bfd_set_format */
2654 {bfd_false
, coff_write_object_contents
, /* bfd_write_contents */
2655 _bfd_write_archive_contents
, bfd_false
},
2657 BFD_JUMP_TABLE_GENERIC (coff
),
2658 BFD_JUMP_TABLE_COPY (coff
),
2659 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
2660 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff
),
2661 BFD_JUMP_TABLE_SYMBOLS (coff
),
2662 BFD_JUMP_TABLE_RELOCS (coff
),
2663 BFD_JUMP_TABLE_WRITE (coff
),
2664 BFD_JUMP_TABLE_LINK (coff
),
2665 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),
2667 /* Alternative_target. */
2668 #ifdef TARGET_LITTLE_SYM
2669 & TARGET_LITTLE_SYM
,