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