Remove syntactic sugar
[deliverable/binutils-gdb.git] / bfd / coff-ppc.c
1 /* BFD back-end for PowerPC Microsoft Portable Executable files.
2 Copyright (C) 1990-2016 Free Software Foundation, Inc.
3
4 Original version pieced together by Kim Knuttila (krk@cygnus.com)
5
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.
9
10 This file is part of BFD, the Binary File Descriptor library.
11
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.
16
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.
21
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. */
26
27 /* Current State:
28 - objdump works
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. */
33
34 #include "sysdep.h"
35 #include "bfd.h"
36 #include "libbfd.h"
37
38 #include "coff/powerpc.h"
39 #include "coff/internal.h"
40
41 #include "coff/pe.h"
42
43 #ifdef BADMAG
44 #undef BADMAG
45 #endif
46
47 #define BADMAG(x) PPCBADMAG(x)
48
49 #include "libcoff.h"
50
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 *);
55
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. */
65
66 #define SET_UNALLOCATED(x) ((x) = 1)
67 #define IS_UNALLOCATED(x) ((x) == 1)
68
69 #define IS_WRITTEN(x) ((x) & 1)
70 #define MARK_AS_WRITTEN(x) ((x) |= 1)
71 #define MAKE_ADDR_AGAIN(x) ((x) &= ~1)
72
73 /* Turn on this check if you suspect something amiss in the hash tables. */
74 #ifdef DEBUG_HASH
75
76 /* Need a 7 char string for an eye catcher. */
77 #define EYE "krkjunk"
78
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) \
83 { \
84 fprintf (stderr,\
85 _("File %s, line %d, Hash check failure, bad eye %8s\n"), \
86 __FILE__, __LINE__, addr->eye_catcher); \
87 abort (); \
88 }
89
90 #else
91
92 #define HASH_CHECK_DCL
93 #define HASH_CHECK_INIT(ret)
94 #define HASH_CHECK(addr)
95
96 #endif
97
98 /* In order not to add an int to every hash table item for every coff
99 linker, we define our own hash table, derived from the coff one. */
100
101 /* PE linker hash table entries. */
102
103 struct ppc_coff_link_hash_entry
104 {
105 struct coff_link_hash_entry root; /* First entry, as required. */
106
107 /* As we wonder around the relocs, we'll keep the assigned toc_offset
108 here. */
109 bfd_vma toc_offset; /* Our addition, as required. */
110 int symbol_is_glue;
111 unsigned long int glue_insn;
112
113 HASH_CHECK_DCL
114 };
115
116 /* PE linker hash table. */
117
118 struct ppc_coff_link_hash_table
119 {
120 struct coff_link_hash_table root; /* First entry, as required. */
121 };
122
123 /* Routine to create an entry in the link hash table. */
124
125 static struct bfd_hash_entry *
126 ppc_coff_link_hash_newfunc (struct bfd_hash_entry * entry,
127 struct bfd_hash_table * table,
128 const char * string)
129 {
130 struct ppc_coff_link_hash_entry *ret =
131 (struct ppc_coff_link_hash_entry *) entry;
132
133 /* Allocate the structure if it has not already been allocated by a
134 subclass. */
135 if (ret == (struct ppc_coff_link_hash_entry *) NULL)
136 ret = (struct ppc_coff_link_hash_entry *)
137 bfd_hash_allocate (table,
138 sizeof (struct ppc_coff_link_hash_entry));
139
140 if (ret == (struct ppc_coff_link_hash_entry *) NULL)
141 return NULL;
142
143 /* Call the allocation method of the superclass. */
144 ret = ((struct ppc_coff_link_hash_entry *)
145 _bfd_coff_link_hash_newfunc ((struct bfd_hash_entry *) ret,
146 table, string));
147
148 if (ret)
149 {
150 /* Initialize the local fields. */
151 SET_UNALLOCATED (ret->toc_offset);
152 ret->symbol_is_glue = 0;
153 ret->glue_insn = 0;
154
155 HASH_CHECK_INIT (ret);
156 }
157
158 return (struct bfd_hash_entry *) ret;
159 }
160
161 /* Initialize a PE linker hash table. */
162
163 static bfd_boolean
164 ppc_coff_link_hash_table_init (struct ppc_coff_link_hash_table *table,
165 bfd *abfd,
166 struct bfd_hash_entry *(*newfunc)
167 (struct bfd_hash_entry *,
168 struct bfd_hash_table *,
169 const char *),
170 unsigned int entsize)
171 {
172 return _bfd_coff_link_hash_table_init (&table->root, abfd, newfunc, entsize);
173 }
174
175 /* Create a PE linker hash table. */
176
177 static struct bfd_link_hash_table *
178 ppc_coff_link_hash_table_create (bfd *abfd)
179 {
180 struct ppc_coff_link_hash_table *ret;
181 bfd_size_type amt = sizeof (struct ppc_coff_link_hash_table);
182
183 ret = (struct ppc_coff_link_hash_table *) bfd_malloc (amt);
184 if (ret == NULL)
185 return NULL;
186 if (!ppc_coff_link_hash_table_init (ret, abfd,
187 ppc_coff_link_hash_newfunc,
188 sizeof (struct ppc_coff_link_hash_entry)))
189 {
190 free (ret);
191 return (struct bfd_link_hash_table *) NULL;
192 }
193 return &ret->root.root;
194 }
195
196 /* Now, tailor coffcode.h to use our hash stuff. */
197
198 #define coff_bfd_link_hash_table_create ppc_coff_link_hash_table_create
199 \f
200 /* The nt loader points the toc register to &toc + 32768, in order to
201 use the complete range of a 16-bit displacement. We have to adjust
202 for this when we fix up loads displaced off the toc reg. */
203 #define TOC_LOAD_ADJUSTMENT (-32768)
204 #define TOC_SECTION_NAME ".private.toc"
205
206 /* The main body of code is in coffcode.h. */
207
208 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
209
210 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
211 from smaller values. Start with zero, widen, *then* decrement. */
212 #define MINUS_ONE (((bfd_vma)0) - 1)
213
214 /* These should definitely go in a header file somewhere... */
215
216 /* NOP */
217 #define IMAGE_REL_PPC_ABSOLUTE 0x0000
218
219 /* 64-bit address */
220 #define IMAGE_REL_PPC_ADDR64 0x0001
221
222 /* 32-bit address */
223 #define IMAGE_REL_PPC_ADDR32 0x0002
224
225 /* 26-bit address, shifted left 2 (branch absolute) */
226 #define IMAGE_REL_PPC_ADDR24 0x0003
227
228 /* 16-bit address */
229 #define IMAGE_REL_PPC_ADDR16 0x0004
230
231 /* 16-bit address, shifted left 2 (load doubleword) */
232 #define IMAGE_REL_PPC_ADDR14 0x0005
233
234 /* 26-bit PC-relative offset, shifted left 2 (branch relative) */
235 #define IMAGE_REL_PPC_REL24 0x0006
236
237 /* 16-bit PC-relative offset, shifted left 2 (br cond relative) */
238 #define IMAGE_REL_PPC_REL14 0x0007
239
240 /* 16-bit offset from TOC base */
241 #define IMAGE_REL_PPC_TOCREL16 0x0008
242
243 /* 16-bit offset from TOC base, shifted left 2 (load doubleword) */
244 #define IMAGE_REL_PPC_TOCREL14 0x0009
245
246 /* 32-bit addr w/o image base */
247 #define IMAGE_REL_PPC_ADDR32NB 0x000A
248
249 /* va of containing section (as in an image sectionhdr) */
250 #define IMAGE_REL_PPC_SECREL 0x000B
251
252 /* sectionheader number */
253 #define IMAGE_REL_PPC_SECTION 0x000C
254
255 /* substitute TOC restore instruction iff symbol is glue code */
256 #define IMAGE_REL_PPC_IFGLUE 0x000D
257
258 /* symbol is glue code; virtual address is TOC restore instruction */
259 #define IMAGE_REL_PPC_IMGLUE 0x000E
260
261 /* va of containing section (limited to 16 bits) */
262 #define IMAGE_REL_PPC_SECREL16 0x000F
263
264 /* Stuff to handle immediate data when the number of bits in the
265 data is greater than the number of bits in the immediate field
266 We need to do (usually) 32 bit arithmetic on 16 bit chunks. */
267 #define IMAGE_REL_PPC_REFHI 0x0010
268 #define IMAGE_REL_PPC_REFLO 0x0011
269 #define IMAGE_REL_PPC_PAIR 0x0012
270
271 /* This is essentially the same as tocrel16, with TOCDEFN assumed. */
272 #define IMAGE_REL_PPC_TOCREL16_DEFN 0x0013
273
274 /* Flag bits in IMAGE_RELOCATION.TYPE. */
275
276 /* Subtract reloc value rather than adding it. */
277 #define IMAGE_REL_PPC_NEG 0x0100
278
279 /* Fix branch prediction bit to predict branch taken. */
280 #define IMAGE_REL_PPC_BRTAKEN 0x0200
281
282 /* Fix branch prediction bit to predict branch not taken. */
283 #define IMAGE_REL_PPC_BRNTAKEN 0x0400
284
285 /* TOC slot defined in file (or, data in toc). */
286 #define IMAGE_REL_PPC_TOCDEFN 0x0800
287
288 /* Masks to isolate above values in IMAGE_RELOCATION.Type. */
289 #define IMAGE_REL_PPC_TYPEMASK 0x00FF
290 #define IMAGE_REL_PPC_FLAGMASK 0x0F00
291
292 #define EXTRACT_TYPE(x) ((x) & IMAGE_REL_PPC_TYPEMASK)
293 #define EXTRACT_FLAGS(x) ((x) & IMAGE_REL_PPC_FLAGMASK)
294 #define EXTRACT_JUNK(x) \
295 ((x) & ~(IMAGE_REL_PPC_TYPEMASK | IMAGE_REL_PPC_FLAGMASK))
296 \f
297 /* Static helper functions to make relocation work. */
298 /* (Work In Progress) */
299
300 static bfd_reloc_status_type ppc_refhi_reloc
301 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
302 static bfd_reloc_status_type ppc_pair_reloc
303 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
304 static bfd_reloc_status_type ppc_toc16_reloc
305 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
306 static bfd_reloc_status_type ppc_section_reloc
307 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
308 static bfd_reloc_status_type ppc_secrel_reloc
309 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
310 static bfd_reloc_status_type ppc_imglue_reloc
311 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
312
313 /* FIXME: It'll take a while to get through all of these. I only need a few to
314 get us started, so those I'll make sure work. Those marked FIXME are either
315 completely unverified or have a specific unknown marked in the comment. */
316
317 /* Relocation entries for Windows/NT on PowerPC.
318
319 From the document "" we find the following listed as used relocs:
320
321 ABSOLUTE : The noop
322 ADDR[64|32|16] : fields that hold addresses in data fields or the
323 16 bit displacement field on a load/store.
324 ADDR[24|14] : fields that hold addresses in branch and cond
325 branches. These represent [26|16] bit addresses.
326 The low order 2 bits are preserved.
327 REL[24|14] : branches relative to the Instruction Address
328 register. These represent [26|16] bit addresses,
329 as before. The instruction field will be zero, and
330 the address of the SYM will be inserted at link time.
331 TOCREL16 : 16 bit displacement field referring to a slot in
332 toc.
333 TOCREL14 : 16 bit displacement field, similar to REL14 or ADDR14.
334 ADDR32NB : 32 bit address relative to the virtual origin.
335 (On the alpha, this is always a linker generated thunk)
336 (i.e. 32bit addr relative to the image base)
337 SECREL : The value is relative to the start of the section
338 containing the symbol.
339 SECTION : access to the header containing the item. Supports the
340 codeview debugger.
341
342 In particular, note that the document does not indicate that the
343 relocations listed in the header file are used. */
344
345
346 static reloc_howto_type ppc_coff_howto_table[] =
347 {
348 /* IMAGE_REL_PPC_ABSOLUTE 0x0000 NOP */
349 /* Unused: */
350 HOWTO (IMAGE_REL_PPC_ABSOLUTE, /* type */
351 0, /* rightshift */
352 0, /* size (0 = byte, 1 = short, 2 = long) */
353 0, /* bitsize */
354 FALSE, /* pc_relative */
355 0, /* bitpos */
356 complain_overflow_dont, /* dont complain_on_overflow */
357 0, /* special_function */
358 "ABSOLUTE", /* name */
359 FALSE, /* partial_inplace */
360 0x00, /* src_mask */
361 0x00, /* dst_mask */
362 FALSE), /* pcrel_offset */
363
364 /* IMAGE_REL_PPC_ADDR64 0x0001 64-bit address */
365 /* Unused: */
366 HOWTO(IMAGE_REL_PPC_ADDR64, /* type */
367 0, /* rightshift */
368 3, /* size (0 = byte, 1 = short, 2 = long) */
369 64, /* bitsize */
370 FALSE, /* pc_relative */
371 0, /* bitpos */
372 complain_overflow_bitfield, /* complain_on_overflow */
373 0, /* special_function */
374 "ADDR64", /* name */
375 TRUE, /* partial_inplace */
376 MINUS_ONE, /* src_mask */
377 MINUS_ONE, /* dst_mask */
378 FALSE), /* pcrel_offset */
379
380 /* IMAGE_REL_PPC_ADDR32 0x0002 32-bit address */
381 /* Used: */
382 HOWTO (IMAGE_REL_PPC_ADDR32, /* type */
383 0, /* rightshift */
384 2, /* size (0 = byte, 1 = short, 2 = long) */
385 32, /* bitsize */
386 FALSE, /* pc_relative */
387 0, /* bitpos */
388 complain_overflow_bitfield, /* complain_on_overflow */
389 0, /* special_function */
390 "ADDR32", /* name */
391 TRUE, /* partial_inplace */
392 0xffffffff, /* src_mask */
393 0xffffffff, /* dst_mask */
394 FALSE), /* pcrel_offset */
395
396 /* IMAGE_REL_PPC_ADDR24 0x0003 26-bit address, shifted left 2 (branch absolute) */
397 /* the LI field is in bit 6 through bit 29 is 24 bits, + 2 for the shift */
398 /* Of course, That's the IBM approved bit numbering, which is not what */
399 /* anyone else uses.... The li field is in bit 2 thru 25 */
400 /* Used: */
401 HOWTO (IMAGE_REL_PPC_ADDR24, /* type */
402 0, /* rightshift */
403 2, /* size (0 = byte, 1 = short, 2 = long) */
404 26, /* bitsize */
405 FALSE, /* pc_relative */
406 0, /* bitpos */
407 complain_overflow_bitfield, /* complain_on_overflow */
408 0, /* special_function */
409 "ADDR24", /* name */
410 TRUE, /* partial_inplace */
411 0x07fffffc, /* src_mask */
412 0x07fffffc, /* dst_mask */
413 FALSE), /* pcrel_offset */
414
415 /* IMAGE_REL_PPC_ADDR16 0x0004 16-bit address */
416 /* Used: */
417 HOWTO (IMAGE_REL_PPC_ADDR16, /* type */
418 0, /* rightshift */
419 1, /* size (0 = byte, 1 = short, 2 = long) */
420 16, /* bitsize */
421 FALSE, /* pc_relative */
422 0, /* bitpos */
423 complain_overflow_signed, /* complain_on_overflow */
424 0, /* special_function */
425 "ADDR16", /* name */
426 TRUE, /* partial_inplace */
427 0xffff, /* src_mask */
428 0xffff, /* dst_mask */
429 FALSE), /* pcrel_offset */
430
431 /* IMAGE_REL_PPC_ADDR14 0x0005 */
432 /* 16-bit address, shifted left 2 (load doubleword) */
433 /* FIXME: the mask is likely wrong, and the bit position may be as well */
434 /* Unused: */
435 HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
436 1, /* rightshift */
437 1, /* size (0 = byte, 1 = short, 2 = long) */
438 16, /* bitsize */
439 FALSE, /* pc_relative */
440 0, /* bitpos */
441 complain_overflow_signed, /* complain_on_overflow */
442 0, /* special_function */
443 "ADDR16", /* name */
444 TRUE, /* partial_inplace */
445 0xffff, /* src_mask */
446 0xffff, /* dst_mask */
447 FALSE), /* pcrel_offset */
448
449 /* IMAGE_REL_PPC_REL24 0x0006 */
450 /* 26-bit PC-relative offset, shifted left 2 (branch relative) */
451 /* Used: */
452 HOWTO (IMAGE_REL_PPC_REL24, /* type */
453 0, /* rightshift */
454 2, /* size (0 = byte, 1 = short, 2 = long) */
455 26, /* bitsize */
456 TRUE, /* pc_relative */
457 0, /* bitpos */
458 complain_overflow_signed, /* complain_on_overflow */
459 0, /* special_function */
460 "REL24", /* name */
461 TRUE, /* partial_inplace */
462 0x3fffffc, /* src_mask */
463 0x3fffffc, /* dst_mask */
464 FALSE), /* pcrel_offset */
465
466 /* IMAGE_REL_PPC_REL14 0x0007 */
467 /* 16-bit PC-relative offset, shifted left 2 (br cond relative) */
468 /* FIXME: the mask is likely wrong, and the bit position may be as well */
469 /* FIXME: how does it know how far to shift? */
470 /* Unused: */
471 HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
472 1, /* rightshift */
473 1, /* size (0 = byte, 1 = short, 2 = long) */
474 16, /* bitsize */
475 FALSE, /* pc_relative */
476 0, /* bitpos */
477 complain_overflow_signed, /* complain_on_overflow */
478 0, /* special_function */
479 "ADDR16", /* name */
480 TRUE, /* partial_inplace */
481 0xffff, /* src_mask */
482 0xffff, /* dst_mask */
483 TRUE), /* pcrel_offset */
484
485 /* IMAGE_REL_PPC_TOCREL16 0x0008 */
486 /* 16-bit offset from TOC base */
487 /* Used: */
488 HOWTO (IMAGE_REL_PPC_TOCREL16,/* type */
489 0, /* rightshift */
490 1, /* size (0 = byte, 1 = short, 2 = long) */
491 16, /* bitsize */
492 FALSE, /* pc_relative */
493 0, /* bitpos */
494 complain_overflow_dont, /* complain_on_overflow */
495 ppc_toc16_reloc, /* special_function */
496 "TOCREL16", /* name */
497 FALSE, /* partial_inplace */
498 0xffff, /* src_mask */
499 0xffff, /* dst_mask */
500 FALSE), /* pcrel_offset */
501
502 /* IMAGE_REL_PPC_TOCREL14 0x0009 */
503 /* 16-bit offset from TOC base, shifted left 2 (load doubleword) */
504 /* Unused: */
505 HOWTO (IMAGE_REL_PPC_TOCREL14,/* type */
506 1, /* rightshift */
507 1, /* size (0 = byte, 1 = short, 2 = long) */
508 16, /* bitsize */
509 FALSE, /* pc_relative */
510 0, /* bitpos */
511 complain_overflow_signed, /* complain_on_overflow */
512 0, /* special_function */
513 "TOCREL14", /* name */
514 FALSE, /* partial_inplace */
515 0xffff, /* src_mask */
516 0xffff, /* dst_mask */
517 FALSE), /* pcrel_offset */
518
519 /* IMAGE_REL_PPC_ADDR32NB 0x000A */
520 /* 32-bit addr w/ image base */
521 /* Unused: */
522 HOWTO (IMAGE_REL_PPC_ADDR32NB,/* type */
523 0, /* rightshift */
524 2, /* size (0 = byte, 1 = short, 2 = long) */
525 32, /* bitsize */
526 FALSE, /* pc_relative */
527 0, /* bitpos */
528 complain_overflow_signed, /* complain_on_overflow */
529 0, /* special_function */
530 "ADDR32NB", /* name */
531 TRUE, /* partial_inplace */
532 0xffffffff, /* src_mask */
533 0xffffffff, /* dst_mask */
534 FALSE), /* pcrel_offset */
535
536 /* IMAGE_REL_PPC_SECREL 0x000B */
537 /* va of containing section (as in an image sectionhdr) */
538 /* Unused: */
539 HOWTO (IMAGE_REL_PPC_SECREL,/* type */
540 0, /* rightshift */
541 2, /* size (0 = byte, 1 = short, 2 = long) */
542 32, /* bitsize */
543 FALSE, /* pc_relative */
544 0, /* bitpos */
545 complain_overflow_signed, /* complain_on_overflow */
546 ppc_secrel_reloc, /* special_function */
547 "SECREL", /* name */
548 TRUE, /* partial_inplace */
549 0xffffffff, /* src_mask */
550 0xffffffff, /* dst_mask */
551 TRUE), /* pcrel_offset */
552
553 /* IMAGE_REL_PPC_SECTION 0x000C */
554 /* sectionheader number */
555 /* Unused: */
556 HOWTO (IMAGE_REL_PPC_SECTION,/* type */
557 0, /* rightshift */
558 2, /* size (0 = byte, 1 = short, 2 = long) */
559 32, /* bitsize */
560 FALSE, /* pc_relative */
561 0, /* bitpos */
562 complain_overflow_signed, /* complain_on_overflow */
563 ppc_section_reloc, /* special_function */
564 "SECTION", /* name */
565 TRUE, /* partial_inplace */
566 0xffffffff, /* src_mask */
567 0xffffffff, /* dst_mask */
568 TRUE), /* pcrel_offset */
569
570 /* IMAGE_REL_PPC_IFGLUE 0x000D */
571 /* substitute TOC restore instruction iff symbol is glue code */
572 /* Used: */
573 HOWTO (IMAGE_REL_PPC_IFGLUE,/* type */
574 0, /* rightshift */
575 2, /* size (0 = byte, 1 = short, 2 = long) */
576 32, /* bitsize */
577 FALSE, /* pc_relative */
578 0, /* bitpos */
579 complain_overflow_signed, /* complain_on_overflow */
580 0, /* special_function */
581 "IFGLUE", /* name */
582 TRUE, /* partial_inplace */
583 0xffffffff, /* src_mask */
584 0xffffffff, /* dst_mask */
585 FALSE), /* pcrel_offset */
586
587 /* IMAGE_REL_PPC_IMGLUE 0x000E */
588 /* symbol is glue code; virtual address is TOC restore instruction */
589 /* Unused: */
590 HOWTO (IMAGE_REL_PPC_IMGLUE,/* type */
591 0, /* rightshift */
592 2, /* size (0 = byte, 1 = short, 2 = long) */
593 32, /* bitsize */
594 FALSE, /* pc_relative */
595 0, /* bitpos */
596 complain_overflow_dont, /* complain_on_overflow */
597 ppc_imglue_reloc, /* special_function */
598 "IMGLUE", /* name */
599 FALSE, /* partial_inplace */
600 0xffffffff, /* src_mask */
601 0xffffffff, /* dst_mask */
602 FALSE), /* pcrel_offset */
603
604 /* IMAGE_REL_PPC_SECREL16 0x000F */
605 /* va of containing section (limited to 16 bits) */
606 /* Unused: */
607 HOWTO (IMAGE_REL_PPC_SECREL16,/* type */
608 0, /* rightshift */
609 1, /* size (0 = byte, 1 = short, 2 = long) */
610 16, /* bitsize */
611 FALSE, /* pc_relative */
612 0, /* bitpos */
613 complain_overflow_signed, /* complain_on_overflow */
614 0, /* special_function */
615 "SECREL16", /* name */
616 TRUE, /* partial_inplace */
617 0xffff, /* src_mask */
618 0xffff, /* dst_mask */
619 TRUE), /* pcrel_offset */
620
621 /* IMAGE_REL_PPC_REFHI 0x0010 */
622 /* Unused: */
623 HOWTO (IMAGE_REL_PPC_REFHI, /* type */
624 0, /* rightshift */
625 1, /* size (0 = byte, 1 = short, 2 = long) */
626 16, /* bitsize */
627 FALSE, /* pc_relative */
628 0, /* bitpos */
629 complain_overflow_signed, /* complain_on_overflow */
630 ppc_refhi_reloc, /* special_function */
631 "REFHI", /* name */
632 TRUE, /* partial_inplace */
633 0xffffffff, /* src_mask */
634 0xffffffff, /* dst_mask */
635 FALSE), /* pcrel_offset */
636
637 /* IMAGE_REL_PPC_REFLO 0x0011 */
638 /* Unused: */
639 HOWTO (IMAGE_REL_PPC_REFLO, /* type */
640 0, /* rightshift */
641 1, /* size (0 = byte, 1 = short, 2 = long) */
642 16, /* bitsize */
643 FALSE, /* pc_relative */
644 0, /* bitpos */
645 complain_overflow_signed, /* complain_on_overflow */
646 ppc_refhi_reloc, /* special_function */
647 "REFLO", /* name */
648 TRUE, /* partial_inplace */
649 0xffffffff, /* src_mask */
650 0xffffffff, /* dst_mask */
651 FALSE), /* pcrel_offset */
652
653 /* IMAGE_REL_PPC_PAIR 0x0012 */
654 /* Unused: */
655 HOWTO (IMAGE_REL_PPC_PAIR, /* type */
656 0, /* rightshift */
657 1, /* size (0 = byte, 1 = short, 2 = long) */
658 16, /* bitsize */
659 FALSE, /* pc_relative */
660 0, /* bitpos */
661 complain_overflow_signed, /* complain_on_overflow */
662 ppc_pair_reloc, /* special_function */
663 "PAIR", /* name */
664 TRUE, /* partial_inplace */
665 0xffffffff, /* src_mask */
666 0xffffffff, /* dst_mask */
667 FALSE), /* pcrel_offset */
668
669 /* IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 */
670 /* 16-bit offset from TOC base, without causing a definition */
671 /* Used: */
672 HOWTO ( (IMAGE_REL_PPC_TOCREL16 | IMAGE_REL_PPC_TOCDEFN), /* type */
673 0, /* rightshift */
674 1, /* size (0 = byte, 1 = short, 2 = long) */
675 16, /* bitsize */
676 FALSE, /* pc_relative */
677 0, /* bitpos */
678 complain_overflow_dont, /* complain_on_overflow */
679 0, /* special_function */
680 "TOCREL16, TOCDEFN", /* name */
681 FALSE, /* partial_inplace */
682 0xffff, /* src_mask */
683 0xffff, /* dst_mask */
684 FALSE), /* pcrel_offset */
685
686 };
687 \f
688 /* Some really cheezy macros that can be turned on to test stderr :-) */
689
690 #ifdef DEBUG_RELOC
691 #define UN_IMPL(x) \
692 { \
693 static int i; \
694 if (i == 0) \
695 { \
696 i = 1; \
697 fprintf (stderr,_("Unimplemented Relocation -- %s\n"),x); \
698 } \
699 }
700
701 #define DUMP_RELOC(n,r) \
702 { \
703 fprintf (stderr,"%s sym %d, addr %d, addend %d\n", \
704 n, (*(r->sym_ptr_ptr))->name, \
705 r->address, r->addend); \
706 }
707
708 /* Given a reloc name, n, and a pointer to an internal_reloc,
709 dump out interesting information on the contents
710
711 #define n_name _n._n_name
712 #define n_zeroes _n._n_n._n_zeroes
713 #define n_offset _n._n_n._n_offset */
714
715 #define DUMP_RELOC2(n,r) \
716 { \
717 fprintf (stderr,"%s sym %d, r_vaddr %d %s\n", \
718 n, r->r_symndx, r->r_vaddr, \
719 (((r->r_type) & IMAGE_REL_PPC_TOCDEFN) == 0) \
720 ?" ":" TOCDEFN" ); \
721 }
722
723 #else
724 #define UN_IMPL(x)
725 #define DUMP_RELOC(n,r)
726 #define DUMP_RELOC2(n,r)
727 #endif
728 \f
729 /* TOC construction and management routines. */
730
731 /* This file is compiled twice, and these variables are defined in one
732 of the compilations. FIXME: This is confusing and weird. Also,
733 BFD should not use global variables. */
734 extern bfd * bfd_of_toc_owner;
735 extern long int global_toc_size;
736 extern long int import_table_size;
737 extern long int first_thunk_address;
738 extern long int thunk_size;
739
740 enum toc_type
741 {
742 default_toc,
743 toc_32,
744 toc_64
745 };
746
747 enum ref_category
748 {
749 priv,
750 pub,
751 tocdata
752 };
753
754 struct list_ele
755 {
756 struct list_ele *next;
757 bfd_vma addr;
758 enum ref_category cat;
759 int offset;
760 const char *name;
761 };
762
763 extern struct list_ele *head;
764 extern struct list_ele *tail;
765
766 static void
767 record_toc (asection *toc_section,
768 bfd_signed_vma our_toc_offset,
769 enum ref_category cat,
770 const char *name)
771 {
772 /* Add this entry to our toc addr-offset-name list. */
773 bfd_size_type amt = sizeof (struct list_ele);
774 struct list_ele *t = (struct list_ele *) bfd_malloc (amt);
775
776 if (t == NULL)
777 abort ();
778 t->next = 0;
779 t->offset = our_toc_offset;
780 t->name = name;
781 t->cat = cat;
782 t->addr = toc_section->output_offset + our_toc_offset;
783
784 if (head == 0)
785 {
786 head = t;
787 tail = t;
788 }
789 else
790 {
791 tail->next = t;
792 tail = t;
793 }
794 }
795
796 #ifdef COFF_IMAGE_WITH_PE
797
798 /* Record a toc offset against a symbol. */
799 static bfd_boolean
800 ppc_record_toc_entry (bfd *abfd,
801 struct bfd_link_info *info ATTRIBUTE_UNUSED,
802 asection *sec ATTRIBUTE_UNUSED,
803 int sym,
804 enum toc_type toc_kind ATTRIBUTE_UNUSED)
805 {
806 struct ppc_coff_link_hash_entry *h;
807 int *local_syms;
808
809 h = 0;
810
811 h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
812 if (h != 0)
813 {
814 HASH_CHECK(h);
815 }
816
817 if (h == 0)
818 {
819 local_syms = obj_coff_local_toc_table(abfd);
820
821 if (local_syms == 0)
822 {
823 unsigned int i;
824 bfd_size_type amt;
825
826 /* allocate a table */
827 amt = (bfd_size_type) obj_raw_syment_count (abfd) * sizeof (int);
828 local_syms = (int *) bfd_zalloc (abfd, amt);
829 if (local_syms == 0)
830 return FALSE;
831 obj_coff_local_toc_table (abfd) = local_syms;
832
833 for (i = 0; i < obj_raw_syment_count (abfd); ++i)
834 {
835 SET_UNALLOCATED (local_syms[i]);
836 }
837 }
838
839 if (IS_UNALLOCATED(local_syms[sym]))
840 {
841 local_syms[sym] = global_toc_size;
842 global_toc_size += 4;
843
844 /* The size must fit in a 16-bit displacement. */
845 if (global_toc_size > 65535)
846 {
847 _bfd_error_handler (_("TOC overflow"));
848 bfd_set_error (bfd_error_file_too_big);
849 return FALSE;
850 }
851 }
852 }
853 else
854 {
855 /* Check to see if there's a toc slot allocated. If not, do it
856 here. It will be used in relocate_section. */
857 if (IS_UNALLOCATED(h->toc_offset))
858 {
859 h->toc_offset = global_toc_size;
860 global_toc_size += 4;
861
862 /* The size must fit in a 16-bit displacement. */
863 if (global_toc_size >= 65535)
864 {
865 _bfd_error_handler (_("TOC overflow"));
866 bfd_set_error (bfd_error_file_too_big);
867 return FALSE;
868 }
869 }
870 }
871
872 return TRUE;
873 }
874
875 /* Record a toc offset against a symbol. */
876 static void
877 ppc_mark_symbol_as_glue (bfd *abfd,
878 int sym,
879 struct internal_reloc *rel)
880 {
881 struct ppc_coff_link_hash_entry *h;
882
883 h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
884
885 HASH_CHECK(h);
886
887 h->symbol_is_glue = 1;
888 h->glue_insn = bfd_get_32 (abfd, (bfd_byte *) &rel->r_vaddr);
889
890 return;
891 }
892
893 #endif /* COFF_IMAGE_WITH_PE */
894 \f
895 /* Return TRUE if this relocation should
896 appear in the output .reloc section. */
897
898 static bfd_boolean
899 in_reloc_p (bfd * abfd ATTRIBUTE_UNUSED,
900 reloc_howto_type *howto)
901 {
902 return
903 (! howto->pc_relative)
904 && (howto->type != IMAGE_REL_PPC_ADDR32NB)
905 && (howto->type != IMAGE_REL_PPC_TOCREL16)
906 && (howto->type != IMAGE_REL_PPC_IMGLUE)
907 && (howto->type != IMAGE_REL_PPC_IFGLUE)
908 && (howto->type != IMAGE_REL_PPC_SECREL)
909 && (howto->type != IMAGE_REL_PPC_SECTION)
910 && (howto->type != IMAGE_REL_PPC_SECREL16)
911 && (howto->type != IMAGE_REL_PPC_REFHI)
912 && (howto->type != IMAGE_REL_PPC_REFLO)
913 && (howto->type != IMAGE_REL_PPC_PAIR)
914 && (howto->type != IMAGE_REL_PPC_TOCREL16_DEFN) ;
915 }
916
917 static bfd_boolean
918 write_base_file_entry (bfd *obfd, struct bfd_link_info *info, bfd_vma addr)
919 {
920 if (coff_data (obfd)->pe)
921 addr -= pe_data (obfd)->pe_opthdr.ImageBase;
922 if (fwrite (&addr, sizeof (addr), 1, (FILE *) info->base_file) == 1)
923 return TRUE;
924
925 bfd_set_error (bfd_error_system_call);
926 return FALSE;
927 }
928
929 /* The reloc processing routine for the optimized COFF linker. */
930
931 static bfd_boolean
932 coff_ppc_relocate_section (bfd *output_bfd,
933 struct bfd_link_info *info,
934 bfd *input_bfd,
935 asection *input_section,
936 bfd_byte *contents,
937 struct internal_reloc *relocs,
938 struct internal_syment *syms,
939 asection **sections)
940 {
941 struct internal_reloc *rel;
942 struct internal_reloc *relend;
943 asection *toc_section = 0;
944 bfd_vma relocation;
945 reloc_howto_type *howto = 0;
946
947 /* If we are performing a relocatable link, we don't need to do a
948 thing. The caller will take care of adjusting the reloc
949 addresses and symbol indices. */
950 if (bfd_link_relocatable (info))
951 return TRUE;
952
953 rel = relocs;
954 relend = rel + input_section->reloc_count;
955 for (; rel < relend; rel++)
956 {
957 long symndx;
958 struct ppc_coff_link_hash_entry *h;
959 struct internal_syment *sym;
960 bfd_vma val;
961
962 asection *sec;
963 bfd_reloc_status_type rstat;
964 bfd_byte *loc;
965
966 unsigned short r_type = EXTRACT_TYPE (rel->r_type);
967 unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
968
969 symndx = rel->r_symndx;
970 loc = contents + rel->r_vaddr - input_section->vma;
971
972 /* FIXME: check bounds on r_type */
973 howto = ppc_coff_howto_table + r_type;
974
975 if (symndx == -1)
976 {
977 h = NULL;
978 sym = NULL;
979 }
980 else
981 {
982 h = (struct ppc_coff_link_hash_entry *)
983 (obj_coff_sym_hashes (input_bfd)[symndx]);
984 if (h != 0)
985 {
986 HASH_CHECK(h);
987 }
988
989 sym = syms + symndx;
990 }
991
992 if (r_type == IMAGE_REL_PPC_IMGLUE && h == 0)
993 {
994 /* An IMGLUE reloc must have a name. Something is very wrong. */
995 abort ();
996 }
997
998 sec = NULL;
999 val = 0;
1000
1001 /* FIXME: PAIR unsupported in the following code. */
1002 if (h == NULL)
1003 {
1004 if (symndx == -1)
1005 sec = bfd_abs_section_ptr;
1006 else
1007 {
1008 sec = sections[symndx];
1009 val = (sec->output_section->vma
1010 + sec->output_offset
1011 + sym->n_value);
1012 if (! obj_pe (output_bfd))
1013 val -= sec->vma;
1014 }
1015 }
1016 else
1017 {
1018 HASH_CHECK(h);
1019
1020 if (h->root.root.type == bfd_link_hash_defined
1021 || h->root.root.type == bfd_link_hash_defweak)
1022 {
1023 sec = h->root.root.u.def.section;
1024 val = (h->root.root.u.def.value
1025 + sec->output_section->vma
1026 + sec->output_offset);
1027 }
1028 else
1029 (*info->callbacks->undefined_symbol)
1030 (info, h->root.root.root.string, input_bfd, input_section,
1031 rel->r_vaddr - input_section->vma, TRUE);
1032 }
1033
1034 rstat = bfd_reloc_ok;
1035
1036 /* Each case must do its own relocation, setting rstat appropriately. */
1037 switch (r_type)
1038 {
1039 default:
1040 _bfd_error_handler
1041 (_("%B: unsupported relocation type 0x%02x"), input_bfd, r_type);
1042 bfd_set_error (bfd_error_bad_value);
1043 return FALSE;
1044 case IMAGE_REL_PPC_TOCREL16:
1045 {
1046 bfd_signed_vma our_toc_offset;
1047 int fixit;
1048
1049 DUMP_RELOC2(howto->name, rel);
1050
1051 if (toc_section == 0)
1052 {
1053 toc_section = bfd_get_section_by_name (bfd_of_toc_owner,
1054 TOC_SECTION_NAME);
1055
1056 if ( toc_section == NULL )
1057 {
1058 /* There is no toc section. Something is very wrong. */
1059 abort ();
1060 }
1061 }
1062
1063 /* Amazing bit tricks present. As we may have seen earlier, we
1064 use the 1 bit to tell us whether or not a toc offset has been
1065 allocated. Now that they've all been allocated, we will use
1066 the 1 bit to tell us if we've written this particular toc
1067 entry out. */
1068 fixit = FALSE;
1069 if (h == 0)
1070 {
1071 /* It is a file local symbol. */
1072 int *local_toc_table;
1073 char name[SYMNMLEN + 1];
1074
1075 sym = syms + symndx;
1076 strncpy (name, sym->_n._n_name, SYMNMLEN);
1077 name[SYMNMLEN] = '\0';
1078
1079 local_toc_table = obj_coff_local_toc_table(input_bfd);
1080 our_toc_offset = local_toc_table[symndx];
1081
1082 if (IS_WRITTEN(our_toc_offset))
1083 {
1084 /* If it has been written out, it is marked with the
1085 1 bit. Fix up our offset, but do not write it out
1086 again. */
1087 MAKE_ADDR_AGAIN(our_toc_offset);
1088 }
1089 else
1090 {
1091 /* Write out the toc entry. */
1092 record_toc (toc_section, our_toc_offset, priv,
1093 strdup (name));
1094
1095 bfd_put_32 (output_bfd, val,
1096 toc_section->contents + our_toc_offset);
1097
1098 MARK_AS_WRITTEN(local_toc_table[symndx]);
1099 fixit = TRUE;
1100 }
1101 }
1102 else
1103 {
1104 const char *name = h->root.root.root.string;
1105 our_toc_offset = h->toc_offset;
1106
1107 if ((r_flags & IMAGE_REL_PPC_TOCDEFN)
1108 == IMAGE_REL_PPC_TOCDEFN )
1109 {
1110 /* This is unbelievable cheese. Some knowledgable asm
1111 hacker has decided to use r2 as a base for loading
1112 a value. He/She does this by setting the tocdefn bit,
1113 and not supplying a toc definition. The behaviour is
1114 then to use the difference between the value of the
1115 symbol and the actual location of the toc as the toc
1116 index.
1117
1118 In fact, what is usually happening is, because the
1119 Import Address Table is mapped immediately following
1120 the toc, some trippy library code trying for speed on
1121 dll linkage, takes advantage of that and considers
1122 the IAT to be part of the toc, thus saving a load. */
1123
1124 our_toc_offset = val - (toc_section->output_section->vma
1125 + toc_section->output_offset);
1126
1127 /* The size must still fit in a 16-bit displacement. */
1128 if ((bfd_vma) our_toc_offset >= 65535)
1129 {
1130 _bfd_error_handler
1131 (_("%B: Relocation for %s of %lx exceeds "
1132 "Toc size limit"),
1133 input_bfd, name,
1134 (unsigned long) our_toc_offset);
1135 bfd_set_error (bfd_error_bad_value);
1136 return FALSE;
1137 }
1138
1139 record_toc (toc_section, our_toc_offset, pub,
1140 strdup (name));
1141 }
1142 else if (IS_WRITTEN (our_toc_offset))
1143 {
1144 /* If it has been written out, it is marked with the
1145 1 bit. Fix up our offset, but do not write it out
1146 again. */
1147 MAKE_ADDR_AGAIN(our_toc_offset);
1148 }
1149 else
1150 {
1151 record_toc(toc_section, our_toc_offset, pub,
1152 strdup (name));
1153
1154 /* Write out the toc entry. */
1155 bfd_put_32 (output_bfd, val,
1156 toc_section->contents + our_toc_offset);
1157
1158 MARK_AS_WRITTEN(h->toc_offset);
1159 /* The tricky part is that this is the address that
1160 needs a .reloc entry for it. */
1161 fixit = TRUE;
1162 }
1163 }
1164
1165 if (fixit && info->base_file)
1166 {
1167 /* So if this is non pcrelative, and is referenced
1168 to a section or a common symbol, then it needs a reloc. */
1169
1170 /* Relocation to a symbol in a section which
1171 isn't absolute - we output the address here
1172 to a file. */
1173 bfd_vma addr = (toc_section->output_section->vma
1174 + toc_section->output_offset + our_toc_offset);
1175
1176 if (!write_base_file_entry (output_bfd, info, addr))
1177 return FALSE;
1178 }
1179
1180 /* FIXME: this test is conservative. */
1181 if ((r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN
1182 && (bfd_vma) our_toc_offset > toc_section->size)
1183 {
1184 _bfd_error_handler
1185 (_("%B: Relocation exceeds allocated TOC (%lx)"),
1186 input_bfd, (unsigned long) toc_section->size);
1187 bfd_set_error (bfd_error_bad_value);
1188 return FALSE;
1189 }
1190
1191 /* Now we know the relocation for this toc reference. */
1192 relocation = our_toc_offset + TOC_LOAD_ADJUSTMENT;
1193 rstat = _bfd_relocate_contents (howto, input_bfd, relocation, loc);
1194 }
1195 break;
1196 case IMAGE_REL_PPC_IFGLUE:
1197 {
1198 /* To solve this, we need to know whether or not the symbol
1199 appearing on the call instruction is a glue function or not.
1200 A glue function must announce itself via a IMGLUE reloc, and
1201 the reloc contains the required toc restore instruction. */
1202 DUMP_RELOC2 (howto->name, rel);
1203
1204 if (h != 0)
1205 {
1206 if (h->symbol_is_glue == 1)
1207 {
1208 bfd_put_32 (input_bfd, (bfd_vma) h->glue_insn, loc);
1209 }
1210 }
1211 }
1212 break;
1213 case IMAGE_REL_PPC_SECREL:
1214 /* Unimplemented: codeview debugging information. */
1215 /* For fast access to the header of the section
1216 containing the item. */
1217 break;
1218 case IMAGE_REL_PPC_SECTION:
1219 /* Unimplemented: codeview debugging information. */
1220 /* Is used to indicate that the value should be relative
1221 to the beginning of the section that contains the
1222 symbol. */
1223 break;
1224 case IMAGE_REL_PPC_ABSOLUTE:
1225 {
1226 const char *my_name;
1227 char buf[SYMNMLEN + 1];
1228
1229 if (h == 0)
1230 {
1231 strncpy (buf, (syms+symndx)->_n._n_name, SYMNMLEN);
1232 buf[SYMNMLEN] = '\0';
1233 my_name = buf;
1234 }
1235 else
1236 my_name = h->root.root.root.string;
1237
1238 _bfd_error_handler
1239 (_("Warning: unsupported reloc %s <file %B, section %A>\n"
1240 "sym %ld (%s), r_vaddr %ld (%lx)"),
1241 input_bfd, input_section, howto->name,
1242 rel->r_symndx, my_name, (long) rel->r_vaddr,
1243 (unsigned long) rel->r_vaddr);
1244 }
1245 break;
1246 case IMAGE_REL_PPC_IMGLUE:
1247 {
1248 /* There is nothing to do now. This reloc was noted in the first
1249 pass over the relocs, and the glue instruction extracted. */
1250 const char *my_name;
1251
1252 if (h->symbol_is_glue == 1)
1253 break;
1254 my_name = h->root.root.root.string;
1255
1256 _bfd_error_handler
1257 (_("%B: Out of order IMGLUE reloc for %s"), input_bfd, my_name);
1258 bfd_set_error (bfd_error_bad_value);
1259 return FALSE;
1260 }
1261
1262 case IMAGE_REL_PPC_ADDR32NB:
1263 {
1264 const char *name = 0;
1265
1266 DUMP_RELOC2 (howto->name, rel);
1267
1268 if (CONST_STRNEQ (input_section->name, ".idata$2") && first_thunk_address == 0)
1269 {
1270 /* Set magic values. */
1271 int idata5offset;
1272 struct coff_link_hash_entry *myh;
1273
1274 myh = coff_link_hash_lookup (coff_hash_table (info),
1275 "__idata5_magic__",
1276 FALSE, FALSE, TRUE);
1277 first_thunk_address = myh->root.u.def.value +
1278 sec->output_section->vma +
1279 sec->output_offset -
1280 pe_data(output_bfd)->pe_opthdr.ImageBase;
1281
1282 idata5offset = myh->root.u.def.value;
1283 myh = coff_link_hash_lookup (coff_hash_table (info),
1284 "__idata6_magic__",
1285 FALSE, FALSE, TRUE);
1286
1287 thunk_size = myh->root.u.def.value - idata5offset;
1288 myh = coff_link_hash_lookup (coff_hash_table (info),
1289 "__idata4_magic__",
1290 FALSE, FALSE, TRUE);
1291 import_table_size = myh->root.u.def.value;
1292 }
1293
1294 if (h == 0)
1295 /* It is a file local symbol. */
1296 sym = syms + symndx;
1297 else
1298 {
1299 char *target = 0;
1300
1301 name = h->root.root.root.string;
1302 if (strcmp (".idata$2", name) == 0)
1303 target = "__idata2_magic__";
1304 else if (strcmp (".idata$4", name) == 0)
1305 target = "__idata4_magic__";
1306 else if (strcmp (".idata$5", name) == 0)
1307 target = "__idata5_magic__";
1308
1309 if (target != 0)
1310 {
1311 struct coff_link_hash_entry *myh;
1312
1313 myh = coff_link_hash_lookup (coff_hash_table (info),
1314 target,
1315 FALSE, FALSE, TRUE);
1316 if (myh == 0)
1317 {
1318 /* Missing magic cookies. Something is very wrong. */
1319 abort ();
1320 }
1321
1322 val = myh->root.u.def.value +
1323 sec->output_section->vma + sec->output_offset;
1324 if (first_thunk_address == 0)
1325 {
1326 int idata5offset;
1327 myh = coff_link_hash_lookup (coff_hash_table (info),
1328 "__idata5_magic__",
1329 FALSE, FALSE, TRUE);
1330 first_thunk_address = myh->root.u.def.value +
1331 sec->output_section->vma +
1332 sec->output_offset -
1333 pe_data(output_bfd)->pe_opthdr.ImageBase;
1334
1335 idata5offset = myh->root.u.def.value;
1336 myh = coff_link_hash_lookup (coff_hash_table (info),
1337 "__idata6_magic__",
1338 FALSE, FALSE, TRUE);
1339
1340 thunk_size = myh->root.u.def.value - idata5offset;
1341 myh = coff_link_hash_lookup (coff_hash_table (info),
1342 "__idata4_magic__",
1343 FALSE, FALSE, TRUE);
1344 import_table_size = myh->root.u.def.value;
1345 }
1346 }
1347 }
1348
1349 rstat = _bfd_relocate_contents (howto,
1350 input_bfd,
1351 val -
1352 pe_data (output_bfd)->pe_opthdr.ImageBase,
1353 loc);
1354 }
1355 break;
1356
1357 case IMAGE_REL_PPC_REL24:
1358 DUMP_RELOC2(howto->name, rel);
1359 val -= (input_section->output_section->vma
1360 + input_section->output_offset);
1361
1362 rstat = _bfd_relocate_contents (howto,
1363 input_bfd,
1364 val,
1365 loc);
1366 break;
1367 case IMAGE_REL_PPC_ADDR16:
1368 case IMAGE_REL_PPC_ADDR24:
1369 case IMAGE_REL_PPC_ADDR32:
1370 DUMP_RELOC2(howto->name, rel);
1371 rstat = _bfd_relocate_contents (howto,
1372 input_bfd,
1373 val,
1374 loc);
1375 break;
1376 }
1377
1378 if (info->base_file)
1379 {
1380 /* So if this is non pcrelative, and is referenced
1381 to a section or a common symbol, then it needs a reloc. */
1382 if (sym && pe_data(output_bfd)->in_reloc_p (output_bfd, howto))
1383 {
1384 /* Relocation to a symbol in a section which
1385 isn't absolute - we output the address here
1386 to a file. */
1387 bfd_vma addr = (rel->r_vaddr
1388 - input_section->vma
1389 + input_section->output_offset
1390 + input_section->output_section->vma);
1391
1392 if (!write_base_file_entry (output_bfd, info, addr))
1393 return FALSE;
1394 }
1395 }
1396
1397 switch (rstat)
1398 {
1399 default:
1400 abort ();
1401 case bfd_reloc_ok:
1402 break;
1403 case bfd_reloc_overflow:
1404 {
1405 const char *name;
1406 char buf[SYMNMLEN + 1];
1407
1408 if (symndx == -1)
1409 name = "*ABS*";
1410 else if (h != NULL)
1411 name = NULL;
1412 else if (sym == NULL)
1413 name = "*unknown*";
1414 else if (sym->_n._n_n._n_zeroes == 0
1415 && sym->_n._n_n._n_offset != 0)
1416 name = obj_coff_strings (input_bfd) + sym->_n._n_n._n_offset;
1417 else
1418 {
1419 strncpy (buf, sym->_n._n_name, SYMNMLEN);
1420 buf[SYMNMLEN] = '\0';
1421 name = buf;
1422 }
1423
1424 (*info->callbacks->reloc_overflow)
1425 (info, (h ? &h->root.root : NULL), name, howto->name,
1426 (bfd_vma) 0, input_bfd, input_section,
1427 rel->r_vaddr - input_section->vma);
1428 }
1429 }
1430 }
1431
1432 return TRUE;
1433 }
1434
1435 #ifdef COFF_IMAGE_WITH_PE
1436
1437 /* FIXME: BFD should not use global variables. This file is compiled
1438 twice, and these variables are shared. This is confusing and
1439 weird. */
1440
1441 long int global_toc_size = 4;
1442
1443 bfd* bfd_of_toc_owner = 0;
1444
1445 long int import_table_size;
1446 long int first_thunk_address;
1447 long int thunk_size;
1448
1449 struct list_ele *head;
1450 struct list_ele *tail;
1451
1452 static char *
1453 h1 = N_("\n\t\t\tTOC MAPPING\n\n");
1454 static char *
1455 h2 = N_(" TOC disassembly Comments Name\n");
1456 static char *
1457 h3 = N_(" Offset spelling (if present)\n");
1458
1459 void
1460 dump_toc (void * vfile)
1461 {
1462 FILE *file = (FILE *) vfile;
1463 struct list_ele *t;
1464
1465 fputs (_(h1), file);
1466 fputs (_(h2), file);
1467 fputs (_(h3), file);
1468
1469 for (t = head; t != 0; t=t->next)
1470 {
1471 const char *cat = "";
1472
1473 if (t->cat == priv)
1474 cat = _("private ");
1475 else if (t->cat == pub)
1476 cat = _("public ");
1477 else if (t->cat == tocdata)
1478 cat = _("data-in-toc ");
1479
1480 if (t->offset > global_toc_size)
1481 {
1482 if (t->offset <= global_toc_size + thunk_size)
1483 cat = _("IAT reference ");
1484 else
1485 {
1486 fprintf (file,
1487 _("**** global_toc_size %ld(%lx), thunk_size %ld(%lx)\n"),
1488 global_toc_size, (unsigned long) global_toc_size,
1489 thunk_size, (unsigned long) thunk_size);
1490 cat = _("Out of bounds!");
1491 }
1492 }
1493
1494 fprintf (file,
1495 " %04lx (%d)", (unsigned long) t->offset, t->offset - 32768);
1496 fprintf (file,
1497 " %s %s\n",
1498 cat, t->name);
1499
1500 }
1501
1502 fprintf (file, "\n");
1503 }
1504
1505 bfd_boolean
1506 ppc_allocate_toc_section (struct bfd_link_info *info ATTRIBUTE_UNUSED)
1507 {
1508 asection *s;
1509 bfd_byte *foo;
1510 bfd_size_type amt;
1511 static char test_char = '1';
1512
1513 if ( global_toc_size == 0 ) /* FIXME: does this get me in trouble? */
1514 return TRUE;
1515
1516 if (bfd_of_toc_owner == 0)
1517 /* No toc owner? Something is very wrong. */
1518 abort ();
1519
1520 s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME);
1521 if (s == NULL)
1522 /* No toc section? Something is very wrong. */
1523 abort ();
1524
1525 amt = global_toc_size;
1526 foo = (bfd_byte *) bfd_alloc (bfd_of_toc_owner, amt);
1527 memset(foo, test_char, (size_t) global_toc_size);
1528
1529 s->size = global_toc_size;
1530 s->contents = foo;
1531
1532 return TRUE;
1533 }
1534
1535 bfd_boolean
1536 ppc_process_before_allocation (bfd *abfd,
1537 struct bfd_link_info *info)
1538 {
1539 asection *sec;
1540 struct internal_reloc *i, *rel;
1541
1542 /* Here we have a bfd that is to be included on the link. We have a hook
1543 to do reloc rummaging, before section sizes are nailed down. */
1544 _bfd_coff_get_external_symbols (abfd);
1545
1546 /* Rummage around all the relocs and map the toc. */
1547 sec = abfd->sections;
1548
1549 if (sec == 0)
1550 return TRUE;
1551
1552 for (; sec != 0; sec = sec->next)
1553 {
1554 if (sec->reloc_count == 0)
1555 continue;
1556
1557 /* load the relocs */
1558 /* FIXME: there may be a storage leak here */
1559 i=_bfd_coff_read_internal_relocs(abfd,sec,1,0,0,0);
1560
1561 if (i == 0)
1562 abort ();
1563
1564 for (rel = i; rel < i + sec->reloc_count; ++rel)
1565 {
1566 unsigned short r_type = EXTRACT_TYPE (rel->r_type);
1567 unsigned short r_flags = EXTRACT_FLAGS (rel->r_type);
1568 bfd_boolean ok = TRUE;
1569
1570 DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, rel);
1571
1572 switch(r_type)
1573 {
1574 case IMAGE_REL_PPC_TOCREL16:
1575 /* If TOCDEFN is on, ignore as someone else has allocated the
1576 toc entry. */
1577 if ((r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN)
1578 ok = ppc_record_toc_entry(abfd, info, sec,
1579 rel->r_symndx, default_toc);
1580 if (!ok)
1581 return FALSE;
1582 break;
1583 case IMAGE_REL_PPC_IMGLUE:
1584 ppc_mark_symbol_as_glue (abfd, rel->r_symndx, rel);
1585 break;
1586 default:
1587 break;
1588 }
1589 }
1590 }
1591
1592 return TRUE;
1593 }
1594
1595 #endif
1596
1597 static bfd_reloc_status_type
1598 ppc_refhi_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1599 arelent *reloc_entry ATTRIBUTE_UNUSED,
1600 asymbol *symbol ATTRIBUTE_UNUSED,
1601 void * data ATTRIBUTE_UNUSED,
1602 asection *input_section ATTRIBUTE_UNUSED,
1603 bfd *output_bfd,
1604 char **error_message ATTRIBUTE_UNUSED)
1605 {
1606 UN_IMPL("REFHI");
1607 DUMP_RELOC("REFHI",reloc_entry);
1608
1609 if (output_bfd == (bfd *) NULL)
1610 return bfd_reloc_continue;
1611
1612 return bfd_reloc_undefined;
1613 }
1614
1615 static bfd_reloc_status_type
1616 ppc_pair_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1617 arelent *reloc_entry ATTRIBUTE_UNUSED,
1618 asymbol *symbol ATTRIBUTE_UNUSED,
1619 void * data ATTRIBUTE_UNUSED,
1620 asection *input_section ATTRIBUTE_UNUSED,
1621 bfd *output_bfd,
1622 char **error_message ATTRIBUTE_UNUSED)
1623 {
1624 UN_IMPL("PAIR");
1625 DUMP_RELOC("PAIR",reloc_entry);
1626
1627 if (output_bfd == (bfd *) NULL)
1628 return bfd_reloc_continue;
1629
1630 return bfd_reloc_undefined;
1631 }
1632
1633 static bfd_reloc_status_type
1634 ppc_toc16_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1635 arelent *reloc_entry ATTRIBUTE_UNUSED,
1636 asymbol *symbol ATTRIBUTE_UNUSED,
1637 void * data ATTRIBUTE_UNUSED,
1638 asection *input_section ATTRIBUTE_UNUSED,
1639 bfd *output_bfd,
1640 char **error_message ATTRIBUTE_UNUSED)
1641 {
1642 UN_IMPL ("TOCREL16");
1643 DUMP_RELOC ("TOCREL16",reloc_entry);
1644
1645 if (output_bfd == (bfd *) NULL)
1646 return bfd_reloc_continue;
1647
1648 return bfd_reloc_ok;
1649 }
1650
1651 static bfd_reloc_status_type
1652 ppc_secrel_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1653 arelent *reloc_entry ATTRIBUTE_UNUSED,
1654 asymbol *symbol ATTRIBUTE_UNUSED,
1655 void * data ATTRIBUTE_UNUSED,
1656 asection *input_section ATTRIBUTE_UNUSED,
1657 bfd *output_bfd,
1658 char **error_message ATTRIBUTE_UNUSED)
1659 {
1660 UN_IMPL("SECREL");
1661 DUMP_RELOC("SECREL",reloc_entry);
1662
1663 if (output_bfd == (bfd *) NULL)
1664 return bfd_reloc_continue;
1665
1666 return bfd_reloc_ok;
1667 }
1668
1669 static bfd_reloc_status_type
1670 ppc_section_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1671 arelent *reloc_entry ATTRIBUTE_UNUSED,
1672 asymbol *symbol ATTRIBUTE_UNUSED,
1673 void * data ATTRIBUTE_UNUSED,
1674 asection *input_section ATTRIBUTE_UNUSED,
1675 bfd *output_bfd,
1676 char **error_message ATTRIBUTE_UNUSED)
1677 {
1678 UN_IMPL("SECTION");
1679 DUMP_RELOC("SECTION",reloc_entry);
1680
1681 if (output_bfd == (bfd *) NULL)
1682 return bfd_reloc_continue;
1683
1684 return bfd_reloc_ok;
1685 }
1686
1687 static bfd_reloc_status_type
1688 ppc_imglue_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1689 arelent *reloc_entry ATTRIBUTE_UNUSED,
1690 asymbol *symbol ATTRIBUTE_UNUSED,
1691 void * data ATTRIBUTE_UNUSED,
1692 asection *input_section ATTRIBUTE_UNUSED,
1693 bfd *output_bfd,
1694 char **error_message ATTRIBUTE_UNUSED)
1695
1696 {
1697 UN_IMPL("IMGLUE");
1698 DUMP_RELOC("IMGLUE",reloc_entry);
1699
1700 if (output_bfd == (bfd *) NULL)
1701 return bfd_reloc_continue;
1702
1703 return bfd_reloc_ok;
1704 }
1705 \f
1706 #define MAX_RELOC_INDEX \
1707 (sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]) - 1)
1708
1709 /* FIXME: There is a possibility that when we read in a reloc from a file,
1710 that there are some bits encoded in the upper portion of the
1711 type field. Not yet implemented. */
1712
1713 static void
1714 ppc_coff_rtype2howto (arelent *relent, struct internal_reloc *internal)
1715 {
1716 /* We can encode one of three things in the type field, aside from the
1717 type:
1718 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
1719 value, rather than an addition value
1720 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
1721 the branch is expected to be taken or not.
1722 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
1723 For now, we just strip this stuff to find the type, and ignore it other
1724 than that. */
1725 reloc_howto_type *howto;
1726 unsigned short r_type = EXTRACT_TYPE (internal->r_type);
1727 unsigned short r_flags = EXTRACT_FLAGS(internal->r_type);
1728 unsigned short junk = EXTRACT_JUNK (internal->r_type);
1729
1730 /* The masking process only slices off the bottom byte for r_type. */
1731 if ( r_type > MAX_RELOC_INDEX )
1732 abort ();
1733
1734 /* Check for absolute crap. */
1735 if (junk != 0)
1736 abort ();
1737
1738 switch(r_type)
1739 {
1740 case IMAGE_REL_PPC_ADDR16:
1741 case IMAGE_REL_PPC_REL24:
1742 case IMAGE_REL_PPC_ADDR24:
1743 case IMAGE_REL_PPC_ADDR32:
1744 case IMAGE_REL_PPC_IFGLUE:
1745 case IMAGE_REL_PPC_ADDR32NB:
1746 case IMAGE_REL_PPC_SECTION:
1747 case IMAGE_REL_PPC_SECREL:
1748 DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
1749 howto = ppc_coff_howto_table + r_type;
1750 break;
1751 case IMAGE_REL_PPC_IMGLUE:
1752 DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
1753 howto = ppc_coff_howto_table + r_type;
1754 break;
1755 case IMAGE_REL_PPC_TOCREL16:
1756 DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
1757 if (r_flags & IMAGE_REL_PPC_TOCDEFN)
1758 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN;
1759 else
1760 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
1761 break;
1762 default:
1763 _bfd_error_handler
1764 (_("warning: unsupported reloc %s [%d] used -- it may not work"),
1765 ppc_coff_howto_table[r_type].name, r_type);
1766 howto = ppc_coff_howto_table + r_type;
1767 break;
1768 }
1769
1770 relent->howto = howto;
1771 }
1772
1773 static reloc_howto_type *
1774 coff_ppc_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
1775 asection *sec,
1776 struct internal_reloc *rel,
1777 struct coff_link_hash_entry *h ATTRIBUTE_UNUSED,
1778 struct internal_syment *sym ATTRIBUTE_UNUSED,
1779 bfd_vma *addendp)
1780 {
1781 reloc_howto_type *howto;
1782
1783 /* We can encode one of three things in the type field, aside from the
1784 type:
1785 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
1786 value, rather than an addition value
1787 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
1788 the branch is expected to be taken or not.
1789 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
1790 For now, we just strip this stuff to find the type, and ignore it other
1791 than that. */
1792
1793 unsigned short r_type = EXTRACT_TYPE (rel->r_type);
1794 unsigned short r_flags = EXTRACT_FLAGS (rel->r_type);
1795 unsigned short junk = EXTRACT_JUNK (rel->r_type);
1796
1797 /* The masking process only slices off the bottom byte for r_type. */
1798 if (r_type > MAX_RELOC_INDEX)
1799 abort ();
1800
1801 /* Check for absolute crap. */
1802 if (junk != 0)
1803 abort ();
1804
1805 switch(r_type)
1806 {
1807 case IMAGE_REL_PPC_ADDR32NB:
1808 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1809 *addendp -= pe_data(sec->output_section->owner)->pe_opthdr.ImageBase;
1810 howto = ppc_coff_howto_table + r_type;
1811 break;
1812 case IMAGE_REL_PPC_TOCREL16:
1813 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1814 if (r_flags & IMAGE_REL_PPC_TOCDEFN)
1815 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN;
1816 else
1817 howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
1818 break;
1819 case IMAGE_REL_PPC_ADDR16:
1820 case IMAGE_REL_PPC_REL24:
1821 case IMAGE_REL_PPC_ADDR24:
1822 case IMAGE_REL_PPC_ADDR32:
1823 case IMAGE_REL_PPC_IFGLUE:
1824 case IMAGE_REL_PPC_SECTION:
1825 case IMAGE_REL_PPC_SECREL:
1826 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1827 howto = ppc_coff_howto_table + r_type;
1828 break;
1829 case IMAGE_REL_PPC_IMGLUE:
1830 DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1831 howto = ppc_coff_howto_table + r_type;
1832 break;
1833 default:
1834 _bfd_error_handler
1835 (_("warning: unsupported reloc %s [%d] used -- it may not work"),
1836 ppc_coff_howto_table[r_type].name, r_type);
1837 howto = ppc_coff_howto_table + r_type;
1838 break;
1839 }
1840
1841 return howto;
1842 }
1843
1844 /* A cheesy little macro to make the code a little more readable. */
1845 #define HOW2MAP(bfd_rtype,ppc_rtype) \
1846 case bfd_rtype: return &ppc_coff_howto_table[ppc_rtype]
1847
1848 static reloc_howto_type *
1849 ppc_coff_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1850 bfd_reloc_code_real_type code)
1851 {
1852 switch (code)
1853 {
1854 HOW2MAP(BFD_RELOC_32_GOTOFF, IMAGE_REL_PPC_IMGLUE);
1855 HOW2MAP(BFD_RELOC_16_GOT_PCREL, IMAGE_REL_PPC_IFGLUE);
1856 HOW2MAP(BFD_RELOC_16, IMAGE_REL_PPC_ADDR16);
1857 HOW2MAP(BFD_RELOC_PPC_B26, IMAGE_REL_PPC_REL24);
1858 HOW2MAP(BFD_RELOC_PPC_BA26, IMAGE_REL_PPC_ADDR24);
1859 HOW2MAP(BFD_RELOC_PPC_TOC16, IMAGE_REL_PPC_TOCREL16);
1860 HOW2MAP(BFD_RELOC_16_GOTOFF, IMAGE_REL_PPC_TOCREL16_DEFN);
1861 HOW2MAP(BFD_RELOC_32, IMAGE_REL_PPC_ADDR32);
1862 HOW2MAP(BFD_RELOC_RVA, IMAGE_REL_PPC_ADDR32NB);
1863 default:
1864 return NULL;
1865 }
1866 }
1867 #undef HOW2MAP
1868
1869 static reloc_howto_type *
1870 ppc_coff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1871 const char *r_name)
1872 {
1873 unsigned int i;
1874
1875 for (i = 0;
1876 i < sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]);
1877 i++)
1878 if (ppc_coff_howto_table[i].name != NULL
1879 && strcasecmp (ppc_coff_howto_table[i].name, r_name) == 0)
1880 return &ppc_coff_howto_table[i];
1881
1882 return NULL;
1883 }
1884 \f
1885 /* Tailor coffcode.h -- macro heaven. */
1886
1887 #define RTYPE2HOWTO(cache_ptr, dst) ppc_coff_rtype2howto (cache_ptr, dst)
1888
1889 /* We use the special COFF backend linker, with our own special touch. */
1890
1891 #define coff_bfd_reloc_type_lookup ppc_coff_reloc_type_lookup
1892 #define coff_bfd_reloc_name_lookup ppc_coff_reloc_name_lookup
1893 #define coff_rtype_to_howto coff_ppc_rtype_to_howto
1894 #define coff_relocate_section coff_ppc_relocate_section
1895 #define coff_bfd_final_link ppc_bfd_coff_final_link
1896
1897 #ifndef COFF_IMAGE_WITH_PE
1898 #endif
1899
1900 #define SELECT_RELOC(internal, howto) {internal.r_type=howto->type;}
1901
1902 #define COFF_PAGE_SIZE 0x1000
1903
1904 /* FIXME: This controls some code that used to be in peicode.h and is
1905 now in peigen.c. It will not control the code in peigen.c. If
1906 anybody wants to get this working, you will need to fix that. */
1907 #define POWERPC_LE_PE
1908
1909 #define COFF_SECTION_ALIGNMENT_ENTRIES \
1910 { COFF_SECTION_NAME_EXACT_MATCH (".idata$2"), \
1911 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
1912 { COFF_SECTION_NAME_EXACT_MATCH (".idata$3"), \
1913 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
1914 { COFF_SECTION_NAME_EXACT_MATCH (".idata$4"), \
1915 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
1916 { COFF_SECTION_NAME_EXACT_MATCH (".idata$5"), \
1917 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
1918 { COFF_SECTION_NAME_EXACT_MATCH (".idata$6"), \
1919 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }, \
1920 { COFF_SECTION_NAME_EXACT_MATCH (".reloc"), \
1921 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }
1922
1923 #include "coffcode.h"
1924 \f
1925 #ifndef COFF_IMAGE_WITH_PE
1926
1927 static bfd_boolean
1928 ppc_do_last (bfd *abfd)
1929 {
1930 if (abfd == bfd_of_toc_owner)
1931 return TRUE;
1932 else
1933 return FALSE;
1934 }
1935
1936 static bfd *
1937 ppc_get_last (void)
1938 {
1939 return bfd_of_toc_owner;
1940 }
1941
1942 /* This piece of machinery exists only to guarantee that the bfd that holds
1943 the toc section is written last.
1944
1945 This does depend on bfd_make_section attaching a new section to the
1946 end of the section list for the bfd.
1947
1948 This is otherwise intended to be functionally the same as
1949 cofflink.c:_bfd_coff_final_link(). It is specifically different only
1950 where the POWERPC_LE_PE macro modifies the code. It is left in as a
1951 precise form of comment. krk@cygnus.com */
1952
1953 /* Do the final link step. */
1954
1955 bfd_boolean
1956 ppc_bfd_coff_final_link (bfd *abfd, struct bfd_link_info *info)
1957 {
1958 bfd_size_type symesz;
1959 struct coff_final_link_info flaginfo;
1960 bfd_boolean debug_merge_allocated;
1961 asection *o;
1962 struct bfd_link_order *p;
1963 bfd_size_type max_sym_count;
1964 bfd_size_type max_lineno_count;
1965 bfd_size_type max_reloc_count;
1966 bfd_size_type max_output_reloc_count;
1967 bfd_size_type max_contents_size;
1968 file_ptr rel_filepos;
1969 unsigned int relsz;
1970 file_ptr line_filepos;
1971 unsigned int linesz;
1972 bfd *sub;
1973 bfd_byte *external_relocs = NULL;
1974 char strbuf[STRING_SIZE_SIZE];
1975 bfd_size_type amt;
1976
1977 symesz = bfd_coff_symesz (abfd);
1978
1979 flaginfo.info = info;
1980 flaginfo.output_bfd = abfd;
1981 flaginfo.strtab = NULL;
1982 flaginfo.section_info = NULL;
1983 flaginfo.last_file_index = -1;
1984 flaginfo.last_bf_index = -1;
1985 flaginfo.internal_syms = NULL;
1986 flaginfo.sec_ptrs = NULL;
1987 flaginfo.sym_indices = NULL;
1988 flaginfo.outsyms = NULL;
1989 flaginfo.linenos = NULL;
1990 flaginfo.contents = NULL;
1991 flaginfo.external_relocs = NULL;
1992 flaginfo.internal_relocs = NULL;
1993 debug_merge_allocated = FALSE;
1994
1995 coff_data (abfd)->link_info = info;
1996
1997 flaginfo.strtab = _bfd_stringtab_init ();
1998 if (flaginfo.strtab == NULL)
1999 goto error_return;
2000
2001 if (! coff_debug_merge_hash_table_init (&flaginfo.debug_merge))
2002 goto error_return;
2003 debug_merge_allocated = TRUE;
2004
2005 /* Compute the file positions for all the sections. */
2006 if (! abfd->output_has_begun)
2007 {
2008 if (! bfd_coff_compute_section_file_positions (abfd))
2009 return FALSE;
2010 }
2011
2012 /* Count the line numbers and relocation entries required for the
2013 output file. Set the file positions for the relocs. */
2014 rel_filepos = obj_relocbase (abfd);
2015 relsz = bfd_coff_relsz (abfd);
2016 max_contents_size = 0;
2017 max_lineno_count = 0;
2018 max_reloc_count = 0;
2019
2020 for (o = abfd->sections; o != NULL; o = o->next)
2021 {
2022 o->reloc_count = 0;
2023 o->lineno_count = 0;
2024
2025 for (p = o->map_head.link_order; p != NULL; p = p->next)
2026 {
2027 if (p->type == bfd_indirect_link_order)
2028 {
2029 asection *sec;
2030
2031 sec = p->u.indirect.section;
2032
2033 /* Mark all sections which are to be included in the
2034 link. This will normally be every section. We need
2035 to do this so that we can identify any sections which
2036 the linker has decided to not include. */
2037 sec->linker_mark = TRUE;
2038
2039 if (info->strip == strip_none
2040 || info->strip == strip_some)
2041 o->lineno_count += sec->lineno_count;
2042
2043 if (bfd_link_relocatable (info))
2044 o->reloc_count += sec->reloc_count;
2045
2046 if (sec->rawsize > max_contents_size)
2047 max_contents_size = sec->rawsize;
2048 if (sec->size > max_contents_size)
2049 max_contents_size = sec->size;
2050 if (sec->lineno_count > max_lineno_count)
2051 max_lineno_count = sec->lineno_count;
2052 if (sec->reloc_count > max_reloc_count)
2053 max_reloc_count = sec->reloc_count;
2054 }
2055 else if (bfd_link_relocatable (info)
2056 && (p->type == bfd_section_reloc_link_order
2057 || p->type == bfd_symbol_reloc_link_order))
2058 ++o->reloc_count;
2059 }
2060 if (o->reloc_count == 0)
2061 o->rel_filepos = 0;
2062 else
2063 {
2064 o->flags |= SEC_RELOC;
2065 o->rel_filepos = rel_filepos;
2066 rel_filepos += o->reloc_count * relsz;
2067 }
2068 }
2069
2070 /* If doing a relocatable link, allocate space for the pointers we
2071 need to keep. */
2072 if (bfd_link_relocatable (info))
2073 {
2074 unsigned int i;
2075
2076 /* We use section_count + 1, rather than section_count, because
2077 the target_index fields are 1 based. */
2078 amt = abfd->section_count + 1;
2079 amt *= sizeof (struct coff_link_section_info);
2080 flaginfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
2081
2082 if (flaginfo.section_info == NULL)
2083 goto error_return;
2084
2085 for (i = 0; i <= abfd->section_count; i++)
2086 {
2087 flaginfo.section_info[i].relocs = NULL;
2088 flaginfo.section_info[i].rel_hashes = NULL;
2089 }
2090 }
2091
2092 /* We now know the size of the relocs, so we can determine the file
2093 positions of the line numbers. */
2094 line_filepos = rel_filepos;
2095 linesz = bfd_coff_linesz (abfd);
2096 max_output_reloc_count = 0;
2097
2098 for (o = abfd->sections; o != NULL; o = o->next)
2099 {
2100 if (o->lineno_count == 0)
2101 o->line_filepos = 0;
2102 else
2103 {
2104 o->line_filepos = line_filepos;
2105 line_filepos += o->lineno_count * linesz;
2106 }
2107
2108 if (o->reloc_count != 0)
2109 {
2110 /* We don't know the indices of global symbols until we have
2111 written out all the local symbols. For each section in
2112 the output file, we keep an array of pointers to hash
2113 table entries. Each entry in the array corresponds to a
2114 reloc. When we find a reloc against a global symbol, we
2115 set the corresponding entry in this array so that we can
2116 fix up the symbol index after we have written out all the
2117 local symbols.
2118
2119 Because of this problem, we also keep the relocs in
2120 memory until the end of the link. This wastes memory,
2121 but only when doing a relocatable link, which is not the
2122 common case. */
2123 BFD_ASSERT (bfd_link_relocatable (info));
2124 amt = o->reloc_count;
2125 amt *= sizeof (struct internal_reloc);
2126 flaginfo.section_info[o->target_index].relocs =
2127 (struct internal_reloc *) bfd_malloc (amt);
2128 amt = o->reloc_count;
2129 amt *= sizeof (struct coff_link_hash_entry *);
2130 flaginfo.section_info[o->target_index].rel_hashes =
2131 (struct coff_link_hash_entry **) bfd_malloc (amt);
2132 if (flaginfo.section_info[o->target_index].relocs == NULL
2133 || flaginfo.section_info[o->target_index].rel_hashes == NULL)
2134 goto error_return;
2135
2136 if (o->reloc_count > max_output_reloc_count)
2137 max_output_reloc_count = o->reloc_count;
2138 }
2139
2140 /* Reset the reloc and lineno counts, so that we can use them to
2141 count the number of entries we have output so far. */
2142 o->reloc_count = 0;
2143 o->lineno_count = 0;
2144 }
2145
2146 obj_sym_filepos (abfd) = line_filepos;
2147
2148 /* Figure out the largest number of symbols in an input BFD. Take
2149 the opportunity to clear the output_has_begun fields of all the
2150 input BFD's. */
2151 max_sym_count = 0;
2152 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
2153 {
2154 bfd_size_type sz;
2155
2156 sub->output_has_begun = FALSE;
2157 sz = obj_raw_syment_count (sub);
2158 if (sz > max_sym_count)
2159 max_sym_count = sz;
2160 }
2161
2162 /* Allocate some buffers used while linking. */
2163 amt = max_sym_count * sizeof (struct internal_syment);
2164 flaginfo.internal_syms = (struct internal_syment *) bfd_malloc (amt);
2165 amt = max_sym_count * sizeof (asection *);
2166 flaginfo.sec_ptrs = (asection **) bfd_malloc (amt);
2167 amt = max_sym_count * sizeof (long);
2168 flaginfo.sym_indices = (long *) bfd_malloc (amt);
2169 amt = (max_sym_count + 1) * symesz;
2170 flaginfo.outsyms = (bfd_byte *) bfd_malloc (amt);
2171 amt = max_lineno_count * bfd_coff_linesz (abfd);
2172 flaginfo.linenos = (bfd_byte *) bfd_malloc (amt);
2173 flaginfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
2174 flaginfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz);
2175 if (! bfd_link_relocatable (info))
2176 {
2177 amt = max_reloc_count * sizeof (struct internal_reloc);
2178 flaginfo.internal_relocs = (struct internal_reloc *) bfd_malloc (amt);
2179 }
2180 if ((flaginfo.internal_syms == NULL && max_sym_count > 0)
2181 || (flaginfo.sec_ptrs == NULL && max_sym_count > 0)
2182 || (flaginfo.sym_indices == NULL && max_sym_count > 0)
2183 || flaginfo.outsyms == NULL
2184 || (flaginfo.linenos == NULL && max_lineno_count > 0)
2185 || (flaginfo.contents == NULL && max_contents_size > 0)
2186 || (flaginfo.external_relocs == NULL && max_reloc_count > 0)
2187 || (! bfd_link_relocatable (info)
2188 && flaginfo.internal_relocs == NULL
2189 && max_reloc_count > 0))
2190 goto error_return;
2191
2192 /* We now know the position of everything in the file, except that
2193 we don't know the size of the symbol table and therefore we don't
2194 know where the string table starts. We just build the string
2195 table in memory as we go along. We process all the relocations
2196 for a single input file at once. */
2197 obj_raw_syment_count (abfd) = 0;
2198
2199 if (coff_backend_info (abfd)->_bfd_coff_start_final_link)
2200 {
2201 if (! bfd_coff_start_final_link (abfd, info))
2202 goto error_return;
2203 }
2204
2205 for (o = abfd->sections; o != NULL; o = o->next)
2206 {
2207 for (p = o->map_head.link_order; p != NULL; p = p->next)
2208 {
2209 if (p->type == bfd_indirect_link_order
2210 && (bfd_get_flavour (p->u.indirect.section->owner)
2211 == bfd_target_coff_flavour))
2212 {
2213 sub = p->u.indirect.section->owner;
2214 #ifdef POWERPC_LE_PE
2215 if (! sub->output_has_begun && !ppc_do_last(sub))
2216 #else
2217 if (! sub->output_has_begun)
2218 #endif
2219 {
2220 if (! _bfd_coff_link_input_bfd (&flaginfo, sub))
2221 goto error_return;
2222 sub->output_has_begun = TRUE;
2223 }
2224 }
2225 else if (p->type == bfd_section_reloc_link_order
2226 || p->type == bfd_symbol_reloc_link_order)
2227 {
2228 if (! _bfd_coff_reloc_link_order (abfd, &flaginfo, o, p))
2229 goto error_return;
2230 }
2231 else
2232 {
2233 if (! _bfd_default_link_order (abfd, info, o, p))
2234 goto error_return;
2235 }
2236 }
2237 }
2238
2239 #ifdef POWERPC_LE_PE
2240 {
2241 bfd* last_one = ppc_get_last();
2242 if (last_one)
2243 {
2244 if (! _bfd_coff_link_input_bfd (&flaginfo, last_one))
2245 goto error_return;
2246 }
2247 last_one->output_has_begun = TRUE;
2248 }
2249 #endif
2250
2251 /* Free up the buffers used by _bfd_coff_link_input_bfd. */
2252 coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
2253 debug_merge_allocated = FALSE;
2254
2255 if (flaginfo.internal_syms != NULL)
2256 {
2257 free (flaginfo.internal_syms);
2258 flaginfo.internal_syms = NULL;
2259 }
2260 if (flaginfo.sec_ptrs != NULL)
2261 {
2262 free (flaginfo.sec_ptrs);
2263 flaginfo.sec_ptrs = NULL;
2264 }
2265 if (flaginfo.sym_indices != NULL)
2266 {
2267 free (flaginfo.sym_indices);
2268 flaginfo.sym_indices = NULL;
2269 }
2270 if (flaginfo.linenos != NULL)
2271 {
2272 free (flaginfo.linenos);
2273 flaginfo.linenos = NULL;
2274 }
2275 if (flaginfo.contents != NULL)
2276 {
2277 free (flaginfo.contents);
2278 flaginfo.contents = NULL;
2279 }
2280 if (flaginfo.external_relocs != NULL)
2281 {
2282 free (flaginfo.external_relocs);
2283 flaginfo.external_relocs = NULL;
2284 }
2285 if (flaginfo.internal_relocs != NULL)
2286 {
2287 free (flaginfo.internal_relocs);
2288 flaginfo.internal_relocs = NULL;
2289 }
2290
2291 /* The value of the last C_FILE symbol is supposed to be the symbol
2292 index of the first external symbol. Write it out again if
2293 necessary. */
2294 if (flaginfo.last_file_index != -1
2295 && (unsigned int) flaginfo.last_file.n_value != obj_raw_syment_count (abfd))
2296 {
2297 file_ptr pos;
2298
2299 flaginfo.last_file.n_value = obj_raw_syment_count (abfd);
2300 bfd_coff_swap_sym_out (abfd, &flaginfo.last_file,
2301 flaginfo.outsyms);
2302 pos = obj_sym_filepos (abfd) + flaginfo.last_file_index * symesz;
2303 if (bfd_seek (abfd, pos, SEEK_SET) != 0
2304 || bfd_bwrite (flaginfo.outsyms, symesz, abfd) != symesz)
2305 return FALSE;
2306 }
2307
2308 /* Write out the global symbols. */
2309 flaginfo.failed = FALSE;
2310 bfd_hash_traverse (&info->hash->table, _bfd_coff_write_global_sym, &flaginfo);
2311 if (flaginfo.failed)
2312 goto error_return;
2313
2314 /* The outsyms buffer is used by _bfd_coff_write_global_sym. */
2315 if (flaginfo.outsyms != NULL)
2316 {
2317 free (flaginfo.outsyms);
2318 flaginfo.outsyms = NULL;
2319 }
2320
2321 if (bfd_link_relocatable (info))
2322 {
2323 /* Now that we have written out all the global symbols, we know
2324 the symbol indices to use for relocs against them, and we can
2325 finally write out the relocs. */
2326 amt = max_output_reloc_count * relsz;
2327 external_relocs = (bfd_byte *) bfd_malloc (amt);
2328 if (external_relocs == NULL)
2329 goto error_return;
2330
2331 for (o = abfd->sections; o != NULL; o = o->next)
2332 {
2333 struct internal_reloc *irel;
2334 struct internal_reloc *irelend;
2335 struct coff_link_hash_entry **rel_hash;
2336 bfd_byte *erel;
2337
2338 if (o->reloc_count == 0)
2339 continue;
2340
2341 irel = flaginfo.section_info[o->target_index].relocs;
2342 irelend = irel + o->reloc_count;
2343 rel_hash = flaginfo.section_info[o->target_index].rel_hashes;
2344 erel = external_relocs;
2345 for (; irel < irelend; irel++, rel_hash++, erel += relsz)
2346 {
2347 if (*rel_hash != NULL)
2348 {
2349 BFD_ASSERT ((*rel_hash)->indx >= 0);
2350 irel->r_symndx = (*rel_hash)->indx;
2351 }
2352 bfd_coff_swap_reloc_out (abfd, irel, erel);
2353 }
2354
2355 amt = relsz * o->reloc_count;
2356 if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
2357 || bfd_bwrite (external_relocs, amt, abfd) != amt)
2358 goto error_return;
2359 }
2360
2361 free (external_relocs);
2362 external_relocs = NULL;
2363 }
2364
2365 /* Free up the section information. */
2366 if (flaginfo.section_info != NULL)
2367 {
2368 unsigned int i;
2369
2370 for (i = 0; i < abfd->section_count; i++)
2371 {
2372 if (flaginfo.section_info[i].relocs != NULL)
2373 free (flaginfo.section_info[i].relocs);
2374 if (flaginfo.section_info[i].rel_hashes != NULL)
2375 free (flaginfo.section_info[i].rel_hashes);
2376 }
2377 free (flaginfo.section_info);
2378 flaginfo.section_info = NULL;
2379 }
2380
2381 /* If we have optimized stabs strings, output them. */
2382 if (coff_hash_table (info)->stab_info.stabstr != NULL)
2383 {
2384 if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info))
2385 return FALSE;
2386 }
2387
2388 /* Write out the string table. */
2389 if (obj_raw_syment_count (abfd) != 0)
2390 {
2391 file_ptr pos;
2392
2393 pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz;
2394 if (bfd_seek (abfd, pos, SEEK_SET) != 0)
2395 return FALSE;
2396
2397 #if STRING_SIZE_SIZE == 4
2398 H_PUT_32 (abfd,
2399 _bfd_stringtab_size (flaginfo.strtab) + STRING_SIZE_SIZE,
2400 strbuf);
2401 #else
2402 #error Change H_PUT_32 above
2403 #endif
2404
2405 if (bfd_bwrite (strbuf, (bfd_size_type) STRING_SIZE_SIZE, abfd)
2406 != STRING_SIZE_SIZE)
2407 return FALSE;
2408
2409 if (! _bfd_stringtab_emit (abfd, flaginfo.strtab))
2410 return FALSE;
2411 }
2412
2413 _bfd_stringtab_free (flaginfo.strtab);
2414
2415 /* Setting bfd_get_symcount to 0 will cause write_object_contents to
2416 not try to write out the symbols. */
2417 bfd_get_symcount (abfd) = 0;
2418
2419 return TRUE;
2420
2421 error_return:
2422 if (debug_merge_allocated)
2423 coff_debug_merge_hash_table_free (&flaginfo.debug_merge);
2424 if (flaginfo.strtab != NULL)
2425 _bfd_stringtab_free (flaginfo.strtab);
2426 if (flaginfo.section_info != NULL)
2427 {
2428 unsigned int i;
2429
2430 for (i = 0; i < abfd->section_count; i++)
2431 {
2432 if (flaginfo.section_info[i].relocs != NULL)
2433 free (flaginfo.section_info[i].relocs);
2434 if (flaginfo.section_info[i].rel_hashes != NULL)
2435 free (flaginfo.section_info[i].rel_hashes);
2436 }
2437 free (flaginfo.section_info);
2438 }
2439 if (flaginfo.internal_syms != NULL)
2440 free (flaginfo.internal_syms);
2441 if (flaginfo.sec_ptrs != NULL)
2442 free (flaginfo.sec_ptrs);
2443 if (flaginfo.sym_indices != NULL)
2444 free (flaginfo.sym_indices);
2445 if (flaginfo.outsyms != NULL)
2446 free (flaginfo.outsyms);
2447 if (flaginfo.linenos != NULL)
2448 free (flaginfo.linenos);
2449 if (flaginfo.contents != NULL)
2450 free (flaginfo.contents);
2451 if (flaginfo.external_relocs != NULL)
2452 free (flaginfo.external_relocs);
2453 if (flaginfo.internal_relocs != NULL)
2454 free (flaginfo.internal_relocs);
2455 if (external_relocs != NULL)
2456 free (external_relocs);
2457 return FALSE;
2458 }
2459 #endif
2460 \f
2461 /* Forward declaration for use by alternative_target field. */
2462 #ifdef TARGET_BIG_SYM
2463 extern const bfd_target TARGET_BIG_SYM;
2464 #endif
2465
2466 /* The transfer vectors that lead the outside world to all of the above. */
2467
2468 #ifdef TARGET_LITTLE_SYM
2469 const bfd_target TARGET_LITTLE_SYM =
2470 {
2471 TARGET_LITTLE_NAME, /* name or coff-arm-little */
2472 bfd_target_coff_flavour,
2473 BFD_ENDIAN_LITTLE, /* data byte order is little */
2474 BFD_ENDIAN_LITTLE, /* header byte order is little */
2475
2476 (HAS_RELOC | EXEC_P | /* FIXME: object flags */
2477 HAS_LINENO | HAS_DEBUG |
2478 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
2479
2480 #ifndef COFF_WITH_PE
2481 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
2482 | SEC_RELOC), /* section flags */
2483 #else
2484 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
2485 | SEC_RELOC | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
2486 #endif
2487
2488 0, /* leading char */
2489 '/', /* ar_pad_char */
2490 15, /* ar_max_namelen??? FIXMEmgo */
2491 0, /* match priority. */
2492
2493 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2494 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2495 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
2496
2497 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2498 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2499 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
2500
2501 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
2502 bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p },
2503 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
2504 bfd_false},
2505 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
2506 _bfd_write_archive_contents, bfd_false},
2507
2508 BFD_JUMP_TABLE_GENERIC (coff),
2509 BFD_JUMP_TABLE_COPY (coff),
2510 BFD_JUMP_TABLE_CORE (_bfd_nocore),
2511 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
2512 BFD_JUMP_TABLE_SYMBOLS (coff),
2513 BFD_JUMP_TABLE_RELOCS (coff),
2514 BFD_JUMP_TABLE_WRITE (coff),
2515 BFD_JUMP_TABLE_LINK (coff),
2516 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
2517
2518 /* Alternative_target. */
2519 #ifdef TARGET_BIG_SYM
2520 & TARGET_BIG_SYM,
2521 #else
2522 NULL,
2523 #endif
2524
2525 COFF_SWAP_TABLE
2526 };
2527 #endif
2528
2529 #ifdef TARGET_BIG_SYM
2530 const bfd_target TARGET_BIG_SYM =
2531 {
2532 TARGET_BIG_NAME,
2533 bfd_target_coff_flavour,
2534 BFD_ENDIAN_BIG, /* data byte order is big */
2535 BFD_ENDIAN_BIG, /* header byte order is big */
2536
2537 (HAS_RELOC | EXEC_P | /* FIXME: object flags */
2538 HAS_LINENO | HAS_DEBUG |
2539 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
2540
2541 #ifndef COFF_WITH_PE
2542 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
2543 | SEC_RELOC), /* section flags */
2544 #else
2545 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
2546 | SEC_RELOC | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
2547 #endif
2548
2549 0, /* leading char */
2550 '/', /* ar_pad_char */
2551 15, /* ar_max_namelen??? FIXMEmgo */
2552 0, /* match priority. */
2553
2554 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
2555 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
2556 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
2557
2558 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
2559 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
2560 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
2561
2562 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
2563 bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p },
2564 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
2565 bfd_false},
2566 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
2567 _bfd_write_archive_contents, bfd_false},
2568
2569 BFD_JUMP_TABLE_GENERIC (coff),
2570 BFD_JUMP_TABLE_COPY (coff),
2571 BFD_JUMP_TABLE_CORE (_bfd_nocore),
2572 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
2573 BFD_JUMP_TABLE_SYMBOLS (coff),
2574 BFD_JUMP_TABLE_RELOCS (coff),
2575 BFD_JUMP_TABLE_WRITE (coff),
2576 BFD_JUMP_TABLE_LINK (coff),
2577 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
2578
2579 /* Alternative_target. */
2580 #ifdef TARGET_LITTLE_SYM
2581 & TARGET_LITTLE_SYM,
2582 #else
2583 NULL,
2584 #endif
2585
2586 COFF_SWAP_TABLE
2587 };
2588
2589 #endif
This page took 0.124253 seconds and 5 git commands to generate.