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