1 /* BFD back-end for PowerPC Microsoft Portable Executable files.
2 Copyright (C) 1990-2020 Free Software Foundation, Inc.
4 Original version pieced together by Kim Knuttila (krk@cygnus.com)
6 There is nothing new under the sun. This file draws a lot on other
7 coff files, in particular, those for the rs/6000, alpha, mips, and
8 intel backends, and the PE work for the arm.
10 This file is part of BFD, the Binary File Descriptor library.
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 3 of the License, or
15 (at your option) any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, 51 Franklin Street - Fifth Floor,
25 Boston, MA 02110-1301, USA. */
29 - relocs generated by gas
30 - ld will link files, but they do not run.
31 - dlltool will not produce correct output in some .reloc cases, and will
32 not produce the right glue code for dll function calls. */
38 #include "coff/powerpc.h"
39 #include "coff/internal.h"
47 #define BADMAG(x) PPCBADMAG(x)
51 /* This file is compiled more than once, but we only compile the
52 final_link routine once. */
53 extern bfd_boolean
ppc_bfd_coff_final_link (bfd
*, struct bfd_link_info
*);
54 extern void dump_toc (void *);
56 /* The toc is a set of bfd_vma fields. We use the fact that valid
57 addresses are even (i.e. the bit representing "1" is off) to allow
58 us to encode a little extra information in the field
59 - Unallocated addresses are initialized to 1.
60 - Allocated addresses are even numbers.
61 The first time we actually write a reference to the toc in the bfd,
62 we want to record that fact in a fixup file (if it is asked for), so
63 we keep track of whether or not an address has been written by marking
64 the low order bit with a "1" upon writing. */
66 #define SET_UNALLOCATED(x) ((x) = 1)
67 #define IS_UNALLOCATED(x) ((x) == 1)
69 #define IS_WRITTEN(x) ((x) & 1)
70 #define MARK_AS_WRITTEN(x) ((x) |= 1)
71 #define MAKE_ADDR_AGAIN(x) ((x) &= ~1)
73 /* Turn on this check if you suspect something amiss in the hash tables. */
76 /* Need a 7 char string for an eye catcher. */
79 #define HASH_CHECK_DCL char eye_catcher[8];
80 #define HASH_CHECK_INIT(ret) strcpy(ret->eye_catcher, EYE)
81 #define HASH_CHECK(addr) \
82 if (strcmp (addr->eye_catcher, EYE) != 0) \
85 /* xgettext: c-format */ \
86 _("File %s, line %d, Hash check failure, bad eye %8s\n"), \
87 __FILE__, __LINE__, addr->eye_catcher); \
93 #define HASH_CHECK_DCL
94 #define HASH_CHECK_INIT(ret)
95 #define HASH_CHECK(addr)
99 /* In order not to add an int to every hash table item for every coff
100 linker, we define our own hash table, derived from the coff one. */
102 /* PE linker hash table entries. */
104 struct ppc_coff_link_hash_entry
106 struct coff_link_hash_entry root
; /* First entry, as required. */
108 /* As we wonder around the relocs, we'll keep the assigned toc_offset
110 bfd_vma toc_offset
; /* Our addition, as required. */
112 unsigned long int glue_insn
;
117 /* PE linker hash table. */
119 struct ppc_coff_link_hash_table
121 struct coff_link_hash_table root
; /* First entry, as required. */
124 /* Routine to create an entry in the link hash table. */
126 static struct bfd_hash_entry
*
127 ppc_coff_link_hash_newfunc (struct bfd_hash_entry
* entry
,
128 struct bfd_hash_table
* table
,
131 struct ppc_coff_link_hash_entry
*ret
=
132 (struct ppc_coff_link_hash_entry
*) entry
;
134 /* Allocate the structure if it has not already been allocated by a
136 if (ret
== (struct ppc_coff_link_hash_entry
*) NULL
)
137 ret
= (struct ppc_coff_link_hash_entry
*)
138 bfd_hash_allocate (table
,
139 sizeof (struct ppc_coff_link_hash_entry
));
141 if (ret
== (struct ppc_coff_link_hash_entry
*) NULL
)
144 /* Call the allocation method of the superclass. */
145 ret
= ((struct ppc_coff_link_hash_entry
*)
146 _bfd_coff_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
151 /* Initialize the local fields. */
152 SET_UNALLOCATED (ret
->toc_offset
);
153 ret
->symbol_is_glue
= 0;
156 HASH_CHECK_INIT (ret
);
159 return (struct bfd_hash_entry
*) ret
;
162 /* Initialize a PE linker hash table. */
165 ppc_coff_link_hash_table_init (struct ppc_coff_link_hash_table
*table
,
167 struct bfd_hash_entry
*(*newfunc
)
168 (struct bfd_hash_entry
*,
169 struct bfd_hash_table
*,
171 unsigned int entsize
)
173 return _bfd_coff_link_hash_table_init (&table
->root
, abfd
, newfunc
, entsize
);
176 /* Create a PE linker hash table. */
178 static struct bfd_link_hash_table
*
179 ppc_coff_link_hash_table_create (bfd
*abfd
)
181 struct ppc_coff_link_hash_table
*ret
;
182 size_t amt
= sizeof (struct ppc_coff_link_hash_table
);
184 ret
= (struct ppc_coff_link_hash_table
*) bfd_malloc (amt
);
187 if (!ppc_coff_link_hash_table_init (ret
, abfd
,
188 ppc_coff_link_hash_newfunc
,
189 sizeof (struct ppc_coff_link_hash_entry
)))
192 return (struct bfd_link_hash_table
*) NULL
;
194 return &ret
->root
.root
;
197 /* Now, tailor coffcode.h to use our hash stuff. */
199 #define coff_bfd_link_hash_table_create ppc_coff_link_hash_table_create
201 /* The nt loader points the toc register to &toc + 32768, in order to
202 use the complete range of a 16-bit displacement. We have to adjust
203 for this when we fix up loads displaced off the toc reg. */
204 #define TOC_LOAD_ADJUSTMENT (-32768)
205 #define TOC_SECTION_NAME ".private.toc"
207 /* The main body of code is in coffcode.h. */
209 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
211 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
212 from smaller values. Start with zero, widen, *then* decrement. */
213 #define MINUS_ONE (((bfd_vma)0) - 1)
215 /* These should definitely go in a header file somewhere... */
218 #define IMAGE_REL_PPC_ABSOLUTE 0x0000
221 #define IMAGE_REL_PPC_ADDR64 0x0001
224 #define IMAGE_REL_PPC_ADDR32 0x0002
226 /* 26-bit address, shifted left 2 (branch absolute) */
227 #define IMAGE_REL_PPC_ADDR24 0x0003
230 #define IMAGE_REL_PPC_ADDR16 0x0004
232 /* 16-bit address, shifted left 2 (load doubleword) */
233 #define IMAGE_REL_PPC_ADDR14 0x0005
235 /* 26-bit PC-relative offset, shifted left 2 (branch relative) */
236 #define IMAGE_REL_PPC_REL24 0x0006
238 /* 16-bit PC-relative offset, shifted left 2 (br cond relative) */
239 #define IMAGE_REL_PPC_REL14 0x0007
241 /* 16-bit offset from TOC base */
242 #define IMAGE_REL_PPC_TOCREL16 0x0008
244 /* 16-bit offset from TOC base, shifted left 2 (load doubleword) */
245 #define IMAGE_REL_PPC_TOCREL14 0x0009
247 /* 32-bit addr w/o image base */
248 #define IMAGE_REL_PPC_ADDR32NB 0x000A
250 /* va of containing section (as in an image sectionhdr) */
251 #define IMAGE_REL_PPC_SECREL 0x000B
253 /* sectionheader number */
254 #define IMAGE_REL_PPC_SECTION 0x000C
256 /* substitute TOC restore instruction iff symbol is glue code */
257 #define IMAGE_REL_PPC_IFGLUE 0x000D
259 /* symbol is glue code; virtual address is TOC restore instruction */
260 #define IMAGE_REL_PPC_IMGLUE 0x000E
262 /* va of containing section (limited to 16 bits) */
263 #define IMAGE_REL_PPC_SECREL16 0x000F
265 /* Stuff to handle immediate data when the number of bits in the
266 data is greater than the number of bits in the immediate field
267 We need to do (usually) 32 bit arithmetic on 16 bit chunks. */
268 #define IMAGE_REL_PPC_REFHI 0x0010
269 #define IMAGE_REL_PPC_REFLO 0x0011
270 #define IMAGE_REL_PPC_PAIR 0x0012
272 /* This is essentially the same as tocrel16, with TOCDEFN assumed. */
273 #define IMAGE_REL_PPC_TOCREL16_DEFN 0x0013
275 /* Flag bits in IMAGE_RELOCATION.TYPE. */
277 /* Subtract reloc value rather than adding it. */
278 #define IMAGE_REL_PPC_NEG 0x0100
280 /* Fix branch prediction bit to predict branch taken. */
281 #define IMAGE_REL_PPC_BRTAKEN 0x0200
283 /* Fix branch prediction bit to predict branch not taken. */
284 #define IMAGE_REL_PPC_BRNTAKEN 0x0400
286 /* TOC slot defined in file (or, data in toc). */
287 #define IMAGE_REL_PPC_TOCDEFN 0x0800
289 /* Masks to isolate above values in IMAGE_RELOCATION.Type. */
290 #define IMAGE_REL_PPC_TYPEMASK 0x00FF
291 #define IMAGE_REL_PPC_FLAGMASK 0x0F00
293 #define EXTRACT_TYPE(x) ((x) & IMAGE_REL_PPC_TYPEMASK)
294 #define EXTRACT_FLAGS(x) ((x) & IMAGE_REL_PPC_FLAGMASK)
295 #define EXTRACT_JUNK(x) \
296 ((x) & ~(IMAGE_REL_PPC_TYPEMASK | IMAGE_REL_PPC_FLAGMASK))
298 /* Static helper functions to make relocation work. */
299 /* (Work In Progress) */
301 static bfd_reloc_status_type ppc_refhi_reloc
302 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
303 static bfd_reloc_status_type ppc_pair_reloc
304 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
305 static bfd_reloc_status_type ppc_toc16_reloc
306 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
307 static bfd_reloc_status_type ppc_section_reloc
308 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
309 static bfd_reloc_status_type ppc_secrel_reloc
310 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
311 static bfd_reloc_status_type ppc_imglue_reloc
312 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
314 /* FIXME: It'll take a while to get through all of these. I only need a few to
315 get us started, so those I'll make sure work. Those marked FIXME are either
316 completely unverified or have a specific unknown marked in the comment. */
318 /* Relocation entries for Windows/NT on PowerPC.
320 From the document "" we find the following listed as used relocs:
323 ADDR[64|32|16] : fields that hold addresses in data fields or the
324 16 bit displacement field on a load/store.
325 ADDR[24|14] : fields that hold addresses in branch and cond
326 branches. These represent [26|16] bit addresses.
327 The low order 2 bits are preserved.
328 REL[24|14] : branches relative to the Instruction Address
329 register. These represent [26|16] bit addresses,
330 as before. The instruction field will be zero, and
331 the address of the SYM will be inserted at link time.
332 TOCREL16 : 16 bit displacement field referring to a slot in
334 TOCREL14 : 16 bit displacement field, similar to REL14 or ADDR14.
335 ADDR32NB : 32 bit address relative to the virtual origin.
336 (On the alpha, this is always a linker generated thunk)
337 (i.e. 32bit addr relative to the image base)
338 SECREL : The value is relative to the start of the section
339 containing the symbol.
340 SECTION : access to the header containing the item. Supports the
343 In particular, note that the document does not indicate that the
344 relocations listed in the header file are used. */
347 static reloc_howto_type ppc_coff_howto_table
[] =
349 /* IMAGE_REL_PPC_ABSOLUTE 0x0000 NOP */
351 HOWTO (IMAGE_REL_PPC_ABSOLUTE
, /* type */
353 0, /* size (0 = byte, 1 = short, 2 = long) */
355 FALSE
, /* pc_relative */
357 complain_overflow_dont
, /* dont complain_on_overflow */
358 0, /* special_function */
359 "ABSOLUTE", /* name */
360 FALSE
, /* partial_inplace */
363 FALSE
), /* pcrel_offset */
365 /* IMAGE_REL_PPC_ADDR64 0x0001 64-bit address */
367 HOWTO(IMAGE_REL_PPC_ADDR64
, /* type */
369 3, /* size (0 = byte, 1 = short, 2 = long) */
371 FALSE
, /* pc_relative */
373 complain_overflow_bitfield
, /* complain_on_overflow */
374 0, /* special_function */
376 TRUE
, /* partial_inplace */
377 MINUS_ONE
, /* src_mask */
378 MINUS_ONE
, /* dst_mask */
379 FALSE
), /* pcrel_offset */
381 /* IMAGE_REL_PPC_ADDR32 0x0002 32-bit address */
383 HOWTO (IMAGE_REL_PPC_ADDR32
, /* type */
385 2, /* size (0 = byte, 1 = short, 2 = long) */
387 FALSE
, /* pc_relative */
389 complain_overflow_bitfield
, /* complain_on_overflow */
390 0, /* special_function */
392 TRUE
, /* partial_inplace */
393 0xffffffff, /* src_mask */
394 0xffffffff, /* dst_mask */
395 FALSE
), /* pcrel_offset */
397 /* IMAGE_REL_PPC_ADDR24 0x0003 26-bit address, shifted left 2 (branch absolute) */
398 /* the LI field is in bit 6 through bit 29 is 24 bits, + 2 for the shift */
399 /* Of course, That's the IBM approved bit numbering, which is not what */
400 /* anyone else uses.... The li field is in bit 2 thru 25 */
402 HOWTO (IMAGE_REL_PPC_ADDR24
, /* type */
404 2, /* size (0 = byte, 1 = short, 2 = long) */
406 FALSE
, /* pc_relative */
408 complain_overflow_bitfield
, /* complain_on_overflow */
409 0, /* special_function */
411 TRUE
, /* partial_inplace */
412 0x07fffffc, /* src_mask */
413 0x07fffffc, /* dst_mask */
414 FALSE
), /* pcrel_offset */
416 /* IMAGE_REL_PPC_ADDR16 0x0004 16-bit address */
418 HOWTO (IMAGE_REL_PPC_ADDR16
, /* type */
420 1, /* size (0 = byte, 1 = short, 2 = long) */
422 FALSE
, /* pc_relative */
424 complain_overflow_signed
, /* complain_on_overflow */
425 0, /* special_function */
427 TRUE
, /* partial_inplace */
428 0xffff, /* src_mask */
429 0xffff, /* dst_mask */
430 FALSE
), /* pcrel_offset */
432 /* IMAGE_REL_PPC_ADDR14 0x0005 */
433 /* 16-bit address, shifted left 2 (load doubleword) */
434 /* FIXME: the mask is likely wrong, and the bit position may be as well */
436 HOWTO (IMAGE_REL_PPC_ADDR14
, /* type */
438 1, /* size (0 = byte, 1 = short, 2 = long) */
440 FALSE
, /* pc_relative */
442 complain_overflow_signed
, /* complain_on_overflow */
443 0, /* special_function */
445 TRUE
, /* partial_inplace */
446 0xffff, /* src_mask */
447 0xffff, /* dst_mask */
448 FALSE
), /* pcrel_offset */
450 /* IMAGE_REL_PPC_REL24 0x0006 */
451 /* 26-bit PC-relative offset, shifted left 2 (branch relative) */
453 HOWTO (IMAGE_REL_PPC_REL24
, /* type */
455 2, /* size (0 = byte, 1 = short, 2 = long) */
457 TRUE
, /* pc_relative */
459 complain_overflow_signed
, /* complain_on_overflow */
460 0, /* special_function */
462 TRUE
, /* partial_inplace */
463 0x3fffffc, /* src_mask */
464 0x3fffffc, /* dst_mask */
465 FALSE
), /* pcrel_offset */
467 /* IMAGE_REL_PPC_REL14 0x0007 */
468 /* 16-bit PC-relative offset, shifted left 2 (br cond relative) */
469 /* FIXME: the mask is likely wrong, and the bit position may be as well */
470 /* FIXME: how does it know how far to shift? */
472 HOWTO (IMAGE_REL_PPC_ADDR14
, /* type */
474 1, /* size (0 = byte, 1 = short, 2 = long) */
476 FALSE
, /* pc_relative */
478 complain_overflow_signed
, /* complain_on_overflow */
479 0, /* special_function */
481 TRUE
, /* partial_inplace */
482 0xffff, /* src_mask */
483 0xffff, /* dst_mask */
484 TRUE
), /* pcrel_offset */
486 /* IMAGE_REL_PPC_TOCREL16 0x0008 */
487 /* 16-bit offset from TOC base */
489 HOWTO (IMAGE_REL_PPC_TOCREL16
,/* type */
491 1, /* size (0 = byte, 1 = short, 2 = long) */
493 FALSE
, /* pc_relative */
495 complain_overflow_dont
, /* complain_on_overflow */
496 ppc_toc16_reloc
, /* special_function */
497 "TOCREL16", /* name */
498 FALSE
, /* partial_inplace */
499 0xffff, /* src_mask */
500 0xffff, /* dst_mask */
501 FALSE
), /* pcrel_offset */
503 /* IMAGE_REL_PPC_TOCREL14 0x0009 */
504 /* 16-bit offset from TOC base, shifted left 2 (load doubleword) */
506 HOWTO (IMAGE_REL_PPC_TOCREL14
,/* type */
508 1, /* size (0 = byte, 1 = short, 2 = long) */
510 FALSE
, /* pc_relative */
512 complain_overflow_signed
, /* complain_on_overflow */
513 0, /* special_function */
514 "TOCREL14", /* name */
515 FALSE
, /* partial_inplace */
516 0xffff, /* src_mask */
517 0xffff, /* dst_mask */
518 FALSE
), /* pcrel_offset */
520 /* IMAGE_REL_PPC_ADDR32NB 0x000A */
521 /* 32-bit addr w/ image base */
523 HOWTO (IMAGE_REL_PPC_ADDR32NB
,/* type */
525 2, /* size (0 = byte, 1 = short, 2 = long) */
527 FALSE
, /* pc_relative */
529 complain_overflow_signed
, /* complain_on_overflow */
530 0, /* special_function */
531 "ADDR32NB", /* name */
532 TRUE
, /* partial_inplace */
533 0xffffffff, /* src_mask */
534 0xffffffff, /* dst_mask */
535 FALSE
), /* pcrel_offset */
537 /* IMAGE_REL_PPC_SECREL 0x000B */
538 /* va of containing section (as in an image sectionhdr) */
540 HOWTO (IMAGE_REL_PPC_SECREL
,/* type */
542 2, /* size (0 = byte, 1 = short, 2 = long) */
544 FALSE
, /* pc_relative */
546 complain_overflow_signed
, /* complain_on_overflow */
547 ppc_secrel_reloc
, /* special_function */
549 TRUE
, /* partial_inplace */
550 0xffffffff, /* src_mask */
551 0xffffffff, /* dst_mask */
552 TRUE
), /* pcrel_offset */
554 /* IMAGE_REL_PPC_SECTION 0x000C */
555 /* sectionheader number */
557 HOWTO (IMAGE_REL_PPC_SECTION
,/* type */
559 2, /* size (0 = byte, 1 = short, 2 = long) */
561 FALSE
, /* pc_relative */
563 complain_overflow_signed
, /* complain_on_overflow */
564 ppc_section_reloc
, /* special_function */
565 "SECTION", /* name */
566 TRUE
, /* partial_inplace */
567 0xffffffff, /* src_mask */
568 0xffffffff, /* dst_mask */
569 TRUE
), /* pcrel_offset */
571 /* IMAGE_REL_PPC_IFGLUE 0x000D */
572 /* substitute TOC restore instruction iff symbol is glue code */
574 HOWTO (IMAGE_REL_PPC_IFGLUE
,/* type */
576 2, /* size (0 = byte, 1 = short, 2 = long) */
578 FALSE
, /* pc_relative */
580 complain_overflow_signed
, /* complain_on_overflow */
581 0, /* special_function */
583 TRUE
, /* partial_inplace */
584 0xffffffff, /* src_mask */
585 0xffffffff, /* dst_mask */
586 FALSE
), /* pcrel_offset */
588 /* IMAGE_REL_PPC_IMGLUE 0x000E */
589 /* symbol is glue code; virtual address is TOC restore instruction */
591 HOWTO (IMAGE_REL_PPC_IMGLUE
,/* type */
593 2, /* size (0 = byte, 1 = short, 2 = long) */
595 FALSE
, /* pc_relative */
597 complain_overflow_dont
, /* complain_on_overflow */
598 ppc_imglue_reloc
, /* special_function */
600 FALSE
, /* partial_inplace */
601 0xffffffff, /* src_mask */
602 0xffffffff, /* dst_mask */
603 FALSE
), /* pcrel_offset */
605 /* IMAGE_REL_PPC_SECREL16 0x000F */
606 /* va of containing section (limited to 16 bits) */
608 HOWTO (IMAGE_REL_PPC_SECREL16
,/* type */
610 1, /* size (0 = byte, 1 = short, 2 = long) */
612 FALSE
, /* pc_relative */
614 complain_overflow_signed
, /* complain_on_overflow */
615 0, /* special_function */
616 "SECREL16", /* name */
617 TRUE
, /* partial_inplace */
618 0xffff, /* src_mask */
619 0xffff, /* dst_mask */
620 TRUE
), /* pcrel_offset */
622 /* IMAGE_REL_PPC_REFHI 0x0010 */
624 HOWTO (IMAGE_REL_PPC_REFHI
, /* type */
626 1, /* size (0 = byte, 1 = short, 2 = long) */
628 FALSE
, /* pc_relative */
630 complain_overflow_signed
, /* complain_on_overflow */
631 ppc_refhi_reloc
, /* special_function */
633 TRUE
, /* partial_inplace */
634 0xffffffff, /* src_mask */
635 0xffffffff, /* dst_mask */
636 FALSE
), /* pcrel_offset */
638 /* IMAGE_REL_PPC_REFLO 0x0011 */
640 HOWTO (IMAGE_REL_PPC_REFLO
, /* type */
642 1, /* size (0 = byte, 1 = short, 2 = long) */
644 FALSE
, /* pc_relative */
646 complain_overflow_signed
, /* complain_on_overflow */
647 ppc_refhi_reloc
, /* special_function */
649 TRUE
, /* partial_inplace */
650 0xffffffff, /* src_mask */
651 0xffffffff, /* dst_mask */
652 FALSE
), /* pcrel_offset */
654 /* IMAGE_REL_PPC_PAIR 0x0012 */
656 HOWTO (IMAGE_REL_PPC_PAIR
, /* type */
658 1, /* size (0 = byte, 1 = short, 2 = long) */
660 FALSE
, /* pc_relative */
662 complain_overflow_signed
, /* complain_on_overflow */
663 ppc_pair_reloc
, /* special_function */
665 TRUE
, /* partial_inplace */
666 0xffffffff, /* src_mask */
667 0xffffffff, /* dst_mask */
668 FALSE
), /* pcrel_offset */
670 /* IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 */
671 /* 16-bit offset from TOC base, without causing a definition */
673 HOWTO ( (IMAGE_REL_PPC_TOCREL16
| IMAGE_REL_PPC_TOCDEFN
), /* type */
675 1, /* size (0 = byte, 1 = short, 2 = long) */
677 FALSE
, /* pc_relative */
679 complain_overflow_dont
, /* complain_on_overflow */
680 0, /* special_function */
681 "TOCREL16, TOCDEFN", /* name */
682 FALSE
, /* partial_inplace */
683 0xffff, /* src_mask */
684 0xffff, /* dst_mask */
685 FALSE
), /* pcrel_offset */
689 /* Some really cheezy macros that can be turned on to test stderr :-) */
698 fprintf (stderr,_("Unimplemented Relocation -- %s\n"),x); \
702 #define DUMP_RELOC(n,r) \
704 fprintf (stderr,"%s sym %d, addr %d, addend %d\n", \
705 n, (*(r->sym_ptr_ptr))->name, \
706 r->address, r->addend); \
709 /* Given a reloc name, n, and a pointer to an internal_reloc,
710 dump out interesting information on the contents
712 #define n_name _n._n_name
713 #define n_zeroes _n._n_n._n_zeroes
714 #define n_offset _n._n_n._n_offset */
716 #define DUMP_RELOC2(n,r) \
718 fprintf (stderr,"%s sym %d, r_vaddr %d %s\n", \
719 n, r->r_symndx, r->r_vaddr, \
720 (((r->r_type) & IMAGE_REL_PPC_TOCDEFN) == 0) \
726 #define DUMP_RELOC(n,r)
727 #define DUMP_RELOC2(n,r)
730 /* TOC construction and management routines. */
732 /* This file is compiled twice, and these variables are defined in one
733 of the compilations. FIXME: This is confusing and weird. Also,
734 BFD should not use global variables. */
735 extern bfd
* bfd_of_toc_owner
;
736 extern long int global_toc_size
;
737 extern long int import_table_size
;
738 extern long int first_thunk_address
;
739 extern long int thunk_size
;
757 struct list_ele
*next
;
759 enum ref_category cat
;
764 extern struct list_ele
*head
;
765 extern struct list_ele
*tail
;
768 record_toc (asection
*toc_section
,
769 bfd_signed_vma our_toc_offset
,
770 enum ref_category cat
,
773 /* Add this entry to our toc addr-offset-name list. */
774 size_t amt
= sizeof (struct list_ele
);
775 struct list_ele
*t
= (struct list_ele
*) bfd_malloc (amt
);
780 t
->offset
= our_toc_offset
;
783 t
->addr
= toc_section
->output_offset
+ our_toc_offset
;
797 #ifdef COFF_IMAGE_WITH_PE
799 /* Record a toc offset against a symbol. */
801 ppc_record_toc_entry (bfd
*abfd
,
802 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
803 asection
*sec ATTRIBUTE_UNUSED
,
805 enum toc_type toc_kind ATTRIBUTE_UNUSED
)
807 struct ppc_coff_link_hash_entry
*h
;
812 h
= (struct ppc_coff_link_hash_entry
*) (obj_coff_sym_hashes (abfd
)[sym
]);
820 local_syms
= obj_coff_local_toc_table(abfd
);
827 /* allocate a table */
828 amt
= (bfd_size_type
) obj_raw_syment_count (abfd
) * sizeof (int);
829 local_syms
= (int *) bfd_zalloc (abfd
, amt
);
832 obj_coff_local_toc_table (abfd
) = local_syms
;
834 for (i
= 0; i
< obj_raw_syment_count (abfd
); ++i
)
836 SET_UNALLOCATED (local_syms
[i
]);
840 if (IS_UNALLOCATED(local_syms
[sym
]))
842 local_syms
[sym
] = global_toc_size
;
843 global_toc_size
+= 4;
845 /* The size must fit in a 16-bit displacement. */
846 if (global_toc_size
> 65535)
848 _bfd_error_handler (_("TOC overflow"));
849 bfd_set_error (bfd_error_file_too_big
);
856 /* Check to see if there's a toc slot allocated. If not, do it
857 here. It will be used in relocate_section. */
858 if (IS_UNALLOCATED(h
->toc_offset
))
860 h
->toc_offset
= global_toc_size
;
861 global_toc_size
+= 4;
863 /* The size must fit in a 16-bit displacement. */
864 if (global_toc_size
>= 65535)
866 _bfd_error_handler (_("TOC overflow"));
867 bfd_set_error (bfd_error_file_too_big
);
876 /* Record a toc offset against a symbol. */
878 ppc_mark_symbol_as_glue (bfd
*abfd
,
880 struct internal_reloc
*rel
)
882 struct ppc_coff_link_hash_entry
*h
;
884 h
= (struct ppc_coff_link_hash_entry
*) (obj_coff_sym_hashes (abfd
)[sym
]);
888 h
->symbol_is_glue
= 1;
889 h
->glue_insn
= bfd_get_32 (abfd
, (bfd_byte
*) &rel
->r_vaddr
);
894 #endif /* COFF_IMAGE_WITH_PE */
896 /* Return TRUE if this relocation should
897 appear in the output .reloc section. */
900 in_reloc_p (bfd
* abfd ATTRIBUTE_UNUSED
,
901 reloc_howto_type
*howto
)
904 (! howto
->pc_relative
)
905 && (howto
->type
!= IMAGE_REL_PPC_ADDR32NB
)
906 && (howto
->type
!= IMAGE_REL_PPC_TOCREL16
)
907 && (howto
->type
!= IMAGE_REL_PPC_IMGLUE
)
908 && (howto
->type
!= IMAGE_REL_PPC_IFGLUE
)
909 && (howto
->type
!= IMAGE_REL_PPC_SECREL
)
910 && (howto
->type
!= IMAGE_REL_PPC_SECTION
)
911 && (howto
->type
!= IMAGE_REL_PPC_SECREL16
)
912 && (howto
->type
!= IMAGE_REL_PPC_REFHI
)
913 && (howto
->type
!= IMAGE_REL_PPC_REFLO
)
914 && (howto
->type
!= IMAGE_REL_PPC_PAIR
)
915 && (howto
->type
!= IMAGE_REL_PPC_TOCREL16_DEFN
) ;
919 write_base_file_entry (bfd
*obfd
, struct bfd_link_info
*info
, bfd_vma addr
)
921 if (coff_data (obfd
)->pe
)
922 addr
-= pe_data (obfd
)->pe_opthdr
.ImageBase
;
923 if (fwrite (&addr
, sizeof (addr
), 1, (FILE *) info
->base_file
) == 1)
926 bfd_set_error (bfd_error_system_call
);
930 /* The reloc processing routine for the optimized COFF linker. */
933 coff_ppc_relocate_section (bfd
*output_bfd
,
934 struct bfd_link_info
*info
,
936 asection
*input_section
,
938 struct internal_reloc
*relocs
,
939 struct internal_syment
*syms
,
942 struct internal_reloc
*rel
;
943 struct internal_reloc
*relend
;
944 asection
*toc_section
= 0;
946 reloc_howto_type
*howto
= 0;
948 /* If we are performing a relocatable link, we don't need to do a
949 thing. The caller will take care of adjusting the reloc
950 addresses and symbol indices. */
951 if (bfd_link_relocatable (info
))
955 relend
= rel
+ input_section
->reloc_count
;
956 for (; rel
< relend
; rel
++)
959 struct ppc_coff_link_hash_entry
*h
;
960 struct internal_syment
*sym
;
964 bfd_reloc_status_type rstat
;
967 unsigned short r_type
= EXTRACT_TYPE (rel
->r_type
);
968 unsigned short r_flags
= EXTRACT_FLAGS(rel
->r_type
);
970 symndx
= rel
->r_symndx
;
971 loc
= contents
+ rel
->r_vaddr
- input_section
->vma
;
973 /* FIXME: check bounds on r_type */
974 howto
= ppc_coff_howto_table
+ r_type
;
983 h
= (struct ppc_coff_link_hash_entry
*)
984 (obj_coff_sym_hashes (input_bfd
)[symndx
]);
993 if (r_type
== IMAGE_REL_PPC_IMGLUE
&& h
== 0)
995 /* An IMGLUE reloc must have a name. Something is very wrong. */
1002 /* FIXME: PAIR unsupported in the following code. */
1006 sec
= bfd_abs_section_ptr
;
1009 sec
= sections
[symndx
];
1010 val
= (sec
->output_section
->vma
1011 + sec
->output_offset
1013 if (! obj_pe (output_bfd
))
1021 if (h
->root
.root
.type
== bfd_link_hash_defined
1022 || h
->root
.root
.type
== bfd_link_hash_defweak
)
1024 sec
= h
->root
.root
.u
.def
.section
;
1025 val
= (h
->root
.root
.u
.def
.value
1026 + sec
->output_section
->vma
1027 + sec
->output_offset
);
1030 (*info
->callbacks
->undefined_symbol
)
1031 (info
, h
->root
.root
.root
.string
, input_bfd
, input_section
,
1032 rel
->r_vaddr
- input_section
->vma
, TRUE
);
1035 rstat
= bfd_reloc_ok
;
1037 /* Each case must do its own relocation, setting rstat appropriately. */
1041 /* xgettext: c-format */
1042 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1044 bfd_set_error (bfd_error_bad_value
);
1046 case IMAGE_REL_PPC_TOCREL16
:
1048 bfd_signed_vma our_toc_offset
;
1051 DUMP_RELOC2(howto
->name
, rel
);
1053 if (toc_section
== 0)
1055 toc_section
= bfd_get_section_by_name (bfd_of_toc_owner
,
1058 if ( toc_section
== NULL
)
1060 /* There is no toc section. Something is very wrong. */
1065 /* Amazing bit tricks present. As we may have seen earlier, we
1066 use the 1 bit to tell us whether or not a toc offset has been
1067 allocated. Now that they've all been allocated, we will use
1068 the 1 bit to tell us if we've written this particular toc
1073 /* It is a file local symbol. */
1074 int *local_toc_table
;
1075 char name
[SYMNMLEN
+ 1];
1077 sym
= syms
+ symndx
;
1078 strncpy (name
, sym
->_n
._n_name
, SYMNMLEN
);
1079 name
[SYMNMLEN
] = '\0';
1081 local_toc_table
= obj_coff_local_toc_table(input_bfd
);
1082 our_toc_offset
= local_toc_table
[symndx
];
1084 if (IS_WRITTEN(our_toc_offset
))
1086 /* If it has been written out, it is marked with the
1087 1 bit. Fix up our offset, but do not write it out
1089 MAKE_ADDR_AGAIN(our_toc_offset
);
1093 /* Write out the toc entry. */
1094 record_toc (toc_section
, our_toc_offset
, priv
,
1097 bfd_put_32 (output_bfd
, val
,
1098 toc_section
->contents
+ our_toc_offset
);
1100 MARK_AS_WRITTEN(local_toc_table
[symndx
]);
1106 const char *name
= h
->root
.root
.root
.string
;
1107 our_toc_offset
= h
->toc_offset
;
1109 if ((r_flags
& IMAGE_REL_PPC_TOCDEFN
)
1110 == IMAGE_REL_PPC_TOCDEFN
)
1112 /* This is unbelievable cheese. Some knowledgable asm
1113 hacker has decided to use r2 as a base for loading
1114 a value. He/She does this by setting the tocdefn bit,
1115 and not supplying a toc definition. The behaviour is
1116 then to use the difference between the value of the
1117 symbol and the actual location of the toc as the toc
1120 In fact, what is usually happening is, because the
1121 Import Address Table is mapped immediately following
1122 the toc, some trippy library code trying for speed on
1123 dll linkage, takes advantage of that and considers
1124 the IAT to be part of the toc, thus saving a load. */
1126 our_toc_offset
= val
- (toc_section
->output_section
->vma
1127 + toc_section
->output_offset
);
1129 /* The size must still fit in a 16-bit displacement. */
1130 if ((bfd_vma
) our_toc_offset
>= 65535)
1133 /* xgettext: c-format */
1134 (_("%pB: Relocation for %s of %#" PRIx64
" exceeds "
1136 input_bfd
, name
, (uint64_t) our_toc_offset
);
1137 bfd_set_error (bfd_error_bad_value
);
1141 record_toc (toc_section
, our_toc_offset
, pub
,
1144 else if (IS_WRITTEN (our_toc_offset
))
1146 /* If it has been written out, it is marked with the
1147 1 bit. Fix up our offset, but do not write it out
1149 MAKE_ADDR_AGAIN(our_toc_offset
);
1153 record_toc(toc_section
, our_toc_offset
, pub
,
1156 /* Write out the toc entry. */
1157 bfd_put_32 (output_bfd
, val
,
1158 toc_section
->contents
+ our_toc_offset
);
1160 MARK_AS_WRITTEN(h
->toc_offset
);
1161 /* The tricky part is that this is the address that
1162 needs a .reloc entry for it. */
1167 if (fixit
&& info
->base_file
)
1169 /* So if this is non pcrelative, and is referenced
1170 to a section or a common symbol, then it needs a reloc. */
1172 /* Relocation to a symbol in a section which
1173 isn't absolute - we output the address here
1175 bfd_vma addr
= (toc_section
->output_section
->vma
1176 + toc_section
->output_offset
+ our_toc_offset
);
1178 if (!write_base_file_entry (output_bfd
, info
, addr
))
1182 /* FIXME: this test is conservative. */
1183 if ((r_flags
& IMAGE_REL_PPC_TOCDEFN
) != IMAGE_REL_PPC_TOCDEFN
1184 && (bfd_vma
) our_toc_offset
> toc_section
->size
)
1187 /* xgettext: c-format */
1188 (_("%pB: Relocation exceeds allocated TOC (%#" PRIx64
")"),
1189 input_bfd
, (uint64_t) toc_section
->size
);
1190 bfd_set_error (bfd_error_bad_value
);
1194 /* Now we know the relocation for this toc reference. */
1195 relocation
= our_toc_offset
+ TOC_LOAD_ADJUSTMENT
;
1196 rstat
= _bfd_relocate_contents (howto
, input_bfd
, relocation
, loc
);
1199 case IMAGE_REL_PPC_IFGLUE
:
1201 /* To solve this, we need to know whether or not the symbol
1202 appearing on the call instruction is a glue function or not.
1203 A glue function must announce itself via a IMGLUE reloc, and
1204 the reloc contains the required toc restore instruction. */
1205 DUMP_RELOC2 (howto
->name
, rel
);
1209 if (h
->symbol_is_glue
== 1)
1211 bfd_put_32 (input_bfd
, (bfd_vma
) h
->glue_insn
, loc
);
1216 case IMAGE_REL_PPC_SECREL
:
1217 /* Unimplemented: codeview debugging information. */
1218 /* For fast access to the header of the section
1219 containing the item. */
1221 case IMAGE_REL_PPC_SECTION
:
1222 /* Unimplemented: codeview debugging information. */
1223 /* Is used to indicate that the value should be relative
1224 to the beginning of the section that contains the
1227 case IMAGE_REL_PPC_ABSOLUTE
:
1229 const char *my_name
;
1230 char buf
[SYMNMLEN
+ 1];
1234 strncpy (buf
, (syms
+symndx
)->_n
._n_name
, SYMNMLEN
);
1235 buf
[SYMNMLEN
] = '\0';
1239 my_name
= h
->root
.root
.root
.string
;
1242 /* xgettext: c-format */
1243 (_("warning: unsupported reloc %s <file %pB, section %pA>\n"
1244 "sym %ld (%s), r_vaddr %" PRId64
" (%#" PRIx64
")"),
1245 howto
->name
, input_bfd
, input_section
,
1246 rel
->r_symndx
, my_name
,
1247 (int64_t) rel
->r_vaddr
, (uint64_t) rel
->r_vaddr
);
1250 case IMAGE_REL_PPC_IMGLUE
:
1252 /* There is nothing to do now. This reloc was noted in the first
1253 pass over the relocs, and the glue instruction extracted. */
1254 const char *my_name
;
1256 if (h
->symbol_is_glue
== 1)
1258 my_name
= h
->root
.root
.root
.string
;
1261 /* xgettext: c-format */
1262 (_("%pB: Out of order IMGLUE reloc for %s"), input_bfd
, my_name
);
1263 bfd_set_error (bfd_error_bad_value
);
1267 case IMAGE_REL_PPC_ADDR32NB
:
1269 const char *name
= 0;
1271 DUMP_RELOC2 (howto
->name
, rel
);
1273 if (CONST_STRNEQ (input_section
->name
, ".idata$2") && first_thunk_address
== 0)
1275 /* Set magic values. */
1277 struct coff_link_hash_entry
*myh
;
1279 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1281 FALSE
, FALSE
, TRUE
);
1282 first_thunk_address
= myh
->root
.u
.def
.value
+
1283 sec
->output_section
->vma
+
1284 sec
->output_offset
-
1285 pe_data(output_bfd
)->pe_opthdr
.ImageBase
;
1287 idata5offset
= myh
->root
.u
.def
.value
;
1288 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1290 FALSE
, FALSE
, TRUE
);
1292 thunk_size
= myh
->root
.u
.def
.value
- idata5offset
;
1293 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1295 FALSE
, FALSE
, TRUE
);
1296 import_table_size
= myh
->root
.u
.def
.value
;
1300 /* It is a file local symbol. */
1301 sym
= syms
+ symndx
;
1306 name
= h
->root
.root
.root
.string
;
1307 if (strcmp (".idata$2", name
) == 0)
1308 target
= "__idata2_magic__";
1309 else if (strcmp (".idata$4", name
) == 0)
1310 target
= "__idata4_magic__";
1311 else if (strcmp (".idata$5", name
) == 0)
1312 target
= "__idata5_magic__";
1316 struct coff_link_hash_entry
*myh
;
1318 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1320 FALSE
, FALSE
, TRUE
);
1323 /* Missing magic cookies. Something is very wrong. */
1327 val
= myh
->root
.u
.def
.value
+
1328 sec
->output_section
->vma
+ sec
->output_offset
;
1329 if (first_thunk_address
== 0)
1332 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1334 FALSE
, FALSE
, TRUE
);
1335 first_thunk_address
= myh
->root
.u
.def
.value
+
1336 sec
->output_section
->vma
+
1337 sec
->output_offset
-
1338 pe_data(output_bfd
)->pe_opthdr
.ImageBase
;
1340 idata5offset
= myh
->root
.u
.def
.value
;
1341 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1343 FALSE
, FALSE
, TRUE
);
1345 thunk_size
= myh
->root
.u
.def
.value
- idata5offset
;
1346 myh
= coff_link_hash_lookup (coff_hash_table (info
),
1348 FALSE
, FALSE
, TRUE
);
1349 import_table_size
= myh
->root
.u
.def
.value
;
1354 rstat
= _bfd_relocate_contents (howto
,
1357 pe_data (output_bfd
)->pe_opthdr
.ImageBase
,
1362 case IMAGE_REL_PPC_REL24
:
1363 DUMP_RELOC2(howto
->name
, rel
);
1364 val
-= (input_section
->output_section
->vma
1365 + input_section
->output_offset
);
1367 rstat
= _bfd_relocate_contents (howto
,
1372 case IMAGE_REL_PPC_ADDR16
:
1373 case IMAGE_REL_PPC_ADDR24
:
1374 case IMAGE_REL_PPC_ADDR32
:
1375 DUMP_RELOC2(howto
->name
, rel
);
1376 rstat
= _bfd_relocate_contents (howto
,
1383 if (info
->base_file
)
1385 /* So if this is non pcrelative, and is referenced
1386 to a section or a common symbol, then it needs a reloc. */
1387 if (sym
&& pe_data(output_bfd
)->in_reloc_p (output_bfd
, howto
))
1389 /* Relocation to a symbol in a section which
1390 isn't absolute - we output the address here
1392 bfd_vma addr
= (rel
->r_vaddr
1393 - input_section
->vma
1394 + input_section
->output_offset
1395 + input_section
->output_section
->vma
);
1397 if (!write_base_file_entry (output_bfd
, info
, addr
))
1408 case bfd_reloc_overflow
:
1411 char buf
[SYMNMLEN
+ 1];
1417 else if (sym
== NULL
)
1419 else if (sym
->_n
._n_n
._n_zeroes
== 0
1420 && sym
->_n
._n_n
._n_offset
!= 0)
1421 name
= obj_coff_strings (input_bfd
) + sym
->_n
._n_n
._n_offset
;
1424 strncpy (buf
, sym
->_n
._n_name
, SYMNMLEN
);
1425 buf
[SYMNMLEN
] = '\0';
1429 (*info
->callbacks
->reloc_overflow
)
1430 (info
, (h
? &h
->root
.root
: NULL
), name
, howto
->name
,
1431 (bfd_vma
) 0, input_bfd
, input_section
,
1432 rel
->r_vaddr
- input_section
->vma
);
1440 #ifdef COFF_IMAGE_WITH_PE
1442 /* FIXME: BFD should not use global variables. This file is compiled
1443 twice, and these variables are shared. This is confusing and
1446 long int global_toc_size
= 4;
1448 bfd
* bfd_of_toc_owner
= 0;
1450 long int import_table_size
;
1451 long int first_thunk_address
;
1452 long int thunk_size
;
1454 struct list_ele
*head
;
1455 struct list_ele
*tail
;
1458 h1
= N_("\n\t\t\tTOC MAPPING\n\n");
1460 h2
= N_(" TOC disassembly Comments Name\n");
1462 h3
= N_(" Offset spelling (if present)\n");
1465 dump_toc (void * vfile
)
1467 FILE *file
= (FILE *) vfile
;
1470 fputs (_(h1
), file
);
1471 fputs (_(h2
), file
);
1472 fputs (_(h3
), file
);
1474 for (t
= head
; t
!= 0; t
=t
->next
)
1476 const char *cat
= "";
1479 cat
= _("private ");
1480 else if (t
->cat
== pub
)
1482 else if (t
->cat
== tocdata
)
1483 cat
= _("data-in-toc ");
1485 if (t
->offset
> global_toc_size
)
1487 if (t
->offset
<= global_toc_size
+ thunk_size
)
1488 cat
= _("IAT reference ");
1492 /* xgettext: c-format */
1493 _("**** global_toc_size %ld(%lx), thunk_size %ld(%lx)\n"),
1494 global_toc_size
, (unsigned long) global_toc_size
,
1495 thunk_size
, (unsigned long) thunk_size
);
1496 cat
= _("Out of bounds!");
1501 " %04lx (%d)", (unsigned long) t
->offset
, t
->offset
- 32768);
1508 fprintf (file
, "\n");
1512 ppc_allocate_toc_section (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1516 static char test_char
= '1';
1518 if ( global_toc_size
== 0 ) /* FIXME: does this get me in trouble? */
1521 if (bfd_of_toc_owner
== 0)
1522 /* No toc owner? Something is very wrong. */
1525 s
= bfd_get_section_by_name ( bfd_of_toc_owner
, TOC_SECTION_NAME
);
1527 /* No toc section? Something is very wrong. */
1530 foo
= (bfd_byte
*) bfd_alloc (bfd_of_toc_owner
, global_toc_size
);
1531 memset(foo
, test_char
, (size_t) global_toc_size
);
1533 s
->size
= global_toc_size
;
1540 ppc_process_before_allocation (bfd
*abfd
,
1541 struct bfd_link_info
*info
)
1544 struct internal_reloc
*i
, *rel
;
1546 /* Here we have a bfd that is to be included on the link. We have a hook
1547 to do reloc rummaging, before section sizes are nailed down. */
1548 _bfd_coff_get_external_symbols (abfd
);
1550 /* Rummage around all the relocs and map the toc. */
1551 sec
= abfd
->sections
;
1556 for (; sec
!= 0; sec
= sec
->next
)
1558 if (sec
->reloc_count
== 0)
1561 /* load the relocs */
1562 /* FIXME: there may be a storage leak here */
1563 i
=_bfd_coff_read_internal_relocs(abfd
,sec
,1,0,0,0);
1568 for (rel
= i
; rel
< i
+ sec
->reloc_count
; ++rel
)
1570 unsigned short r_type
= EXTRACT_TYPE (rel
->r_type
);
1571 unsigned short r_flags
= EXTRACT_FLAGS (rel
->r_type
);
1572 bfd_boolean ok
= TRUE
;
1574 DUMP_RELOC2 (ppc_coff_howto_table
[r_type
].name
, rel
);
1578 case IMAGE_REL_PPC_TOCREL16
:
1579 /* If TOCDEFN is on, ignore as someone else has allocated the
1581 if ((r_flags
& IMAGE_REL_PPC_TOCDEFN
) != IMAGE_REL_PPC_TOCDEFN
)
1582 ok
= ppc_record_toc_entry(abfd
, info
, sec
,
1583 rel
->r_symndx
, default_toc
);
1587 case IMAGE_REL_PPC_IMGLUE
:
1588 ppc_mark_symbol_as_glue (abfd
, rel
->r_symndx
, rel
);
1601 static bfd_reloc_status_type
1602 ppc_refhi_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
1603 arelent
*reloc_entry ATTRIBUTE_UNUSED
,
1604 asymbol
*symbol ATTRIBUTE_UNUSED
,
1605 void * data ATTRIBUTE_UNUSED
,
1606 asection
*input_section ATTRIBUTE_UNUSED
,
1608 char **error_message ATTRIBUTE_UNUSED
)
1611 DUMP_RELOC("REFHI",reloc_entry
);
1613 if (output_bfd
== (bfd
*) NULL
)
1614 return bfd_reloc_continue
;
1616 return bfd_reloc_undefined
;
1619 static bfd_reloc_status_type
1620 ppc_pair_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
1621 arelent
*reloc_entry ATTRIBUTE_UNUSED
,
1622 asymbol
*symbol ATTRIBUTE_UNUSED
,
1623 void * data ATTRIBUTE_UNUSED
,
1624 asection
*input_section ATTRIBUTE_UNUSED
,
1626 char **error_message ATTRIBUTE_UNUSED
)
1629 DUMP_RELOC("PAIR",reloc_entry
);
1631 if (output_bfd
== (bfd
*) NULL
)
1632 return bfd_reloc_continue
;
1634 return bfd_reloc_undefined
;
1637 static bfd_reloc_status_type
1638 ppc_toc16_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
1639 arelent
*reloc_entry ATTRIBUTE_UNUSED
,
1640 asymbol
*symbol ATTRIBUTE_UNUSED
,
1641 void * data ATTRIBUTE_UNUSED
,
1642 asection
*input_section ATTRIBUTE_UNUSED
,
1644 char **error_message ATTRIBUTE_UNUSED
)
1646 UN_IMPL ("TOCREL16");
1647 DUMP_RELOC ("TOCREL16",reloc_entry
);
1649 if (output_bfd
== (bfd
*) NULL
)
1650 return bfd_reloc_continue
;
1652 return bfd_reloc_ok
;
1655 static bfd_reloc_status_type
1656 ppc_secrel_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
1657 arelent
*reloc_entry ATTRIBUTE_UNUSED
,
1658 asymbol
*symbol ATTRIBUTE_UNUSED
,
1659 void * data ATTRIBUTE_UNUSED
,
1660 asection
*input_section ATTRIBUTE_UNUSED
,
1662 char **error_message ATTRIBUTE_UNUSED
)
1665 DUMP_RELOC("SECREL",reloc_entry
);
1667 if (output_bfd
== (bfd
*) NULL
)
1668 return bfd_reloc_continue
;
1670 return bfd_reloc_ok
;
1673 static bfd_reloc_status_type
1674 ppc_section_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
1675 arelent
*reloc_entry ATTRIBUTE_UNUSED
,
1676 asymbol
*symbol ATTRIBUTE_UNUSED
,
1677 void * data ATTRIBUTE_UNUSED
,
1678 asection
*input_section ATTRIBUTE_UNUSED
,
1680 char **error_message ATTRIBUTE_UNUSED
)
1683 DUMP_RELOC("SECTION",reloc_entry
);
1685 if (output_bfd
== (bfd
*) NULL
)
1686 return bfd_reloc_continue
;
1688 return bfd_reloc_ok
;
1691 static bfd_reloc_status_type
1692 ppc_imglue_reloc (bfd
*abfd ATTRIBUTE_UNUSED
,
1693 arelent
*reloc_entry ATTRIBUTE_UNUSED
,
1694 asymbol
*symbol ATTRIBUTE_UNUSED
,
1695 void * data ATTRIBUTE_UNUSED
,
1696 asection
*input_section ATTRIBUTE_UNUSED
,
1698 char **error_message ATTRIBUTE_UNUSED
)
1702 DUMP_RELOC("IMGLUE",reloc_entry
);
1704 if (output_bfd
== (bfd
*) NULL
)
1705 return bfd_reloc_continue
;
1707 return bfd_reloc_ok
;
1710 #define MAX_RELOC_INDEX \
1711 (sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]) - 1)
1713 /* FIXME: There is a possibility that when we read in a reloc from a file,
1714 that there are some bits encoded in the upper portion of the
1715 type field. Not yet implemented. */
1718 ppc_coff_rtype2howto (arelent
*relent
, struct internal_reloc
*internal
)
1720 /* We can encode one of three things in the type field, aside from the
1722 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
1723 value, rather than an addition value
1724 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
1725 the branch is expected to be taken or not.
1726 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
1727 For now, we just strip this stuff to find the type, and ignore it other
1729 reloc_howto_type
*howto
;
1730 unsigned short r_type
= EXTRACT_TYPE (internal
->r_type
);
1731 unsigned short r_flags
= EXTRACT_FLAGS(internal
->r_type
);
1732 unsigned short junk
= EXTRACT_JUNK (internal
->r_type
);
1734 /* The masking process only slices off the bottom byte for r_type. */
1735 if ( r_type
> MAX_RELOC_INDEX
)
1738 /* Check for absolute crap. */
1744 case IMAGE_REL_PPC_ADDR16
:
1745 case IMAGE_REL_PPC_REL24
:
1746 case IMAGE_REL_PPC_ADDR24
:
1747 case IMAGE_REL_PPC_ADDR32
:
1748 case IMAGE_REL_PPC_IFGLUE
:
1749 case IMAGE_REL_PPC_ADDR32NB
:
1750 case IMAGE_REL_PPC_SECTION
:
1751 case IMAGE_REL_PPC_SECREL
:
1752 DUMP_RELOC2 (ppc_coff_howto_table
[r_type
].name
, internal
);
1753 howto
= ppc_coff_howto_table
+ r_type
;
1755 case IMAGE_REL_PPC_IMGLUE
:
1756 DUMP_RELOC2 (ppc_coff_howto_table
[r_type
].name
, internal
);
1757 howto
= ppc_coff_howto_table
+ r_type
;
1759 case IMAGE_REL_PPC_TOCREL16
:
1760 DUMP_RELOC2 (ppc_coff_howto_table
[r_type
].name
, internal
);
1761 if (r_flags
& IMAGE_REL_PPC_TOCDEFN
)
1762 howto
= ppc_coff_howto_table
+ IMAGE_REL_PPC_TOCREL16_DEFN
;
1764 howto
= ppc_coff_howto_table
+ IMAGE_REL_PPC_TOCREL16
;
1768 /* xgettext: c-format */
1769 (_("warning: unsupported reloc %s [%d] used -- it may not work"),
1770 ppc_coff_howto_table
[r_type
].name
, r_type
);
1771 howto
= ppc_coff_howto_table
+ r_type
;
1775 relent
->howto
= howto
;
1778 static reloc_howto_type
*
1779 coff_ppc_rtype_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
,
1781 struct internal_reloc
*rel
,
1782 struct coff_link_hash_entry
*h ATTRIBUTE_UNUSED
,
1783 struct internal_syment
*sym ATTRIBUTE_UNUSED
,
1786 reloc_howto_type
*howto
;
1788 /* We can encode one of three things in the type field, aside from the
1790 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
1791 value, rather than an addition value
1792 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
1793 the branch is expected to be taken or not.
1794 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
1795 For now, we just strip this stuff to find the type, and ignore it other
1798 unsigned short r_type
= EXTRACT_TYPE (rel
->r_type
);
1799 unsigned short r_flags
= EXTRACT_FLAGS (rel
->r_type
);
1800 unsigned short junk
= EXTRACT_JUNK (rel
->r_type
);
1802 /* The masking process only slices off the bottom byte for r_type. */
1803 if (r_type
> MAX_RELOC_INDEX
)
1806 /* Check for absolute crap. */
1812 case IMAGE_REL_PPC_ADDR32NB
:
1813 DUMP_RELOC2(ppc_coff_howto_table
[r_type
].name
, rel
);
1814 *addendp
-= pe_data(sec
->output_section
->owner
)->pe_opthdr
.ImageBase
;
1815 howto
= ppc_coff_howto_table
+ r_type
;
1817 case IMAGE_REL_PPC_TOCREL16
:
1818 DUMP_RELOC2(ppc_coff_howto_table
[r_type
].name
, rel
);
1819 if (r_flags
& IMAGE_REL_PPC_TOCDEFN
)
1820 howto
= ppc_coff_howto_table
+ IMAGE_REL_PPC_TOCREL16_DEFN
;
1822 howto
= ppc_coff_howto_table
+ IMAGE_REL_PPC_TOCREL16
;
1824 case IMAGE_REL_PPC_ADDR16
:
1825 case IMAGE_REL_PPC_REL24
:
1826 case IMAGE_REL_PPC_ADDR24
:
1827 case IMAGE_REL_PPC_ADDR32
:
1828 case IMAGE_REL_PPC_IFGLUE
:
1829 case IMAGE_REL_PPC_SECTION
:
1830 case IMAGE_REL_PPC_SECREL
:
1831 DUMP_RELOC2(ppc_coff_howto_table
[r_type
].name
, rel
);
1832 howto
= ppc_coff_howto_table
+ r_type
;
1834 case IMAGE_REL_PPC_IMGLUE
:
1835 DUMP_RELOC2(ppc_coff_howto_table
[r_type
].name
, rel
);
1836 howto
= ppc_coff_howto_table
+ r_type
;
1840 /* xgettext: c-format */
1841 (_("warning: unsupported reloc %s [%d] used -- it may not work"),
1842 ppc_coff_howto_table
[r_type
].name
, r_type
);
1843 howto
= ppc_coff_howto_table
+ r_type
;
1850 /* A cheesy little macro to make the code a little more readable. */
1851 #define HOW2MAP(bfd_rtype,ppc_rtype) \
1852 case bfd_rtype: return &ppc_coff_howto_table[ppc_rtype]
1854 static reloc_howto_type
*
1855 ppc_coff_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1856 bfd_reloc_code_real_type code
)
1860 HOW2MAP(BFD_RELOC_32_GOTOFF
, IMAGE_REL_PPC_IMGLUE
);
1861 HOW2MAP(BFD_RELOC_16_GOT_PCREL
, IMAGE_REL_PPC_IFGLUE
);
1862 HOW2MAP(BFD_RELOC_16
, IMAGE_REL_PPC_ADDR16
);
1863 HOW2MAP(BFD_RELOC_PPC_B26
, IMAGE_REL_PPC_REL24
);
1864 HOW2MAP(BFD_RELOC_PPC_BA26
, IMAGE_REL_PPC_ADDR24
);
1865 HOW2MAP(BFD_RELOC_PPC_TOC16
, IMAGE_REL_PPC_TOCREL16
);
1866 HOW2MAP(BFD_RELOC_16_GOTOFF
, IMAGE_REL_PPC_TOCREL16_DEFN
);
1867 HOW2MAP(BFD_RELOC_32
, IMAGE_REL_PPC_ADDR32
);
1868 HOW2MAP(BFD_RELOC_RVA
, IMAGE_REL_PPC_ADDR32NB
);
1875 static reloc_howto_type
*
1876 ppc_coff_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1882 i
< sizeof (ppc_coff_howto_table
) / sizeof (ppc_coff_howto_table
[0]);
1884 if (ppc_coff_howto_table
[i
].name
!= NULL
1885 && strcasecmp (ppc_coff_howto_table
[i
].name
, r_name
) == 0)
1886 return &ppc_coff_howto_table
[i
];
1891 /* Tailor coffcode.h -- macro heaven. */
1893 #define RTYPE2HOWTO(cache_ptr, dst) ppc_coff_rtype2howto (cache_ptr, dst)
1895 /* We use the special COFF backend linker, with our own special touch. */
1897 #define coff_bfd_reloc_type_lookup ppc_coff_reloc_type_lookup
1898 #define coff_bfd_reloc_name_lookup ppc_coff_reloc_name_lookup
1899 #define coff_rtype_to_howto coff_ppc_rtype_to_howto
1900 #define coff_relocate_section coff_ppc_relocate_section
1901 #define coff_bfd_final_link ppc_bfd_coff_final_link
1903 #ifndef COFF_IMAGE_WITH_PE
1906 #define SELECT_RELOC(internal, howto) {internal.r_type=howto->type;}
1908 #define COFF_PAGE_SIZE 0x1000
1910 /* FIXME: This controls some code that used to be in peicode.h and is
1911 now in peigen.c. It will not control the code in peigen.c. If
1912 anybody wants to get this working, you will need to fix that. */
1913 #define POWERPC_LE_PE
1915 #define COFF_SECTION_ALIGNMENT_ENTRIES \
1916 { COFF_SECTION_NAME_EXACT_MATCH (".idata$2"), \
1917 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
1918 { COFF_SECTION_NAME_EXACT_MATCH (".idata$3"), \
1919 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
1920 { COFF_SECTION_NAME_EXACT_MATCH (".idata$4"), \
1921 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
1922 { COFF_SECTION_NAME_EXACT_MATCH (".idata$5"), \
1923 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
1924 { COFF_SECTION_NAME_EXACT_MATCH (".idata$6"), \
1925 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }, \
1926 { COFF_SECTION_NAME_EXACT_MATCH (".reloc"), \
1927 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }
1929 #include "coffcode.h"
1931 #ifndef COFF_IMAGE_WITH_PE
1934 ppc_do_last (bfd
*abfd
)
1936 if (abfd
== bfd_of_toc_owner
)
1945 return bfd_of_toc_owner
;
1948 /* This piece of machinery exists only to guarantee that the bfd that holds
1949 the toc section is written last.
1951 This does depend on bfd_make_section attaching a new section to the
1952 end of the section list for the bfd.
1954 This is otherwise intended to be functionally the same as
1955 cofflink.c:_bfd_coff_final_link(). It is specifically different only
1956 where the POWERPC_LE_PE macro modifies the code. It is left in as a
1957 precise form of comment. krk@cygnus.com */
1959 /* Do the final link step. */
1962 ppc_bfd_coff_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
1964 bfd_size_type symesz
;
1965 struct coff_final_link_info flaginfo
;
1966 bfd_boolean debug_merge_allocated
;
1968 struct bfd_link_order
*p
;
1969 bfd_size_type max_sym_count
;
1970 bfd_size_type max_lineno_count
;
1971 bfd_size_type max_reloc_count
;
1972 bfd_size_type max_output_reloc_count
;
1973 bfd_size_type max_contents_size
;
1974 file_ptr rel_filepos
;
1976 file_ptr line_filepos
;
1977 unsigned int linesz
;
1979 bfd_byte
*external_relocs
= NULL
;
1980 char strbuf
[STRING_SIZE_SIZE
];
1983 symesz
= bfd_coff_symesz (abfd
);
1985 flaginfo
.info
= info
;
1986 flaginfo
.output_bfd
= abfd
;
1987 flaginfo
.strtab
= NULL
;
1988 flaginfo
.section_info
= NULL
;
1989 flaginfo
.last_file_index
= -1;
1990 flaginfo
.last_bf_index
= -1;
1991 flaginfo
.internal_syms
= NULL
;
1992 flaginfo
.sec_ptrs
= NULL
;
1993 flaginfo
.sym_indices
= NULL
;
1994 flaginfo
.outsyms
= NULL
;
1995 flaginfo
.linenos
= NULL
;
1996 flaginfo
.contents
= NULL
;
1997 flaginfo
.external_relocs
= NULL
;
1998 flaginfo
.internal_relocs
= NULL
;
1999 debug_merge_allocated
= FALSE
;
2001 coff_data (abfd
)->link_info
= info
;
2003 flaginfo
.strtab
= _bfd_stringtab_init ();
2004 if (flaginfo
.strtab
== NULL
)
2007 if (! coff_debug_merge_hash_table_init (&flaginfo
.debug_merge
))
2009 debug_merge_allocated
= TRUE
;
2011 /* Compute the file positions for all the sections. */
2012 if (! abfd
->output_has_begun
)
2014 if (! bfd_coff_compute_section_file_positions (abfd
))
2018 /* Count the line numbers and relocation entries required for the
2019 output file. Set the file positions for the relocs. */
2020 rel_filepos
= obj_relocbase (abfd
);
2021 relsz
= bfd_coff_relsz (abfd
);
2022 max_contents_size
= 0;
2023 max_lineno_count
= 0;
2024 max_reloc_count
= 0;
2026 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
2029 o
->lineno_count
= 0;
2031 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
2033 if (p
->type
== bfd_indirect_link_order
)
2037 sec
= p
->u
.indirect
.section
;
2039 /* Mark all sections which are to be included in the
2040 link. This will normally be every section. We need
2041 to do this so that we can identify any sections which
2042 the linker has decided to not include. */
2043 sec
->linker_mark
= TRUE
;
2045 if (info
->strip
== strip_none
2046 || info
->strip
== strip_some
)
2047 o
->lineno_count
+= sec
->lineno_count
;
2049 if (bfd_link_relocatable (info
))
2050 o
->reloc_count
+= sec
->reloc_count
;
2052 if (sec
->rawsize
> max_contents_size
)
2053 max_contents_size
= sec
->rawsize
;
2054 if (sec
->size
> max_contents_size
)
2055 max_contents_size
= sec
->size
;
2056 if (sec
->lineno_count
> max_lineno_count
)
2057 max_lineno_count
= sec
->lineno_count
;
2058 if (sec
->reloc_count
> max_reloc_count
)
2059 max_reloc_count
= sec
->reloc_count
;
2061 else if (bfd_link_relocatable (info
)
2062 && (p
->type
== bfd_section_reloc_link_order
2063 || p
->type
== bfd_symbol_reloc_link_order
))
2066 if (o
->reloc_count
== 0)
2070 o
->flags
|= SEC_RELOC
;
2071 o
->rel_filepos
= rel_filepos
;
2072 rel_filepos
+= o
->reloc_count
* relsz
;
2076 /* If doing a relocatable link, allocate space for the pointers we
2078 if (bfd_link_relocatable (info
))
2082 /* We use section_count + 1, rather than section_count, because
2083 the target_index fields are 1 based. */
2084 amt
= abfd
->section_count
+ 1;
2085 amt
*= sizeof (struct coff_link_section_info
);
2086 flaginfo
.section_info
= (struct coff_link_section_info
*) bfd_malloc (amt
);
2088 if (flaginfo
.section_info
== NULL
)
2091 for (i
= 0; i
<= abfd
->section_count
; i
++)
2093 flaginfo
.section_info
[i
].relocs
= NULL
;
2094 flaginfo
.section_info
[i
].rel_hashes
= NULL
;
2098 /* We now know the size of the relocs, so we can determine the file
2099 positions of the line numbers. */
2100 line_filepos
= rel_filepos
;
2101 linesz
= bfd_coff_linesz (abfd
);
2102 max_output_reloc_count
= 0;
2104 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
2106 if (o
->lineno_count
== 0)
2107 o
->line_filepos
= 0;
2110 o
->line_filepos
= line_filepos
;
2111 line_filepos
+= o
->lineno_count
* linesz
;
2114 if (o
->reloc_count
!= 0)
2116 /* We don't know the indices of global symbols until we have
2117 written out all the local symbols. For each section in
2118 the output file, we keep an array of pointers to hash
2119 table entries. Each entry in the array corresponds to a
2120 reloc. When we find a reloc against a global symbol, we
2121 set the corresponding entry in this array so that we can
2122 fix up the symbol index after we have written out all the
2125 Because of this problem, we also keep the relocs in
2126 memory until the end of the link. This wastes memory,
2127 but only when doing a relocatable link, which is not the
2129 BFD_ASSERT (bfd_link_relocatable (info
));
2130 amt
= o
->reloc_count
;
2131 amt
*= sizeof (struct internal_reloc
);
2132 flaginfo
.section_info
[o
->target_index
].relocs
=
2133 (struct internal_reloc
*) bfd_malloc (amt
);
2134 amt
= o
->reloc_count
;
2135 amt
*= sizeof (struct coff_link_hash_entry
*);
2136 flaginfo
.section_info
[o
->target_index
].rel_hashes
=
2137 (struct coff_link_hash_entry
**) bfd_malloc (amt
);
2138 if (flaginfo
.section_info
[o
->target_index
].relocs
== NULL
2139 || flaginfo
.section_info
[o
->target_index
].rel_hashes
== NULL
)
2142 if (o
->reloc_count
> max_output_reloc_count
)
2143 max_output_reloc_count
= o
->reloc_count
;
2146 /* Reset the reloc and lineno counts, so that we can use them to
2147 count the number of entries we have output so far. */
2149 o
->lineno_count
= 0;
2152 obj_sym_filepos (abfd
) = line_filepos
;
2154 /* Figure out the largest number of symbols in an input BFD. Take
2155 the opportunity to clear the output_has_begun fields of all the
2158 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
2162 sub
->output_has_begun
= FALSE
;
2163 sz
= obj_raw_syment_count (sub
);
2164 if (sz
> max_sym_count
)
2168 /* Allocate some buffers used while linking. */
2169 amt
= max_sym_count
* sizeof (struct internal_syment
);
2170 flaginfo
.internal_syms
= (struct internal_syment
*) bfd_malloc (amt
);
2171 amt
= max_sym_count
* sizeof (asection
*);
2172 flaginfo
.sec_ptrs
= (asection
**) bfd_malloc (amt
);
2173 amt
= max_sym_count
* sizeof (long);
2174 flaginfo
.sym_indices
= (long *) bfd_malloc (amt
);
2175 amt
= (max_sym_count
+ 1) * symesz
;
2176 flaginfo
.outsyms
= (bfd_byte
*) bfd_malloc (amt
);
2177 amt
= max_lineno_count
* bfd_coff_linesz (abfd
);
2178 flaginfo
.linenos
= (bfd_byte
*) bfd_malloc (amt
);
2179 flaginfo
.contents
= (bfd_byte
*) bfd_malloc (max_contents_size
);
2180 flaginfo
.external_relocs
= (bfd_byte
*) bfd_malloc (max_reloc_count
* relsz
);
2181 if (! bfd_link_relocatable (info
))
2183 amt
= max_reloc_count
* sizeof (struct internal_reloc
);
2184 flaginfo
.internal_relocs
= (struct internal_reloc
*) bfd_malloc (amt
);
2186 if ((flaginfo
.internal_syms
== NULL
&& max_sym_count
> 0)
2187 || (flaginfo
.sec_ptrs
== NULL
&& max_sym_count
> 0)
2188 || (flaginfo
.sym_indices
== NULL
&& max_sym_count
> 0)
2189 || flaginfo
.outsyms
== NULL
2190 || (flaginfo
.linenos
== NULL
&& max_lineno_count
> 0)
2191 || (flaginfo
.contents
== NULL
&& max_contents_size
> 0)
2192 || (flaginfo
.external_relocs
== NULL
&& max_reloc_count
> 0)
2193 || (! bfd_link_relocatable (info
)
2194 && flaginfo
.internal_relocs
== NULL
2195 && max_reloc_count
> 0))
2198 /* We now know the position of everything in the file, except that
2199 we don't know the size of the symbol table and therefore we don't
2200 know where the string table starts. We just build the string
2201 table in memory as we go along. We process all the relocations
2202 for a single input file at once. */
2203 obj_raw_syment_count (abfd
) = 0;
2205 if (coff_backend_info (abfd
)->_bfd_coff_start_final_link
)
2207 if (! bfd_coff_start_final_link (abfd
, info
))
2211 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
2213 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
2215 if (p
->type
== bfd_indirect_link_order
2216 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
2217 == bfd_target_coff_flavour
))
2219 sub
= p
->u
.indirect
.section
->owner
;
2220 #ifdef POWERPC_LE_PE
2221 if (! sub
->output_has_begun
&& !ppc_do_last(sub
))
2223 if (! sub
->output_has_begun
)
2226 if (! _bfd_coff_link_input_bfd (&flaginfo
, sub
))
2228 sub
->output_has_begun
= TRUE
;
2231 else if (p
->type
== bfd_section_reloc_link_order
2232 || p
->type
== bfd_symbol_reloc_link_order
)
2234 if (! _bfd_coff_reloc_link_order (abfd
, &flaginfo
, o
, p
))
2239 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
2245 #ifdef POWERPC_LE_PE
2247 bfd
* last_one
= ppc_get_last();
2250 if (! _bfd_coff_link_input_bfd (&flaginfo
, last_one
))
2253 last_one
->output_has_begun
= TRUE
;
2257 /* Free up the buffers used by _bfd_coff_link_input_bfd. */
2258 coff_debug_merge_hash_table_free (&flaginfo
.debug_merge
);
2259 debug_merge_allocated
= FALSE
;
2261 if (flaginfo
.internal_syms
!= NULL
)
2263 free (flaginfo
.internal_syms
);
2264 flaginfo
.internal_syms
= NULL
;
2266 if (flaginfo
.sec_ptrs
!= NULL
)
2268 free (flaginfo
.sec_ptrs
);
2269 flaginfo
.sec_ptrs
= NULL
;
2271 if (flaginfo
.sym_indices
!= NULL
)
2273 free (flaginfo
.sym_indices
);
2274 flaginfo
.sym_indices
= NULL
;
2276 if (flaginfo
.linenos
!= NULL
)
2278 free (flaginfo
.linenos
);
2279 flaginfo
.linenos
= NULL
;
2281 if (flaginfo
.contents
!= NULL
)
2283 free (flaginfo
.contents
);
2284 flaginfo
.contents
= NULL
;
2286 if (flaginfo
.external_relocs
!= NULL
)
2288 free (flaginfo
.external_relocs
);
2289 flaginfo
.external_relocs
= NULL
;
2291 if (flaginfo
.internal_relocs
!= NULL
)
2293 free (flaginfo
.internal_relocs
);
2294 flaginfo
.internal_relocs
= NULL
;
2297 /* The value of the last C_FILE symbol is supposed to be the symbol
2298 index of the first external symbol. Write it out again if
2300 if (flaginfo
.last_file_index
!= -1
2301 && (unsigned int) flaginfo
.last_file
.n_value
!= obj_raw_syment_count (abfd
))
2305 flaginfo
.last_file
.n_value
= obj_raw_syment_count (abfd
);
2306 bfd_coff_swap_sym_out (abfd
, &flaginfo
.last_file
,
2308 pos
= obj_sym_filepos (abfd
) + flaginfo
.last_file_index
* symesz
;
2309 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
2310 || bfd_bwrite (flaginfo
.outsyms
, symesz
, abfd
) != symesz
)
2314 /* Write out the global symbols. */
2315 flaginfo
.failed
= FALSE
;
2316 bfd_hash_traverse (&info
->hash
->table
, _bfd_coff_write_global_sym
, &flaginfo
);
2317 if (flaginfo
.failed
)
2320 /* The outsyms buffer is used by _bfd_coff_write_global_sym. */
2321 if (flaginfo
.outsyms
!= NULL
)
2323 free (flaginfo
.outsyms
);
2324 flaginfo
.outsyms
= NULL
;
2327 if (bfd_link_relocatable (info
))
2329 /* Now that we have written out all the global symbols, we know
2330 the symbol indices to use for relocs against them, and we can
2331 finally write out the relocs. */
2332 amt
= max_output_reloc_count
* relsz
;
2333 external_relocs
= (bfd_byte
*) bfd_malloc (amt
);
2334 if (external_relocs
== NULL
)
2337 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
2339 struct internal_reloc
*irel
;
2340 struct internal_reloc
*irelend
;
2341 struct coff_link_hash_entry
**rel_hash
;
2344 if (o
->reloc_count
== 0)
2347 irel
= flaginfo
.section_info
[o
->target_index
].relocs
;
2348 irelend
= irel
+ o
->reloc_count
;
2349 rel_hash
= flaginfo
.section_info
[o
->target_index
].rel_hashes
;
2350 erel
= external_relocs
;
2351 for (; irel
< irelend
; irel
++, rel_hash
++, erel
+= relsz
)
2353 if (*rel_hash
!= NULL
)
2355 BFD_ASSERT ((*rel_hash
)->indx
>= 0);
2356 irel
->r_symndx
= (*rel_hash
)->indx
;
2358 bfd_coff_swap_reloc_out (abfd
, irel
, erel
);
2361 amt
= relsz
* o
->reloc_count
;
2362 if (bfd_seek (abfd
, o
->rel_filepos
, SEEK_SET
) != 0
2363 || bfd_bwrite (external_relocs
, amt
, abfd
) != amt
)
2367 free (external_relocs
);
2368 external_relocs
= NULL
;
2371 /* Free up the section information. */
2372 if (flaginfo
.section_info
!= NULL
)
2376 for (i
= 0; i
< abfd
->section_count
; i
++)
2378 if (flaginfo
.section_info
[i
].relocs
!= NULL
)
2379 free (flaginfo
.section_info
[i
].relocs
);
2380 if (flaginfo
.section_info
[i
].rel_hashes
!= NULL
)
2381 free (flaginfo
.section_info
[i
].rel_hashes
);
2383 free (flaginfo
.section_info
);
2384 flaginfo
.section_info
= NULL
;
2387 /* If we have optimized stabs strings, output them. */
2388 if (coff_hash_table (info
)->stab_info
.stabstr
!= NULL
)
2390 if (! _bfd_write_stab_strings (abfd
, &coff_hash_table (info
)->stab_info
))
2394 /* Write out the string table. */
2395 if (obj_raw_syment_count (abfd
) != 0)
2399 pos
= obj_sym_filepos (abfd
) + obj_raw_syment_count (abfd
) * symesz
;
2400 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0)
2403 #if STRING_SIZE_SIZE == 4
2405 _bfd_stringtab_size (flaginfo
.strtab
) + STRING_SIZE_SIZE
,
2408 #error Change H_PUT_32 above
2411 if (bfd_bwrite (strbuf
, (bfd_size_type
) STRING_SIZE_SIZE
, abfd
)
2412 != STRING_SIZE_SIZE
)
2415 if (! _bfd_stringtab_emit (abfd
, flaginfo
.strtab
))
2419 _bfd_stringtab_free (flaginfo
.strtab
);
2421 /* Setting symcount to 0 will cause write_object_contents to
2422 not try to write out the symbols. */
2428 if (debug_merge_allocated
)
2429 coff_debug_merge_hash_table_free (&flaginfo
.debug_merge
);
2430 if (flaginfo
.strtab
!= NULL
)
2431 _bfd_stringtab_free (flaginfo
.strtab
);
2432 if (flaginfo
.section_info
!= NULL
)
2436 for (i
= 0; i
< abfd
->section_count
; i
++)
2438 if (flaginfo
.section_info
[i
].relocs
!= NULL
)
2439 free (flaginfo
.section_info
[i
].relocs
);
2440 if (flaginfo
.section_info
[i
].rel_hashes
!= NULL
)
2441 free (flaginfo
.section_info
[i
].rel_hashes
);
2443 free (flaginfo
.section_info
);
2445 if (flaginfo
.internal_syms
!= NULL
)
2446 free (flaginfo
.internal_syms
);
2447 if (flaginfo
.sec_ptrs
!= NULL
)
2448 free (flaginfo
.sec_ptrs
);
2449 if (flaginfo
.sym_indices
!= NULL
)
2450 free (flaginfo
.sym_indices
);
2451 if (flaginfo
.outsyms
!= NULL
)
2452 free (flaginfo
.outsyms
);
2453 if (flaginfo
.linenos
!= NULL
)
2454 free (flaginfo
.linenos
);
2455 if (flaginfo
.contents
!= NULL
)
2456 free (flaginfo
.contents
);
2457 if (flaginfo
.external_relocs
!= NULL
)
2458 free (flaginfo
.external_relocs
);
2459 if (flaginfo
.internal_relocs
!= NULL
)
2460 free (flaginfo
.internal_relocs
);
2461 if (external_relocs
!= NULL
)
2462 free (external_relocs
);
2467 /* Forward declaration for use by alternative_target field. */
2468 #ifdef TARGET_BIG_SYM
2469 extern const bfd_target TARGET_BIG_SYM
;
2472 /* The transfer vectors that lead the outside world to all of the above. */
2474 #ifdef TARGET_LITTLE_SYM
2475 const bfd_target TARGET_LITTLE_SYM
=
2477 TARGET_LITTLE_NAME
, /* name or coff-arm-little */
2478 bfd_target_coff_flavour
,
2479 BFD_ENDIAN_LITTLE
, /* data byte order is little */
2480 BFD_ENDIAN_LITTLE
, /* header byte order is little */
2482 (HAS_RELOC
| EXEC_P
/* FIXME: object flags */
2483 | HAS_LINENO
| HAS_DEBUG
2484 | HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| D_PAGED
),
2486 #ifndef COFF_WITH_PE
2487 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_READONLY
2488 | SEC_RELOC
), /* section flags */
2490 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_READONLY
2491 | SEC_RELOC
| SEC_LINK_ONCE
| SEC_LINK_DUPLICATES
),
2494 0, /* leading char */
2495 '/', /* ar_pad_char */
2496 15, /* ar_max_namelen??? FIXMEmgo */
2497 0, /* match priority. */
2499 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
2500 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
2501 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* data */
2503 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
2504 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
2505 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* hdrs */
2507 { /* bfd_check_format */
2510 bfd_generic_archive_p
,
2513 { /* bfd_set_format */
2514 _bfd_bool_bfd_false_error
,
2516 _bfd_generic_mkarchive
,
2517 _bfd_bool_bfd_false_error
2519 { /* bfd_write_contents */
2520 _bfd_bool_bfd_false_error
,
2521 coff_write_object_contents
,
2522 _bfd_write_archive_contents
,
2523 _bfd_bool_bfd_false_error
2526 BFD_JUMP_TABLE_GENERIC (coff
),
2527 BFD_JUMP_TABLE_COPY (coff
),
2528 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
2529 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff
),
2530 BFD_JUMP_TABLE_SYMBOLS (coff
),
2531 BFD_JUMP_TABLE_RELOCS (coff
),
2532 BFD_JUMP_TABLE_WRITE (coff
),
2533 BFD_JUMP_TABLE_LINK (coff
),
2534 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),
2536 /* Alternative_target. */
2537 #ifdef TARGET_BIG_SYM
2547 #ifdef TARGET_BIG_SYM
2548 const bfd_target TARGET_BIG_SYM
=
2551 bfd_target_coff_flavour
,
2552 BFD_ENDIAN_BIG
, /* data byte order is big */
2553 BFD_ENDIAN_BIG
, /* header byte order is big */
2555 (HAS_RELOC
| EXEC_P
/* FIXME: object flags */
2556 | HAS_LINENO
| HAS_DEBUG
2557 | HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| D_PAGED
),
2559 #ifndef COFF_WITH_PE
2560 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_READONLY
2561 | SEC_RELOC
), /* section flags */
2563 (SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_READONLY
2564 | SEC_RELOC
| SEC_LINK_ONCE
| SEC_LINK_DUPLICATES
),
2567 0, /* leading char */
2568 '/', /* ar_pad_char */
2569 15, /* ar_max_namelen??? FIXMEmgo */
2570 0, /* match priority. */
2572 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
2573 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
2574 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* data */
2576 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
2577 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
2578 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* hdrs */
2580 { /* bfd_check_format */
2583 bfd_generic_archive_p
,
2586 { /* bfd_set_format */
2587 _bfd_bool_bfd_false_error
,
2589 _bfd_generic_mkarchive
,
2590 _bfd_bool_bfd_false_error
2592 { /* bfd_write_contents */
2593 _bfd_bool_bfd_false_error
,
2594 coff_write_object_contents
,
2595 _bfd_write_archive_contents
,
2596 _bfd_bool_bfd_false_error
2599 BFD_JUMP_TABLE_GENERIC (coff
),
2600 BFD_JUMP_TABLE_COPY (coff
),
2601 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
2602 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff
),
2603 BFD_JUMP_TABLE_SYMBOLS (coff
),
2604 BFD_JUMP_TABLE_RELOCS (coff
),
2605 BFD_JUMP_TABLE_WRITE (coff
),
2606 BFD_JUMP_TABLE_LINK (coff
),
2607 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),
2609 /* Alternative_target. */
2610 #ifdef TARGET_LITTLE_SYM