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