OSDN Git Service

Update copyright notices
[pf3gnuchains/pf3gnuchains3x.git] / bfd / coff-ppc.c
1 /* BFD back-end for PowerPC Microsoft Portable Executable files.
2    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001
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
9    coff files, in particular, those for the rs/6000, alpha, mips, and
10    intel backends, and the PE work for the arm.
11
12 This file is part of BFD, the Binary File Descriptor library.
13
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
16 the Free Software Foundation; either version 2 of the License, or
17 (at your option) any later version.
18
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.
23
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
26 Foundation, 59 Temple Place - Suite 330,
27 Boston, 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.
33    - dlltool will not produce correct output in some .reloc cases, and will
34      not produce the right glue code for dll function calls.
35 */
36
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.  */
57 extern boolean ppc_bfd_coff_final_link
58   PARAMS ((bfd *, struct bfd_link_info *));
59 extern 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
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   { \
89     fprintf (stderr,\
90     _("File %s, line %d, Hash check failure, bad eye %8s\n"), \
91     __FILE__, __LINE__, addr->eye_catcher); \
92     abort (); \
93  }
94
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
106 /* PE linker hash table entries.  */
107
108 struct 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
121 /* PE linker hash table.  */
122
123 struct ppc_coff_link_hash_table
124 {
125   struct coff_link_hash_table root; /* First entry, as required */
126 };
127
128 static struct bfd_hash_entry *ppc_coff_link_hash_newfunc
129   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *,
130            const char *));
131 static 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 *)));
136 static struct bfd_link_hash_table *ppc_coff_link_hash_table_create
137   PARAMS ((bfd *));
138 static boolean coff_ppc_relocate_section
139   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
140            struct internal_reloc *, struct internal_syment *, asection **));
141 static 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
148 static struct bfd_hash_entry *
149 ppc_coff_link_hash_newfunc (entry, table, string)
150      struct bfd_hash_entry *entry;
151      struct bfd_hash_table *table;
152      const char *string;
153 {
154   struct ppc_coff_link_hash_entry *ret =
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 *)
161       bfd_hash_allocate (table,
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 *)
169          _bfd_coff_link_hash_newfunc ((struct bfd_hash_entry *) ret,
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
187 static boolean
188 ppc_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
200 static struct bfd_link_hash_table *
201 ppc_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
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
237 /* these should definitely go in a header file somewhere...  */
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))
319 \f
320 /* static helper functions to make relocation work */
321 /* (Work In Progress) */
322
323 static 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
331 static 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
339 static 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));
346 \f
347 static 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
356 static 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
364 static 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
372 static 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
380 static 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
388 static boolean in_reloc_p PARAMS((bfd *abfd, reloc_howto_type *howto));
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.                                                   */
412 /*   TOCREL14       : 16 bit displacement field, similar to REL14 or ADDR14.  */
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
428 static reloc_howto_type ppc_coff_howto_table[] =
429 {
430   /* IMAGE_REL_PPC_ABSOLUTE 0x0000   NOP */
431   /* Unused: */
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 */
438          complain_overflow_dont, /* dont complain_on_overflow */
439          0,                      /* special_function */
440          "ABSOLUTE",             /* name */
441          false,                  /* partial_inplace */
442          0x00,                   /* src_mask */
443          0x00,                   /* dst_mask */
444          false),                 /* pcrel_offset */
445
446   /* IMAGE_REL_PPC_ADDR64 0x0001  64-bit address */
447   /* Unused: */
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 */
454         complain_overflow_bitfield,      /* complain_on_overflow */
455         0,                       /* special_function */
456         "ADDR64",               /* name */
457         true,                    /* partial_inplace */
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 */
465          0,                     /* rightshift */
466          2,                     /* size (0 = byte, 1 = short, 2 = long) */
467          32,                    /* bitsize */
468          false,                 /* pc_relative */
469          0,                     /* bitpos */
470          complain_overflow_bitfield, /* complain_on_overflow */
471          0,                     /* special_function */
472          "ADDR32",              /* name */
473          true,                  /* partial_inplace */
474          0xffffffff,            /* src_mask */
475          0xffffffff,            /* dst_mask */
476          false),                /* pcrel_offset */
477
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 */
481   /* anyone else uses.... The li field is in bit 2 thru 25 */
482   /* Used: */
483   HOWTO (IMAGE_REL_PPC_ADDR24,  /* type */
484          0,                     /* rightshift */
485          2,                     /* size (0 = byte, 1 = short, 2 = long) */
486          26,                    /* bitsize */
487          false,                 /* pc_relative */
488          0,                     /* bitpos */
489          complain_overflow_bitfield, /* complain_on_overflow */
490          0,                     /* special_function */
491          "ADDR24",              /* name */
492          true,                  /* partial_inplace */
493          0x07fffffc,            /* src_mask */
494          0x07fffffc,            /* dst_mask */
495          false),                /* pcrel_offset */
496
497   /* IMAGE_REL_PPC_ADDR16 0x0004  16-bit address */
498   /* Used: */
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 */
505          complain_overflow_signed, /* complain_on_overflow */
506          0,                     /* special_function */
507          "ADDR16",              /* name */
508          true,                  /* partial_inplace */
509          0xffff,                /* src_mask */
510          0xffff,                /* dst_mask */
511          false),                /* pcrel_offset */
512
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: */
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 */
523          complain_overflow_signed, /* complain_on_overflow */
524          0,                     /* special_function */
525          "ADDR16",              /* name */
526          true,                  /* partial_inplace */
527          0xffff,                /* src_mask */
528          0xffff,                /* dst_mask */
529          false),                /* pcrel_offset */
530
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 */
535          0,                     /* rightshift */
536          2,                     /* size (0 = byte, 1 = short, 2 = long) */
537          26,                    /* bitsize */
538          true,                  /* pc_relative */
539          0,                     /* bitpos */
540          complain_overflow_signed, /* complain_on_overflow */
541          0,                     /* special_function */
542          "REL24",               /* name */
543          true,                  /* partial_inplace */
544          0x3fffffc,             /* src_mask */
545          0x3fffffc,             /* dst_mask */
546          false),                /* pcrel_offset */
547
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: */
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 */
559          complain_overflow_signed, /* complain_on_overflow */
560          0,                     /* special_function */
561          "ADDR16",              /* name */
562          true,                  /* partial_inplace */
563          0xffff,                /* src_mask */
564          0xffff,                /* dst_mask */
565          true),                 /* pcrel_offset */
566
567   /* IMAGE_REL_PPC_TOCREL16 0x0008 */
568   /*   16-bit offset from TOC base */
569   /* Used: */
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 */
576          complain_overflow_dont, /* complain_on_overflow */
577          ppc_toc16_reloc,       /* special_function */
578          "TOCREL16",            /* name */
579          false,                 /* partial_inplace */
580          0xffff,                /* src_mask */
581          0xffff,                /* dst_mask */
582          false),                /* pcrel_offset */
583
584   /* IMAGE_REL_PPC_TOCREL14 0x0009 */
585   /*   16-bit offset from TOC base, shifted left 2 (load doubleword) */
586   /* Unused: */
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 */
593          complain_overflow_signed, /* complain_on_overflow */
594          0,                     /* special_function */
595          "TOCREL14",            /* name */
596          false,                 /* partial_inplace */
597          0xffff,                /* src_mask */
598          0xffff,                /* dst_mask */
599          false),                /* pcrel_offset */
600
601   /* IMAGE_REL_PPC_ADDR32NB 0x000A */
602   /*   32-bit addr w/ image base */
603   /* Unused: */
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 */
610          complain_overflow_signed, /* complain_on_overflow */
611          0,                     /* special_function */
612          "ADDR32NB",            /* name */
613          true,                  /* partial_inplace */
614          0xffffffff,            /* src_mask */
615          0xffffffff,            /* dst_mask */
616          false),                 /* pcrel_offset */
617
618   /* IMAGE_REL_PPC_SECREL 0x000B */
619   /*   va of containing section (as in an image sectionhdr) */
620   /* Unused: */
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 */
627          complain_overflow_signed, /* complain_on_overflow */
628          ppc_secrel_reloc,      /* special_function */
629          "SECREL",              /* name */
630          true,                  /* partial_inplace */
631          0xffffffff,            /* src_mask */
632          0xffffffff,            /* dst_mask */
633          true),                 /* pcrel_offset */
634
635   /* IMAGE_REL_PPC_SECTION 0x000C */
636   /*   sectionheader number */
637   /* Unused: */
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 */
644          complain_overflow_signed, /* complain_on_overflow */
645          ppc_section_reloc,     /* special_function */
646          "SECTION",             /* name */
647          true,                  /* partial_inplace */
648          0xffffffff,            /* src_mask */
649          0xffffffff,            /* dst_mask */
650          true),                 /* pcrel_offset */
651
652   /* IMAGE_REL_PPC_IFGLUE 0x000D */
653   /*   substitute TOC restore instruction iff symbol is glue code */
654   /* Used: */
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 */
661          complain_overflow_signed, /* complain_on_overflow */
662          0,                     /* special_function */
663          "IFGLUE",              /* name */
664          true,                  /* partial_inplace */
665          0xffffffff,            /* src_mask */
666          0xffffffff,            /* dst_mask */
667          false),                /* pcrel_offset */
668
669   /* IMAGE_REL_PPC_IMGLUE 0x000E */
670   /*   symbol is glue code; virtual address is TOC restore instruction */
671   /* Unused: */
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 */
678          complain_overflow_dont, /* complain_on_overflow */
679          ppc_imglue_reloc,      /* special_function */
680          "IMGLUE",              /* name */
681          false,                 /* partial_inplace */
682          0xffffffff,            /* src_mask */
683          0xffffffff,            /* dst_mask */
684          false),                 /* pcrel_offset */
685
686   /* IMAGE_REL_PPC_SECREL16 0x000F */
687   /*   va of containing section (limited to 16 bits) */
688   /* Unused: */
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 */
695          complain_overflow_signed, /* complain_on_overflow */
696          0,                     /* special_function */
697          "SECREL16",            /* name */
698          true,                  /* partial_inplace */
699          0xffff,                /* src_mask */
700          0xffff,                /* dst_mask */
701          true),                 /* pcrel_offset */
702
703   /* IMAGE_REL_PPC_REFHI             0x0010 */
704   /* Unused: */
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 */
711          complain_overflow_signed, /* complain_on_overflow */
712          ppc_refhi_reloc,       /* special_function */
713          "REFHI",               /* name */
714          true,                  /* partial_inplace */
715          0xffffffff,            /* src_mask */
716          0xffffffff,            /* dst_mask */
717          false),                 /* pcrel_offset */
718
719   /* IMAGE_REL_PPC_REFLO             0x0011 */
720   /* Unused: */
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 */
727          complain_overflow_signed, /* complain_on_overflow */
728          ppc_refhi_reloc,       /* special_function */
729          "REFLO",               /* name */
730          true,                  /* partial_inplace */
731          0xffffffff,            /* src_mask */
732          0xffffffff,            /* dst_mask */
733          false),                /* pcrel_offset */
734
735   /* IMAGE_REL_PPC_PAIR              0x0012 */
736   /* Unused: */
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 */
743          complain_overflow_signed, /* complain_on_overflow */
744          ppc_pair_reloc,        /* special_function */
745          "PAIR",                /* name */
746          true,                  /* partial_inplace */
747          0xffffffff,            /* src_mask */
748          0xffffffff,            /* dst_mask */
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: */
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 */
760          complain_overflow_dont, /* complain_on_overflow */
761          0,                     /* special_function */
762          "TOCREL16, TOCDEFN",   /* name */
763          false,                 /* partial_inplace */
764          0xffff,                /* src_mask */
765          0xffff,                /* dst_mask */
766          false),                /* pcrel_offset */
767
768 };
769 \f
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;                                                \
779        fprintf (stderr,_("Unimplemented Relocation -- %s\n"),x); \
780      }                                                       \
781 }
782
783 #define DUMP_RELOC(n,r)                              \
784 {                                                    \
785    fprintf (stderr,"%s sym %d, addr %d, addend %d\n", \
786            n, (*(r->sym_ptr_ptr))->name,             \
787            r->address, r->addend);                   \
788 }
789
790 /* Given a reloc name, n, and a pointer to an internal_reloc,
791    dump out interesting information on the contents
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 {                                            \
801    fprintf (stderr,"%s sym %d, r_vaddr %d %s\n", \
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
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.  */
818 extern bfd* bfd_of_toc_owner;
819 extern long int global_toc_size;
820
821 extern long int import_table_size;
822 extern long int first_thunk_address;
823 extern long int thunk_size;
824
825 enum toc_type
826 {
827   default_toc,
828   toc_32,
829   toc_64
830 };
831
832 enum ref_category
833 {
834   priv,
835   pub,
836   data
837 };
838
839 struct 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
848 extern struct list_ele *head;
849 extern struct list_ele *tail;
850
851 static void record_toc
852   PARAMS ((asection *, int, enum ref_category, const char *));
853
854 static void
855 record_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
886 static boolean ppc_record_toc_entry
887   PARAMS ((bfd *, struct bfd_link_info *, asection *, int, enum toc_type));
888 static void ppc_mark_symbol_as_glue
889   PARAMS ((bfd *, int, struct internal_reloc *));
890
891 /* record a toc offset against a symbol */
892 static boolean
893 ppc_record_toc_entry(abfd, info, sec, sym, toc_kind)
894      bfd *abfd;
895      struct bfd_link_info *info ATTRIBUTE_UNUSED;
896      asection *sec ATTRIBUTE_UNUSED;
897      int sym;
898      enum toc_type toc_kind ATTRIBUTE_UNUSED;
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
913   if (h == 0)
914     {
915       local_syms = obj_coff_local_toc_table(abfd);
916       if (local_syms == 0)
917         {
918           unsigned int i;
919           /* allocate a table */
920           local_syms =
921             (int *) bfd_zalloc (abfd,
922                                 obj_raw_syment_count(abfd) * sizeof (int));
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
932       if (IS_UNALLOCATED(local_syms[sym]))
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 */
971 static void
972 ppc_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
991 /* Return true if this relocation should
992    appear in the output .reloc section.  */
993
994 static boolean in_reloc_p(abfd, howto)
995      bfd * abfd ATTRIBUTE_UNUSED;
996      reloc_howto_type *howto;
997 {
998   return
999     (! howto->pc_relative)
1000       && (howto->type != IMAGE_REL_PPC_ADDR32NB)
1001       && (howto->type != IMAGE_REL_PPC_TOCREL16)
1002       && (howto->type != IMAGE_REL_PPC_IMGLUE)
1003       && (howto->type != IMAGE_REL_PPC_IFGLUE)
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) ;
1011 }
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
1019 static bfd_reloc_status_type
1020 pe_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*/
1038
1039   r_type = reloc_entry->howto->type;
1040
1041   if (output_bfd)
1042     {
1043       /* Partial linking - do nothing */
1044       reloc_entry->address += input_section->output_offset;
1045       return bfd_reloc_ok;
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 */
1052       if (r_type == IMAGE_REL_PPC_REFHI)
1053         {
1054           part1_consth_active = true;
1055           part1_consth_value  = 0;
1056         }
1057       return(bfd_reloc_undefined);
1058     }
1059
1060   if ((part1_consth_active) && (r_type != IMAGE_REL_PPC_PAIR))
1061     {
1062       part1_consth_active = false;
1063       *error_message = (char *) _("Missing PAIR");
1064       return(bfd_reloc_dangerous);
1065     }
1066
1067   sym_value = get_symbol_value(symbol_in);
1068
1069   return(bfd_reloc_ok);
1070 }
1071
1072 #endif /* 0 */
1073
1074 /* The reloc processing routine for the optimized COFF linker.  */
1075
1076 static boolean
1077 coff_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;
1095
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;
1101
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);
1120
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         {
1134           h = (struct ppc_coff_link_hash_entry *)
1135             (obj_coff_sym_hashes (input_bfd)[symndx]);
1136           if (h != 0)
1137             {
1138               HASH_CHECK(h);
1139             }
1140
1141           sym = syms + symndx;
1142         }
1143
1144       if (r_type == IMAGE_REL_PPC_IMGLUE && h == 0)
1145         {
1146           /* An IMGLUE reloc must have a name. Something is very wrong.  */
1147           abort ();
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,
1184                       rel->r_vaddr - input_section->vma, true)))
1185                 return false;
1186             }
1187         }
1188
1189       rstat = bfd_reloc_ok;
1190
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
1207             if (toc_section == 0)
1208               {
1209                 toc_section = bfd_get_section_by_name (bfd_of_toc_owner,
1210                                                        TOC_SECTION_NAME);
1211
1212                 if ( toc_section == NULL )
1213                   {
1214                     /* There is no toc section. Something is very wrong.  */
1215                     abort ();
1216                   }
1217               }
1218
1219             /*
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                   {
1240                     /* if it has been written out, it is marked with the
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 */
1249                     record_toc(toc_section,
1250                                our_toc_offset,
1251                                priv,
1252                                strdup(name));
1253
1254                     bfd_put_32 (output_bfd,
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
1267                 if ((r_flags & IMAGE_REL_PPC_TOCDEFN)
1268                     == IMAGE_REL_PPC_TOCDEFN )
1269                   {
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.
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
1281                        dll linkage, takes advantage of that and considers
1282                        the IAT to be part of the toc, thus saving a load.
1283                     */
1284
1285                     our_toc_offset = val -
1286                       (toc_section->output_section->vma +
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)
1293                           (_("%s: Relocation for %s of %x exceeds Toc size limit"),
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                   {
1303                     /* if it has been written out, it is marked with the
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 */
1314                     bfd_put_32 (output_bfd,
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
1325             if (fixit && info->base_file)
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
1331                    isn't absolute - we output the address here
1332                    to a file */
1333
1334                 bfd_vma addr =  toc_section->output_section->vma
1335                   + toc_section->output_offset + our_toc_offset;
1336
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
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)
1348                   (_("%s: Relocation exceeds allocated TOC (%x)"),
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,
1358                                             input_bfd,
1359                                             relocation,
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 */
1366             /* appearing on the call instruction is a glue function or not.  */
1367             /* A glue function must announce itself via a IMGLUE reloc, and */
1368             /* the reloc contains the required toc restore instruction */
1369
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;
1377                 if (h->symbol_is_glue == 1)
1378                   {
1379                     x = bfd_get_32 (input_bfd, loc);
1380                     bfd_put_32 (input_bfd, h->glue_insn, loc);
1381                   }
1382               }
1383           }
1384           break;
1385         case IMAGE_REL_PPC_SECREL:
1386           /* Unimplemented: codeview debugging information */
1387           /* For fast access to the header of the section
1388              containing the item.  */
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
1406             fprintf (stderr,
1407                     _("Warning: unsupported reloc %s <file %s, section %s>\n"),
1408                     howto->name,
1409                     bfd_get_filename(input_bfd),
1410                     input_section->name);
1411
1412             fprintf (stderr,"sym %ld (%s), r_vaddr %ld (%lx)\n",
1413                     rel->r_symndx, my_name, (long) rel->r_vaddr,
1414                     (unsigned long) rel->r_vaddr);
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;
1422             if (h->symbol_is_glue == 1)
1423               break;
1424             my_name = h->root.root.root.string;
1425
1426             (*_bfd_error_handler)
1427               (_("%s: Out of order IMGLUE reloc for %s"),
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);
1447                 first_thunk_address = myh->root.u.def.value +
1448                   sec->output_section->vma +
1449                     sec->output_offset -
1450                       pe_data(output_bfd)->pe_opthdr.ImageBase;
1451
1452                 idata5offset = myh->root.u.def.value;
1453                 myh = coff_link_hash_lookup (coff_hash_table (info),
1454                                              "__idata6_magic__",
1455                                              false, false, true);
1456
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);
1488                     if (myh == 0)
1489                       {
1490                         /* Missing magic cookies. Something is very wrong.  */
1491                         abort ();
1492                       }
1493
1494                     val = myh->root.u.def.value +
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);
1502                         first_thunk_address = myh->root.u.def.value +
1503                           sec->output_section->vma +
1504                             sec->output_offset -
1505                               pe_data(output_bfd)->pe_opthdr.ImageBase;
1506
1507                         idata5offset = myh->root.u.def.value;
1508                         myh = coff_link_hash_lookup (coff_hash_table (info),
1509                                                      "__idata6_magic__",
1510                                                      false, false, true);
1511
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,
1522                               input_bfd,
1523                               val -
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,
1535                                           input_bfd,
1536                                           val,
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,
1544                                           input_bfd,
1545                                           val,
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
1557                  isn't absolute - we output the address here
1558                  to a file */
1559               bfd_vma addr = rel->r_vaddr
1560                 - input_section->vma
1561                 + input_section->output_offset
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)
1600                    (info, name, howto->name,
1601                     (bfd_vma) 0, input_bfd,
1602                     input_section, rel->r_vaddr - input_section->vma)))
1603               {
1604                 return false;
1605               }
1606           }
1607         }
1608
1609     }
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
1620 long int global_toc_size = 4;
1621
1622 bfd* bfd_of_toc_owner = 0;
1623
1624 long int import_table_size;
1625 long int first_thunk_address;
1626 long int thunk_size;
1627
1628 struct list_ele *head;
1629 struct list_ele *tail;
1630
1631 static char *
1632 h1 = N_("\n\t\t\tTOC MAPPING\n\n");
1633 static char *
1634 h2 = N_(" TOC    disassembly  Comments       Name\n");
1635 static char *
1636 h3 = N_(" Offset  spelling                   (if present)\n");
1637
1638 void
1639 dump_toc (vfile)
1640      PTR vfile;
1641 {
1642   FILE *file = (FILE *) vfile;
1643   struct list_ele *t;
1644
1645   fprintf (file, _(h1));
1646   fprintf (file, _(h2));
1647   fprintf (file, _(h3));
1648
1649   for (t = head; t != 0; t=t->next)
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             {
1666               fprintf (file,
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
1673       fprintf (file,
1674               " %04lx    (%d)", (unsigned long) t->offset, t->offset - 32768);
1675       fprintf (file,
1676               "    %s %s\n",
1677               cat, t->name);
1678
1679     }
1680
1681   fprintf (file, "\n");
1682 }
1683
1684 boolean
1685 ppc_allocate_toc_section (info)
1686      struct bfd_link_info *info ATTRIBUTE_UNUSED;
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     {
1697       /* No toc owner? Something is very wrong.  */
1698       abort ();
1699     }
1700
1701   s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME);
1702   if (s == NULL)
1703     {
1704       /* No toc section? Something is very wrong.  */
1705       abort ();
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
1717 boolean
1718 ppc_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
1726      to do reloc rummaging, before section sizes are nailed down.  */
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   {
1740     if (sec->reloc_count == 0)
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);
1746
1747     if (i == 0)
1748       abort ();
1749
1750     for (rel=i;rel<i+sec->reloc_count;++rel)
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
1758         switch(r_type)
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 )
1764               ok = ppc_record_toc_entry(abfd, info, sec,
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
1783 static bfd_reloc_status_type
1784 ppc_refhi_reloc (abfd,
1785                  reloc_entry,
1786                  symbol,
1787                  data,
1788                  input_section,
1789                  output_bfd,
1790                  error_message)
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;
1796      bfd *output_bfd;
1797      char **error_message ATTRIBUTE_UNUSED;
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
1810 static bfd_reloc_status_type
1811 ppc_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
1837 static bfd_reloc_status_type
1838 ppc_pair_reloc (abfd,
1839                 reloc_entry,
1840                 symbol,
1841                 data,
1842                 input_section,
1843                 output_bfd,
1844                 error_message)
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;
1850      bfd *output_bfd;
1851      char **error_message ATTRIBUTE_UNUSED;
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 }
1861 \f
1862 static bfd_reloc_status_type
1863 ppc_toc16_reloc (abfd,
1864                  reloc_entry,
1865                  symbol,
1866                  data,
1867                  input_section,
1868                  output_bfd,
1869                  error_message)
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;
1875      bfd *output_bfd;
1876      char **error_message ATTRIBUTE_UNUSED;
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
1897 static bfd_reloc_status_type
1898 ppc_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
1921 static bfd_reloc_status_type
1922 ppc_secrel_reloc (abfd,
1923                   reloc_entry,
1924                   symbol,
1925                   data,
1926                   input_section,
1927                   output_bfd,
1928                   error_message)
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;
1934      bfd *output_bfd;
1935      char **error_message ATTRIBUTE_UNUSED;
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
1946 static bfd_reloc_status_type
1947 ppc_section_reloc (abfd,
1948                    reloc_entry,
1949                    symbol,
1950                    data,
1951                    input_section,
1952                    output_bfd,
1953                    error_message)
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;
1959      bfd *output_bfd;
1960      char **error_message ATTRIBUTE_UNUSED;
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
1971 static bfd_reloc_status_type
1972 ppc_imglue_reloc (abfd,
1973                   reloc_entry,
1974                   symbol,
1975                   data,
1976                   input_section,
1977                   output_bfd,
1978                   error_message)
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;
1984      bfd *output_bfd;
1985      char **error_message ATTRIBUTE_UNUSED;
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 }
1995 \f
1996 #define MAX_RELOC_INDEX  \
1997       (sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]) - 1)
1998
1999 /* FIXME: There is a possiblity that when we read in a reloc from a file,
2000           that there are some bits encoded in the upper portion of the
2001           type field. Not yet implemented.
2002 */
2003 static void ppc_coff_rtype2howto PARAMS ((arelent *relent,
2004                                           struct internal_reloc *internal));
2005
2006 static void
2007 ppc_coff_rtype2howto (relent, internal)
2008      arelent *relent;
2009      struct internal_reloc *internal;
2010 {
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
2027   /* the masking process only slices off the bottom byte for r_type.  */
2028   if ( r_type > MAX_RELOC_INDEX )
2029     abort ();
2030
2031   /* check for absolute crap */
2032   if ( junk != 0 )
2033     abort ();
2034
2035   switch(r_type)
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:
2060       fprintf (stderr,
2061               _("Warning: Unsupported reloc %s [%d] used -- it may not work.\n"),
2062               ppc_coff_howto_table[r_type].name,
2063               r_type);
2064       howto = ppc_coff_howto_table + r_type;
2065       break;
2066     }
2067
2068   relent->howto = howto;
2069
2070 }
2071
2072 static reloc_howto_type *
2073 coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
2074      bfd *abfd ATTRIBUTE_UNUSED;
2075      asection *sec;
2076      struct internal_reloc *rel;
2077      struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
2078      struct internal_syment *sym ATTRIBUTE_UNUSED;
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
2098   /* the masking process only slices off the bottom byte for r_type.  */
2099   if ( r_type > MAX_RELOC_INDEX )
2100     abort ();
2101
2102   /* check for absolute crap */
2103   if ( junk != 0 )
2104     abort ();
2105
2106   switch(r_type)
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:
2135       fprintf (stderr,
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     }
2142
2143   return howto;
2144 }
2145
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
2150 static reloc_howto_type *ppc_coff_reloc_type_lookup
2151 PARAMS ((bfd *, bfd_reloc_code_real_type));
2152
2153 static reloc_howto_type *
2154 ppc_coff_reloc_type_lookup (abfd, code)
2155      bfd *abfd ATTRIBUTE_UNUSED;
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);
2169     default:
2170       return NULL;
2171     }
2172   /*NOTREACHED*/
2173 }
2174
2175 #undef HOW2MAP
2176 \f
2177 /* Tailor coffcode.h -- macro heaven.  */
2178
2179 #define RTYPE2HOWTO(cache_ptr, dst)  ppc_coff_rtype2howto (cache_ptr, dst)
2180
2181 #ifndef COFF_IMAGE_WITH_PE
2182 static 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
2190 #define coff_bfd_final_link          ppc_bfd_coff_final_link
2191
2192 #ifndef COFF_IMAGE_WITH_PE
2193 /* FIXME: This no longer works.  */
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
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.  */
2204 #define POWERPC_LE_PE
2205
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
2220 #include "coffcode.h"
2221 \f
2222 #ifndef COFF_IMAGE_WITH_PE
2223 /* FIXME:
2224    What we're trying to do here is allocate a toc section (early), and attach
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
2237 static void
2238 ppc_coff_swap_sym_in_hook (abfd, ext1, in1)
2239      bfd            *abfd;
2240      PTR ext1 ATTRIBUTE_UNUSED;
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);
2254       if (s != NULL)
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 */
2268           abort ();
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
2281 static boolean ppc_do_last PARAMS ((bfd *));
2282 static bfd *ppc_get_last PARAMS ((void));
2283
2284 static boolean
2285 ppc_do_last (abfd)
2286      bfd *abfd;
2287 {
2288   if (abfd == bfd_of_toc_owner)
2289     return true;
2290   else
2291     return false;
2292 }
2293
2294 static bfd *
2295 ppc_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
2301    the toc section is written last.
2302
2303    This does depend on bfd_make_section attaching a new section to the
2304    end of the section list for the bfd.
2305
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
2309    precise form of comment. krk@cygnus.com
2310 */
2311
2312 /* Do the final link step.  */
2313
2314 boolean
2315 ppc_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
2816 /* Forward declaration for use by alternative_target field.  */
2817 #ifdef TARGET_BIG_SYM
2818 extern const bfd_target TARGET_BIG_SYM;
2819 #endif
2820
2821 /* The transfer vectors that lead the outside world to all of the above.  */
2822
2823 #ifdef TARGET_LITTLE_SYM
2824 const bfd_target TARGET_LITTLE_SYM =
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),
2834
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 */
2853
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},
2860
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),
2870
2871   /* Alternative_target.  */
2872 #ifdef TARGET_BIG_SYM
2873   & TARGET_BIG_SYM,
2874 #else
2875   NULL,
2876 #endif
2877
2878   COFF_SWAP_TABLE
2879 };
2880 #endif
2881
2882 #ifdef TARGET_BIG_SYM
2883 const bfd_target TARGET_BIG_SYM =
2884 {
2885   TARGET_BIG_NAME,
2886   bfd_target_coff_flavour,
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
2930   /* Alternative_target.  */
2931 #ifdef TARGET_LITTLE_SYM
2932   & TARGET_LITTLE_SYM,
2933 #else
2934   NULL,
2935 #endif
2936
2937   COFF_SWAP_TABLE
2938 };
2939
2940 #endif