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