2001-03-22 Philip Blundell <philb@gnu.org>
[binutils.git] / bfd / coff-ppc.c
blob798399d90cafe5d223bf39c7e0dab9c77316541b
1 /* BFD back-end for PowerPC Microsoft Portable Executable files.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
5 Original version pieced together by Kim Knuttila (krk@cygnus.com)
7 There is nothing new under the sun. This file draws a lot on other
8 coff files, in particular, those for the rs/6000, alpha, mips, and
9 intel backends, and the PE work for the arm.
11 This file is part of BFD, the Binary File Descriptor library.
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, 59 Temple Place - Suite 330,
26 Boston, MA 02111-1307, USA. */
28 /* Current State:
29 - objdump works
30 - relocs generated by gas
31 - ld will link files, but they do not run.
32 - dlltool will not produce correct output in some .reloc cases, and will
33 not produce the right glue code for dll function calls.
36 #include "bfd.h"
37 #include "sysdep.h"
39 #include "libbfd.h"
41 #include "coff/powerpc.h"
42 #include "coff/internal.h"
44 #include "coff/pe.h"
46 #ifdef BADMAG
47 #undef BADMAG
48 #endif
50 #define BADMAG(x) PPCBADMAG(x)
52 #include "libcoff.h"
54 /* This file is compiled more than once, but we only compile the
55 final_link routine once. */
56 extern 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 intialized 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 */
78 #ifdef DEBUG_HASH
80 /* Need a 7 char string for an eye catcher */
81 #define EYE "krkjunk"
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) \
87 { \
88 fprintf (stderr,\
89 _("File %s, line %d, Hash check failure, bad eye %8s\n"), \
90 __FILE__, __LINE__, addr->eye_catcher); \
91 abort (); \
94 #else
96 #define HASH_CHECK_DCL
97 #define HASH_CHECK_INIT(ret)
98 #define HASH_CHECK(addr)
100 #endif
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
112 here */
113 bfd_vma toc_offset; /* Our addition, as required */
114 int symbol_is_glue;
115 unsigned long int glue_insn;
117 HASH_CHECK_DCL
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 *,
129 const char *));
130 static 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 *,
134 const char *)));
135 static struct bfd_link_hash_table *ppc_coff_link_hash_table_create
136 PARAMS ((bfd *));
137 static 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 *,
143 bfd_vma *));
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;
151 const char *string;
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
157 subclass. */
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)
164 return 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,
169 table, string));
171 if (ret)
173 /* Initialize the local fields. */
174 SET_UNALLOCATED(ret->toc_offset);
175 ret->symbol_is_glue = 0;
176 ret->glue_insn = 0;
178 HASH_CHECK_INIT(ret);
181 return (struct bfd_hash_entry *) ret;
184 /* Initialize a PE linker hash table. */
186 static boolean
187 ppc_coff_link_hash_table_init (table, abfd, newfunc)
188 struct ppc_coff_link_hash_table *table;
189 bfd *abfd;
190 struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *,
191 struct bfd_hash_table *,
192 const char *));
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)
201 bfd *abfd;
203 struct ppc_coff_link_hash_table *ret;
205 ret = ((struct ppc_coff_link_hash_table *)
206 bfd_alloc (abfd, sizeof (struct ppc_coff_link_hash_table)));
207 if (ret == NULL)
208 return NULL;
209 if (! ppc_coff_link_hash_table_init (ret, abfd,
210 ppc_coff_link_hash_newfunc))
212 bfd_release (abfd, ret);
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... */
238 /* NOP */
239 #define IMAGE_REL_PPC_ABSOLUTE 0x0000
241 /* 64-bit address */
242 #define IMAGE_REL_PPC_ADDR64 0x0001
244 /* 32-bit address */
245 #define IMAGE_REL_PPC_ADDR32 0x0002
247 /* 26-bit address, shifted left 2 (branch absolute) */
248 #define IMAGE_REL_PPC_ADDR24 0x0003
250 /* 16-bit address */
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,
323 arelent *reloc,
324 asymbol *symbol,
325 PTR data,
326 asection *section,
327 bfd *output_bfd,
328 char **error));
329 #if 0
330 static bfd_reloc_status_type ppc_reflo_reloc PARAMS ((bfd *abfd,
331 arelent *reloc,
332 asymbol *symbol,
333 PTR data,
334 asection *section,
335 bfd *output_bfd,
336 char **error));
337 #endif
338 static bfd_reloc_status_type ppc_pair_reloc PARAMS ((bfd *abfd,
339 arelent *reloc,
340 asymbol *symbol,
341 PTR data,
342 asection *section,
343 bfd *output_bfd,
344 char **error));
346 static bfd_reloc_status_type ppc_toc16_reloc PARAMS ((bfd *abfd,
347 arelent *reloc,
348 asymbol *symbol,
349 PTR data,
350 asection *section,
351 bfd *output_bfd,
352 char **error));
354 #if 0
355 static bfd_reloc_status_type ppc_addr32nb_reloc PARAMS ((bfd *abfd,
356 arelent *reloc,
357 asymbol *symbol,
358 PTR data,
359 asection *section,
360 bfd *output_bfd,
361 char **error));
362 #endif
363 static bfd_reloc_status_type ppc_section_reloc PARAMS ((bfd *abfd,
364 arelent *reloc,
365 asymbol *symbol,
366 PTR data,
367 asection *section,
368 bfd *output_bfd,
369 char **error));
371 static bfd_reloc_status_type ppc_secrel_reloc PARAMS ((bfd *abfd,
372 arelent *reloc,
373 asymbol *symbol,
374 PTR data,
375 asection *section,
376 bfd *output_bfd,
377 char **error));
379 static bfd_reloc_status_type ppc_imglue_reloc PARAMS ((bfd *abfd,
380 arelent *reloc,
381 asymbol *symbol,
382 PTR data,
383 asection *section,
384 bfd *output_bfd,
385 char **error));
387 static boolean in_reloc_p PARAMS((bfd *abfd, reloc_howto_type *howto));
389 /* FIXME: It'll take a while to get through all of these. I only need a few to
390 get us started, so those I'll make sure work. Those marked FIXME are either
391 completely unverified or have a specific unknown marked in the comment */
393 /*---------------------------------------------------------------------------*/
394 /* */
395 /* Relocation entries for Windows/NT on PowerPC. */
396 /* */
397 /* From the document "" we find the following listed as used relocs: */
398 /* */
399 /* ABSOLUTE : The noop */
400 /* ADDR[64|32|16] : fields that hold addresses in data fields or the */
401 /* 16 bit displacement field on a load/store. */
402 /* ADDR[24|14] : fields that hold addresses in branch and cond */
403 /* branches. These represent [26|16] bit addresses. */
404 /* The low order 2 bits are preserved. */
405 /* REL[24|14] : branches relative to the Instruction Address */
406 /* register. These represent [26|16] bit addresses, */
407 /* as before. The instruction field will be zero, and */
408 /* the address of the SYM will be inserted at link time. */
409 /* TOCREL16 : 16 bit displacement field referring to a slot in */
410 /* toc. */
411 /* TOCREL14 : 16 bit displacement field, similar to REL14 or ADDR14. */
412 /* ADDR32NB : 32 bit address relative to the virtual origin. */
413 /* (On the alpha, this is always a linker generated thunk)*/
414 /* (i.e. 32bit addr relative to the image base) */
415 /* SECREL : The value is relative to the start of the section */
416 /* containing the symbol. */
417 /* SECTION : access to the header containing the item. Supports the */
418 /* codeview debugger. */
419 /* */
420 /* In particular, note that the document does not indicate that the */
421 /* relocations listed in the header file are used. */
422 /* */
423 /* */
424 /* */
425 /*---------------------------------------------------------------------------*/
427 static reloc_howto_type ppc_coff_howto_table[] =
429 /* IMAGE_REL_PPC_ABSOLUTE 0x0000 NOP */
430 /* Unused: */
431 HOWTO (IMAGE_REL_PPC_ABSOLUTE, /* type */
432 0, /* rightshift */
433 0, /* size (0 = byte, 1 = short, 2 = long) */
434 0, /* bitsize */
435 false, /* pc_relative */
436 0, /* bitpos */
437 complain_overflow_dont, /* dont complain_on_overflow */
438 0, /* special_function */
439 "ABSOLUTE", /* name */
440 false, /* partial_inplace */
441 0x00, /* src_mask */
442 0x00, /* dst_mask */
443 false), /* pcrel_offset */
445 /* IMAGE_REL_PPC_ADDR64 0x0001 64-bit address */
446 /* Unused: */
447 HOWTO(IMAGE_REL_PPC_ADDR64, /* type */
448 0, /* rightshift */
449 3, /* size (0 = byte, 1 = short, 2 = long) */
450 64, /* bitsize */
451 false, /* pc_relative */
452 0, /* bitpos */
453 complain_overflow_bitfield, /* complain_on_overflow */
454 0, /* special_function */
455 "ADDR64", /* name */
456 true, /* partial_inplace */
457 MINUS_ONE, /* src_mask */
458 MINUS_ONE, /* dst_mask */
459 false), /* pcrel_offset */
461 /* IMAGE_REL_PPC_ADDR32 0x0002 32-bit address */
462 /* Used: */
463 HOWTO (IMAGE_REL_PPC_ADDR32, /* type */
464 0, /* rightshift */
465 2, /* size (0 = byte, 1 = short, 2 = long) */
466 32, /* bitsize */
467 false, /* pc_relative */
468 0, /* bitpos */
469 complain_overflow_bitfield, /* complain_on_overflow */
470 0, /* special_function */
471 "ADDR32", /* name */
472 true, /* partial_inplace */
473 0xffffffff, /* src_mask */
474 0xffffffff, /* dst_mask */
475 false), /* pcrel_offset */
477 /* IMAGE_REL_PPC_ADDR24 0x0003 26-bit address, shifted left 2 (branch absolute) */
478 /* the LI field is in bit 6 through bit 29 is 24 bits, + 2 for the shift */
479 /* Of course, That's the IBM approved bit numbering, which is not what */
480 /* anyone else uses.... The li field is in bit 2 thru 25 */
481 /* Used: */
482 HOWTO (IMAGE_REL_PPC_ADDR24, /* type */
483 0, /* rightshift */
484 2, /* size (0 = byte, 1 = short, 2 = long) */
485 26, /* bitsize */
486 false, /* pc_relative */
487 0, /* bitpos */
488 complain_overflow_bitfield, /* complain_on_overflow */
489 0, /* special_function */
490 "ADDR24", /* name */
491 true, /* partial_inplace */
492 0x07fffffc, /* src_mask */
493 0x07fffffc, /* dst_mask */
494 false), /* pcrel_offset */
496 /* IMAGE_REL_PPC_ADDR16 0x0004 16-bit address */
497 /* Used: */
498 HOWTO (IMAGE_REL_PPC_ADDR16, /* type */
499 0, /* rightshift */
500 1, /* size (0 = byte, 1 = short, 2 = long) */
501 16, /* bitsize */
502 false, /* pc_relative */
503 0, /* bitpos */
504 complain_overflow_signed, /* complain_on_overflow */
505 0, /* special_function */
506 "ADDR16", /* name */
507 true, /* partial_inplace */
508 0xffff, /* src_mask */
509 0xffff, /* dst_mask */
510 false), /* pcrel_offset */
512 /* IMAGE_REL_PPC_ADDR14 0x0005 */
513 /* 16-bit address, shifted left 2 (load doubleword) */
514 /* FIXME: the mask is likely wrong, and the bit position may be as well */
515 /* Unused: */
516 HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
517 1, /* rightshift */
518 1, /* size (0 = byte, 1 = short, 2 = long) */
519 16, /* bitsize */
520 false, /* pc_relative */
521 0, /* bitpos */
522 complain_overflow_signed, /* complain_on_overflow */
523 0, /* special_function */
524 "ADDR16", /* name */
525 true, /* partial_inplace */
526 0xffff, /* src_mask */
527 0xffff, /* dst_mask */
528 false), /* pcrel_offset */
530 /* IMAGE_REL_PPC_REL24 0x0006 */
531 /* 26-bit PC-relative offset, shifted left 2 (branch relative) */
532 /* Used: */
533 HOWTO (IMAGE_REL_PPC_REL24, /* type */
534 0, /* rightshift */
535 2, /* size (0 = byte, 1 = short, 2 = long) */
536 26, /* bitsize */
537 true, /* pc_relative */
538 0, /* bitpos */
539 complain_overflow_signed, /* complain_on_overflow */
540 0, /* special_function */
541 "REL24", /* name */
542 true, /* partial_inplace */
543 0x3fffffc, /* src_mask */
544 0x3fffffc, /* dst_mask */
545 false), /* pcrel_offset */
547 /* IMAGE_REL_PPC_REL14 0x0007 */
548 /* 16-bit PC-relative offset, shifted left 2 (br cond relative) */
549 /* FIXME: the mask is likely wrong, and the bit position may be as well */
550 /* FIXME: how does it know how far to shift? */
551 /* Unused: */
552 HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
553 1, /* rightshift */
554 1, /* size (0 = byte, 1 = short, 2 = long) */
555 16, /* bitsize */
556 false, /* pc_relative */
557 0, /* bitpos */
558 complain_overflow_signed, /* complain_on_overflow */
559 0, /* special_function */
560 "ADDR16", /* name */
561 true, /* partial_inplace */
562 0xffff, /* src_mask */
563 0xffff, /* dst_mask */
564 true), /* pcrel_offset */
566 /* IMAGE_REL_PPC_TOCREL16 0x0008 */
567 /* 16-bit offset from TOC base */
568 /* Used: */
569 HOWTO (IMAGE_REL_PPC_TOCREL16,/* type */
570 0, /* rightshift */
571 1, /* size (0 = byte, 1 = short, 2 = long) */
572 16, /* bitsize */
573 false, /* pc_relative */
574 0, /* bitpos */
575 complain_overflow_dont, /* complain_on_overflow */
576 ppc_toc16_reloc, /* special_function */
577 "TOCREL16", /* name */
578 false, /* partial_inplace */
579 0xffff, /* src_mask */
580 0xffff, /* dst_mask */
581 false), /* pcrel_offset */
583 /* IMAGE_REL_PPC_TOCREL14 0x0009 */
584 /* 16-bit offset from TOC base, shifted left 2 (load doubleword) */
585 /* Unused: */
586 HOWTO (IMAGE_REL_PPC_TOCREL14,/* type */
587 1, /* rightshift */
588 1, /* size (0 = byte, 1 = short, 2 = long) */
589 16, /* bitsize */
590 false, /* pc_relative */
591 0, /* bitpos */
592 complain_overflow_signed, /* complain_on_overflow */
593 0, /* special_function */
594 "TOCREL14", /* name */
595 false, /* partial_inplace */
596 0xffff, /* src_mask */
597 0xffff, /* dst_mask */
598 false), /* pcrel_offset */
600 /* IMAGE_REL_PPC_ADDR32NB 0x000A */
601 /* 32-bit addr w/ image base */
602 /* Unused: */
603 HOWTO (IMAGE_REL_PPC_ADDR32NB,/* type */
604 0, /* rightshift */
605 2, /* size (0 = byte, 1 = short, 2 = long) */
606 32, /* bitsize */
607 false, /* pc_relative */
608 0, /* bitpos */
609 complain_overflow_signed, /* complain_on_overflow */
610 0, /* special_function */
611 "ADDR32NB", /* name */
612 true, /* partial_inplace */
613 0xffffffff, /* src_mask */
614 0xffffffff, /* dst_mask */
615 false), /* pcrel_offset */
617 /* IMAGE_REL_PPC_SECREL 0x000B */
618 /* va of containing section (as in an image sectionhdr) */
619 /* Unused: */
620 HOWTO (IMAGE_REL_PPC_SECREL,/* type */
621 0, /* rightshift */
622 2, /* size (0 = byte, 1 = short, 2 = long) */
623 32, /* bitsize */
624 false, /* pc_relative */
625 0, /* bitpos */
626 complain_overflow_signed, /* complain_on_overflow */
627 ppc_secrel_reloc, /* special_function */
628 "SECREL", /* name */
629 true, /* partial_inplace */
630 0xffffffff, /* src_mask */
631 0xffffffff, /* dst_mask */
632 true), /* pcrel_offset */
634 /* IMAGE_REL_PPC_SECTION 0x000C */
635 /* sectionheader number */
636 /* Unused: */
637 HOWTO (IMAGE_REL_PPC_SECTION,/* type */
638 0, /* rightshift */
639 2, /* size (0 = byte, 1 = short, 2 = long) */
640 32, /* bitsize */
641 false, /* pc_relative */
642 0, /* bitpos */
643 complain_overflow_signed, /* complain_on_overflow */
644 ppc_section_reloc, /* special_function */
645 "SECTION", /* name */
646 true, /* partial_inplace */
647 0xffffffff, /* src_mask */
648 0xffffffff, /* dst_mask */
649 true), /* pcrel_offset */
651 /* IMAGE_REL_PPC_IFGLUE 0x000D */
652 /* substitute TOC restore instruction iff symbol is glue code */
653 /* Used: */
654 HOWTO (IMAGE_REL_PPC_IFGLUE,/* type */
655 0, /* rightshift */
656 2, /* size (0 = byte, 1 = short, 2 = long) */
657 32, /* bitsize */
658 false, /* pc_relative */
659 0, /* bitpos */
660 complain_overflow_signed, /* complain_on_overflow */
661 0, /* special_function */
662 "IFGLUE", /* name */
663 true, /* partial_inplace */
664 0xffffffff, /* src_mask */
665 0xffffffff, /* dst_mask */
666 false), /* pcrel_offset */
668 /* IMAGE_REL_PPC_IMGLUE 0x000E */
669 /* symbol is glue code; virtual address is TOC restore instruction */
670 /* Unused: */
671 HOWTO (IMAGE_REL_PPC_IMGLUE,/* type */
672 0, /* rightshift */
673 2, /* size (0 = byte, 1 = short, 2 = long) */
674 32, /* bitsize */
675 false, /* pc_relative */
676 0, /* bitpos */
677 complain_overflow_dont, /* complain_on_overflow */
678 ppc_imglue_reloc, /* special_function */
679 "IMGLUE", /* name */
680 false, /* partial_inplace */
681 0xffffffff, /* src_mask */
682 0xffffffff, /* dst_mask */
683 false), /* pcrel_offset */
685 /* IMAGE_REL_PPC_SECREL16 0x000F */
686 /* va of containing section (limited to 16 bits) */
687 /* Unused: */
688 HOWTO (IMAGE_REL_PPC_SECREL16,/* type */
689 0, /* rightshift */
690 1, /* size (0 = byte, 1 = short, 2 = long) */
691 16, /* bitsize */
692 false, /* pc_relative */
693 0, /* bitpos */
694 complain_overflow_signed, /* complain_on_overflow */
695 0, /* special_function */
696 "SECREL16", /* name */
697 true, /* partial_inplace */
698 0xffff, /* src_mask */
699 0xffff, /* dst_mask */
700 true), /* pcrel_offset */
702 /* IMAGE_REL_PPC_REFHI 0x0010 */
703 /* Unused: */
704 HOWTO (IMAGE_REL_PPC_REFHI, /* type */
705 0, /* rightshift */
706 1, /* size (0 = byte, 1 = short, 2 = long) */
707 16, /* bitsize */
708 false, /* pc_relative */
709 0, /* bitpos */
710 complain_overflow_signed, /* complain_on_overflow */
711 ppc_refhi_reloc, /* special_function */
712 "REFHI", /* name */
713 true, /* partial_inplace */
714 0xffffffff, /* src_mask */
715 0xffffffff, /* dst_mask */
716 false), /* pcrel_offset */
718 /* IMAGE_REL_PPC_REFLO 0x0011 */
719 /* Unused: */
720 HOWTO (IMAGE_REL_PPC_REFLO, /* type */
721 0, /* rightshift */
722 1, /* size (0 = byte, 1 = short, 2 = long) */
723 16, /* bitsize */
724 false, /* pc_relative */
725 0, /* bitpos */
726 complain_overflow_signed, /* complain_on_overflow */
727 ppc_refhi_reloc, /* special_function */
728 "REFLO", /* name */
729 true, /* partial_inplace */
730 0xffffffff, /* src_mask */
731 0xffffffff, /* dst_mask */
732 false), /* pcrel_offset */
734 /* IMAGE_REL_PPC_PAIR 0x0012 */
735 /* Unused: */
736 HOWTO (IMAGE_REL_PPC_PAIR, /* type */
737 0, /* rightshift */
738 1, /* size (0 = byte, 1 = short, 2 = long) */
739 16, /* bitsize */
740 false, /* pc_relative */
741 0, /* bitpos */
742 complain_overflow_signed, /* complain_on_overflow */
743 ppc_pair_reloc, /* special_function */
744 "PAIR", /* name */
745 true, /* partial_inplace */
746 0xffffffff, /* src_mask */
747 0xffffffff, /* dst_mask */
748 false), /* pcrel_offset */
750 /* IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 */
751 /* 16-bit offset from TOC base, without causing a definition */
752 /* Used: */
753 HOWTO ( (IMAGE_REL_PPC_TOCREL16 | IMAGE_REL_PPC_TOCDEFN), /* type */
754 0, /* rightshift */
755 1, /* size (0 = byte, 1 = short, 2 = long) */
756 16, /* bitsize */
757 false, /* pc_relative */
758 0, /* bitpos */
759 complain_overflow_dont, /* complain_on_overflow */
760 0, /* special_function */
761 "TOCREL16, TOCDEFN", /* name */
762 false, /* partial_inplace */
763 0xffff, /* src_mask */
764 0xffff, /* dst_mask */
765 false), /* pcrel_offset */
769 /* Some really cheezy macros that can be turned on to test stderr :-) */
771 #ifdef DEBUG_RELOC
772 #define UN_IMPL(x) \
774 static int i; \
775 if (i == 0) \
777 i = 1; \
778 fprintf (stderr,_("Unimplemented Relocation -- %s\n"),x); \
782 #define DUMP_RELOC(n,r) \
784 fprintf (stderr,"%s sym %d, addr %d, addend %d\n", \
785 n, (*(r->sym_ptr_ptr))->name, \
786 r->address, r->addend); \
789 /* Given a reloc name, n, and a pointer to an internal_reloc,
790 dump out interesting information on the contents
792 #define n_name _n._n_name
793 #define n_zeroes _n._n_n._n_zeroes
794 #define n_offset _n._n_n._n_offset
798 #define DUMP_RELOC2(n,r) \
800 fprintf (stderr,"%s sym %d, r_vaddr %d %s\n", \
801 n, r->r_symndx, r->r_vaddr,\
802 (((r->r_type) & IMAGE_REL_PPC_TOCDEFN) == 0) \
803 ?" ":" TOCDEFN" ); \
806 #else
807 #define UN_IMPL(x)
808 #define DUMP_RELOC(n,r)
809 #define DUMP_RELOC2(n,r)
810 #endif
812 /* toc construction and management routines */
814 /* This file is compiled twice, and these variables are defined in one
815 of the compilations. FIXME: This is confusing and weird. Also,
816 BFD should not use global variables. */
817 extern bfd* bfd_of_toc_owner;
818 extern long int global_toc_size;
820 extern long int import_table_size;
821 extern long int first_thunk_address;
822 extern long int thunk_size;
824 enum toc_type
826 default_toc,
827 toc_32,
828 toc_64
831 enum ref_category
833 priv,
834 pub,
835 data
838 struct list_ele
840 struct list_ele *next;
841 bfd_vma addr;
842 enum ref_category cat;
843 int offset;
844 const char *name;
847 extern struct list_ele *head;
848 extern struct list_ele *tail;
850 static void record_toc
851 PARAMS ((asection *, int, enum ref_category, const char *));
853 static void
854 record_toc (toc_section, our_toc_offset, cat, name)
855 asection *toc_section;
856 int our_toc_offset;
857 enum ref_category cat;
858 const char *name;
860 /* add this entry to our toc addr-offset-name list */
861 struct list_ele *t;
862 t = (struct list_ele *) bfd_malloc (sizeof (struct list_ele));
863 if (t == NULL)
864 abort ();
865 t->next = 0;
866 t->offset = our_toc_offset;
867 t->name = name;
868 t->cat = cat;
869 t->addr = toc_section->output_offset + our_toc_offset;
871 if (head == 0)
873 head = t;
874 tail = t;
876 else
878 tail->next = t;
879 tail = t;
883 #ifdef COFF_IMAGE_WITH_PE
885 static boolean ppc_record_toc_entry
886 PARAMS ((bfd *, struct bfd_link_info *, asection *, int, enum toc_type));
887 static void ppc_mark_symbol_as_glue
888 PARAMS ((bfd *, int, struct internal_reloc *));
890 /* record a toc offset against a symbol */
891 static boolean
892 ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
893 bfd *abfd;
894 struct bfd_link_info *info ATTRIBUTE_UNUSED;
895 asection *sec ATTRIBUTE_UNUSED;
896 int sym;
897 enum toc_type toc_kind ATTRIBUTE_UNUSED;
899 struct ppc_coff_link_hash_entry *h;
900 const char *name;
902 int *local_syms;
904 h = 0;
906 h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
907 if (h != 0)
909 HASH_CHECK(h);
912 if (h == 0)
914 local_syms = obj_coff_local_toc_table(abfd);
915 if (local_syms == 0)
917 unsigned int i;
918 /* allocate a table */
919 local_syms =
920 (int *) bfd_zalloc (abfd,
921 obj_raw_syment_count(abfd) * sizeof (int));
922 if (local_syms == 0)
923 return false;
924 obj_coff_local_toc_table(abfd) = local_syms;
925 for (i = 0; i < obj_raw_syment_count(abfd); ++i)
927 SET_UNALLOCATED(local_syms[i]);
931 if (IS_UNALLOCATED(local_syms[sym]))
933 local_syms[sym] = global_toc_size;
934 global_toc_size += 4;
936 /* The size must fit in a 16bit displacment */
937 if (global_toc_size > 65535)
939 (*_bfd_error_handler) (_("TOC overflow"));
940 bfd_set_error (bfd_error_file_too_big);
941 return false;
945 else
947 name = h->root.root.root.string;
949 /* check to see if there's a toc slot allocated. If not, do it
950 here. It will be used in relocate_section */
951 if (IS_UNALLOCATED(h->toc_offset))
953 h->toc_offset = global_toc_size;
954 global_toc_size += 4;
956 /* The size must fit in a 16bit displacment */
957 if (global_toc_size >= 65535)
959 (*_bfd_error_handler) (_("TOC overflow"));
960 bfd_set_error (bfd_error_file_too_big);
961 return false;
966 return true;
969 /* record a toc offset against a symbol */
970 static void
971 ppc_mark_symbol_as_glue(abfd, sym, rel)
972 bfd *abfd;
973 int sym;
974 struct internal_reloc *rel;
976 struct ppc_coff_link_hash_entry *h;
978 h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
980 HASH_CHECK(h);
982 h->symbol_is_glue = 1;
983 h->glue_insn = bfd_get_32 (abfd, (bfd_byte *) &rel->r_vaddr);
985 return;
988 #endif /* COFF_IMAGE_WITH_PE */
990 /* Return true if this relocation should
991 appear in the output .reloc section. */
993 static boolean in_reloc_p(abfd, howto)
994 bfd * abfd ATTRIBUTE_UNUSED;
995 reloc_howto_type *howto;
997 return
998 (! howto->pc_relative)
999 && (howto->type != IMAGE_REL_PPC_ADDR32NB)
1000 && (howto->type != IMAGE_REL_PPC_TOCREL16)
1001 && (howto->type != IMAGE_REL_PPC_IMGLUE)
1002 && (howto->type != IMAGE_REL_PPC_IFGLUE)
1003 && (howto->type != IMAGE_REL_PPC_SECREL)
1004 && (howto->type != IMAGE_REL_PPC_SECTION)
1005 && (howto->type != IMAGE_REL_PPC_SECREL16)
1006 && (howto->type != IMAGE_REL_PPC_REFHI)
1007 && (howto->type != IMAGE_REL_PPC_REFLO)
1008 && (howto->type != IMAGE_REL_PPC_PAIR)
1009 && (howto->type != IMAGE_REL_PPC_TOCREL16_DEFN) ;
1012 #if 0
1014 /* this function is in charge of performing all the ppc PE relocations */
1015 /* Don't yet know if we want to do this this particular way ... (krk) */
1016 /* FIXME: (it is not yet enabled) */
1018 static bfd_reloc_status_type
1019 pe_ppc_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
1020 error_message)
1021 bfd *abfd;
1022 arelent *reloc_entry;
1023 asymbol *symbol_in;
1024 PTR data;
1025 asection *input_section;
1026 bfd *output_bfd;
1027 char **error_message;
1029 /* the consth relocation comes in two parts, we have to remember
1030 the state between calls, in these variables */
1031 static boolean part1_consth_active = false;
1032 static unsigned long part1_consth_value;
1034 unsigned long sym_value;
1035 unsigned short r_type;
1036 unsigned long addr = reloc_entry->address ; /*+ input_section->vma*/
1038 r_type = reloc_entry->howto->type;
1040 if (output_bfd)
1042 /* Partial linking - do nothing */
1043 reloc_entry->address += input_section->output_offset;
1044 return bfd_reloc_ok;
1047 if (symbol_in != NULL
1048 && bfd_is_und_section (symbol_in->section))
1050 /* Keep the state machine happy in case we're called again */
1051 if (r_type == IMAGE_REL_PPC_REFHI)
1053 part1_consth_active = true;
1054 part1_consth_value = 0;
1056 return(bfd_reloc_undefined);
1059 if ((part1_consth_active) && (r_type != IMAGE_REL_PPC_PAIR))
1061 part1_consth_active = false;
1062 *error_message = (char *) _("Missing PAIR");
1063 return(bfd_reloc_dangerous);
1066 sym_value = get_symbol_value(symbol_in);
1068 return(bfd_reloc_ok);
1071 #endif /* 0 */
1073 /* The reloc processing routine for the optimized COFF linker. */
1075 static boolean
1076 coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
1077 contents, relocs, syms, sections)
1078 bfd *output_bfd;
1079 struct bfd_link_info *info;
1080 bfd *input_bfd;
1081 asection *input_section;
1082 bfd_byte *contents;
1083 struct internal_reloc *relocs;
1084 struct internal_syment *syms;
1085 asection **sections;
1087 struct internal_reloc *rel;
1088 struct internal_reloc *relend;
1089 boolean hihalf;
1090 bfd_vma hihalf_val;
1091 asection *toc_section = 0;
1092 bfd_vma relocation;
1093 reloc_howto_type *howto = 0;
1095 /* If we are performing a relocateable link, we don't need to do a
1096 thing. The caller will take care of adjusting the reloc
1097 addresses and symbol indices. */
1098 if (info->relocateable)
1099 return true;
1101 hihalf = false;
1102 hihalf_val = 0;
1104 rel = relocs;
1105 relend = rel + input_section->reloc_count;
1106 for (; rel < relend; rel++)
1108 long symndx;
1109 struct ppc_coff_link_hash_entry *h;
1110 struct internal_syment *sym;
1111 bfd_vma val;
1113 asection *sec;
1114 bfd_reloc_status_type rstat;
1115 bfd_byte *loc;
1117 unsigned short r_type = EXTRACT_TYPE (rel->r_type);
1118 unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
1120 symndx = rel->r_symndx;
1121 loc = contents + rel->r_vaddr - input_section->vma;
1123 /* FIXME: check bounds on r_type */
1124 howto = ppc_coff_howto_table + r_type;
1126 if (symndx == -1)
1128 h = NULL;
1129 sym = NULL;
1131 else
1133 h = (struct ppc_coff_link_hash_entry *)
1134 (obj_coff_sym_hashes (input_bfd)[symndx]);
1135 if (h != 0)
1137 HASH_CHECK(h);
1140 sym = syms + symndx;
1143 if (r_type == IMAGE_REL_PPC_IMGLUE && h == 0)
1145 /* An IMGLUE reloc must have a name. Something is very wrong. */
1146 abort ();
1149 sec = NULL;
1150 val = 0;
1152 /* FIXME: PAIR unsupported in the following code */
1153 if (h == NULL)
1155 if (symndx == -1)
1156 sec = bfd_abs_section_ptr;
1157 else
1159 sec = sections[symndx];
1160 val = (sec->output_section->vma
1161 + sec->output_offset
1162 + sym->n_value);
1163 if (! obj_pe (output_bfd))
1164 val -= sec->vma;
1167 else
1169 HASH_CHECK(h);
1171 if (h->root.root.type == bfd_link_hash_defined
1172 || h->root.root.type == bfd_link_hash_defweak)
1174 sec = h->root.root.u.def.section;
1175 val = (h->root.root.u.def.value
1176 + sec->output_section->vma
1177 + sec->output_offset);
1179 else
1181 if (! ((*info->callbacks->undefined_symbol)
1182 (info, h->root.root.root.string, input_bfd, input_section,
1183 rel->r_vaddr - input_section->vma, true)))
1184 return false;
1188 rstat = bfd_reloc_ok;
1190 /* Each case must do its own relocation, setting rstat appropriately */
1191 switch (r_type)
1193 default:
1194 (*_bfd_error_handler)
1195 (_("%s: unsupported relocation type 0x%02x"),
1196 bfd_get_filename (input_bfd), r_type);
1197 bfd_set_error (bfd_error_bad_value);
1198 return false;
1199 case IMAGE_REL_PPC_TOCREL16:
1201 bfd_vma our_toc_offset;
1202 int fixit;
1204 DUMP_RELOC2(howto->name, rel);
1206 if (toc_section == 0)
1208 toc_section = bfd_get_section_by_name (bfd_of_toc_owner,
1209 TOC_SECTION_NAME);
1211 if ( toc_section == NULL )
1213 /* There is no toc section. Something is very wrong. */
1214 abort ();
1219 * Amazing bit tricks present. As we may have seen earlier, we
1220 * use the 1 bit to tell us whether or not a toc offset has been
1221 * allocated. Now that they've all been allocated, we will use
1222 * the 1 bit to tell us if we've written this particular toc
1223 * entry out.
1225 fixit = false;
1226 if (h == 0)
1227 { /* it is a file local symbol */
1228 int *local_toc_table;
1229 const char *name;
1231 sym = syms + symndx;
1232 name = sym->_n._n_name;
1234 local_toc_table = obj_coff_local_toc_table(input_bfd);
1235 our_toc_offset = local_toc_table[symndx];
1237 if (IS_WRITTEN(our_toc_offset))
1239 /* if it has been written out, it is marked with the
1240 1 bit. Fix up our offset, but do not write it out
1241 again.
1243 MAKE_ADDR_AGAIN(our_toc_offset);
1245 else
1247 /* write out the toc entry */
1248 record_toc(toc_section,
1249 our_toc_offset,
1250 priv,
1251 strdup(name));
1253 bfd_put_32 (output_bfd,
1254 val,
1255 toc_section->contents + our_toc_offset);
1257 MARK_AS_WRITTEN(local_toc_table[symndx]);
1258 fixit = true;
1261 else
1263 const char *name = h->root.root.root.string;
1264 our_toc_offset = h->toc_offset;
1266 if ((r_flags & IMAGE_REL_PPC_TOCDEFN)
1267 == IMAGE_REL_PPC_TOCDEFN )
1269 /* This is unbelievable cheese. Some knowledgable asm
1270 hacker has decided to use r2 as a base for loading
1271 a value. He/She does this by setting the tocdefn bit,
1272 and not supplying a toc definition. The behaviour is
1273 then to use the difference between the value of the
1274 symbol and the actual location of the toc as the toc
1275 index.
1277 In fact, what is usually happening is, because the
1278 Import Address Table is mapped immediately following
1279 the toc, some trippy library code trying for speed on
1280 dll linkage, takes advantage of that and considers
1281 the IAT to be part of the toc, thus saving a load.
1284 our_toc_offset = val -
1285 (toc_section->output_section->vma +
1286 toc_section->output_offset);
1288 /* The size must still fit in a 16bit displacment */
1289 if (our_toc_offset >= 65535)
1291 (*_bfd_error_handler)
1292 (_("%s: Relocation for %s of %x exceeds Toc size limit"),
1293 bfd_get_filename (input_bfd), name, our_toc_offset);
1294 bfd_set_error (bfd_error_bad_value);
1295 return false;
1298 record_toc(toc_section, our_toc_offset, pub, strdup(name));
1300 else if (IS_WRITTEN(our_toc_offset))
1302 /* if it has been written out, it is marked with the
1303 1 bit. Fix up our offset, but do not write it out
1304 again.
1306 MAKE_ADDR_AGAIN(our_toc_offset);
1308 else
1310 record_toc(toc_section, our_toc_offset, pub, strdup(name));
1312 /* write out the toc entry */
1313 bfd_put_32 (output_bfd,
1314 val,
1315 toc_section->contents + our_toc_offset);
1317 MARK_AS_WRITTEN(h->toc_offset);
1318 /* The tricky part is that this is the address that */
1319 /* needs a .reloc entry for it */
1320 fixit = true;
1324 if (fixit && info->base_file)
1326 /* So if this is non pcrelative, and is referenced
1327 to a section or a common symbol, then it needs a reloc */
1329 /* relocation to a symbol in a section which
1330 isn't absolute - we output the address here
1331 to a file */
1333 bfd_vma addr = toc_section->output_section->vma
1334 + toc_section->output_offset + our_toc_offset;
1336 if (coff_data(output_bfd)->pe)
1337 addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
1339 fwrite (&addr, 1,4, (FILE *) info->base_file);
1342 /* FIXME: this test is conservative */
1343 if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN &&
1344 our_toc_offset > toc_section->_raw_size)
1346 (*_bfd_error_handler)
1347 (_("%s: Relocation exceeds allocated TOC (%x)"),
1348 bfd_get_filename (input_bfd),
1349 toc_section->_raw_size);
1350 bfd_set_error (bfd_error_bad_value);
1351 return false;
1354 /* Now we know the relocation for this toc reference */
1355 relocation = our_toc_offset + TOC_LOAD_ADJUSTMENT;
1356 rstat = _bfd_relocate_contents (howto,
1357 input_bfd,
1358 relocation,
1359 loc);
1361 break;
1362 case IMAGE_REL_PPC_IFGLUE:
1364 /* To solve this, we need to know whether or not the symbol */
1365 /* appearing on the call instruction is a glue function or not. */
1366 /* A glue function must announce itself via a IMGLUE reloc, and */
1367 /* the reloc contains the required toc restore instruction */
1369 bfd_vma x;
1370 const char *my_name;
1371 DUMP_RELOC2(howto->name, rel);
1373 if (h != 0)
1375 my_name = h->root.root.root.string;
1376 if (h->symbol_is_glue == 1)
1378 x = bfd_get_32 (input_bfd, loc);
1379 bfd_put_32 (input_bfd, h->glue_insn, loc);
1383 break;
1384 case IMAGE_REL_PPC_SECREL:
1385 /* Unimplemented: codeview debugging information */
1386 /* For fast access to the header of the section
1387 containing the item. */
1388 break;
1389 case IMAGE_REL_PPC_SECTION:
1390 /* Unimplemented: codeview debugging information */
1391 /* Is used to indicate that the value should be relative
1392 to the beginning of the section that contains the
1393 symbol */
1394 break;
1395 case IMAGE_REL_PPC_ABSOLUTE:
1397 const char *my_name;
1398 if (h == 0)
1399 my_name = (syms+symndx)->_n._n_name;
1400 else
1402 my_name = h->root.root.root.string;
1405 fprintf (stderr,
1406 _("Warning: unsupported reloc %s <file %s, section %s>\n"),
1407 howto->name,
1408 bfd_get_filename(input_bfd),
1409 input_section->name);
1411 fprintf (stderr,"sym %ld (%s), r_vaddr %ld (%lx)\n",
1412 rel->r_symndx, my_name, (long) rel->r_vaddr,
1413 (unsigned long) rel->r_vaddr);
1415 break;
1416 case IMAGE_REL_PPC_IMGLUE:
1418 /* There is nothing to do now. This reloc was noted in the first
1419 pass over the relocs, and the glue instruction extracted */
1420 const char *my_name;
1421 if (h->symbol_is_glue == 1)
1422 break;
1423 my_name = h->root.root.root.string;
1425 (*_bfd_error_handler)
1426 (_("%s: Out of order IMGLUE reloc for %s"),
1427 bfd_get_filename (input_bfd), my_name);
1428 bfd_set_error (bfd_error_bad_value);
1429 return false;
1432 case IMAGE_REL_PPC_ADDR32NB:
1434 struct coff_link_hash_entry *myh = 0;
1435 const char *name = 0;
1436 DUMP_RELOC2(howto->name, rel);
1438 if (strncmp(".idata$2",input_section->name,8) == 0 && first_thunk_address == 0)
1440 /* set magic values */
1441 int idata5offset;
1442 struct coff_link_hash_entry *myh = 0;
1443 myh = coff_link_hash_lookup (coff_hash_table (info),
1444 "__idata5_magic__",
1445 false, false, true);
1446 first_thunk_address = myh->root.u.def.value +
1447 sec->output_section->vma +
1448 sec->output_offset -
1449 pe_data(output_bfd)->pe_opthdr.ImageBase;
1451 idata5offset = myh->root.u.def.value;
1452 myh = coff_link_hash_lookup (coff_hash_table (info),
1453 "__idata6_magic__",
1454 false, false, true);
1456 thunk_size = myh->root.u.def.value - idata5offset;
1457 myh = coff_link_hash_lookup (coff_hash_table (info),
1458 "__idata4_magic__",
1459 false, false, true);
1460 import_table_size = myh->root.u.def.value;
1463 if (h == 0)
1464 { /* it is a file local symbol */
1465 sym = syms + symndx;
1466 name = sym->_n._n_name;
1468 else
1470 char *target = 0;
1472 name = h->root.root.root.string;
1473 if (strcmp(".idata$2", name) == 0)
1474 target = "__idata2_magic__";
1475 else if (strcmp(".idata$4", name) == 0)
1476 target = "__idata4_magic__";
1477 else if (strcmp(".idata$5", name) == 0)
1478 target = "__idata5_magic__";
1480 if (target != 0)
1482 myh = 0;
1484 myh = coff_link_hash_lookup (coff_hash_table (info),
1485 target,
1486 false, false, true);
1487 if (myh == 0)
1489 /* Missing magic cookies. Something is very wrong. */
1490 abort ();
1493 val = myh->root.u.def.value +
1494 sec->output_section->vma + sec->output_offset;
1495 if (first_thunk_address == 0)
1497 int idata5offset;
1498 myh = coff_link_hash_lookup (coff_hash_table (info),
1499 "__idata5_magic__",
1500 false, false, true);
1501 first_thunk_address = myh->root.u.def.value +
1502 sec->output_section->vma +
1503 sec->output_offset -
1504 pe_data(output_bfd)->pe_opthdr.ImageBase;
1506 idata5offset = myh->root.u.def.value;
1507 myh = coff_link_hash_lookup (coff_hash_table (info),
1508 "__idata6_magic__",
1509 false, false, true);
1511 thunk_size = myh->root.u.def.value - idata5offset;
1512 myh = coff_link_hash_lookup (coff_hash_table (info),
1513 "__idata4_magic__",
1514 false, false, true);
1515 import_table_size = myh->root.u.def.value;
1520 rstat = _bfd_relocate_contents (howto,
1521 input_bfd,
1522 val -
1523 pe_data(output_bfd)->pe_opthdr.ImageBase,
1524 loc);
1526 break;
1528 case IMAGE_REL_PPC_REL24:
1529 DUMP_RELOC2(howto->name, rel);
1530 val -= (input_section->output_section->vma
1531 + input_section->output_offset);
1533 rstat = _bfd_relocate_contents (howto,
1534 input_bfd,
1535 val,
1536 loc);
1537 break;
1538 case IMAGE_REL_PPC_ADDR16:
1539 case IMAGE_REL_PPC_ADDR24:
1540 case IMAGE_REL_PPC_ADDR32:
1541 DUMP_RELOC2(howto->name, rel);
1542 rstat = _bfd_relocate_contents (howto,
1543 input_bfd,
1544 val,
1545 loc);
1546 break;
1549 if ( info->base_file )
1551 /* So if this is non pcrelative, and is referenced
1552 to a section or a common symbol, then it needs a reloc */
1553 if (sym && pe_data(output_bfd)->in_reloc_p(output_bfd, howto))
1555 /* relocation to a symbol in a section which
1556 isn't absolute - we output the address here
1557 to a file */
1558 bfd_vma addr = rel->r_vaddr
1559 - input_section->vma
1560 + input_section->output_offset
1561 + input_section->output_section->vma;
1563 if (coff_data(output_bfd)->pe)
1565 addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
1567 fwrite (&addr, 1,4, (FILE *) info->base_file);
1571 switch (rstat)
1573 default:
1574 abort ();
1575 case bfd_reloc_ok:
1576 break;
1577 case bfd_reloc_overflow:
1579 const char *name;
1580 char buf[SYMNMLEN + 1];
1582 if (symndx == -1)
1583 name = "*ABS*";
1584 else if (h != NULL)
1585 name = h->root.root.root.string;
1586 else if (sym == NULL)
1587 name = "*unknown*";
1588 else if (sym->_n._n_n._n_zeroes == 0
1589 && sym->_n._n_n._n_offset != 0)
1590 name = obj_coff_strings (input_bfd) + sym->_n._n_n._n_offset;
1591 else
1593 strncpy (buf, sym->_n._n_name, SYMNMLEN);
1594 buf[SYMNMLEN] = '\0';
1595 name = buf;
1598 if (! ((*info->callbacks->reloc_overflow)
1599 (info, name, howto->name,
1600 (bfd_vma) 0, input_bfd,
1601 input_section, rel->r_vaddr - input_section->vma)))
1603 return false;
1610 return true;
1613 #ifdef COFF_IMAGE_WITH_PE
1615 /* FIXME: BFD should not use global variables. This file is compiled
1616 twice, and these variables are shared. This is confusing and
1617 weird. */
1619 long int global_toc_size = 4;
1621 bfd* bfd_of_toc_owner = 0;
1623 long int import_table_size;
1624 long int first_thunk_address;
1625 long int thunk_size;
1627 struct list_ele *head;
1628 struct list_ele *tail;
1630 static char *
1631 h1 = N_("\n\t\t\tTOC MAPPING\n\n");
1632 static char *
1633 h2 = N_(" TOC disassembly Comments Name\n");
1634 static char *
1635 h3 = N_(" Offset spelling (if present)\n");
1637 void
1638 dump_toc (vfile)
1639 PTR vfile;
1641 FILE *file = (FILE *) vfile;
1642 struct list_ele *t;
1644 fprintf (file, _(h1));
1645 fprintf (file, _(h2));
1646 fprintf (file, _(h3));
1648 for (t = head; t != 0; t=t->next)
1650 const char *cat = "";
1652 if (t->cat == priv)
1653 cat = _("private ");
1654 else if (t->cat == pub)
1655 cat = _("public ");
1656 else if (t->cat == data)
1657 cat = _("data-in-toc ");
1659 if (t->offset > global_toc_size)
1661 if (t->offset <= global_toc_size + thunk_size)
1662 cat = _("IAT reference ");
1663 else
1665 fprintf (file,
1666 _("**** global_toc_size %ld(%lx), thunk_size %ld(%lx)\n"),
1667 global_toc_size, global_toc_size, thunk_size, thunk_size);
1668 cat = _("Out of bounds!");
1672 fprintf (file,
1673 " %04lx (%d)", (unsigned long) t->offset, t->offset - 32768);
1674 fprintf (file,
1675 " %s %s\n",
1676 cat, t->name);
1680 fprintf (file, "\n");
1683 boolean
1684 ppc_allocate_toc_section (info)
1685 struct bfd_link_info *info ATTRIBUTE_UNUSED;
1687 asection *s;
1688 bfd_byte *foo;
1689 static char test_char = '1';
1691 if ( global_toc_size == 0 ) /* FIXME: does this get me in trouble? */
1692 return true;
1694 if (bfd_of_toc_owner == 0)
1696 /* No toc owner? Something is very wrong. */
1697 abort ();
1700 s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME);
1701 if (s == NULL)
1703 /* No toc section? Something is very wrong. */
1704 abort ();
1707 foo = (bfd_byte *) bfd_alloc(bfd_of_toc_owner, global_toc_size);
1708 memset(foo, test_char, global_toc_size);
1710 s->_raw_size = s->_cooked_size = global_toc_size;
1711 s->contents = foo;
1713 return true;
1716 boolean
1717 ppc_process_before_allocation (abfd, info)
1718 bfd *abfd;
1719 struct bfd_link_info *info;
1721 asection *sec;
1722 struct internal_reloc *i, *rel;
1724 /* here we have a bfd that is to be included on the link. We have a hook
1725 to do reloc rummaging, before section sizes are nailed down. */
1727 _bfd_coff_get_external_symbols(abfd);
1729 /* rummage around all the relocs and map the toc */
1730 sec = abfd->sections;
1732 if (sec == 0)
1734 return true;
1737 for (; sec != 0; sec = sec->next)
1739 if (sec->reloc_count == 0)
1740 continue;
1742 /* load the relocs */
1743 /* FIXME: there may be a storage leak here */
1744 i=_bfd_coff_read_internal_relocs(abfd,sec,1,0,0,0);
1746 if (i == 0)
1747 abort ();
1749 for (rel=i;rel<i+sec->reloc_count;++rel)
1751 unsigned short r_type = EXTRACT_TYPE (rel->r_type);
1752 unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
1753 boolean ok = true;
1755 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1757 switch(r_type)
1759 case IMAGE_REL_PPC_TOCREL16:
1760 /* if TOCDEFN is on, ignore as someone else has allocated the
1761 toc entry */
1762 if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN )
1763 ok = ppc_record_toc_entry(abfd, info, sec,
1764 rel->r_symndx, default_toc);
1765 if (!ok)
1766 return false;
1767 break;
1768 case IMAGE_REL_PPC_IMGLUE:
1769 ppc_mark_symbol_as_glue(abfd, rel->r_symndx, rel);
1770 break;
1771 default:
1772 break;
1777 return true;
1780 #endif
1782 static bfd_reloc_status_type
1783 ppc_refhi_reloc (abfd,
1784 reloc_entry,
1785 symbol,
1786 data,
1787 input_section,
1788 output_bfd,
1789 error_message)
1790 bfd *abfd ATTRIBUTE_UNUSED;
1791 arelent *reloc_entry ATTRIBUTE_UNUSED;
1792 asymbol *symbol ATTRIBUTE_UNUSED;
1793 PTR data ATTRIBUTE_UNUSED;
1794 asection *input_section ATTRIBUTE_UNUSED;
1795 bfd *output_bfd;
1796 char **error_message ATTRIBUTE_UNUSED;
1798 UN_IMPL("REFHI");
1799 DUMP_RELOC("REFHI",reloc_entry);
1801 if (output_bfd == (bfd *) NULL)
1802 return bfd_reloc_continue;
1804 return bfd_reloc_undefined;
1807 #if 0
1809 static bfd_reloc_status_type
1810 ppc_reflo_reloc (abfd,
1811 reloc_entry,
1812 symbol,
1813 data,
1814 input_section,
1815 output_bfd,
1816 error_message)
1817 bfd *abfd;
1818 arelent *reloc_entry;
1819 asymbol *symbol;
1820 PTR data;
1821 asection *input_section;
1822 bfd *output_bfd;
1823 char **error_message;
1825 UN_IMPL("REFLO");
1826 DUMP_RELOC("REFLO",reloc_entry);
1828 if (output_bfd == (bfd *) NULL)
1829 return bfd_reloc_continue;
1831 return bfd_reloc_undefined;
1834 #endif
1836 static bfd_reloc_status_type
1837 ppc_pair_reloc (abfd,
1838 reloc_entry,
1839 symbol,
1840 data,
1841 input_section,
1842 output_bfd,
1843 error_message)
1844 bfd *abfd ATTRIBUTE_UNUSED;
1845 arelent *reloc_entry ATTRIBUTE_UNUSED;
1846 asymbol *symbol ATTRIBUTE_UNUSED;
1847 PTR data ATTRIBUTE_UNUSED;
1848 asection *input_section ATTRIBUTE_UNUSED;
1849 bfd *output_bfd;
1850 char **error_message ATTRIBUTE_UNUSED;
1852 UN_IMPL("PAIR");
1853 DUMP_RELOC("PAIR",reloc_entry);
1855 if (output_bfd == (bfd *) NULL)
1856 return bfd_reloc_continue;
1858 return bfd_reloc_undefined;
1861 static bfd_reloc_status_type
1862 ppc_toc16_reloc (abfd,
1863 reloc_entry,
1864 symbol,
1865 data,
1866 input_section,
1867 output_bfd,
1868 error_message)
1869 bfd *abfd ATTRIBUTE_UNUSED;
1870 arelent *reloc_entry ATTRIBUTE_UNUSED;
1871 asymbol *symbol ATTRIBUTE_UNUSED;
1872 PTR data ATTRIBUTE_UNUSED;
1873 asection *input_section ATTRIBUTE_UNUSED;
1874 bfd *output_bfd;
1875 char **error_message ATTRIBUTE_UNUSED;
1877 UN_IMPL("TOCREL16");
1878 DUMP_RELOC("TOCREL16",reloc_entry);
1880 if (output_bfd == (bfd *) NULL)
1882 return bfd_reloc_continue;
1885 return bfd_reloc_ok;
1888 #if 0
1890 /* ADDR32NB : 32 bit address relative to the virtual origin. */
1891 /* (On the alpha, this is always a linker generated thunk)*/
1892 /* (i.e. 32bit addr relative to the image base) */
1893 /* */
1894 /* */
1896 static bfd_reloc_status_type
1897 ppc_addr32nb_reloc (abfd,
1898 reloc_entry,
1899 symbol,
1900 data,
1901 input_section,
1902 output_bfd,
1903 error_message)
1904 bfd *abfd;
1905 arelent *reloc_entry;
1906 asymbol *symbol;
1907 PTR data;
1908 asection *input_section;
1909 bfd *output_bfd;
1910 char **error_message;
1912 UN_IMPL("ADDR32NB");
1913 DUMP_RELOC("ADDR32NB",reloc_entry);
1915 return bfd_reloc_ok;
1918 #endif
1920 static bfd_reloc_status_type
1921 ppc_secrel_reloc (abfd,
1922 reloc_entry,
1923 symbol,
1924 data,
1925 input_section,
1926 output_bfd,
1927 error_message)
1928 bfd *abfd ATTRIBUTE_UNUSED;
1929 arelent *reloc_entry ATTRIBUTE_UNUSED;
1930 asymbol *symbol ATTRIBUTE_UNUSED;
1931 PTR data ATTRIBUTE_UNUSED;
1932 asection *input_section ATTRIBUTE_UNUSED;
1933 bfd *output_bfd;
1934 char **error_message ATTRIBUTE_UNUSED;
1936 UN_IMPL("SECREL");
1937 DUMP_RELOC("SECREL",reloc_entry);
1939 if (output_bfd == (bfd *) NULL)
1940 return bfd_reloc_continue;
1942 return bfd_reloc_ok;
1945 static bfd_reloc_status_type
1946 ppc_section_reloc (abfd,
1947 reloc_entry,
1948 symbol,
1949 data,
1950 input_section,
1951 output_bfd,
1952 error_message)
1953 bfd *abfd ATTRIBUTE_UNUSED;
1954 arelent *reloc_entry ATTRIBUTE_UNUSED;
1955 asymbol *symbol ATTRIBUTE_UNUSED;
1956 PTR data ATTRIBUTE_UNUSED;
1957 asection *input_section ATTRIBUTE_UNUSED;
1958 bfd *output_bfd;
1959 char **error_message ATTRIBUTE_UNUSED;
1961 UN_IMPL("SECTION");
1962 DUMP_RELOC("SECTION",reloc_entry);
1964 if (output_bfd == (bfd *) NULL)
1965 return bfd_reloc_continue;
1967 return bfd_reloc_ok;
1970 static bfd_reloc_status_type
1971 ppc_imglue_reloc (abfd,
1972 reloc_entry,
1973 symbol,
1974 data,
1975 input_section,
1976 output_bfd,
1977 error_message)
1978 bfd *abfd ATTRIBUTE_UNUSED;
1979 arelent *reloc_entry ATTRIBUTE_UNUSED;
1980 asymbol *symbol ATTRIBUTE_UNUSED;
1981 PTR data ATTRIBUTE_UNUSED;
1982 asection *input_section ATTRIBUTE_UNUSED;
1983 bfd *output_bfd;
1984 char **error_message ATTRIBUTE_UNUSED;
1986 UN_IMPL("IMGLUE");
1987 DUMP_RELOC("IMGLUE",reloc_entry);
1989 if (output_bfd == (bfd *) NULL)
1990 return bfd_reloc_continue;
1992 return bfd_reloc_ok;
1995 #define MAX_RELOC_INDEX \
1996 (sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]) - 1)
1998 /* FIXME: There is a possiblity that when we read in a reloc from a file,
1999 that there are some bits encoded in the upper portion of the
2000 type field. Not yet implemented.
2002 static void ppc_coff_rtype2howto PARAMS ((arelent *relent,
2003 struct internal_reloc *internal));
2005 static void
2006 ppc_coff_rtype2howto (relent, internal)
2007 arelent *relent;
2008 struct internal_reloc *internal;
2011 /* We can encode one of three things in the type field, aside from the
2012 type:
2013 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
2014 value, rather than an addition value
2015 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
2016 the branch is expected to be taken or not.
2017 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
2018 For now, we just strip this stuff to find the type, and ignore it other
2019 than that.
2021 reloc_howto_type *howto;
2022 unsigned short r_type = EXTRACT_TYPE (internal->r_type);
2023 unsigned short r_flags = EXTRACT_FLAGS(internal->r_type);
2024 unsigned short junk = EXTRACT_JUNK (internal->r_type);
2026 /* the masking process only slices off the bottom byte for r_type. */
2027 if ( r_type > MAX_RELOC_INDEX )
2028 abort ();
2030 /* check for absolute crap */
2031 if ( junk != 0 )
2032 abort ();
2034 switch(r_type)
2036 case IMAGE_REL_PPC_ADDR16:
2037 case IMAGE_REL_PPC_REL24:
2038 case IMAGE_REL_PPC_ADDR24:
2039 case IMAGE_REL_PPC_ADDR32:
2040 case IMAGE_REL_PPC_IFGLUE:
2041 case IMAGE_REL_PPC_ADDR32NB:
2042 case IMAGE_REL_PPC_SECTION:
2043 case IMAGE_REL_PPC_SECREL:
2044 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, internal);
2045 howto = ppc_coff_howto_table + r_type;
2046 break;
2047 case IMAGE_REL_PPC_IMGLUE:
2048 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, internal);
2049 howto = ppc_coff_howto_table + r_type;
2050 break;
2051 case IMAGE_REL_PPC_TOCREL16:
2052 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, internal);
2053 if (r_flags & IMAGE_REL_PPC_TOCDEFN)
2054 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN;
2055 else
2056 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
2057 break;
2058 default:
2059 fprintf (stderr,
2060 _("Warning: Unsupported reloc %s [%d] used -- it may not work.\n"),
2061 ppc_coff_howto_table[r_type].name,
2062 r_type);
2063 howto = ppc_coff_howto_table + r_type;
2064 break;
2067 relent->howto = howto;
2071 static reloc_howto_type *
2072 coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
2073 bfd *abfd ATTRIBUTE_UNUSED;
2074 asection *sec;
2075 struct internal_reloc *rel;
2076 struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
2077 struct internal_syment *sym ATTRIBUTE_UNUSED;
2078 bfd_vma *addendp;
2080 reloc_howto_type *howto;
2082 /* We can encode one of three things in the type field, aside from the
2083 type:
2084 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
2085 value, rather than an addition value
2086 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
2087 the branch is expected to be taken or not.
2088 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
2089 For now, we just strip this stuff to find the type, and ignore it other
2090 than that.
2093 unsigned short r_type = EXTRACT_TYPE (rel->r_type);
2094 unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
2095 unsigned short junk = EXTRACT_JUNK (rel->r_type);
2097 /* the masking process only slices off the bottom byte for r_type. */
2098 if ( r_type > MAX_RELOC_INDEX )
2099 abort ();
2101 /* check for absolute crap */
2102 if ( junk != 0 )
2103 abort ();
2105 switch(r_type)
2107 case IMAGE_REL_PPC_ADDR32NB:
2108 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
2109 *addendp -= pe_data(sec->output_section->owner)->pe_opthdr.ImageBase;
2110 howto = ppc_coff_howto_table + r_type;
2111 break;
2112 case IMAGE_REL_PPC_TOCREL16:
2113 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
2114 if (r_flags & IMAGE_REL_PPC_TOCDEFN)
2115 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN;
2116 else
2117 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
2118 break;
2119 case IMAGE_REL_PPC_ADDR16:
2120 case IMAGE_REL_PPC_REL24:
2121 case IMAGE_REL_PPC_ADDR24:
2122 case IMAGE_REL_PPC_ADDR32:
2123 case IMAGE_REL_PPC_IFGLUE:
2124 case IMAGE_REL_PPC_SECTION:
2125 case IMAGE_REL_PPC_SECREL:
2126 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
2127 howto = ppc_coff_howto_table + r_type;
2128 break;
2129 case IMAGE_REL_PPC_IMGLUE:
2130 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
2131 howto = ppc_coff_howto_table + r_type;
2132 break;
2133 default:
2134 fprintf (stderr,
2135 _("Warning: Unsupported reloc %s [%d] used -- it may not work.\n"),
2136 ppc_coff_howto_table[r_type].name,
2137 r_type);
2138 howto = ppc_coff_howto_table + r_type;
2139 break;
2142 return howto;
2145 /* a cheesy little macro to make the code a little more readable */
2146 #define HOW2MAP(bfd_rtype,ppc_rtype) \
2147 case bfd_rtype: return &ppc_coff_howto_table[ppc_rtype]
2149 static reloc_howto_type *ppc_coff_reloc_type_lookup
2150 PARAMS ((bfd *, bfd_reloc_code_real_type));
2152 static reloc_howto_type *
2153 ppc_coff_reloc_type_lookup (abfd, code)
2154 bfd *abfd ATTRIBUTE_UNUSED;
2155 bfd_reloc_code_real_type code;
2157 switch (code)
2159 HOW2MAP(BFD_RELOC_32_GOTOFF, IMAGE_REL_PPC_IMGLUE);
2160 HOW2MAP(BFD_RELOC_16_GOT_PCREL, IMAGE_REL_PPC_IFGLUE);
2161 HOW2MAP(BFD_RELOC_16, IMAGE_REL_PPC_ADDR16);
2162 HOW2MAP(BFD_RELOC_PPC_B26, IMAGE_REL_PPC_REL24);
2163 HOW2MAP(BFD_RELOC_PPC_BA26, IMAGE_REL_PPC_ADDR24);
2164 HOW2MAP(BFD_RELOC_PPC_TOC16, IMAGE_REL_PPC_TOCREL16);
2165 HOW2MAP(BFD_RELOC_16_GOTOFF, IMAGE_REL_PPC_TOCREL16_DEFN);
2166 HOW2MAP(BFD_RELOC_32, IMAGE_REL_PPC_ADDR32);
2167 HOW2MAP(BFD_RELOC_RVA, IMAGE_REL_PPC_ADDR32NB);
2168 default:
2169 return NULL;
2171 /*NOTREACHED*/
2174 #undef HOW2MAP
2176 /* Tailor coffcode.h -- macro heaven. */
2178 #define RTYPE2HOWTO(cache_ptr, dst) ppc_coff_rtype2howto (cache_ptr, dst)
2180 #ifndef COFF_IMAGE_WITH_PE
2181 static void ppc_coff_swap_sym_in_hook PARAMS ((bfd *, PTR, PTR));
2182 #endif
2184 /* We use the special COFF backend linker, with our own special touch. */
2186 #define coff_bfd_reloc_type_lookup ppc_coff_reloc_type_lookup
2187 #define coff_rtype_to_howto coff_ppc_rtype_to_howto
2188 #define coff_relocate_section coff_ppc_relocate_section
2189 #define coff_bfd_final_link ppc_bfd_coff_final_link
2191 #ifndef COFF_IMAGE_WITH_PE
2192 /* FIXME: This no longer works. */
2193 #define coff_swap_sym_in_hook ppc_coff_swap_sym_in_hook
2194 #endif
2196 #define SELECT_RELOC(internal, howto) {internal.r_type=howto->type;}
2198 #define COFF_PAGE_SIZE 0x1000
2200 /* FIXME: This controls some code that used to be in peicode.h and is
2201 now in peigen.c. It will not control the code in peigen.c. If
2202 anybody wants to get this working, you will need to fix that. */
2203 #define POWERPC_LE_PE
2205 #define COFF_SECTION_ALIGNMENT_ENTRIES \
2206 { COFF_SECTION_NAME_EXACT_MATCH (".idata$2"), \
2207 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
2208 { COFF_SECTION_NAME_EXACT_MATCH (".idata$3"), \
2209 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
2210 { COFF_SECTION_NAME_EXACT_MATCH (".idata$4"), \
2211 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
2212 { COFF_SECTION_NAME_EXACT_MATCH (".idata$5"), \
2213 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
2214 { COFF_SECTION_NAME_EXACT_MATCH (".idata$6"), \
2215 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }, \
2216 { COFF_SECTION_NAME_EXACT_MATCH (".reloc"), \
2217 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }
2219 #include "coffcode.h"
2221 #ifndef COFF_IMAGE_WITH_PE
2222 /* FIXME:
2223 What we're trying to do here is allocate a toc section (early), and attach
2224 it to the last bfd to be processed. This avoids the problem of having a toc
2225 written out before all files have been processed. This code allocates
2226 a toc section for every file, and records the last one seen. There are
2227 at least two problems with this approach:
2228 1. We allocate whole bunches of toc sections that are ignored, but at
2229 at least we will not allocate a toc if no .toc is present.
2230 2. It's not clear to me that being the last bfd read necessarily means
2231 that you are the last bfd closed.
2232 3. Doing it on a "swap in" hook depends on when the "swap in" is called,
2233 and how often, etc. It's not clear to me that there isn't a hole here.
2236 static void
2237 ppc_coff_swap_sym_in_hook (abfd, ext1, in1)
2238 bfd *abfd;
2239 PTR ext1 ATTRIBUTE_UNUSED;
2240 PTR in1;
2242 struct internal_syment *in = (struct internal_syment *)in1;
2244 if (bfd_of_toc_owner != 0) /* we already have a toc, so go home */
2245 return;
2247 if (strcmp(in->_n._n_name, ".toc") == 0)
2249 flagword flags;
2250 register asection *s;
2252 s = bfd_get_section_by_name ( abfd , TOC_SECTION_NAME);
2253 if (s != NULL)
2255 return;
2258 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY ;
2260 s = bfd_make_section (abfd, TOC_SECTION_NAME);
2262 if (s == NULL
2263 || !bfd_set_section_flags (abfd, s, flags)
2264 || !bfd_set_section_alignment (abfd, s, 2))
2266 /* FIXME: set appropriate bfd error */
2267 abort ();
2270 /* save the bfd for later allocation */
2271 bfd_of_toc_owner = abfd;
2274 return;
2276 #endif
2278 #ifndef COFF_IMAGE_WITH_PE
2280 static boolean ppc_do_last PARAMS ((bfd *));
2281 static bfd *ppc_get_last PARAMS ((void));
2283 static boolean
2284 ppc_do_last (abfd)
2285 bfd *abfd;
2287 if (abfd == bfd_of_toc_owner)
2288 return true;
2289 else
2290 return false;
2293 static bfd *
2294 ppc_get_last()
2296 return bfd_of_toc_owner;
2299 /* this piece of machinery exists only to guarantee that the bfd that holds
2300 the toc section is written last.
2302 This does depend on bfd_make_section attaching a new section to the
2303 end of the section list for the bfd.
2305 This is otherwise intended to be functionally the same as
2306 cofflink.c:_bfd_coff_final_link(). It is specifically different only
2307 where the POWERPC_LE_PE macro modifies the code. It is left in as a
2308 precise form of comment. krk@cygnus.com
2311 /* Do the final link step. */
2313 boolean
2314 ppc_bfd_coff_final_link (abfd, info)
2315 bfd *abfd;
2316 struct bfd_link_info *info;
2318 bfd_size_type symesz;
2319 struct coff_final_link_info finfo;
2320 boolean debug_merge_allocated;
2321 asection *o;
2322 struct bfd_link_order *p;
2323 size_t max_sym_count;
2324 size_t max_lineno_count;
2325 size_t max_reloc_count;
2326 size_t max_output_reloc_count;
2327 size_t max_contents_size;
2328 file_ptr rel_filepos;
2329 unsigned int relsz;
2330 file_ptr line_filepos;
2331 unsigned int linesz;
2332 bfd *sub;
2333 bfd_byte *external_relocs = NULL;
2334 char strbuf[STRING_SIZE_SIZE];
2336 symesz = bfd_coff_symesz (abfd);
2338 finfo.info = info;
2339 finfo.output_bfd = abfd;
2340 finfo.strtab = NULL;
2341 finfo.section_info = NULL;
2342 finfo.last_file_index = -1;
2343 finfo.last_bf_index = -1;
2344 finfo.internal_syms = NULL;
2345 finfo.sec_ptrs = NULL;
2346 finfo.sym_indices = NULL;
2347 finfo.outsyms = NULL;
2348 finfo.linenos = NULL;
2349 finfo.contents = NULL;
2350 finfo.external_relocs = NULL;
2351 finfo.internal_relocs = NULL;
2352 debug_merge_allocated = false;
2354 coff_data (abfd)->link_info = info;
2356 finfo.strtab = _bfd_stringtab_init ();
2357 if (finfo.strtab == NULL)
2358 goto error_return;
2360 if (! coff_debug_merge_hash_table_init (&finfo.debug_merge))
2361 goto error_return;
2362 debug_merge_allocated = true;
2364 /* Compute the file positions for all the sections. */
2365 if (! abfd->output_has_begun)
2367 if (! bfd_coff_compute_section_file_positions (abfd))
2368 return false;
2371 /* Count the line numbers and relocation entries required for the
2372 output file. Set the file positions for the relocs. */
2373 rel_filepos = obj_relocbase (abfd);
2374 relsz = bfd_coff_relsz (abfd);
2375 max_contents_size = 0;
2376 max_lineno_count = 0;
2377 max_reloc_count = 0;
2379 for (o = abfd->sections; o != NULL; o = o->next)
2381 o->reloc_count = 0;
2382 o->lineno_count = 0;
2383 for (p = o->link_order_head; p != NULL; p = p->next)
2386 if (p->type == bfd_indirect_link_order)
2388 asection *sec;
2390 sec = p->u.indirect.section;
2392 /* Mark all sections which are to be included in the
2393 link. This will normally be every section. We need
2394 to do this so that we can identify any sections which
2395 the linker has decided to not include. */
2396 sec->linker_mark = true;
2398 if (info->strip == strip_none
2399 || info->strip == strip_some)
2400 o->lineno_count += sec->lineno_count;
2402 if (info->relocateable)
2403 o->reloc_count += sec->reloc_count;
2405 if (sec->_raw_size > max_contents_size)
2406 max_contents_size = sec->_raw_size;
2407 if (sec->lineno_count > max_lineno_count)
2408 max_lineno_count = sec->lineno_count;
2409 if (sec->reloc_count > max_reloc_count)
2410 max_reloc_count = sec->reloc_count;
2412 else if (info->relocateable
2413 && (p->type == bfd_section_reloc_link_order
2414 || p->type == bfd_symbol_reloc_link_order))
2415 ++o->reloc_count;
2417 if (o->reloc_count == 0)
2418 o->rel_filepos = 0;
2419 else
2421 o->flags |= SEC_RELOC;
2422 o->rel_filepos = rel_filepos;
2423 rel_filepos += o->reloc_count * relsz;
2427 /* If doing a relocateable link, allocate space for the pointers we
2428 need to keep. */
2429 if (info->relocateable)
2431 unsigned int i;
2433 /* We use section_count + 1, rather than section_count, because
2434 the target_index fields are 1 based. */
2435 finfo.section_info =
2436 ((struct coff_link_section_info *)
2437 bfd_malloc ((abfd->section_count + 1)
2438 * sizeof (struct coff_link_section_info)));
2439 if (finfo.section_info == NULL)
2440 goto error_return;
2441 for (i = 0; i <= abfd->section_count; i++)
2443 finfo.section_info[i].relocs = NULL;
2444 finfo.section_info[i].rel_hashes = NULL;
2448 /* We now know the size of the relocs, so we can determine the file
2449 positions of the line numbers. */
2450 line_filepos = rel_filepos;
2451 linesz = bfd_coff_linesz (abfd);
2452 max_output_reloc_count = 0;
2453 for (o = abfd->sections; o != NULL; o = o->next)
2455 if (o->lineno_count == 0)
2456 o->line_filepos = 0;
2457 else
2459 o->line_filepos = line_filepos;
2460 line_filepos += o->lineno_count * linesz;
2463 if (o->reloc_count != 0)
2465 /* We don't know the indices of global symbols until we have
2466 written out all the local symbols. For each section in
2467 the output file, we keep an array of pointers to hash
2468 table entries. Each entry in the array corresponds to a
2469 reloc. When we find a reloc against a global symbol, we
2470 set the corresponding entry in this array so that we can
2471 fix up the symbol index after we have written out all the
2472 local symbols.
2474 Because of this problem, we also keep the relocs in
2475 memory until the end of the link. This wastes memory,
2476 but only when doing a relocateable link, which is not the
2477 common case. */
2478 BFD_ASSERT (info->relocateable);
2479 finfo.section_info[o->target_index].relocs =
2480 ((struct internal_reloc *)
2481 bfd_malloc (o->reloc_count * sizeof (struct internal_reloc)));
2482 finfo.section_info[o->target_index].rel_hashes =
2483 ((struct coff_link_hash_entry **)
2484 bfd_malloc (o->reloc_count
2485 * sizeof (struct coff_link_hash_entry *)));
2486 if (finfo.section_info[o->target_index].relocs == NULL
2487 || finfo.section_info[o->target_index].rel_hashes == NULL)
2488 goto error_return;
2490 if (o->reloc_count > max_output_reloc_count)
2491 max_output_reloc_count = o->reloc_count;
2494 /* Reset the reloc and lineno counts, so that we can use them to
2495 count the number of entries we have output so far. */
2496 o->reloc_count = 0;
2497 o->lineno_count = 0;
2500 obj_sym_filepos (abfd) = line_filepos;
2502 /* Figure out the largest number of symbols in an input BFD. Take
2503 the opportunity to clear the output_has_begun fields of all the
2504 input BFD's. */
2505 max_sym_count = 0;
2506 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
2508 size_t sz;
2510 sub->output_has_begun = false;
2511 sz = obj_raw_syment_count (sub);
2512 if (sz > max_sym_count)
2513 max_sym_count = sz;
2516 /* Allocate some buffers used while linking. */
2517 finfo.internal_syms = ((struct internal_syment *)
2518 bfd_malloc (max_sym_count
2519 * sizeof (struct internal_syment)));
2520 finfo.sec_ptrs = (asection **) bfd_malloc (max_sym_count
2521 * sizeof (asection *));
2522 finfo.sym_indices = (long *) bfd_malloc (max_sym_count * sizeof (long));
2523 finfo.outsyms = ((bfd_byte *)
2524 bfd_malloc ((size_t) ((max_sym_count + 1) * symesz)));
2525 finfo.linenos = (bfd_byte *) bfd_malloc (max_lineno_count
2526 * bfd_coff_linesz (abfd));
2527 finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
2528 finfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz);
2529 if (! info->relocateable)
2530 finfo.internal_relocs = ((struct internal_reloc *)
2531 bfd_malloc (max_reloc_count
2532 * sizeof (struct internal_reloc)));
2533 if ((finfo.internal_syms == NULL && max_sym_count > 0)
2534 || (finfo.sec_ptrs == NULL && max_sym_count > 0)
2535 || (finfo.sym_indices == NULL && max_sym_count > 0)
2536 || finfo.outsyms == NULL
2537 || (finfo.linenos == NULL && max_lineno_count > 0)
2538 || (finfo.contents == NULL && max_contents_size > 0)
2539 || (finfo.external_relocs == NULL && max_reloc_count > 0)
2540 || (! info->relocateable
2541 && finfo.internal_relocs == NULL
2542 && max_reloc_count > 0))
2543 goto error_return;
2545 /* We now know the position of everything in the file, except that
2546 we don't know the size of the symbol table and therefore we don't
2547 know where the string table starts. We just build the string
2548 table in memory as we go along. We process all the relocations
2549 for a single input file at once. */
2550 obj_raw_syment_count (abfd) = 0;
2552 if (coff_backend_info (abfd)->_bfd_coff_start_final_link)
2554 if (! bfd_coff_start_final_link (abfd, info))
2555 goto error_return;
2558 for (o = abfd->sections; o != NULL; o = o->next)
2560 for (p = o->link_order_head; p != NULL; p = p->next)
2562 if (p->type == bfd_indirect_link_order
2563 && (bfd_get_flavour (p->u.indirect.section->owner)
2564 == bfd_target_coff_flavour))
2566 sub = p->u.indirect.section->owner;
2567 #ifdef POWERPC_LE_PE
2568 if (! sub->output_has_begun && !ppc_do_last(sub))
2569 #else
2570 if (! sub->output_has_begun)
2571 #endif
2573 if (! _bfd_coff_link_input_bfd (&finfo, sub))
2574 goto error_return;
2575 sub->output_has_begun = true;
2578 else if (p->type == bfd_section_reloc_link_order
2579 || p->type == bfd_symbol_reloc_link_order)
2581 if (! _bfd_coff_reloc_link_order (abfd, &finfo, o, p))
2582 goto error_return;
2584 else
2586 if (! _bfd_default_link_order (abfd, info, o, p))
2587 goto error_return;
2592 #ifdef POWERPC_LE_PE
2594 bfd* last_one = ppc_get_last();
2595 if (last_one)
2597 if (! _bfd_coff_link_input_bfd (&finfo, last_one))
2598 goto error_return;
2600 last_one->output_has_begun = true;
2602 #endif
2604 /* Free up the buffers used by _bfd_coff_link_input_bfd. */
2606 coff_debug_merge_hash_table_free (&finfo.debug_merge);
2607 debug_merge_allocated = false;
2609 if (finfo.internal_syms != NULL)
2611 free (finfo.internal_syms);
2612 finfo.internal_syms = NULL;
2614 if (finfo.sec_ptrs != NULL)
2616 free (finfo.sec_ptrs);
2617 finfo.sec_ptrs = NULL;
2619 if (finfo.sym_indices != NULL)
2621 free (finfo.sym_indices);
2622 finfo.sym_indices = NULL;
2624 if (finfo.linenos != NULL)
2626 free (finfo.linenos);
2627 finfo.linenos = NULL;
2629 if (finfo.contents != NULL)
2631 free (finfo.contents);
2632 finfo.contents = NULL;
2634 if (finfo.external_relocs != NULL)
2636 free (finfo.external_relocs);
2637 finfo.external_relocs = NULL;
2639 if (finfo.internal_relocs != NULL)
2641 free (finfo.internal_relocs);
2642 finfo.internal_relocs = NULL;
2645 /* The value of the last C_FILE symbol is supposed to be the symbol
2646 index of the first external symbol. Write it out again if
2647 necessary. */
2648 if (finfo.last_file_index != -1
2649 && (unsigned int) finfo.last_file.n_value != obj_raw_syment_count (abfd))
2651 finfo.last_file.n_value = obj_raw_syment_count (abfd);
2652 bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
2653 (PTR) finfo.outsyms);
2654 if (bfd_seek (abfd,
2655 (obj_sym_filepos (abfd)
2656 + finfo.last_file_index * symesz),
2657 SEEK_SET) != 0
2658 || bfd_write (finfo.outsyms, symesz, 1, abfd) != symesz)
2659 return false;
2662 /* Write out the global symbols. */
2663 finfo.failed = false;
2664 coff_link_hash_traverse (coff_hash_table (info), _bfd_coff_write_global_sym,
2665 (PTR) &finfo);
2666 if (finfo.failed)
2667 goto error_return;
2669 /* The outsyms buffer is used by _bfd_coff_write_global_sym. */
2670 if (finfo.outsyms != NULL)
2672 free (finfo.outsyms);
2673 finfo.outsyms = NULL;
2676 if (info->relocateable)
2678 /* Now that we have written out all the global symbols, we know
2679 the symbol indices to use for relocs against them, and we can
2680 finally write out the relocs. */
2681 external_relocs = ((bfd_byte *)
2682 bfd_malloc (max_output_reloc_count * relsz));
2683 if (external_relocs == NULL)
2684 goto error_return;
2686 for (o = abfd->sections; o != NULL; o = o->next)
2688 struct internal_reloc *irel;
2689 struct internal_reloc *irelend;
2690 struct coff_link_hash_entry **rel_hash;
2691 bfd_byte *erel;
2693 if (o->reloc_count == 0)
2694 continue;
2696 irel = finfo.section_info[o->target_index].relocs;
2697 irelend = irel + o->reloc_count;
2698 rel_hash = finfo.section_info[o->target_index].rel_hashes;
2699 erel = external_relocs;
2700 for (; irel < irelend; irel++, rel_hash++, erel += relsz)
2702 if (*rel_hash != NULL)
2704 BFD_ASSERT ((*rel_hash)->indx >= 0);
2705 irel->r_symndx = (*rel_hash)->indx;
2707 bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel);
2710 if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
2711 || bfd_write ((PTR) external_relocs, relsz, o->reloc_count,
2712 abfd) != relsz * o->reloc_count)
2713 goto error_return;
2716 free (external_relocs);
2717 external_relocs = NULL;
2720 /* Free up the section information. */
2721 if (finfo.section_info != NULL)
2723 unsigned int i;
2725 for (i = 0; i < abfd->section_count; i++)
2727 if (finfo.section_info[i].relocs != NULL)
2728 free (finfo.section_info[i].relocs);
2729 if (finfo.section_info[i].rel_hashes != NULL)
2730 free (finfo.section_info[i].rel_hashes);
2732 free (finfo.section_info);
2733 finfo.section_info = NULL;
2736 /* If we have optimized stabs strings, output them. */
2737 if (coff_hash_table (info)->stab_info != NULL)
2739 if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info))
2740 return false;
2743 /* Write out the string table. */
2744 if (obj_raw_syment_count (abfd) != 0)
2746 if (bfd_seek (abfd,
2747 (obj_sym_filepos (abfd)
2748 + obj_raw_syment_count (abfd) * symesz),
2749 SEEK_SET) != 0)
2750 return false;
2752 #if STRING_SIZE_SIZE == 4
2753 bfd_h_put_32 (abfd,
2754 _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE,
2755 (bfd_byte *) strbuf);
2756 #else
2757 #error Change bfd_h_put_32
2758 #endif
2760 if (bfd_write (strbuf, 1, STRING_SIZE_SIZE, abfd) != STRING_SIZE_SIZE)
2761 return false;
2763 if (! _bfd_stringtab_emit (abfd, finfo.strtab))
2764 return false;
2767 _bfd_stringtab_free (finfo.strtab);
2769 /* Setting bfd_get_symcount to 0 will cause write_object_contents to
2770 not try to write out the symbols. */
2771 bfd_get_symcount (abfd) = 0;
2773 return true;
2775 error_return:
2776 if (debug_merge_allocated)
2777 coff_debug_merge_hash_table_free (&finfo.debug_merge);
2778 if (finfo.strtab != NULL)
2779 _bfd_stringtab_free (finfo.strtab);
2780 if (finfo.section_info != NULL)
2782 unsigned int i;
2784 for (i = 0; i < abfd->section_count; i++)
2786 if (finfo.section_info[i].relocs != NULL)
2787 free (finfo.section_info[i].relocs);
2788 if (finfo.section_info[i].rel_hashes != NULL)
2789 free (finfo.section_info[i].rel_hashes);
2791 free (finfo.section_info);
2793 if (finfo.internal_syms != NULL)
2794 free (finfo.internal_syms);
2795 if (finfo.sec_ptrs != NULL)
2796 free (finfo.sec_ptrs);
2797 if (finfo.sym_indices != NULL)
2798 free (finfo.sym_indices);
2799 if (finfo.outsyms != NULL)
2800 free (finfo.outsyms);
2801 if (finfo.linenos != NULL)
2802 free (finfo.linenos);
2803 if (finfo.contents != NULL)
2804 free (finfo.contents);
2805 if (finfo.external_relocs != NULL)
2806 free (finfo.external_relocs);
2807 if (finfo.internal_relocs != NULL)
2808 free (finfo.internal_relocs);
2809 if (external_relocs != NULL)
2810 free (external_relocs);
2811 return false;
2813 #endif
2815 /* Forward declaration for use by alternative_target field. */
2816 #ifdef TARGET_BIG_SYM
2817 extern const bfd_target TARGET_BIG_SYM;
2818 #endif
2820 /* The transfer vectors that lead the outside world to all of the above. */
2822 #ifdef TARGET_LITTLE_SYM
2823 const bfd_target TARGET_LITTLE_SYM =
2825 TARGET_LITTLE_NAME, /* name or coff-arm-little */
2826 bfd_target_coff_flavour,
2827 BFD_ENDIAN_LITTLE, /* data byte order is little */
2828 BFD_ENDIAN_LITTLE, /* header byte order is little */
2830 (HAS_RELOC | EXEC_P | /* FIXME: object flags */
2831 HAS_LINENO | HAS_DEBUG |
2832 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
2834 #ifndef COFF_WITH_PE
2835 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
2836 #else
2837 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
2838 | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
2839 #endif
2841 0, /* leading char */
2842 '/', /* ar_pad_char */
2843 15, /* ar_max_namelen??? FIXMEmgo */
2845 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2846 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2847 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
2849 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2850 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2851 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
2853 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
2854 bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p },
2855 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
2856 bfd_false},
2857 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
2858 _bfd_write_archive_contents, bfd_false},
2860 BFD_JUMP_TABLE_GENERIC (coff),
2861 BFD_JUMP_TABLE_COPY (coff),
2862 BFD_JUMP_TABLE_CORE (_bfd_nocore),
2863 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
2864 BFD_JUMP_TABLE_SYMBOLS (coff),
2865 BFD_JUMP_TABLE_RELOCS (coff),
2866 BFD_JUMP_TABLE_WRITE (coff),
2867 BFD_JUMP_TABLE_LINK (coff),
2868 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
2870 /* Alternative_target. */
2871 #ifdef TARGET_BIG_SYM
2872 & TARGET_BIG_SYM,
2873 #else
2874 NULL,
2875 #endif
2877 COFF_SWAP_TABLE
2879 #endif
2881 #ifdef TARGET_BIG_SYM
2882 const bfd_target TARGET_BIG_SYM =
2884 TARGET_BIG_NAME,
2885 bfd_target_coff_flavour,
2886 BFD_ENDIAN_BIG, /* data byte order is big */
2887 BFD_ENDIAN_BIG, /* header byte order is big */
2889 (HAS_RELOC | EXEC_P | /* FIXME: object flags */
2890 HAS_LINENO | HAS_DEBUG |
2891 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
2893 #ifndef COFF_WITH_PE
2894 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
2895 #else
2896 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
2897 | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
2898 #endif
2900 0, /* leading char */
2901 '/', /* ar_pad_char */
2902 15, /* ar_max_namelen??? FIXMEmgo */
2904 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
2905 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
2906 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
2908 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
2909 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
2910 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
2912 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
2913 bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p },
2914 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
2915 bfd_false},
2916 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
2917 _bfd_write_archive_contents, bfd_false},
2919 BFD_JUMP_TABLE_GENERIC (coff),
2920 BFD_JUMP_TABLE_COPY (coff),
2921 BFD_JUMP_TABLE_CORE (_bfd_nocore),
2922 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
2923 BFD_JUMP_TABLE_SYMBOLS (coff),
2924 BFD_JUMP_TABLE_RELOCS (coff),
2925 BFD_JUMP_TABLE_WRITE (coff),
2926 BFD_JUMP_TABLE_LINK (coff),
2927 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
2929 /* Alternative_target. */
2930 #ifdef TARGET_LITTLE_SYM
2931 & TARGET_LITTLE_SYM,
2932 #else
2933 NULL,
2934 #endif
2936 COFF_SWAP_TABLE
2939 #endif