Original version pieced together by Kim Knuttila (krk@cygnus.com)
There is nothing new under the sun. This file draws a lot on other
- coff files, in particular, those for the rs/6000, alpha, mips, and
+ coff files, in particular, those for the rs/6000, alpha, mips, and
intel backends, and the PE work for the arm.
This file is part of BFD, the Binary File Descriptor library.
- objdump works
- relocs generated by gas
- ld will link files, but they do not run.
- - dlltool will not produce correct output in some .reloc cases, and will
+ - dlltool will not produce correct output in some .reloc cases, and will
not produce the right glue code for dll function calls.
*/
-
#include "bfd.h"
#include "sysdep.h"
#define MARK_AS_WRITTEN(x) ((x) |= 1)
#define MAKE_ADDR_AGAIN(x) ((x) &= ~1)
-
/* Turn on this check if you suspect something amiss in the hash tables */
#ifdef DEBUG_HASH
abort(); \
}
-
#else
#define HASH_CHECK_DCL
/* In order not to add an int to every hash table item for every coff
linker, we define our own hash table, derived from the coff one */
-/* PE linker hash table entries. */
+/* PE linker hash table entries. */
struct ppc_coff_link_hash_entry
{
HASH_CHECK_DCL
};
-
/* PE linker hash table. */
struct ppc_coff_link_hash_table
struct bfd_hash_table *table;
const char *string;
{
- struct ppc_coff_link_hash_entry *ret =
+ struct ppc_coff_link_hash_entry *ret =
(struct ppc_coff_link_hash_entry *) entry;
/* Allocate the structure if it has not already been allocated by a
subclass. */
if (ret == (struct ppc_coff_link_hash_entry *) NULL)
ret = (struct ppc_coff_link_hash_entry *)
- bfd_hash_allocate (table,
+ bfd_hash_allocate (table,
sizeof (struct ppc_coff_link_hash_entry));
if (ret == (struct ppc_coff_link_hash_entry *) NULL)
/* Call the allocation method of the superclass. */
ret = ((struct ppc_coff_link_hash_entry *)
- _bfd_coff_link_hash_newfunc ((struct bfd_hash_entry *) ret,
+ _bfd_coff_link_hash_newfunc ((struct bfd_hash_entry *) ret,
table, string));
if (ret)
from smaller values. Start with zero, widen, *then* decrement. */
#define MINUS_ONE (((bfd_vma)0) - 1)
-/* these should definitely go in a header file somewhere... */
+/* these should definitely go in a header file somewhere... */
/* NOP */
#define IMAGE_REL_PPC_ABSOLUTE 0x0000
bfd *output_bfd,
char **error));
-
-
static boolean in_reloc_p PARAMS((bfd *abfd, reloc_howto_type *howto));
\f
/* the address of the SYM will be inserted at link time. */
/* TOCREL16 : 16 bit displacement field referring to a slot in */
/* toc. */
-/* TOCREL14 : 16 bit displacement field, similar to REL14 or ADDR14. */
+/* TOCREL14 : 16 bit displacement field, similar to REL14 or ADDR14. */
/* ADDR32NB : 32 bit address relative to the virtual origin. */
/* (On the alpha, this is always a linker generated thunk)*/
/* (i.e. 32bit addr relative to the image base) */
{
/* IMAGE_REL_PPC_ABSOLUTE 0x0000 NOP */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_ABSOLUTE, /* type */
- 0, /* rightshift */
- 0, /* size (0 = byte, 1 = short, 2 = long) */
- 0, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_ABSOLUTE, /* type */
+ 0, /* rightshift */
+ 0, /* size (0 = byte, 1 = short, 2 = long) */
+ 0, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_dont, /* dont complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"ABSOLUTE", /* name */
- false, /* partial_inplace */
- 0x00, /* src_mask */
- 0x00, /* dst_mask */
+ false, /* partial_inplace */
+ 0x00, /* src_mask */
+ 0x00, /* dst_mask */
false), /* pcrel_offset */
-
+
/* IMAGE_REL_PPC_ADDR64 0x0001 64-bit address */
/* Unused: */
- HOWTO(IMAGE_REL_PPC_ADDR64, /* type */
- 0, /* rightshift */
- 3, /* size (0 = byte, 1 = short, 2 = long) */
- 64, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO(IMAGE_REL_PPC_ADDR64, /* type */
+ 0, /* rightshift */
+ 3, /* size (0 = byte, 1 = short, 2 = long) */
+ 64, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"ADDR64", /* name */
- true, /* partial_inplace */
+ true, /* partial_inplace */
MINUS_ONE, /* src_mask */
MINUS_ONE, /* dst_mask */
false), /* pcrel_offset */
/* IMAGE_REL_PPC_ADDR32 0x0002 32-bit address */
/* Used: */
HOWTO (IMAGE_REL_PPC_ADDR32, /* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 32, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"ADDR32", /* name */
- true, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
false), /* pcrel_offset */
-
+
/* IMAGE_REL_PPC_ADDR24 0x0003 26-bit address, shifted left 2 (branch absolute) */
/* the LI field is in bit 6 through bit 29 is 24 bits, + 2 for the shift */
/* Of course, That's the IBM approved bit numbering, which is not what */
- /* anyone else uses.... The li field is in bit 2 thru 25 */
+ /* anyone else uses.... The li field is in bit 2 thru 25 */
/* Used: */
HOWTO (IMAGE_REL_PPC_ADDR24, /* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
26, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"ADDR24", /* name */
- true, /* partial_inplace */
- 0x07fffffc, /* src_mask */
- 0x07fffffc, /* dst_mask */
+ true, /* partial_inplace */
+ 0x07fffffc, /* src_mask */
+ 0x07fffffc, /* dst_mask */
false), /* pcrel_offset */
-
+
/* IMAGE_REL_PPC_ADDR16 0x0004 16-bit address */
/* Used: */
- HOWTO (IMAGE_REL_PPC_ADDR16, /* type */
- 0, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 16, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_ADDR16, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"ADDR16", /* name */
- true, /* partial_inplace */
- 0xffff, /* src_mask */
- 0xffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
false), /* pcrel_offset */
-
+
/* IMAGE_REL_PPC_ADDR14 0x0005 */
/* 16-bit address, shifted left 2 (load doubleword) */
/* FIXME: the mask is likely wrong, and the bit position may be as well */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
- 1, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 16, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
+ 1, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"ADDR16", /* name */
- true, /* partial_inplace */
- 0xffff, /* src_mask */
- 0xffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
false), /* pcrel_offset */
-
+
/* IMAGE_REL_PPC_REL24 0x0006 */
/* 26-bit PC-relative offset, shifted left 2 (branch relative) */
/* Used: */
HOWTO (IMAGE_REL_PPC_REL24, /* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 26, /* bitsize */
- true, /* pc_relative */
- 0, /* bitpos */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 26, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"REL24", /* name */
- true, /* partial_inplace */
- 0x3fffffc, /* src_mask */
- 0x3fffffc, /* dst_mask */
+ true, /* partial_inplace */
+ 0x3fffffc, /* src_mask */
+ 0x3fffffc, /* dst_mask */
false), /* pcrel_offset */
-
+
/* IMAGE_REL_PPC_REL14 0x0007 */
/* 16-bit PC-relative offset, shifted left 2 (br cond relative) */
/* FIXME: the mask is likely wrong, and the bit position may be as well */
/* FIXME: how does it know how far to shift? */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
- 1, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 16, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_ADDR14, /* type */
+ 1, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"ADDR16", /* name */
- true, /* partial_inplace */
- 0xffff, /* src_mask */
- 0xffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
true), /* pcrel_offset */
-
+
/* IMAGE_REL_PPC_TOCREL16 0x0008 */
/* 16-bit offset from TOC base */
/* Used: */
- HOWTO (IMAGE_REL_PPC_TOCREL16,/* type */
- 0, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 16, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_TOCREL16,/* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
- ppc_toc16_reloc, /* special_function */
+ ppc_toc16_reloc, /* special_function */
"TOCREL16", /* name */
- false, /* partial_inplace */
- 0xffff, /* src_mask */
- 0xffff, /* dst_mask */
+ false, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
false), /* pcrel_offset */
-
+
/* IMAGE_REL_PPC_TOCREL14 0x0009 */
/* 16-bit offset from TOC base, shifted left 2 (load doubleword) */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_TOCREL14,/* type */
- 1, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 16, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_TOCREL14,/* type */
+ 1, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"TOCREL14", /* name */
- false, /* partial_inplace */
- 0xffff, /* src_mask */
- 0xffff, /* dst_mask */
+ false, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
false), /* pcrel_offset */
-
+
/* IMAGE_REL_PPC_ADDR32NB 0x000A */
/* 32-bit addr w/ image base */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_ADDR32NB,/* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 32, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_ADDR32NB,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"ADDR32NB", /* name */
- true, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
false), /* pcrel_offset */
-
+
/* IMAGE_REL_PPC_SECREL 0x000B */
/* va of containing section (as in an image sectionhdr) */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_SECREL,/* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 32, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_SECREL,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- ppc_secrel_reloc, /* special_function */
+ ppc_secrel_reloc, /* special_function */
"SECREL", /* name */
- true, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
true), /* pcrel_offset */
/* IMAGE_REL_PPC_SECTION 0x000C */
/* sectionheader number */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_SECTION,/* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 32, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_SECTION,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- ppc_section_reloc, /* special_function */
+ ppc_section_reloc, /* special_function */
"SECTION", /* name */
- true, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
true), /* pcrel_offset */
/* IMAGE_REL_PPC_IFGLUE 0x000D */
/* substitute TOC restore instruction iff symbol is glue code */
/* Used: */
- HOWTO (IMAGE_REL_PPC_IFGLUE,/* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 32, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_IFGLUE,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"IFGLUE", /* name */
- true, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
false), /* pcrel_offset */
/* IMAGE_REL_PPC_IMGLUE 0x000E */
/* symbol is glue code; virtual address is TOC restore instruction */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_IMGLUE,/* type */
- 0, /* rightshift */
- 2, /* size (0 = byte, 1 = short, 2 = long) */
- 32, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_IMGLUE,/* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
- ppc_imglue_reloc, /* special_function */
+ ppc_imglue_reloc, /* special_function */
"IMGLUE", /* name */
- false, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
+ false, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
false), /* pcrel_offset */
/* IMAGE_REL_PPC_SECREL16 0x000F */
/* va of containing section (limited to 16 bits) */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_SECREL16,/* type */
- 0, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 16, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_SECREL16,/* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"SECREL16", /* name */
- true, /* partial_inplace */
- 0xffff, /* src_mask */
- 0xffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
true), /* pcrel_offset */
/* IMAGE_REL_PPC_REFHI 0x0010 */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_REFHI, /* type */
- 0, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 16, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_REFHI, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- ppc_refhi_reloc, /* special_function */
+ ppc_refhi_reloc, /* special_function */
"REFHI", /* name */
- true, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
false), /* pcrel_offset */
/* IMAGE_REL_PPC_REFLO 0x0011 */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_REFLO, /* type */
- 0, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 16, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_REFLO, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- ppc_refhi_reloc, /* special_function */
+ ppc_refhi_reloc, /* special_function */
"REFLO", /* name */
- true, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
false), /* pcrel_offset */
/* IMAGE_REL_PPC_PAIR 0x0012 */
/* Unused: */
- HOWTO (IMAGE_REL_PPC_PAIR, /* type */
- 0, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 16, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO (IMAGE_REL_PPC_PAIR, /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
- ppc_pair_reloc, /* special_function */
+ ppc_pair_reloc, /* special_function */
"PAIR", /* name */
- true, /* partial_inplace */
- 0xffffffff, /* src_mask */
- 0xffffffff, /* dst_mask */
+ true, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
false), /* pcrel_offset */
/* IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 */
/* 16-bit offset from TOC base, without causing a definition */
/* Used: */
- HOWTO ( (IMAGE_REL_PPC_TOCREL16 | IMAGE_REL_PPC_TOCDEFN), /* type */
- 0, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
- 16, /* bitsize */
- false, /* pc_relative */
- 0, /* bitpos */
+ HOWTO ( (IMAGE_REL_PPC_TOCREL16 | IMAGE_REL_PPC_TOCDEFN), /* type */
+ 0, /* rightshift */
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
+ 16, /* bitsize */
+ false, /* pc_relative */
+ 0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
- 0, /* special_function */
+ 0, /* special_function */
"TOCREL16, TOCDEFN", /* name */
- false, /* partial_inplace */
- 0xffff, /* src_mask */
- 0xffff, /* dst_mask */
+ false, /* partial_inplace */
+ 0xffff, /* src_mask */
+ 0xffff, /* dst_mask */
false), /* pcrel_offset */
};
-
\f
/* Some really cheezy macros that can be turned on to test stderr :-) */
r->address, r->addend); \
}
-/* Given a reloc name, n, and a pointer to an internal_reloc,
- dump out interesting information on the contents
+/* Given a reloc name, n, and a pointer to an internal_reloc,
+ dump out interesting information on the contents
#define n_name _n._n_name
#define n_zeroes _n._n_n._n_zeroes
#define DUMP_RELOC2(n,r)
#endif
-
\f
/* toc construction and management routines */
HASH_CHECK(h);
}
- if (h == 0)
- {
+ if (h == 0)
+ {
local_syms = obj_coff_local_toc_table(abfd);
if (local_syms == 0)
{
unsigned int i;
/* allocate a table */
- local_syms =
- (int *) bfd_zalloc (abfd,
+ local_syms =
+ (int *) bfd_zalloc (abfd,
obj_raw_syment_count(abfd) * sizeof(int));
if (local_syms == 0)
return false;
}
}
- if (IS_UNALLOCATED(local_syms[sym]))
+ if (IS_UNALLOCATED(local_syms[sym]))
{
local_syms[sym] = global_toc_size;
global_toc_size += 4;
\f
/* Return true if this relocation should
- appear in the output .reloc section. */
+ appear in the output .reloc section. */
static boolean in_reloc_p(abfd, howto)
bfd * abfd ATTRIBUTE_UNUSED;
reloc_howto_type *howto;
{
- return
- (! howto->pc_relative)
+ return
+ (! howto->pc_relative)
&& (howto->type != IMAGE_REL_PPC_ADDR32NB)
&& (howto->type != IMAGE_REL_PPC_TOCREL16)
&& (howto->type != IMAGE_REL_PPC_IMGLUE)
- && (howto->type != IMAGE_REL_PPC_IFGLUE)
+ && (howto->type != IMAGE_REL_PPC_IFGLUE)
&& (howto->type != IMAGE_REL_PPC_SECREL)
&& (howto->type != IMAGE_REL_PPC_SECTION)
&& (howto->type != IMAGE_REL_PPC_SECREL16)
&& (howto->type != IMAGE_REL_PPC_REFLO)
&& (howto->type != IMAGE_REL_PPC_PAIR)
&& (howto->type != IMAGE_REL_PPC_TOCREL16_DEFN) ;
-}
+}
#if 0
unsigned long sym_value;
unsigned short r_type;
unsigned long addr = reloc_entry->address ; /*+ input_section->vma*/
-
+
r_type = reloc_entry->howto->type;
- if (output_bfd)
+ if (output_bfd)
{
/* Partial linking - do nothing */
reloc_entry->address += input_section->output_offset;
- return bfd_reloc_ok;
+ return bfd_reloc_ok;
}
if (symbol_in != NULL
&& bfd_is_und_section (symbol_in->section))
{
/* Keep the state machine happy in case we're called again */
- if (r_type == IMAGE_REL_PPC_REFHI)
+ if (r_type == IMAGE_REL_PPC_REFHI)
{
part1_consth_active = true;
part1_consth_value = 0;
}
return(bfd_reloc_undefined);
}
-
- if ((part1_consth_active) && (r_type != IMAGE_REL_PPC_PAIR))
+
+ if ((part1_consth_active) && (r_type != IMAGE_REL_PPC_PAIR))
{
part1_consth_active = false;
*error_message = (char *) _("Missing PAIR");
return(bfd_reloc_dangerous);
}
-
sym_value = get_symbol_value(symbol_in);
-
- return(bfd_reloc_ok);
+
+ return(bfd_reloc_ok);
}
#endif /* 0 */
asection *toc_section = 0;
bfd_vma relocation;
reloc_howto_type *howto = 0;
-
+
/* If we are performing a relocateable link, we don't need to do a
thing. The caller will take care of adjusting the reloc
addresses and symbol indices. */
if (info->relocateable)
return true;
-
+
hihalf = false;
hihalf_val = 0;
unsigned short r_type = EXTRACT_TYPE (rel->r_type);
unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
-
+
symndx = rel->r_symndx;
loc = contents + rel->r_vaddr - input_section->vma;
}
else
{
- h = (struct ppc_coff_link_hash_entry *)
+ h = (struct ppc_coff_link_hash_entry *)
(obj_coff_sym_hashes (input_bfd)[symndx]);
- if (h != 0)
+ if (h != 0)
{
HASH_CHECK(h);
}
if (r_type == IMAGE_REL_PPC_IMGLUE && h == 0)
{
- /* An IMGLUE reloc must have a name. Something is very wrong. */
+ /* An IMGLUE reloc must have a name. Something is very wrong. */
abort();
}
}
rstat = bfd_reloc_ok;
-
+
/* Each case must do its own relocation, setting rstat appropriately */
switch (r_type)
{
DUMP_RELOC2(howto->name, rel);
- if (toc_section == 0)
+ if (toc_section == 0)
{
- toc_section = bfd_get_section_by_name (bfd_of_toc_owner,
+ toc_section = bfd_get_section_by_name (bfd_of_toc_owner,
TOC_SECTION_NAME);
- if ( toc_section == NULL )
+ if ( toc_section == NULL )
{
- /* There is no toc section. Something is very wrong. */
+ /* There is no toc section. Something is very wrong. */
abort();
}
}
- /*
+ /*
* Amazing bit tricks present. As we may have seen earlier, we
* use the 1 bit to tell us whether or not a toc offset has been
* allocated. Now that they've all been allocated, we will use
if (IS_WRITTEN(our_toc_offset))
{
- /* if it has been written out, it is marked with the
+ /* if it has been written out, it is marked with the
1 bit. Fix up our offset, but do not write it out
again.
*/
else
{
/* write out the toc entry */
- record_toc(toc_section,
- our_toc_offset,
- priv,
+ record_toc(toc_section,
+ our_toc_offset,
+ priv,
strdup(name));
bfd_put_32(output_bfd,
const char *name = h->root.root.root.string;
our_toc_offset = h->toc_offset;
- if ((r_flags & IMAGE_REL_PPC_TOCDEFN)
+ if ((r_flags & IMAGE_REL_PPC_TOCDEFN)
== IMAGE_REL_PPC_TOCDEFN )
{
- /* This is unbelievable cheese. Some knowledgable asm
- hacker has decided to use r2 as a base for loading
- a value. He/She does this by setting the tocdefn bit,
- and not supplying a toc definition. The behaviour is
- then to use the difference between the value of the
- symbol and the actual location of the toc as the toc
- index.
+ /* This is unbelievable cheese. Some knowledgable asm
+ hacker has decided to use r2 as a base for loading
+ a value. He/She does this by setting the tocdefn bit,
+ and not supplying a toc definition. The behaviour is
+ then to use the difference between the value of the
+ symbol and the actual location of the toc as the toc
+ index.
In fact, what is usually happening is, because the
Import Address Table is mapped immediately following
the toc, some trippy library code trying for speed on
- dll linkage, takes advantage of that and considers
+ dll linkage, takes advantage of that and considers
the IAT to be part of the toc, thus saving a load.
*/
- our_toc_offset = val -
- (toc_section->output_section->vma +
+ our_toc_offset = val -
+ (toc_section->output_section->vma +
toc_section->output_offset);
/* The size must still fit in a 16bit displacment */
if (our_toc_offset >= 65535)
{
(*_bfd_error_handler)
- (_("%s: Relocation for %s of %x exceeds Toc size limit"),
+ (_("%s: Relocation for %s of %x exceeds Toc size limit"),
bfd_get_filename (input_bfd), name, our_toc_offset);
bfd_set_error (bfd_error_bad_value);
return false;
}
else if (IS_WRITTEN(our_toc_offset))
{
- /* if it has been written out, it is marked with the
+ /* if it has been written out, it is marked with the
1 bit. Fix up our offset, but do not write it out
again.
*/
}
}
- if (fixit && info->base_file)
+ if (fixit && info->base_file)
{
/* So if this is non pcrelative, and is referenced
to a section or a common symbol, then it needs a reloc */
/* relocation to a symbol in a section which
- isn't absolute - we output the address here
+ isn't absolute - we output the address here
to a file */
bfd_vma addr = toc_section->output_section->vma
+ toc_section->output_offset + our_toc_offset;
-
+
if (coff_data(output_bfd)->pe)
addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
fwrite (&addr, 1,4, (FILE *) info->base_file);
}
-
/* FIXME: this test is conservative */
if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN &&
our_toc_offset > toc_section->_raw_size)
{
(*_bfd_error_handler)
- (_("%s: Relocation exceeds allocated TOC (%x)"),
+ (_("%s: Relocation exceeds allocated TOC (%x)"),
bfd_get_filename (input_bfd),
toc_section->_raw_size);
bfd_set_error (bfd_error_bad_value);
/* Now we know the relocation for this toc reference */
relocation = our_toc_offset + TOC_LOAD_ADJUSTMENT;
rstat = _bfd_relocate_contents (howto,
- input_bfd,
- relocation,
+ input_bfd,
+ relocation,
loc);
}
break;
case IMAGE_REL_PPC_IFGLUE:
{
/* To solve this, we need to know whether or not the symbol */
- /* appearing on the call instruction is a glue function or not. */
+ /* appearing on the call instruction is a glue function or not. */
/* A glue function must announce itself via a IMGLUE reloc, and */
/* the reloc contains the required toc restore instruction */
-
+
bfd_vma x;
const char *my_name;
DUMP_RELOC2(howto->name, rel);
if (h != 0)
{
my_name = h->root.root.root.string;
- if (h->symbol_is_glue == 1)
+ if (h->symbol_is_glue == 1)
{
x = bfd_get_32(input_bfd, loc);
bfd_put_32(input_bfd, h->glue_insn, loc);
break;
case IMAGE_REL_PPC_SECREL:
/* Unimplemented: codeview debugging information */
- /* For fast access to the header of the section
- containing the item. */
+ /* For fast access to the header of the section
+ containing the item. */
break;
case IMAGE_REL_PPC_SECTION:
/* Unimplemented: codeview debugging information */
my_name = h->root.root.root.string;
}
- fprintf(stderr,
- _("Warning: unsupported reloc %s <file %s, section %s>\n"),
+ fprintf(stderr,
+ _("Warning: unsupported reloc %s <file %s, section %s>\n"),
howto->name,
bfd_get_filename(input_bfd),
input_section->name);
- fprintf(stderr,"sym %ld (%s), r_vaddr %ld (%lx)\n",
+ fprintf(stderr,"sym %ld (%s), r_vaddr %ld (%lx)\n",
rel->r_symndx, my_name, (long) rel->r_vaddr,
- (unsigned long) rel->r_vaddr);
+ (unsigned long) rel->r_vaddr);
}
break;
case IMAGE_REL_PPC_IMGLUE:
/* There is nothing to do now. This reloc was noted in the first
pass over the relocs, and the glue instruction extracted */
const char *my_name;
- if (h->symbol_is_glue == 1)
+ if (h->symbol_is_glue == 1)
break;
my_name = h->root.root.root.string;
(*_bfd_error_handler)
- (_("%s: Out of order IMGLUE reloc for %s"),
+ (_("%s: Out of order IMGLUE reloc for %s"),
bfd_get_filename (input_bfd), my_name);
bfd_set_error (bfd_error_bad_value);
return false;
myh = coff_link_hash_lookup (coff_hash_table (info),
"__idata5_magic__",
false, false, true);
- first_thunk_address = myh->root.u.def.value +
- sec->output_section->vma +
- sec->output_offset -
+ first_thunk_address = myh->root.u.def.value +
+ sec->output_section->vma +
+ sec->output_offset -
pe_data(output_bfd)->pe_opthdr.ImageBase;
-
+
idata5offset = myh->root.u.def.value;
myh = coff_link_hash_lookup (coff_hash_table (info),
"__idata6_magic__",
false, false, true);
-
+
thunk_size = myh->root.u.def.value - idata5offset;
myh = coff_link_hash_lookup (coff_hash_table (info),
"__idata4_magic__",
myh = coff_link_hash_lookup (coff_hash_table (info),
target,
false, false, true);
- if (myh == 0)
+ if (myh == 0)
{
- /* Missing magic cookies. Something is very wrong. */
+ /* Missing magic cookies. Something is very wrong. */
abort();
}
-
- val = myh->root.u.def.value +
+
+ val = myh->root.u.def.value +
sec->output_section->vma + sec->output_offset;
if (first_thunk_address == 0)
{
myh = coff_link_hash_lookup (coff_hash_table (info),
"__idata5_magic__",
false, false, true);
- first_thunk_address = myh->root.u.def.value +
- sec->output_section->vma +
- sec->output_offset -
+ first_thunk_address = myh->root.u.def.value +
+ sec->output_section->vma +
+ sec->output_offset -
pe_data(output_bfd)->pe_opthdr.ImageBase;
-
+
idata5offset = myh->root.u.def.value;
myh = coff_link_hash_lookup (coff_hash_table (info),
"__idata6_magic__",
false, false, true);
-
+
thunk_size = myh->root.u.def.value - idata5offset;
myh = coff_link_hash_lookup (coff_hash_table (info),
"__idata4_magic__",
}
rstat = _bfd_relocate_contents (howto,
- input_bfd,
- val -
+ input_bfd,
+ val -
pe_data(output_bfd)->pe_opthdr.ImageBase,
loc);
}
+ input_section->output_offset);
rstat = _bfd_relocate_contents (howto,
- input_bfd,
- val,
+ input_bfd,
+ val,
loc);
break;
case IMAGE_REL_PPC_ADDR16:
case IMAGE_REL_PPC_ADDR32:
DUMP_RELOC2(howto->name, rel);
rstat = _bfd_relocate_contents (howto,
- input_bfd,
- val,
+ input_bfd,
+ val,
loc);
break;
}
if (sym && pe_data(output_bfd)->in_reloc_p(output_bfd, howto))
{
/* relocation to a symbol in a section which
- isn't absolute - we output the address here
+ isn't absolute - we output the address here
to a file */
- bfd_vma addr = rel->r_vaddr
- - input_section->vma
- + input_section->output_offset
+ bfd_vma addr = rel->r_vaddr
+ - input_section->vma
+ + input_section->output_offset
+ input_section->output_section->vma;
if (coff_data(output_bfd)->pe)
}
if (! ((*info->callbacks->reloc_overflow)
- (info, name, howto->name,
+ (info, name, howto->name,
(bfd_vma) 0, input_bfd,
input_section, rel->r_vaddr - input_section->vma)))
{
}
}
- }
+ }
return true;
}
}
boolean
-ppc_allocate_toc_section (info)
+ppc_allocate_toc_section (info)
struct bfd_link_info *info ATTRIBUTE_UNUSED;
{
asection *s;
if (bfd_of_toc_owner == 0)
{
- /* No toc owner? Something is very wrong. */
+ /* No toc owner? Something is very wrong. */
abort();
}
s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME);
- if (s == NULL)
+ if (s == NULL)
{
- /* No toc section? Something is very wrong. */
+ /* No toc section? Something is very wrong. */
abort();
}
struct internal_reloc *i, *rel;
/* here we have a bfd that is to be included on the link. We have a hook
- to do reloc rummaging, before section sizes are nailed down. */
+ to do reloc rummaging, before section sizes are nailed down. */
_bfd_coff_get_external_symbols(abfd);
for (; sec != 0; sec = sec->next)
{
- if (sec->reloc_count == 0)
+ if (sec->reloc_count == 0)
continue;
/* load the relocs */
/* FIXME: there may be a storage leak here */
i=_bfd_coff_read_internal_relocs(abfd,sec,1,0,0,0);
-
+
if (i == 0)
abort();
- for (rel=i;rel<i+sec->reloc_count;++rel)
+ for (rel=i;rel<i+sec->reloc_count;++rel)
{
unsigned short r_type = EXTRACT_TYPE (rel->r_type);
unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
- switch(r_type)
+ switch(r_type)
{
case IMAGE_REL_PPC_TOCREL16:
/* if TOCDEFN is on, ignore as someone else has allocated the
toc entry */
if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN )
- ok = ppc_record_toc_entry(abfd, info, sec,
+ ok = ppc_record_toc_entry(abfd, info, sec,
rel->r_symndx, default_toc);
if (!ok)
return false;
#endif
-
static bfd_reloc_status_type
ppc_refhi_reloc (abfd,
reloc_entry,
#define MAX_RELOC_INDEX \
(sizeof(ppc_coff_howto_table) / sizeof(ppc_coff_howto_table[0]) - 1)
-
/* FIXME: There is a possiblity that when we read in a reloc from a file,
- that there are some bits encoded in the upper portion of the
+ that there are some bits encoded in the upper portion of the
type field. Not yet implemented.
*/
static void ppc_coff_rtype2howto PARAMS ((arelent *relent,
ppc_coff_rtype2howto (relent, internal)
arelent *relent;
struct internal_reloc *internal;
-{
+{
/* We can encode one of three things in the type field, aside from the
type:
unsigned short r_flags = EXTRACT_FLAGS(internal->r_type);
unsigned short junk = EXTRACT_JUNK (internal->r_type);
- /* the masking process only slices off the bottom byte for r_type. */
- if ( r_type > MAX_RELOC_INDEX )
+ /* the masking process only slices off the bottom byte for r_type. */
+ if ( r_type > MAX_RELOC_INDEX )
abort();
/* check for absolute crap */
if ( junk != 0 )
abort();
- switch(r_type)
+ switch(r_type)
{
case IMAGE_REL_PPC_ADDR16:
case IMAGE_REL_PPC_REL24:
howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16;
break;
default:
- fprintf(stderr,
+ fprintf(stderr,
_("Warning: Unsupported reloc %s [%d] used -- it may not work.\n"),
ppc_coff_howto_table[r_type].name,
r_type);
- howto = ppc_coff_howto_table + r_type;
+ howto = ppc_coff_howto_table + r_type;
break;
}
-
+
relent->howto = howto;
-
+
}
static reloc_howto_type *
unsigned short r_flags = EXTRACT_FLAGS(rel->r_type);
unsigned short junk = EXTRACT_JUNK (rel->r_type);
- /* the masking process only slices off the bottom byte for r_type. */
- if ( r_type > MAX_RELOC_INDEX )
+ /* the masking process only slices off the bottom byte for r_type. */
+ if ( r_type > MAX_RELOC_INDEX )
abort();
-
+
/* check for absolute crap */
if ( junk != 0 )
abort();
-
- switch(r_type)
+
+ switch(r_type)
{
case IMAGE_REL_PPC_ADDR32NB:
DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel);
howto = ppc_coff_howto_table + r_type;
break;
default:
- fprintf(stderr,
+ fprintf(stderr,
_("Warning: Unsupported reloc %s [%d] used -- it may not work.\n"),
ppc_coff_howto_table[r_type].name,
r_type);
howto = ppc_coff_howto_table + r_type;
break;
}
-
+
return howto;
}
-
/* a cheesy little macro to make the code a little more readable */
#define HOW2MAP(bfd_rtype,ppc_rtype) \
case bfd_rtype: return &ppc_coff_howto_table[ppc_rtype]
HOW2MAP(BFD_RELOC_16_GOTOFF, IMAGE_REL_PPC_TOCREL16_DEFN);
HOW2MAP(BFD_RELOC_32, IMAGE_REL_PPC_ADDR32);
HOW2MAP(BFD_RELOC_RVA, IMAGE_REL_PPC_ADDR32NB);
- default:
+ default:
return NULL;
}
/*NOTREACHED*/
#undef HOW2MAP
\f
-/* Tailor coffcode.h -- macro heaven. */
+/* Tailor coffcode.h -- macro heaven. */
#define RTYPE2HOWTO(cache_ptr, dst) ppc_coff_rtype2howto (cache_ptr, dst)
#define coff_bfd_reloc_type_lookup ppc_coff_reloc_type_lookup
#define coff_rtype_to_howto coff_ppc_rtype_to_howto
#define coff_relocate_section coff_ppc_relocate_section
-#define coff_bfd_final_link ppc_bfd_coff_final_link
+#define coff_bfd_final_link ppc_bfd_coff_final_link
#ifndef COFF_IMAGE_WITH_PE
/* FIXME: This no longer works. */
#ifndef COFF_IMAGE_WITH_PE
/* FIXME:
- What we're trying to do here is allocate a toc section (early), and attach
+ What we're trying to do here is allocate a toc section (early), and attach
it to the last bfd to be processed. This avoids the problem of having a toc
written out before all files have been processed. This code allocates
a toc section for every file, and records the last one seen. There are
register asection *s;
s = bfd_get_section_by_name ( abfd , TOC_SECTION_NAME);
- if (s != NULL)
+ if (s != NULL)
{
return;
}
}
/* this piece of machinery exists only to guarantee that the bfd that holds
- the toc section is written last.
+ the toc section is written last.
This does depend on bfd_make_section attaching a new section to the
- end of the section list for the bfd.
+ end of the section list for the bfd.
- This is otherwise intended to be functionally the same as
- cofflink.c:_bfd_coff_final_link(). It is specifically different only
- where the POWERPC_LE_PE macro modifies the code. It is left in as a
+ This is otherwise intended to be functionally the same as
+ cofflink.c:_bfd_coff_final_link(). It is specifically different only
+ where the POWERPC_LE_PE macro modifies the code. It is left in as a
precise form of comment. krk@cygnus.com
*/
-
/* Do the final link step. */
boolean
extern const bfd_target TARGET_BIG_SYM;
#endif
-/* The transfer vectors that lead the outside world to all of the above. */
+/* The transfer vectors that lead the outside world to all of the above. */
#ifdef TARGET_LITTLE_SYM
const bfd_target TARGET_LITTLE_SYM =
(HAS_RELOC | EXEC_P | /* FIXME: object flags */
HAS_LINENO | HAS_DEBUG |
HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
-
+
#ifndef COFF_WITH_PE
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
#else
bfd_getl64, bfd_getl_signed_64, bfd_putl64,
bfd_getl32, bfd_getl_signed_32, bfd_putl32,
bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
-
+
{_bfd_dummy_target, coff_object_p, /* bfd_check_format */
bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p },
{bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
bfd_false},
{bfd_false, coff_write_object_contents, /* bfd_write_contents */
_bfd_write_archive_contents, bfd_false},
-
+
BFD_JUMP_TABLE_GENERIC (coff),
BFD_JUMP_TABLE_COPY (coff),
BFD_JUMP_TABLE_CORE (_bfd_nocore),
#else
NULL,
#endif
-
+
COFF_SWAP_TABLE
};
#endif
const bfd_target TARGET_BIG_SYM =
{
TARGET_BIG_NAME,
- bfd_target_coff_flavour,
+ bfd_target_coff_flavour,
BFD_ENDIAN_BIG, /* data byte order is big */
BFD_ENDIAN_BIG, /* header byte order is big */
BFD_JUMP_TABLE_LINK (coff),
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
-
/* Alternative_target. */
#ifdef TARGET_LITTLE_SYM
& TARGET_LITTLE_SYM,
#else
NULL,
#endif
-
+
COFF_SWAP_TABLE
};