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