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, 2008, 2009, 2010, 2011
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 3 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  int *local_syms;
871
872  h = 0;
873
874  h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
875  if (h != 0)
876    {
877      HASH_CHECK(h);
878    }
879
880  if (h == 0)
881    {
882      local_syms = obj_coff_local_toc_table(abfd);
883
884      if (local_syms == 0)
885	{
886	  unsigned int i;
887	  bfd_size_type amt;
888
889	  /* allocate a table */
890	  amt = (bfd_size_type) obj_raw_syment_count (abfd) * sizeof (int);
891	  local_syms = (int *) bfd_zalloc (abfd, amt);
892	  if (local_syms == 0)
893	    return FALSE;
894	  obj_coff_local_toc_table (abfd) = local_syms;
895
896	  for (i = 0; i < obj_raw_syment_count (abfd); ++i)
897	    {
898	      SET_UNALLOCATED (local_syms[i]);
899	    }
900	}
901
902      if (IS_UNALLOCATED(local_syms[sym]))
903	{
904	  local_syms[sym] = global_toc_size;
905	  global_toc_size += 4;
906
907	  /* The size must fit in a 16-bit displacement.  */
908	  if (global_toc_size > 65535)
909	    {
910	      (*_bfd_error_handler) (_("TOC overflow"));
911	      bfd_set_error (bfd_error_file_too_big);
912	      return FALSE;
913	    }
914	}
915    }
916  else
917    {
918      /* Check to see if there's a toc slot allocated. If not, do it
919	 here. It will be used in relocate_section.  */
920      if (IS_UNALLOCATED(h->toc_offset))
921	{
922	  h->toc_offset = global_toc_size;
923	  global_toc_size += 4;
924
925	  /* The size must fit in a 16-bit displacement.  */
926	  if (global_toc_size >= 65535)
927	    {
928	      (*_bfd_error_handler) (_("TOC overflow"));
929	      bfd_set_error (bfd_error_file_too_big);
930	      return FALSE;
931	    }
932	}
933    }
934
935  return TRUE;
936}
937
938/* Record a toc offset against a symbol.  */
939static void
940ppc_mark_symbol_as_glue(abfd, sym, rel)
941     bfd *abfd;
942     int sym;
943     struct internal_reloc *rel;
944{
945  struct ppc_coff_link_hash_entry *h;
946
947  h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]);
948
949  HASH_CHECK(h);
950
951  h->symbol_is_glue = 1;
952  h->glue_insn = bfd_get_32 (abfd, (bfd_byte *) &rel->r_vaddr);
953
954  return;
955}
956
957#endif /* COFF_IMAGE_WITH_PE */
958
959/* Return TRUE if this relocation should
960   appear in the output .reloc section.  */
961
962static bfd_boolean in_reloc_p(abfd, howto)
963     bfd * abfd ATTRIBUTE_UNUSED;
964     reloc_howto_type *howto;
965{
966  return
967    (! howto->pc_relative)
968      && (howto->type != IMAGE_REL_PPC_ADDR32NB)
969      && (howto->type != IMAGE_REL_PPC_TOCREL16)
970      && (howto->type != IMAGE_REL_PPC_IMGLUE)
971      && (howto->type != IMAGE_REL_PPC_IFGLUE)
972      && (howto->type != IMAGE_REL_PPC_SECREL)
973      && (howto->type != IMAGE_REL_PPC_SECTION)
974      && (howto->type != IMAGE_REL_PPC_SECREL16)
975      && (howto->type != IMAGE_REL_PPC_REFHI)
976      && (howto->type != IMAGE_REL_PPC_REFLO)
977      && (howto->type != IMAGE_REL_PPC_PAIR)
978      && (howto->type != IMAGE_REL_PPC_TOCREL16_DEFN) ;
979}
980
981static bfd_boolean
982write_base_file_entry (bfd *obfd, struct bfd_link_info *info, bfd_vma addr)
983{
984  if (coff_data (obfd)->pe)
985     addr -= pe_data (obfd)->pe_opthdr.ImageBase;
986  if (fwrite (&addr, sizeof (addr), 1, (FILE *) info->base_file) == 1)
987    return TRUE;
988
989  bfd_set_error (bfd_error_system_call);
990  return FALSE;
991}
992
993/* The reloc processing routine for the optimized COFF linker.  */
994
995static bfd_boolean
996coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section,
997			   contents, relocs, syms, sections)
998     bfd *output_bfd;
999     struct bfd_link_info *info;
1000     bfd *input_bfd;
1001     asection *input_section;
1002     bfd_byte *contents;
1003     struct internal_reloc *relocs;
1004     struct internal_syment *syms;
1005     asection **sections;
1006{
1007  struct internal_reloc *rel;
1008  struct internal_reloc *relend;
1009  asection *toc_section = 0;
1010  bfd_vma relocation;
1011  reloc_howto_type *howto = 0;
1012
1013  /* If we are performing a relocatable link, we don't need to do a
1014     thing.  The caller will take care of adjusting the reloc
1015     addresses and symbol indices.  */
1016  if (info->relocatable)
1017    return TRUE;
1018
1019  rel = relocs;
1020  relend = rel + input_section->reloc_count;
1021  for (; rel < relend; rel++)
1022    {
1023      long symndx;
1024      struct ppc_coff_link_hash_entry *h;
1025      struct internal_syment *sym;
1026      bfd_vma val;
1027
1028      asection *sec;
1029      bfd_reloc_status_type rstat;
1030      bfd_byte *loc;
1031
1032      unsigned short r_type  = EXTRACT_TYPE (rel->r_type);
1033      unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
1034
1035      symndx = rel->r_symndx;
1036      loc = contents + rel->r_vaddr - input_section->vma;
1037
1038      /* FIXME: check bounds on r_type */
1039      howto = ppc_coff_howto_table + r_type;
1040
1041      if (symndx == -1)
1042	{
1043	  h = NULL;
1044	  sym = NULL;
1045	}
1046      else
1047	{
1048	  h = (struct ppc_coff_link_hash_entry *)
1049	    (obj_coff_sym_hashes (input_bfd)[symndx]);
1050	  if (h != 0)
1051	    {
1052	      HASH_CHECK(h);
1053	    }
1054
1055	  sym = syms + symndx;
1056	}
1057
1058      if (r_type == IMAGE_REL_PPC_IMGLUE && h == 0)
1059	{
1060	  /* An IMGLUE reloc must have a name. Something is very wrong.  */
1061	  abort ();
1062	}
1063
1064      sec = NULL;
1065      val = 0;
1066
1067      /* FIXME: PAIR unsupported in the following code.  */
1068      if (h == NULL)
1069	{
1070	  if (symndx == -1)
1071	    sec = bfd_abs_section_ptr;
1072	  else
1073	    {
1074	      sec = sections[symndx];
1075	      val = (sec->output_section->vma
1076		     + sec->output_offset
1077		     + sym->n_value);
1078	      if (! obj_pe (output_bfd))
1079		val -= sec->vma;
1080	    }
1081	}
1082      else
1083	{
1084	  HASH_CHECK(h);
1085
1086	  if (h->root.root.type == bfd_link_hash_defined
1087	      || h->root.root.type == bfd_link_hash_defweak)
1088	    {
1089	      sec = h->root.root.u.def.section;
1090	      val = (h->root.root.u.def.value
1091		     + sec->output_section->vma
1092		     + sec->output_offset);
1093	    }
1094	  else
1095	    {
1096	      if (! ((*info->callbacks->undefined_symbol)
1097		     (info, h->root.root.root.string, input_bfd, input_section,
1098		      rel->r_vaddr - input_section->vma, TRUE)))
1099		return FALSE;
1100	    }
1101	}
1102
1103      rstat = bfd_reloc_ok;
1104
1105      /* Each case must do its own relocation, setting rstat appropriately.  */
1106      switch (r_type)
1107	{
1108	default:
1109	  (*_bfd_error_handler)
1110	    (_("%B: unsupported relocation type 0x%02x"), input_bfd, r_type);
1111	  bfd_set_error (bfd_error_bad_value);
1112	  return FALSE;
1113	case IMAGE_REL_PPC_TOCREL16:
1114	  {
1115	    bfd_signed_vma our_toc_offset;
1116	    int fixit;
1117
1118	    DUMP_RELOC2(howto->name, rel);
1119
1120	    if (toc_section == 0)
1121	      {
1122		toc_section = bfd_get_section_by_name (bfd_of_toc_owner,
1123						       TOC_SECTION_NAME);
1124
1125		if ( toc_section == NULL )
1126		  {
1127		    /* There is no toc section. Something is very wrong.  */
1128		    abort ();
1129		  }
1130	      }
1131
1132	    /* Amazing bit tricks present. As we may have seen earlier, we
1133	       use the 1 bit to tell us whether or not a toc offset has been
1134	       allocated. Now that they've all been allocated, we will use
1135	       the 1 bit to tell us if we've written this particular toc
1136	       entry out.  */
1137	    fixit = FALSE;
1138	    if (h == 0)
1139	      {
1140		/* It is a file local symbol.  */
1141		int *local_toc_table;
1142		const char *name;
1143
1144		sym = syms + symndx;
1145		name = sym->_n._n_name;
1146
1147		local_toc_table = obj_coff_local_toc_table(input_bfd);
1148		our_toc_offset = local_toc_table[symndx];
1149
1150		if (IS_WRITTEN(our_toc_offset))
1151		  {
1152		    /* If it has been written out, it is marked with the
1153		       1 bit. Fix up our offset, but do not write it out
1154		       again.  */
1155		    MAKE_ADDR_AGAIN(our_toc_offset);
1156		  }
1157		else
1158		  {
1159		    /* Write out the toc entry.  */
1160		    record_toc (toc_section, our_toc_offset, priv,
1161				strdup (name));
1162
1163		    bfd_put_32 (output_bfd, val,
1164			       toc_section->contents + our_toc_offset);
1165
1166		    MARK_AS_WRITTEN(local_toc_table[symndx]);
1167		    fixit = TRUE;
1168		  }
1169	      }
1170	    else
1171	      {
1172		const char *name = h->root.root.root.string;
1173		our_toc_offset = h->toc_offset;
1174
1175		if ((r_flags & IMAGE_REL_PPC_TOCDEFN)
1176		    == IMAGE_REL_PPC_TOCDEFN )
1177		  {
1178		    /* This is unbelievable cheese. Some knowledgable asm
1179		       hacker has decided to use r2 as a base for loading
1180		       a value. He/She does this by setting the tocdefn bit,
1181		       and not supplying a toc definition. The behaviour is
1182		       then to use the difference between the value of the
1183		       symbol and the actual location of the toc as the toc
1184		       index.
1185
1186		       In fact, what is usually happening is, because the
1187		       Import Address Table is mapped immediately following
1188		       the toc, some trippy library code trying for speed on
1189		       dll linkage, takes advantage of that and considers
1190		       the IAT to be part of the toc, thus saving a load.  */
1191
1192		    our_toc_offset = val - (toc_section->output_section->vma
1193					    + toc_section->output_offset);
1194
1195		    /* The size must still fit in a 16-bit displacement.  */
1196		    if ((bfd_vma) our_toc_offset >= 65535)
1197		      {
1198			(*_bfd_error_handler)
1199			  (_("%B: Relocation for %s of %lx exceeds Toc size limit"),
1200			   input_bfd, name,
1201			   (unsigned long) our_toc_offset);
1202			bfd_set_error (bfd_error_bad_value);
1203			return FALSE;
1204		      }
1205
1206		    record_toc (toc_section, our_toc_offset, pub,
1207				strdup (name));
1208		  }
1209		else if (IS_WRITTEN (our_toc_offset))
1210		  {
1211		    /* If it has been written out, it is marked with the
1212		       1 bit. Fix up our offset, but do not write it out
1213		       again.  */
1214		    MAKE_ADDR_AGAIN(our_toc_offset);
1215		  }
1216		else
1217		  {
1218		    record_toc(toc_section, our_toc_offset, pub,
1219			       strdup (name));
1220
1221		    /* Write out the toc entry.  */
1222		    bfd_put_32 (output_bfd, val,
1223			       toc_section->contents + our_toc_offset);
1224
1225		    MARK_AS_WRITTEN(h->toc_offset);
1226		    /* The tricky part is that this is the address that
1227		       needs a .reloc entry for it.  */
1228		    fixit = TRUE;
1229		  }
1230	      }
1231
1232	    if (fixit && info->base_file)
1233	      {
1234		/* So if this is non pcrelative, and is referenced
1235		   to a section or a common symbol, then it needs a reloc.  */
1236
1237		/* Relocation to a symbol in a section which
1238		   isn't absolute - we output the address here
1239		   to a file.  */
1240		bfd_vma addr = (toc_section->output_section->vma
1241				+ toc_section->output_offset + our_toc_offset);
1242
1243		if (!write_base_file_entry (output_bfd, info, addr))
1244		  return FALSE;
1245	      }
1246
1247	    /* FIXME: this test is conservative.  */
1248	    if ((r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN
1249		&& (bfd_vma) our_toc_offset > toc_section->size)
1250	      {
1251		(*_bfd_error_handler)
1252		  (_("%B: Relocation exceeds allocated TOC (%lx)"),
1253		   input_bfd, (unsigned long) toc_section->size);
1254		bfd_set_error (bfd_error_bad_value);
1255		return FALSE;
1256	      }
1257
1258	    /* Now we know the relocation for this toc reference.  */
1259	    relocation =  our_toc_offset + TOC_LOAD_ADJUSTMENT;
1260	    rstat = _bfd_relocate_contents (howto, input_bfd, relocation, loc);
1261	  }
1262	  break;
1263	case IMAGE_REL_PPC_IFGLUE:
1264	  {
1265	    /* To solve this, we need to know whether or not the symbol
1266	       appearing on the call instruction is a glue function or not.
1267	       A glue function must announce itself via a IMGLUE reloc, and
1268	       the reloc contains the required toc restore instruction.  */
1269	    DUMP_RELOC2 (howto->name, rel);
1270
1271	    if (h != 0)
1272	      {
1273		if (h->symbol_is_glue == 1)
1274		  {
1275		    bfd_put_32 (input_bfd, (bfd_vma) h->glue_insn, loc);
1276		  }
1277	      }
1278	  }
1279	  break;
1280	case IMAGE_REL_PPC_SECREL:
1281	  /* Unimplemented: codeview debugging information.  */
1282	  /* For fast access to the header of the section
1283	     containing the item.  */
1284	  break;
1285	case IMAGE_REL_PPC_SECTION:
1286	  /* Unimplemented: codeview debugging information.  */
1287	  /* Is used to indicate that the value should be relative
1288	     to the beginning of the section that contains the
1289	     symbol.  */
1290	  break;
1291	case IMAGE_REL_PPC_ABSOLUTE:
1292	  {
1293	    const char *my_name;
1294
1295	    if (h == 0)
1296	      my_name = (syms+symndx)->_n._n_name;
1297	    else
1298	      my_name = h->root.root.root.string;
1299
1300	    (*_bfd_error_handler)
1301	      (_("Warning: unsupported reloc %s <file %B, section %A>\n"
1302		 "sym %ld (%s), r_vaddr %ld (%lx)"),
1303	       input_bfd, input_section, howto->name,
1304	       rel->r_symndx, my_name, (long) rel->r_vaddr,
1305	       (unsigned long) rel->r_vaddr);
1306	  }
1307	  break;
1308	case IMAGE_REL_PPC_IMGLUE:
1309	  {
1310	    /* There is nothing to do now. This reloc was noted in the first
1311	       pass over the relocs, and the glue instruction extracted.  */
1312	    const char *my_name;
1313
1314	    if (h->symbol_is_glue == 1)
1315	      break;
1316	    my_name = h->root.root.root.string;
1317
1318	    (*_bfd_error_handler)
1319	      (_("%B: Out of order IMGLUE reloc for %s"), input_bfd, my_name);
1320	    bfd_set_error (bfd_error_bad_value);
1321	    return FALSE;
1322	  }
1323
1324	case IMAGE_REL_PPC_ADDR32NB:
1325	  {
1326	    const char *name = 0;
1327
1328	    DUMP_RELOC2 (howto->name, rel);
1329
1330	    if (CONST_STRNEQ (input_section->name, ".idata$2") && first_thunk_address == 0)
1331	      {
1332		/* Set magic values.  */
1333		int idata5offset;
1334		struct coff_link_hash_entry *myh;
1335
1336		myh = coff_link_hash_lookup (coff_hash_table (info),
1337					     "__idata5_magic__",
1338					     FALSE, FALSE, TRUE);
1339		first_thunk_address = myh->root.u.def.value +
1340		  sec->output_section->vma +
1341		    sec->output_offset -
1342		      pe_data(output_bfd)->pe_opthdr.ImageBase;
1343
1344		idata5offset = myh->root.u.def.value;
1345		myh = coff_link_hash_lookup (coff_hash_table (info),
1346					     "__idata6_magic__",
1347					     FALSE, FALSE, TRUE);
1348
1349		thunk_size = myh->root.u.def.value - idata5offset;
1350		myh = coff_link_hash_lookup (coff_hash_table (info),
1351					     "__idata4_magic__",
1352					     FALSE, FALSE, TRUE);
1353		import_table_size = myh->root.u.def.value;
1354	      }
1355
1356	    if (h == 0)
1357	      {
1358		/* It is a file local symbol.  */
1359		sym = syms + symndx;
1360		name = sym->_n._n_name;
1361	      }
1362	    else
1363	      {
1364		char *target = 0;
1365
1366		name = h->root.root.root.string;
1367		if (strcmp (".idata$2", name) == 0)
1368		  target = "__idata2_magic__";
1369		else if (strcmp (".idata$4", name) == 0)
1370		  target = "__idata4_magic__";
1371		else if (strcmp (".idata$5", name) == 0)
1372		  target = "__idata5_magic__";
1373
1374		if (target != 0)
1375		  {
1376		    struct coff_link_hash_entry *myh;
1377
1378		    myh = coff_link_hash_lookup (coff_hash_table (info),
1379						 target,
1380						 FALSE, FALSE, TRUE);
1381		    if (myh == 0)
1382		      {
1383			/* Missing magic cookies. Something is very wrong.  */
1384			abort ();
1385		      }
1386
1387		    val = myh->root.u.def.value +
1388		      sec->output_section->vma + sec->output_offset;
1389		    if (first_thunk_address == 0)
1390		      {
1391			int idata5offset;
1392			myh = coff_link_hash_lookup (coff_hash_table (info),
1393						     "__idata5_magic__",
1394						     FALSE, FALSE, TRUE);
1395			first_thunk_address = myh->root.u.def.value +
1396			  sec->output_section->vma +
1397			    sec->output_offset -
1398			      pe_data(output_bfd)->pe_opthdr.ImageBase;
1399
1400			idata5offset = myh->root.u.def.value;
1401			myh = coff_link_hash_lookup (coff_hash_table (info),
1402						     "__idata6_magic__",
1403						     FALSE, FALSE, TRUE);
1404
1405			thunk_size = myh->root.u.def.value - idata5offset;
1406			myh = coff_link_hash_lookup (coff_hash_table (info),
1407						     "__idata4_magic__",
1408						     FALSE, FALSE, TRUE);
1409			import_table_size = myh->root.u.def.value;
1410		      }
1411		  }
1412	      }
1413
1414	    rstat = _bfd_relocate_contents (howto,
1415					    input_bfd,
1416					    val -
1417					    pe_data (output_bfd)->pe_opthdr.ImageBase,
1418					    loc);
1419	  }
1420	  break;
1421
1422	case IMAGE_REL_PPC_REL24:
1423	  DUMP_RELOC2(howto->name, rel);
1424	  val -= (input_section->output_section->vma
1425		  + input_section->output_offset);
1426
1427	  rstat = _bfd_relocate_contents (howto,
1428					  input_bfd,
1429					  val,
1430					  loc);
1431	  break;
1432	case IMAGE_REL_PPC_ADDR16:
1433	case IMAGE_REL_PPC_ADDR24:
1434	case IMAGE_REL_PPC_ADDR32:
1435	  DUMP_RELOC2(howto->name, rel);
1436	  rstat = _bfd_relocate_contents (howto,
1437					  input_bfd,
1438					  val,
1439					  loc);
1440	  break;
1441	}
1442
1443      if (info->base_file)
1444	{
1445	  /* So if this is non pcrelative, and is referenced
1446	     to a section or a common symbol, then it needs a reloc.  */
1447	  if (sym && pe_data(output_bfd)->in_reloc_p (output_bfd, howto))
1448	    {
1449	      /* Relocation to a symbol in a section which
1450		 isn't absolute - we output the address here
1451		 to a file.  */
1452	      bfd_vma addr = (rel->r_vaddr
1453			      - input_section->vma
1454			      + input_section->output_offset
1455			      + input_section->output_section->vma);
1456
1457	      if (!write_base_file_entry (output_bfd, info, addr))
1458		return FALSE;
1459	    }
1460	}
1461
1462      switch (rstat)
1463	{
1464	default:
1465	  abort ();
1466	case bfd_reloc_ok:
1467	  break;
1468	case bfd_reloc_overflow:
1469	  {
1470	    const char *name;
1471	    char buf[SYMNMLEN + 1];
1472
1473	    if (symndx == -1)
1474	      name = "*ABS*";
1475	    else if (h != NULL)
1476	      name = NULL;
1477	    else if (sym == NULL)
1478	      name = "*unknown*";
1479	    else if (sym->_n._n_n._n_zeroes == 0
1480		     && sym->_n._n_n._n_offset != 0)
1481	      name = obj_coff_strings (input_bfd) + sym->_n._n_n._n_offset;
1482	    else
1483	      {
1484		strncpy (buf, sym->_n._n_name, SYMNMLEN);
1485		buf[SYMNMLEN] = '\0';
1486		name = buf;
1487	      }
1488
1489	    if (! ((*info->callbacks->reloc_overflow)
1490		   (info, (h ? &h->root.root : NULL), name, howto->name,
1491		    (bfd_vma) 0, input_bfd,
1492		    input_section, rel->r_vaddr - input_section->vma)))
1493	      return FALSE;
1494	  }
1495	}
1496    }
1497
1498  return TRUE;
1499}
1500
1501#ifdef COFF_IMAGE_WITH_PE
1502
1503/* FIXME: BFD should not use global variables.  This file is compiled
1504   twice, and these variables are shared.  This is confusing and
1505   weird.  */
1506
1507long int global_toc_size = 4;
1508
1509bfd* bfd_of_toc_owner = 0;
1510
1511long int import_table_size;
1512long int first_thunk_address;
1513long int thunk_size;
1514
1515struct list_ele *head;
1516struct list_ele *tail;
1517
1518static char *
1519h1 = N_("\n\t\t\tTOC MAPPING\n\n");
1520static char *
1521h2 = N_(" TOC    disassembly  Comments       Name\n");
1522static char *
1523h3 = N_(" Offset  spelling                   (if present)\n");
1524
1525void
1526dump_toc (vfile)
1527     PTR vfile;
1528{
1529  FILE *file = (FILE *) vfile;
1530  struct list_ele *t;
1531
1532  fputs (_(h1), file);
1533  fputs (_(h2), file);
1534  fputs (_(h3), file);
1535
1536  for (t = head; t != 0; t=t->next)
1537    {
1538      const char *cat = "";
1539
1540      if (t->cat == priv)
1541	cat = _("private       ");
1542      else if (t->cat == pub)
1543	cat = _("public        ");
1544      else if (t->cat == tocdata)
1545	cat = _("data-in-toc   ");
1546
1547      if (t->offset > global_toc_size)
1548	{
1549	  if (t->offset <= global_toc_size + thunk_size)
1550	    cat = _("IAT reference ");
1551	  else
1552	    {
1553	      fprintf (file,
1554		      _("**** global_toc_size %ld(%lx), thunk_size %ld(%lx)\n"),
1555		       global_toc_size, (unsigned long) global_toc_size,
1556		       thunk_size, (unsigned long) thunk_size);
1557	      cat = _("Out of bounds!");
1558	    }
1559	}
1560
1561      fprintf (file,
1562	      " %04lx    (%d)", (unsigned long) t->offset, t->offset - 32768);
1563      fprintf (file,
1564	      "    %s %s\n",
1565	      cat, t->name);
1566
1567    }
1568
1569  fprintf (file, "\n");
1570}
1571
1572bfd_boolean
1573ppc_allocate_toc_section (info)
1574     struct bfd_link_info *info ATTRIBUTE_UNUSED;
1575{
1576  asection *s;
1577  bfd_byte *foo;
1578  bfd_size_type amt;
1579  static char test_char = '1';
1580
1581  if ( global_toc_size == 0 ) /* FIXME: does this get me in trouble?  */
1582    return TRUE;
1583
1584  if (bfd_of_toc_owner == 0)
1585    /* No toc owner? Something is very wrong.  */
1586    abort ();
1587
1588  s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME);
1589  if (s == NULL)
1590    /* No toc section? Something is very wrong.  */
1591    abort ();
1592
1593  amt = global_toc_size;
1594  foo = (bfd_byte *) bfd_alloc (bfd_of_toc_owner, amt);
1595  memset(foo, test_char, (size_t) global_toc_size);
1596
1597  s->size = global_toc_size;
1598  s->contents = foo;
1599
1600  return TRUE;
1601}
1602
1603bfd_boolean
1604ppc_process_before_allocation (abfd, info)
1605     bfd *abfd;
1606     struct bfd_link_info *info;
1607{
1608  asection *sec;
1609  struct internal_reloc *i, *rel;
1610
1611  /* Here we have a bfd that is to be included on the link. We have a hook
1612     to do reloc rummaging, before section sizes are nailed down.  */
1613  _bfd_coff_get_external_symbols (abfd);
1614
1615  /* Rummage around all the relocs and map the toc.  */
1616  sec = abfd->sections;
1617
1618  if (sec == 0)
1619    return TRUE;
1620
1621  for (; sec != 0; sec = sec->next)
1622    {
1623      if (sec->reloc_count == 0)
1624	continue;
1625
1626      /* load the relocs */
1627      /* FIXME: there may be a storage leak here */
1628      i=_bfd_coff_read_internal_relocs(abfd,sec,1,0,0,0);
1629
1630      if (i == 0)
1631	abort ();
1632
1633      for (rel = i; rel < i + sec->reloc_count; ++rel)
1634	{
1635	  unsigned short r_type  = EXTRACT_TYPE  (rel->r_type);
1636	  unsigned short r_flags = EXTRACT_FLAGS (rel->r_type);
1637	  bfd_boolean ok = TRUE;
1638
1639	  DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, rel);
1640
1641	  switch(r_type)
1642	    {
1643	    case IMAGE_REL_PPC_TOCREL16:
1644	      /* If TOCDEFN is on, ignore as someone else has allocated the
1645		 toc entry.  */
1646	      if ((r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN)
1647		ok = ppc_record_toc_entry(abfd, info, sec,
1648					  rel->r_symndx, default_toc);
1649	      if (!ok)
1650		return FALSE;
1651	      break;
1652	    case IMAGE_REL_PPC_IMGLUE:
1653	      ppc_mark_symbol_as_glue (abfd, rel->r_symndx, rel);
1654	      break;
1655	    default:
1656	      break;
1657	    }
1658	}
1659    }
1660
1661  return TRUE;
1662}
1663
1664#endif
1665
1666static bfd_reloc_status_type
1667ppc_refhi_reloc (abfd, reloc_entry, symbol, data,
1668		 input_section, output_bfd, error_message)
1669     bfd *abfd ATTRIBUTE_UNUSED;
1670     arelent *reloc_entry ATTRIBUTE_UNUSED;
1671     asymbol *symbol ATTRIBUTE_UNUSED;
1672     PTR data ATTRIBUTE_UNUSED;
1673     asection *input_section ATTRIBUTE_UNUSED;
1674     bfd *output_bfd;
1675     char **error_message ATTRIBUTE_UNUSED;
1676{
1677  UN_IMPL("REFHI");
1678  DUMP_RELOC("REFHI",reloc_entry);
1679
1680  if (output_bfd == (bfd *) NULL)
1681    return bfd_reloc_continue;
1682
1683  return bfd_reloc_undefined;
1684}
1685
1686static bfd_reloc_status_type
1687ppc_pair_reloc (abfd, reloc_entry, symbol, data,
1688		input_section, output_bfd, error_message)
1689     bfd *abfd ATTRIBUTE_UNUSED;
1690     arelent *reloc_entry ATTRIBUTE_UNUSED;
1691     asymbol *symbol ATTRIBUTE_UNUSED;
1692     PTR data ATTRIBUTE_UNUSED;
1693     asection *input_section ATTRIBUTE_UNUSED;
1694     bfd *output_bfd;
1695     char **error_message ATTRIBUTE_UNUSED;
1696{
1697  UN_IMPL("PAIR");
1698  DUMP_RELOC("PAIR",reloc_entry);
1699
1700  if (output_bfd == (bfd *) NULL)
1701    return bfd_reloc_continue;
1702
1703  return bfd_reloc_undefined;
1704}
1705
1706static bfd_reloc_status_type
1707ppc_toc16_reloc (abfd, reloc_entry, symbol, data,
1708		 input_section, output_bfd, error_message)
1709     bfd *abfd ATTRIBUTE_UNUSED;
1710     arelent *reloc_entry ATTRIBUTE_UNUSED;
1711     asymbol *symbol ATTRIBUTE_UNUSED;
1712     PTR data ATTRIBUTE_UNUSED;
1713     asection *input_section ATTRIBUTE_UNUSED;
1714     bfd *output_bfd;
1715     char **error_message ATTRIBUTE_UNUSED;
1716{
1717  UN_IMPL ("TOCREL16");
1718  DUMP_RELOC ("TOCREL16",reloc_entry);
1719
1720  if (output_bfd == (bfd *) NULL)
1721    return bfd_reloc_continue;
1722
1723  return bfd_reloc_ok;
1724}
1725
1726static bfd_reloc_status_type
1727ppc_secrel_reloc (abfd, reloc_entry, symbol, data,
1728		  input_section, output_bfd, error_message)
1729     bfd *abfd ATTRIBUTE_UNUSED;
1730     arelent *reloc_entry ATTRIBUTE_UNUSED;
1731     asymbol *symbol ATTRIBUTE_UNUSED;
1732     PTR data ATTRIBUTE_UNUSED;
1733     asection *input_section ATTRIBUTE_UNUSED;
1734     bfd *output_bfd;
1735     char **error_message ATTRIBUTE_UNUSED;
1736{
1737  UN_IMPL("SECREL");
1738  DUMP_RELOC("SECREL",reloc_entry);
1739
1740  if (output_bfd == (bfd *) NULL)
1741    return bfd_reloc_continue;
1742
1743  return bfd_reloc_ok;
1744}
1745
1746static bfd_reloc_status_type
1747ppc_section_reloc (abfd, reloc_entry, symbol, data,
1748		   input_section, output_bfd, error_message)
1749     bfd *abfd ATTRIBUTE_UNUSED;
1750     arelent *reloc_entry ATTRIBUTE_UNUSED;
1751     asymbol *symbol ATTRIBUTE_UNUSED;
1752     PTR data ATTRIBUTE_UNUSED;
1753     asection *input_section ATTRIBUTE_UNUSED;
1754     bfd *output_bfd;
1755     char **error_message ATTRIBUTE_UNUSED;
1756{
1757  UN_IMPL("SECTION");
1758  DUMP_RELOC("SECTION",reloc_entry);
1759
1760  if (output_bfd == (bfd *) NULL)
1761    return bfd_reloc_continue;
1762
1763  return bfd_reloc_ok;
1764}
1765
1766static bfd_reloc_status_type
1767ppc_imglue_reloc (abfd, reloc_entry, symbol, data,
1768		  input_section, output_bfd, error_message)
1769     bfd *abfd ATTRIBUTE_UNUSED;
1770     arelent *reloc_entry ATTRIBUTE_UNUSED;
1771     asymbol *symbol ATTRIBUTE_UNUSED;
1772     PTR data ATTRIBUTE_UNUSED;
1773     asection *input_section ATTRIBUTE_UNUSED;
1774     bfd *output_bfd;
1775     char **error_message ATTRIBUTE_UNUSED;
1776{
1777  UN_IMPL("IMGLUE");
1778  DUMP_RELOC("IMGLUE",reloc_entry);
1779
1780  if (output_bfd == (bfd *) NULL)
1781    return bfd_reloc_continue;
1782
1783  return bfd_reloc_ok;
1784}
1785
1786#define MAX_RELOC_INDEX  \
1787      (sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]) - 1)
1788
1789/* FIXME: There is a possibility that when we read in a reloc from a file,
1790          that there are some bits encoded in the upper portion of the
1791	  type field. Not yet implemented.  */
1792static void ppc_coff_rtype2howto PARAMS ((arelent *, struct internal_reloc *));
1793
1794static void
1795ppc_coff_rtype2howto (relent, internal)
1796     arelent *relent;
1797     struct internal_reloc *internal;
1798{
1799  /* We can encode one of three things in the type field, aside from the
1800     type:
1801     1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
1802        value, rather than an addition value
1803     2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
1804        the branch is expected to be taken or not.
1805     3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
1806     For now, we just strip this stuff to find the type, and ignore it other
1807     than that.  */
1808  reloc_howto_type *howto;
1809  unsigned short r_type  = EXTRACT_TYPE (internal->r_type);
1810  unsigned short r_flags = EXTRACT_FLAGS(internal->r_type);
1811  unsigned short junk    = EXTRACT_JUNK (internal->r_type);
1812
1813  /* The masking process only slices off the bottom byte for r_type.  */
1814  if ( r_type > MAX_RELOC_INDEX )
1815    abort ();
1816
1817  /* Check for absolute crap.  */
1818  if (junk != 0)
1819    abort ();
1820
1821  switch(r_type)
1822    {
1823    case IMAGE_REL_PPC_ADDR16:
1824    case IMAGE_REL_PPC_REL24:
1825    case IMAGE_REL_PPC_ADDR24:
1826    case IMAGE_REL_PPC_ADDR32:
1827    case IMAGE_REL_PPC_IFGLUE:
1828    case IMAGE_REL_PPC_ADDR32NB:
1829    case IMAGE_REL_PPC_SECTION:
1830    case IMAGE_REL_PPC_SECREL:
1831      DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
1832      howto = ppc_coff_howto_table + r_type;
1833      break;
1834    case IMAGE_REL_PPC_IMGLUE:
1835      DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
1836      howto = ppc_coff_howto_table + r_type;
1837      break;
1838    case IMAGE_REL_PPC_TOCREL16:
1839      DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal);
1840      if (r_flags & IMAGE_REL_PPC_TOCDEFN)
1841	howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN;
1842      else
1843	howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
1844      break;
1845    default:
1846      (*_bfd_error_handler) (_("warning: unsupported reloc %s [%d] used -- it may not work"),
1847			     ppc_coff_howto_table[r_type].name,
1848			     r_type);
1849      howto = ppc_coff_howto_table + r_type;
1850      break;
1851    }
1852
1853  relent->howto = howto;
1854}
1855
1856static reloc_howto_type *
1857coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
1858     bfd *abfd ATTRIBUTE_UNUSED;
1859     asection *sec;
1860     struct internal_reloc *rel;
1861     struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
1862     struct internal_syment *sym ATTRIBUTE_UNUSED;
1863     bfd_vma *addendp;
1864{
1865  reloc_howto_type *howto;
1866
1867  /* We can encode one of three things in the type field, aside from the
1868     type:
1869     1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction
1870        value, rather than an addition value
1871     2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that
1872        the branch is expected to be taken or not.
1873     3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file
1874     For now, we just strip this stuff to find the type, and ignore it other
1875     than that.  */
1876
1877  unsigned short r_type  = EXTRACT_TYPE  (rel->r_type);
1878  unsigned short r_flags = EXTRACT_FLAGS (rel->r_type);
1879  unsigned short junk    = EXTRACT_JUNK  (rel->r_type);
1880
1881  /* The masking process only slices off the bottom byte for r_type.  */
1882  if (r_type > MAX_RELOC_INDEX)
1883    abort ();
1884
1885  /* Check for absolute crap.  */
1886  if (junk != 0)
1887    abort ();
1888
1889  switch(r_type)
1890    {
1891    case IMAGE_REL_PPC_ADDR32NB:
1892      DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1893      *addendp -= pe_data(sec->output_section->owner)->pe_opthdr.ImageBase;
1894      howto = ppc_coff_howto_table + r_type;
1895      break;
1896    case IMAGE_REL_PPC_TOCREL16:
1897      DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1898      if (r_flags & IMAGE_REL_PPC_TOCDEFN)
1899	howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN;
1900      else
1901	howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
1902      break;
1903    case IMAGE_REL_PPC_ADDR16:
1904    case IMAGE_REL_PPC_REL24:
1905    case IMAGE_REL_PPC_ADDR24:
1906    case IMAGE_REL_PPC_ADDR32:
1907    case IMAGE_REL_PPC_IFGLUE:
1908    case IMAGE_REL_PPC_SECTION:
1909    case IMAGE_REL_PPC_SECREL:
1910      DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1911      howto = ppc_coff_howto_table + r_type;
1912      break;
1913    case IMAGE_REL_PPC_IMGLUE:
1914      DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
1915      howto = ppc_coff_howto_table + r_type;
1916      break;
1917    default:
1918      (*_bfd_error_handler) (_("warning: unsupported reloc %s [%d] used -- it may not work"),
1919			     ppc_coff_howto_table[r_type].name,
1920			     r_type);
1921      howto = ppc_coff_howto_table + r_type;
1922      break;
1923    }
1924
1925  return howto;
1926}
1927
1928/* A cheesy little macro to make the code a little more readable.  */
1929#define HOW2MAP(bfd_rtype,ppc_rtype)  \
1930 case bfd_rtype: return &ppc_coff_howto_table[ppc_rtype]
1931
1932static reloc_howto_type *ppc_coff_reloc_type_lookup
1933PARAMS ((bfd *, bfd_reloc_code_real_type));
1934
1935static reloc_howto_type *
1936ppc_coff_reloc_type_lookup (abfd, code)
1937     bfd *abfd ATTRIBUTE_UNUSED;
1938     bfd_reloc_code_real_type code;
1939{
1940  switch (code)
1941    {
1942      HOW2MAP(BFD_RELOC_32_GOTOFF,    IMAGE_REL_PPC_IMGLUE);
1943      HOW2MAP(BFD_RELOC_16_GOT_PCREL, IMAGE_REL_PPC_IFGLUE);
1944      HOW2MAP(BFD_RELOC_16,           IMAGE_REL_PPC_ADDR16);
1945      HOW2MAP(BFD_RELOC_PPC_B26,      IMAGE_REL_PPC_REL24);
1946      HOW2MAP(BFD_RELOC_PPC_BA26,     IMAGE_REL_PPC_ADDR24);
1947      HOW2MAP(BFD_RELOC_PPC_TOC16,    IMAGE_REL_PPC_TOCREL16);
1948      HOW2MAP(BFD_RELOC_16_GOTOFF,    IMAGE_REL_PPC_TOCREL16_DEFN);
1949      HOW2MAP(BFD_RELOC_32,           IMAGE_REL_PPC_ADDR32);
1950      HOW2MAP(BFD_RELOC_RVA,          IMAGE_REL_PPC_ADDR32NB);
1951    default:
1952      return NULL;
1953    }
1954}
1955#undef HOW2MAP
1956
1957static reloc_howto_type *
1958ppc_coff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1959			    const char *r_name)
1960{
1961  unsigned int i;
1962
1963  for (i = 0;
1964       i < sizeof (ppc_coff_howto_table) / sizeof (ppc_coff_howto_table[0]);
1965       i++)
1966    if (ppc_coff_howto_table[i].name != NULL
1967	&& strcasecmp (ppc_coff_howto_table[i].name, r_name) == 0)
1968      return &ppc_coff_howto_table[i];
1969
1970  return NULL;
1971}
1972
1973/* Tailor coffcode.h -- macro heaven.  */
1974
1975#define RTYPE2HOWTO(cache_ptr, dst)  ppc_coff_rtype2howto (cache_ptr, dst)
1976
1977/* We use the special COFF backend linker, with our own special touch.  */
1978
1979#define coff_bfd_reloc_type_lookup   ppc_coff_reloc_type_lookup
1980#define coff_bfd_reloc_name_lookup ppc_coff_reloc_name_lookup
1981#define coff_rtype_to_howto          coff_ppc_rtype_to_howto
1982#define coff_relocate_section        coff_ppc_relocate_section
1983#define coff_bfd_final_link          ppc_bfd_coff_final_link
1984
1985#ifndef COFF_IMAGE_WITH_PE
1986#endif
1987
1988#define SELECT_RELOC(internal, howto) {internal.r_type=howto->type;}
1989
1990#define COFF_PAGE_SIZE                       0x1000
1991
1992/* FIXME: This controls some code that used to be in peicode.h and is
1993   now in peigen.c.  It will not control the code in peigen.c.  If
1994   anybody wants to get this working, you will need to fix that.  */
1995#define POWERPC_LE_PE
1996
1997#define COFF_SECTION_ALIGNMENT_ENTRIES \
1998{ COFF_SECTION_NAME_EXACT_MATCH (".idata$2"), \
1999  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
2000{ COFF_SECTION_NAME_EXACT_MATCH (".idata$3"), \
2001  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
2002{ COFF_SECTION_NAME_EXACT_MATCH (".idata$4"), \
2003  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
2004{ COFF_SECTION_NAME_EXACT_MATCH (".idata$5"), \
2005  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
2006{ COFF_SECTION_NAME_EXACT_MATCH (".idata$6"), \
2007  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }, \
2008{ COFF_SECTION_NAME_EXACT_MATCH (".reloc"), \
2009  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 1 }
2010
2011#include "coffcode.h"
2012
2013#ifndef COFF_IMAGE_WITH_PE
2014
2015static bfd_boolean ppc_do_last PARAMS ((bfd *));
2016static bfd *ppc_get_last PARAMS ((void));
2017
2018static bfd_boolean
2019ppc_do_last (abfd)
2020     bfd *abfd;
2021{
2022  if (abfd == bfd_of_toc_owner)
2023    return TRUE;
2024  else
2025    return FALSE;
2026}
2027
2028static bfd *
2029ppc_get_last()
2030{
2031  return bfd_of_toc_owner;
2032}
2033
2034/* This piece of machinery exists only to guarantee that the bfd that holds
2035   the toc section is written last.
2036
2037   This does depend on bfd_make_section attaching a new section to the
2038   end of the section list for the bfd.
2039
2040   This is otherwise intended to be functionally the same as
2041   cofflink.c:_bfd_coff_final_link(). It is specifically different only
2042   where the POWERPC_LE_PE macro modifies the code. It is left in as a
2043   precise form of comment. krk@cygnus.com  */
2044
2045/* Do the final link step.  */
2046
2047bfd_boolean
2048ppc_bfd_coff_final_link (abfd, info)
2049     bfd *abfd;
2050     struct bfd_link_info *info;
2051{
2052  bfd_size_type symesz;
2053  struct coff_final_link_info finfo;
2054  bfd_boolean debug_merge_allocated;
2055  asection *o;
2056  struct bfd_link_order *p;
2057  bfd_size_type max_sym_count;
2058  bfd_size_type max_lineno_count;
2059  bfd_size_type max_reloc_count;
2060  bfd_size_type max_output_reloc_count;
2061  bfd_size_type max_contents_size;
2062  file_ptr rel_filepos;
2063  unsigned int relsz;
2064  file_ptr line_filepos;
2065  unsigned int linesz;
2066  bfd *sub;
2067  bfd_byte *external_relocs = NULL;
2068  char strbuf[STRING_SIZE_SIZE];
2069  bfd_size_type amt;
2070
2071  symesz = bfd_coff_symesz (abfd);
2072
2073  finfo.info = info;
2074  finfo.output_bfd = abfd;
2075  finfo.strtab = NULL;
2076  finfo.section_info = NULL;
2077  finfo.last_file_index = -1;
2078  finfo.last_bf_index = -1;
2079  finfo.internal_syms = NULL;
2080  finfo.sec_ptrs = NULL;
2081  finfo.sym_indices = NULL;
2082  finfo.outsyms = NULL;
2083  finfo.linenos = NULL;
2084  finfo.contents = NULL;
2085  finfo.external_relocs = NULL;
2086  finfo.internal_relocs = NULL;
2087  debug_merge_allocated = FALSE;
2088
2089  coff_data (abfd)->link_info = info;
2090
2091  finfo.strtab = _bfd_stringtab_init ();
2092  if (finfo.strtab == NULL)
2093    goto error_return;
2094
2095  if (! coff_debug_merge_hash_table_init (&finfo.debug_merge))
2096    goto error_return;
2097  debug_merge_allocated = TRUE;
2098
2099  /* Compute the file positions for all the sections.  */
2100  if (! abfd->output_has_begun)
2101    {
2102      if (! bfd_coff_compute_section_file_positions (abfd))
2103	return FALSE;
2104    }
2105
2106  /* Count the line numbers and relocation entries required for the
2107     output file.  Set the file positions for the relocs.  */
2108  rel_filepos = obj_relocbase (abfd);
2109  relsz = bfd_coff_relsz (abfd);
2110  max_contents_size = 0;
2111  max_lineno_count = 0;
2112  max_reloc_count = 0;
2113
2114  for (o = abfd->sections; o != NULL; o = o->next)
2115    {
2116      o->reloc_count = 0;
2117      o->lineno_count = 0;
2118
2119      for (p = o->map_head.link_order; p != NULL; p = p->next)
2120	{
2121	  if (p->type == bfd_indirect_link_order)
2122	    {
2123	      asection *sec;
2124
2125	      sec = p->u.indirect.section;
2126
2127	      /* Mark all sections which are to be included in the
2128		 link.  This will normally be every section.  We need
2129		 to do this so that we can identify any sections which
2130		 the linker has decided to not include.  */
2131	      sec->linker_mark = TRUE;
2132
2133	      if (info->strip == strip_none
2134		  || info->strip == strip_some)
2135		o->lineno_count += sec->lineno_count;
2136
2137	      if (info->relocatable)
2138		o->reloc_count += sec->reloc_count;
2139
2140	      if (sec->rawsize > max_contents_size)
2141		max_contents_size = sec->rawsize;
2142	      if (sec->size > max_contents_size)
2143		max_contents_size = sec->size;
2144	      if (sec->lineno_count > max_lineno_count)
2145		max_lineno_count = sec->lineno_count;
2146	      if (sec->reloc_count > max_reloc_count)
2147		max_reloc_count = sec->reloc_count;
2148	    }
2149	  else if (info->relocatable
2150		   && (p->type == bfd_section_reloc_link_order
2151		       || p->type == bfd_symbol_reloc_link_order))
2152	    ++o->reloc_count;
2153	}
2154      if (o->reloc_count == 0)
2155	o->rel_filepos = 0;
2156      else
2157	{
2158	  o->flags |= SEC_RELOC;
2159	  o->rel_filepos = rel_filepos;
2160	  rel_filepos += o->reloc_count * relsz;
2161	}
2162    }
2163
2164  /* If doing a relocatable link, allocate space for the pointers we
2165     need to keep.  */
2166  if (info->relocatable)
2167    {
2168      unsigned int i;
2169
2170      /* We use section_count + 1, rather than section_count, because
2171         the target_index fields are 1 based.  */
2172      amt = abfd->section_count + 1;
2173      amt *= sizeof (struct coff_link_section_info);
2174      finfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt);
2175
2176      if (finfo.section_info == NULL)
2177	goto error_return;
2178
2179      for (i = 0; i <= abfd->section_count; i++)
2180	{
2181	  finfo.section_info[i].relocs = NULL;
2182	  finfo.section_info[i].rel_hashes = NULL;
2183	}
2184    }
2185
2186  /* We now know the size of the relocs, so we can determine the file
2187     positions of the line numbers.  */
2188  line_filepos = rel_filepos;
2189  linesz = bfd_coff_linesz (abfd);
2190  max_output_reloc_count = 0;
2191
2192  for (o = abfd->sections; o != NULL; o = o->next)
2193    {
2194      if (o->lineno_count == 0)
2195	o->line_filepos = 0;
2196      else
2197	{
2198	  o->line_filepos = line_filepos;
2199	  line_filepos += o->lineno_count * linesz;
2200	}
2201
2202      if (o->reloc_count != 0)
2203	{
2204	  /* We don't know the indices of global symbols until we have
2205             written out all the local symbols.  For each section in
2206             the output file, we keep an array of pointers to hash
2207             table entries.  Each entry in the array corresponds to a
2208             reloc.  When we find a reloc against a global symbol, we
2209             set the corresponding entry in this array so that we can
2210             fix up the symbol index after we have written out all the
2211             local symbols.
2212
2213	     Because of this problem, we also keep the relocs in
2214	     memory until the end of the link.  This wastes memory,
2215	     but only when doing a relocatable link, which is not the
2216	     common case.  */
2217	  BFD_ASSERT (info->relocatable);
2218	  amt = o->reloc_count;
2219	  amt *= sizeof (struct internal_reloc);
2220	  finfo.section_info[o->target_index].relocs =
2221	    (struct internal_reloc *) bfd_malloc (amt);
2222	  amt = o->reloc_count;
2223	  amt *= sizeof (struct coff_link_hash_entry *);
2224	  finfo.section_info[o->target_index].rel_hashes =
2225	    (struct coff_link_hash_entry **) bfd_malloc (amt);
2226	  if (finfo.section_info[o->target_index].relocs == NULL
2227	      || finfo.section_info[o->target_index].rel_hashes == NULL)
2228	    goto error_return;
2229
2230	  if (o->reloc_count > max_output_reloc_count)
2231	    max_output_reloc_count = o->reloc_count;
2232	}
2233
2234      /* Reset the reloc and lineno counts, so that we can use them to
2235	 count the number of entries we have output so far.  */
2236      o->reloc_count = 0;
2237      o->lineno_count = 0;
2238    }
2239
2240  obj_sym_filepos (abfd) = line_filepos;
2241
2242  /* Figure out the largest number of symbols in an input BFD.  Take
2243     the opportunity to clear the output_has_begun fields of all the
2244     input BFD's.  */
2245  max_sym_count = 0;
2246  for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
2247    {
2248      bfd_size_type sz;
2249
2250      sub->output_has_begun = FALSE;
2251      sz = obj_raw_syment_count (sub);
2252      if (sz > max_sym_count)
2253	max_sym_count = sz;
2254    }
2255
2256  /* Allocate some buffers used while linking.  */
2257  amt = max_sym_count * sizeof (struct internal_syment);
2258  finfo.internal_syms = (struct internal_syment *) bfd_malloc (amt);
2259  amt = max_sym_count * sizeof (asection *);
2260  finfo.sec_ptrs = (asection **) bfd_malloc (amt);
2261  amt = max_sym_count * sizeof (long);
2262  finfo.sym_indices = (long *) bfd_malloc (amt);
2263  amt = (max_sym_count + 1) * symesz;
2264  finfo.outsyms = (bfd_byte *) bfd_malloc (amt);
2265  amt = max_lineno_count * bfd_coff_linesz (abfd);
2266  finfo.linenos = (bfd_byte *) bfd_malloc (amt);
2267  finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size);
2268  finfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz);
2269  if (! info->relocatable)
2270    {
2271      amt = max_reloc_count * sizeof (struct internal_reloc);
2272      finfo.internal_relocs = (struct internal_reloc *) bfd_malloc (amt);
2273    }
2274  if ((finfo.internal_syms == NULL && max_sym_count > 0)
2275      || (finfo.sec_ptrs == NULL && max_sym_count > 0)
2276      || (finfo.sym_indices == NULL && max_sym_count > 0)
2277      || finfo.outsyms == NULL
2278      || (finfo.linenos == NULL && max_lineno_count > 0)
2279      || (finfo.contents == NULL && max_contents_size > 0)
2280      || (finfo.external_relocs == NULL && max_reloc_count > 0)
2281      || (! info->relocatable
2282	  && finfo.internal_relocs == NULL
2283	  && max_reloc_count > 0))
2284    goto error_return;
2285
2286  /* We now know the position of everything in the file, except that
2287     we don't know the size of the symbol table and therefore we don't
2288     know where the string table starts.  We just build the string
2289     table in memory as we go along.  We process all the relocations
2290     for a single input file at once.  */
2291  obj_raw_syment_count (abfd) = 0;
2292
2293  if (coff_backend_info (abfd)->_bfd_coff_start_final_link)
2294    {
2295      if (! bfd_coff_start_final_link (abfd, info))
2296	goto error_return;
2297    }
2298
2299  for (o = abfd->sections; o != NULL; o = o->next)
2300    {
2301      for (p = o->map_head.link_order; p != NULL; p = p->next)
2302	{
2303	  if (p->type == bfd_indirect_link_order
2304	      && (bfd_get_flavour (p->u.indirect.section->owner)
2305		  == bfd_target_coff_flavour))
2306	    {
2307	      sub = p->u.indirect.section->owner;
2308#ifdef POWERPC_LE_PE
2309	      if (! sub->output_has_begun && !ppc_do_last(sub))
2310#else
2311	      if (! sub->output_has_begun)
2312#endif
2313		{
2314		  if (! _bfd_coff_link_input_bfd (&finfo, sub))
2315		    goto error_return;
2316		  sub->output_has_begun = TRUE;
2317		}
2318	    }
2319	  else if (p->type == bfd_section_reloc_link_order
2320		   || p->type == bfd_symbol_reloc_link_order)
2321	    {
2322	      if (! _bfd_coff_reloc_link_order (abfd, &finfo, o, p))
2323		goto error_return;
2324	    }
2325	  else
2326	    {
2327	      if (! _bfd_default_link_order (abfd, info, o, p))
2328		goto error_return;
2329	    }
2330	}
2331    }
2332
2333#ifdef POWERPC_LE_PE
2334  {
2335    bfd* last_one = ppc_get_last();
2336    if (last_one)
2337      {
2338	if (! _bfd_coff_link_input_bfd (&finfo, last_one))
2339	  goto error_return;
2340      }
2341    last_one->output_has_begun = TRUE;
2342  }
2343#endif
2344
2345  /* Free up the buffers used by _bfd_coff_link_input_bfd.  */
2346  coff_debug_merge_hash_table_free (&finfo.debug_merge);
2347  debug_merge_allocated = FALSE;
2348
2349  if (finfo.internal_syms != NULL)
2350    {
2351      free (finfo.internal_syms);
2352      finfo.internal_syms = NULL;
2353    }
2354  if (finfo.sec_ptrs != NULL)
2355    {
2356      free (finfo.sec_ptrs);
2357      finfo.sec_ptrs = NULL;
2358    }
2359  if (finfo.sym_indices != NULL)
2360    {
2361      free (finfo.sym_indices);
2362      finfo.sym_indices = NULL;
2363    }
2364  if (finfo.linenos != NULL)
2365    {
2366      free (finfo.linenos);
2367      finfo.linenos = NULL;
2368    }
2369  if (finfo.contents != NULL)
2370    {
2371      free (finfo.contents);
2372      finfo.contents = NULL;
2373    }
2374  if (finfo.external_relocs != NULL)
2375    {
2376      free (finfo.external_relocs);
2377      finfo.external_relocs = NULL;
2378    }
2379  if (finfo.internal_relocs != NULL)
2380    {
2381      free (finfo.internal_relocs);
2382      finfo.internal_relocs = NULL;
2383    }
2384
2385  /* The value of the last C_FILE symbol is supposed to be the symbol
2386     index of the first external symbol.  Write it out again if
2387     necessary.  */
2388  if (finfo.last_file_index != -1
2389      && (unsigned int) finfo.last_file.n_value != obj_raw_syment_count (abfd))
2390    {
2391      file_ptr pos;
2392
2393      finfo.last_file.n_value = obj_raw_syment_count (abfd);
2394      bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file,
2395			     (PTR) finfo.outsyms);
2396      pos = obj_sym_filepos (abfd) + finfo.last_file_index * symesz;
2397      if (bfd_seek (abfd, pos, SEEK_SET) != 0
2398	  || bfd_bwrite (finfo.outsyms, symesz, abfd) != symesz)
2399	return FALSE;
2400    }
2401
2402  /* Write out the global symbols.  */
2403  finfo.failed = FALSE;
2404  coff_link_hash_traverse (coff_hash_table (info), _bfd_coff_write_global_sym,
2405			   (PTR) &finfo);
2406  if (finfo.failed)
2407    goto error_return;
2408
2409  /* The outsyms buffer is used by _bfd_coff_write_global_sym.  */
2410  if (finfo.outsyms != NULL)
2411    {
2412      free (finfo.outsyms);
2413      finfo.outsyms = NULL;
2414    }
2415
2416  if (info->relocatable)
2417    {
2418      /* Now that we have written out all the global symbols, we know
2419	 the symbol indices to use for relocs against them, and we can
2420	 finally write out the relocs.  */
2421      amt = max_output_reloc_count * relsz;
2422      external_relocs = (bfd_byte *) bfd_malloc (amt);
2423      if (external_relocs == NULL)
2424	goto error_return;
2425
2426      for (o = abfd->sections; o != NULL; o = o->next)
2427	{
2428	  struct internal_reloc *irel;
2429	  struct internal_reloc *irelend;
2430	  struct coff_link_hash_entry **rel_hash;
2431	  bfd_byte *erel;
2432
2433	  if (o->reloc_count == 0)
2434	    continue;
2435
2436	  irel = finfo.section_info[o->target_index].relocs;
2437	  irelend = irel + o->reloc_count;
2438	  rel_hash = finfo.section_info[o->target_index].rel_hashes;
2439	  erel = external_relocs;
2440	  for (; irel < irelend; irel++, rel_hash++, erel += relsz)
2441	    {
2442	      if (*rel_hash != NULL)
2443		{
2444		  BFD_ASSERT ((*rel_hash)->indx >= 0);
2445		  irel->r_symndx = (*rel_hash)->indx;
2446		}
2447	      bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel);
2448	    }
2449
2450	  amt = relsz * o->reloc_count;
2451	  if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0
2452	      || bfd_bwrite ((PTR) external_relocs, amt, abfd) != amt)
2453	    goto error_return;
2454	}
2455
2456      free (external_relocs);
2457      external_relocs = NULL;
2458    }
2459
2460  /* Free up the section information.  */
2461  if (finfo.section_info != NULL)
2462    {
2463      unsigned int i;
2464
2465      for (i = 0; i < abfd->section_count; i++)
2466	{
2467	  if (finfo.section_info[i].relocs != NULL)
2468	    free (finfo.section_info[i].relocs);
2469	  if (finfo.section_info[i].rel_hashes != NULL)
2470	    free (finfo.section_info[i].rel_hashes);
2471	}
2472      free (finfo.section_info);
2473      finfo.section_info = NULL;
2474    }
2475
2476  /* If we have optimized stabs strings, output them.  */
2477  if (coff_hash_table (info)->stab_info.stabstr != NULL)
2478    {
2479      if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info))
2480	return FALSE;
2481    }
2482
2483  /* Write out the string table.  */
2484  if (obj_raw_syment_count (abfd) != 0)
2485    {
2486      file_ptr pos;
2487
2488      pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz;
2489      if (bfd_seek (abfd, pos, SEEK_SET) != 0)
2490	return FALSE;
2491
2492#if STRING_SIZE_SIZE == 4
2493      H_PUT_32 (abfd,
2494		_bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE,
2495		strbuf);
2496#else
2497 #error Change H_PUT_32 above
2498#endif
2499
2500      if (bfd_bwrite (strbuf, (bfd_size_type) STRING_SIZE_SIZE, abfd)
2501	  != STRING_SIZE_SIZE)
2502	return FALSE;
2503
2504      if (! _bfd_stringtab_emit (abfd, finfo.strtab))
2505	return FALSE;
2506    }
2507
2508  _bfd_stringtab_free (finfo.strtab);
2509
2510  /* Setting bfd_get_symcount to 0 will cause write_object_contents to
2511     not try to write out the symbols.  */
2512  bfd_get_symcount (abfd) = 0;
2513
2514  return TRUE;
2515
2516 error_return:
2517  if (debug_merge_allocated)
2518    coff_debug_merge_hash_table_free (&finfo.debug_merge);
2519  if (finfo.strtab != NULL)
2520    _bfd_stringtab_free (finfo.strtab);
2521  if (finfo.section_info != NULL)
2522    {
2523      unsigned int i;
2524
2525      for (i = 0; i < abfd->section_count; i++)
2526	{
2527	  if (finfo.section_info[i].relocs != NULL)
2528	    free (finfo.section_info[i].relocs);
2529	  if (finfo.section_info[i].rel_hashes != NULL)
2530	    free (finfo.section_info[i].rel_hashes);
2531	}
2532      free (finfo.section_info);
2533    }
2534  if (finfo.internal_syms != NULL)
2535    free (finfo.internal_syms);
2536  if (finfo.sec_ptrs != NULL)
2537    free (finfo.sec_ptrs);
2538  if (finfo.sym_indices != NULL)
2539    free (finfo.sym_indices);
2540  if (finfo.outsyms != NULL)
2541    free (finfo.outsyms);
2542  if (finfo.linenos != NULL)
2543    free (finfo.linenos);
2544  if (finfo.contents != NULL)
2545    free (finfo.contents);
2546  if (finfo.external_relocs != NULL)
2547    free (finfo.external_relocs);
2548  if (finfo.internal_relocs != NULL)
2549    free (finfo.internal_relocs);
2550  if (external_relocs != NULL)
2551    free (external_relocs);
2552  return FALSE;
2553}
2554#endif
2555
2556/* Forward declaration for use by alternative_target field.  */
2557#ifdef TARGET_BIG_SYM
2558extern const bfd_target TARGET_BIG_SYM;
2559#endif
2560
2561/* The transfer vectors that lead the outside world to all of the above.  */
2562
2563#ifdef TARGET_LITTLE_SYM
2564const bfd_target TARGET_LITTLE_SYM =
2565{
2566  TARGET_LITTLE_NAME,		/* name or coff-arm-little */
2567  bfd_target_coff_flavour,
2568  BFD_ENDIAN_LITTLE,		/* data byte order is little */
2569  BFD_ENDIAN_LITTLE,		/* header byte order is little */
2570
2571  (HAS_RELOC | EXEC_P |		/* FIXME: object flags */
2572   HAS_LINENO | HAS_DEBUG |
2573   HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
2574
2575#ifndef COFF_WITH_PE
2576  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
2577#else
2578  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
2579   | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
2580#endif
2581
2582  0,				/* leading char */
2583  '/',				/* ar_pad_char */
2584  15,				/* ar_max_namelen??? FIXMEmgo */
2585
2586  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2587  bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2588  bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
2589
2590  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2591  bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2592  bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
2593
2594  {_bfd_dummy_target, coff_object_p, 	/* bfd_check_format */
2595     bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p },
2596  {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
2597     bfd_false},
2598  {bfd_false, coff_write_object_contents,	/* bfd_write_contents */
2599     _bfd_write_archive_contents, bfd_false},
2600
2601  BFD_JUMP_TABLE_GENERIC (coff),
2602  BFD_JUMP_TABLE_COPY (coff),
2603  BFD_JUMP_TABLE_CORE (_bfd_nocore),
2604  BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
2605  BFD_JUMP_TABLE_SYMBOLS (coff),
2606  BFD_JUMP_TABLE_RELOCS (coff),
2607  BFD_JUMP_TABLE_WRITE (coff),
2608  BFD_JUMP_TABLE_LINK (coff),
2609  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
2610
2611  /* Alternative_target.  */
2612#ifdef TARGET_BIG_SYM
2613  & TARGET_BIG_SYM,
2614#else
2615  NULL,
2616#endif
2617
2618  COFF_SWAP_TABLE
2619};
2620#endif
2621
2622#ifdef TARGET_BIG_SYM
2623const bfd_target TARGET_BIG_SYM =
2624{
2625  TARGET_BIG_NAME,
2626  bfd_target_coff_flavour,
2627  BFD_ENDIAN_BIG,		/* data byte order is big */
2628  BFD_ENDIAN_BIG,		/* header byte order is big */
2629
2630  (HAS_RELOC | EXEC_P |		/* FIXME: object flags */
2631   HAS_LINENO | HAS_DEBUG |
2632   HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
2633
2634#ifndef COFF_WITH_PE
2635  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
2636#else
2637  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
2638   | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
2639#endif
2640
2641  0,				/* leading char */
2642  '/',				/* ar_pad_char */
2643  15,				/* ar_max_namelen??? FIXMEmgo */
2644
2645  bfd_getb64, bfd_getb_signed_64, bfd_putb64,
2646  bfd_getb32, bfd_getb_signed_32, bfd_putb32,
2647  bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
2648
2649  bfd_getb64, bfd_getb_signed_64, bfd_putb64,
2650  bfd_getb32, bfd_getb_signed_32, bfd_putb32,
2651  bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
2652
2653  {_bfd_dummy_target, coff_object_p, 	/* bfd_check_format */
2654     bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p },
2655  {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
2656     bfd_false},
2657  {bfd_false, coff_write_object_contents,	/* bfd_write_contents */
2658     _bfd_write_archive_contents, bfd_false},
2659
2660  BFD_JUMP_TABLE_GENERIC (coff),
2661  BFD_JUMP_TABLE_COPY (coff),
2662  BFD_JUMP_TABLE_CORE (_bfd_nocore),
2663  BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
2664  BFD_JUMP_TABLE_SYMBOLS (coff),
2665  BFD_JUMP_TABLE_RELOCS (coff),
2666  BFD_JUMP_TABLE_WRITE (coff),
2667  BFD_JUMP_TABLE_LINK (coff),
2668  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
2669
2670  /* Alternative_target.  */
2671#ifdef TARGET_LITTLE_SYM
2672  & TARGET_LITTLE_SYM,
2673#else
2674  NULL,
2675#endif
2676
2677  COFF_SWAP_TABLE
2678};
2679
2680#endif
2681