X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fcoff-ppc.c;h=c1c2c32a178b36378e247de767ad7ce1689fadf4;hb=8ce8c090f3e7509af869a05090bc5b0656c487d8;hp=2bf296ab803d186d5ba89d71bb0a5e106b092aa0;hpb=7898dedac0f0bd75d7363d13427c4a1e72b66f66;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/coff-ppc.c b/bfd/coff-ppc.c index 2bf296ab80..c1c2c32a17 100644 --- a/bfd/coff-ppc.c +++ b/bfd/coff-ppc.c @@ -1,6 +1,6 @@ /* BFD back-end for PowerPC Microsoft Portable Executable files. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001 + 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Original version pieced together by Kim Knuttila (krk@cygnus.com) @@ -9,30 +9,29 @@ 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. + This file is part of BFD, the Binary File Descriptor library. -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ /* Current State: - 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 - not produce the right glue code for dll function calls. -*/ + not produce the right glue code for dll function calls. */ #include "bfd.h" #include "sysdep.h" @@ -54,19 +53,19 @@ Boston, MA 02111-1307, USA. */ /* This file is compiled more than once, but we only compile the final_link routine once. */ -extern boolean ppc_bfd_coff_final_link +extern bfd_boolean ppc_bfd_coff_final_link PARAMS ((bfd *, struct bfd_link_info *)); extern void dump_toc PARAMS ((PTR)); -/* The toc is a set of bfd_vma fields. We use the fact that valid */ -/* addresses are even (i.e. the bit representing "1" is off) to allow */ -/* us to encode a little extra information in the field */ -/* - Unallocated addresses are intialized to 1. */ -/* - Allocated addresses are even numbers. */ -/* The first time we actually write a reference to the toc in the bfd, */ -/* we want to record that fact in a fixup file (if it is asked for), so */ -/* we keep track of whether or not an address has been written by marking */ -/* the low order bit with a "1" upon writing */ +/* The toc is a set of bfd_vma fields. We use the fact that valid + addresses are even (i.e. the bit representing "1" is off) to allow + us to encode a little extra information in the field + - Unallocated addresses are initialized to 1. + - Allocated addresses are even numbers. + The first time we actually write a reference to the toc in the bfd, + we want to record that fact in a fixup file (if it is asked for), so + we keep track of whether or not an address has been written by marking + the low order bit with a "1" upon writing. */ #define SET_UNALLOCATED(x) ((x) = 1) #define IS_UNALLOCATED(x) ((x) == 1) @@ -75,10 +74,10 @@ extern void dump_toc PARAMS ((PTR)); #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 */ +/* Turn on this check if you suspect something amiss in the hash tables. */ #ifdef DEBUG_HASH -/* Need a 7 char string for an eye catcher */ +/* Need a 7 char string for an eye catcher. */ #define EYE "krkjunk" #define HASH_CHECK_DCL char eye_catcher[8]; @@ -101,17 +100,17 @@ extern void dump_toc PARAMS ((PTR)); #endif /* 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 */ + linker, we define our own hash table, derived from the coff one. */ /* PE linker hash table entries. */ struct ppc_coff_link_hash_entry { - struct coff_link_hash_entry root; /* First entry, as required */ + struct coff_link_hash_entry root; /* First entry, as required. */ /* As we wonder around the relocs, we'll keep the assigned toc_offset - here */ - bfd_vma toc_offset; /* Our addition, as required */ + here. */ + bfd_vma toc_offset; /* Our addition, as required. */ int symbol_is_glue; unsigned long int glue_insn; @@ -122,20 +121,20 @@ struct ppc_coff_link_hash_entry struct ppc_coff_link_hash_table { - struct coff_link_hash_table root; /* First entry, as required */ + struct coff_link_hash_table root; /* First entry, as required. */ }; static struct bfd_hash_entry *ppc_coff_link_hash_newfunc PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -static boolean ppc_coff_link_hash_table_init +static bfd_boolean ppc_coff_link_hash_table_init PARAMS ((struct ppc_coff_link_hash_table *, bfd *, struct bfd_hash_entry *(*) (struct bfd_hash_entry *, struct bfd_hash_table *, const char *))); static struct bfd_link_hash_table *ppc_coff_link_hash_table_create PARAMS ((bfd *)); -static boolean coff_ppc_relocate_section +static bfd_boolean coff_ppc_relocate_section PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, struct internal_reloc *, struct internal_syment *, asection **)); static reloc_howto_type *coff_ppc_rtype_to_howto @@ -172,11 +171,11 @@ ppc_coff_link_hash_newfunc (entry, table, string) if (ret) { /* Initialize the local fields. */ - SET_UNALLOCATED(ret->toc_offset); + SET_UNALLOCATED (ret->toc_offset); ret->symbol_is_glue = 0; ret->glue_insn = 0; - HASH_CHECK_INIT(ret); + HASH_CHECK_INIT (ret); } return (struct bfd_hash_entry *) ret; @@ -184,7 +183,7 @@ ppc_coff_link_hash_newfunc (entry, table, string) /* Initialize a PE linker hash table. */ -static boolean +static bfd_boolean ppc_coff_link_hash_table_init (table, abfd, newfunc) struct ppc_coff_link_hash_table *table; bfd *abfd; @@ -202,27 +201,27 @@ ppc_coff_link_hash_table_create (abfd) bfd *abfd; { struct ppc_coff_link_hash_table *ret; + bfd_size_type amt = sizeof (struct ppc_coff_link_hash_table); - ret = ((struct ppc_coff_link_hash_table *) - bfd_alloc (abfd, sizeof (struct ppc_coff_link_hash_table))); + ret = (struct ppc_coff_link_hash_table *) bfd_malloc (amt); if (ret == NULL) return NULL; if (! ppc_coff_link_hash_table_init (ret, abfd, ppc_coff_link_hash_newfunc)) { - bfd_release (abfd, ret); + free (ret); return (struct bfd_link_hash_table *) NULL; } return &ret->root.root; } -/* Now, tailor coffcode.h to use our hash stuff */ +/* Now, tailor coffcode.h to use our hash stuff. */ #define coff_bfd_link_hash_table_create ppc_coff_link_hash_table_create -/* The nt loader points the toc register to &toc + 32768, in order to */ -/* use the complete range of a 16-bit displacement. We have to adjust */ -/* for this when we fix up loads displaced off the toc reg. */ +/* The nt loader points the toc register to &toc + 32768, in order to + use the complete range of a 16-bit displacement. We have to adjust + for this when we fix up loads displaced off the toc reg. */ #define TOC_LOAD_ADJUSTMENT (-32768) #define TOC_SECTION_NAME ".private.toc" @@ -234,7 +233,7 @@ ppc_coff_link_hash_table_create (abfd) 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 @@ -284,31 +283,31 @@ ppc_coff_link_hash_table_create (abfd) /* va of containing section (limited to 16 bits) */ #define IMAGE_REL_PPC_SECREL16 0x000F -/* stuff to handle immediate data when the number of bits in the */ -/* data is greater than the number of bits in the immediate field */ -/* We need to do (usually) 32 bit arithmetic on 16 bit chunks */ +/* Stuff to handle immediate data when the number of bits in the + data is greater than the number of bits in the immediate field + We need to do (usually) 32 bit arithmetic on 16 bit chunks. */ #define IMAGE_REL_PPC_REFHI 0x0010 #define IMAGE_REL_PPC_REFLO 0x0011 #define IMAGE_REL_PPC_PAIR 0x0012 -/* This is essentially the same as tocrel16, with TOCDEFN assumed */ +/* This is essentially the same as tocrel16, with TOCDEFN assumed. */ #define IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 -/* Flag bits in IMAGE_RELOCATION.TYPE */ +/* Flag bits in IMAGE_RELOCATION.TYPE. */ -/* subtract reloc value rather than adding it */ +/* Subtract reloc value rather than adding it. */ #define IMAGE_REL_PPC_NEG 0x0100 -/* fix branch prediction bit to predict branch taken */ +/* Fix branch prediction bit to predict branch taken. */ #define IMAGE_REL_PPC_BRTAKEN 0x0200 -/* fix branch prediction bit to predict branch not taken */ +/* Fix branch prediction bit to predict branch not taken. */ #define IMAGE_REL_PPC_BRNTAKEN 0x0400 -/* toc slot defined in file (or, data in toc) */ +/* TOC slot defined in file (or, data in toc). */ #define IMAGE_REL_PPC_TOCDEFN 0x0800 -/* masks to isolate above values in IMAGE_RELOCATION.Type */ +/* Masks to isolate above values in IMAGE_RELOCATION.Type. */ #define IMAGE_REL_PPC_TYPEMASK 0x00FF #define IMAGE_REL_PPC_FLAGMASK 0x0F00 @@ -317,7 +316,7 @@ ppc_coff_link_hash_table_create (abfd) #define EXTRACT_JUNK(x) \ ((x) & ~(IMAGE_REL_PPC_TYPEMASK | IMAGE_REL_PPC_FLAGMASK)) -/* static helper functions to make relocation work */ +/* Static helper functions to make relocation work. */ /* (Work In Progress) */ static bfd_reloc_status_type ppc_refhi_reloc PARAMS ((bfd *abfd, @@ -385,45 +384,40 @@ static bfd_reloc_status_type ppc_imglue_reloc PARAMS ((bfd *abfd, bfd *output_bfd, char **error)); -static boolean in_reloc_p PARAMS((bfd *abfd, reloc_howto_type *howto)); +static bfd_boolean in_reloc_p PARAMS((bfd *abfd, reloc_howto_type *howto)); /* FIXME: It'll take a while to get through all of these. I only need a few to get us started, so those I'll make sure work. Those marked FIXME are either - completely unverified or have a specific unknown marked in the comment */ - -/*---------------------------------------------------------------------------*/ -/* */ -/* Relocation entries for Windows/NT on PowerPC. */ -/* */ -/* From the document "" we find the following listed as used relocs: */ -/* */ -/* ABSOLUTE : The noop */ -/* ADDR[64|32|16] : fields that hold addresses in data fields or the */ -/* 16 bit displacement field on a load/store. */ -/* ADDR[24|14] : fields that hold addresses in branch and cond */ -/* branches. These represent [26|16] bit addresses. */ -/* The low order 2 bits are preserved. */ -/* REL[24|14] : branches relative to the Instruction Address */ -/* register. These represent [26|16] bit addresses, */ -/* as before. The instruction field will be zero, and */ -/* 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. */ -/* 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) */ -/* SECREL : The value is relative to the start of the section */ -/* containing the symbol. */ -/* SECTION : access to the header containing the item. Supports the */ -/* codeview debugger. */ -/* */ -/* In particular, note that the document does not indicate that the */ -/* relocations listed in the header file are used. */ -/* */ -/* */ -/* */ -/*---------------------------------------------------------------------------*/ + completely unverified or have a specific unknown marked in the comment. */ + +/* Relocation entries for Windows/NT on PowerPC. + + From the document "" we find the following listed as used relocs: + + ABSOLUTE : The noop + ADDR[64|32|16] : fields that hold addresses in data fields or the + 16 bit displacement field on a load/store. + ADDR[24|14] : fields that hold addresses in branch and cond + branches. These represent [26|16] bit addresses. + The low order 2 bits are preserved. + REL[24|14] : branches relative to the Instruction Address + register. These represent [26|16] bit addresses, + as before. The instruction field will be zero, and + 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. + 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) + SECREL : The value is relative to the start of the section + containing the symbol. + SECTION : access to the header containing the item. Supports the + codeview debugger. + + In particular, note that the document does not indicate that the + relocations listed in the header file are used. */ + static reloc_howto_type ppc_coff_howto_table[] = { @@ -433,15 +427,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 0, /* size (0 = byte, 1 = short, 2 = long) */ 0, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* dont complain_on_overflow */ 0, /* special_function */ "ABSOLUTE", /* name */ - false, /* partial_inplace */ + FALSE, /* partial_inplace */ 0x00, /* src_mask */ 0x00, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_ADDR64 0x0001 64-bit address */ /* Unused: */ @@ -449,15 +443,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 3, /* size (0 = byte, 1 = short, 2 = long) */ 64, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "ADDR64", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ MINUS_ONE, /* src_mask */ MINUS_ONE, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_ADDR32 0x0002 32-bit address */ /* Used: */ @@ -465,15 +459,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "ADDR32", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ + 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 */ @@ -484,15 +478,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 26, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ 0, /* special_function */ "ADDR24", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0x07fffffc, /* src_mask */ 0x07fffffc, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_ADDR16 0x0004 16-bit address */ /* Used: */ @@ -500,15 +494,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ 0, /* special_function */ "ADDR16", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_ADDR14 0x0005 */ /* 16-bit address, shifted left 2 (load doubleword) */ @@ -518,15 +512,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 1, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ 0, /* special_function */ "ADDR16", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_REL24 0x0006 */ /* 26-bit PC-relative offset, shifted left 2 (branch relative) */ @@ -535,15 +529,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 26, /* bitsize */ - true, /* pc_relative */ + TRUE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ 0, /* special_function */ "REL24", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0x3fffffc, /* src_mask */ 0x3fffffc, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_REL14 0x0007 */ /* 16-bit PC-relative offset, shifted left 2 (br cond relative) */ @@ -554,15 +548,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 1, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ 0, /* special_function */ "ADDR16", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - true), /* pcrel_offset */ + TRUE), /* pcrel_offset */ /* IMAGE_REL_PPC_TOCREL16 0x0008 */ /* 16-bit offset from TOC base */ @@ -571,15 +565,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ ppc_toc16_reloc, /* special_function */ "TOCREL16", /* name */ - false, /* partial_inplace */ + FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_TOCREL14 0x0009 */ /* 16-bit offset from TOC base, shifted left 2 (load doubleword) */ @@ -588,15 +582,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 1, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ 0, /* special_function */ "TOCREL14", /* name */ - false, /* partial_inplace */ + FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_ADDR32NB 0x000A */ /* 32-bit addr w/ image base */ @@ -605,15 +599,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ 0, /* special_function */ "ADDR32NB", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_SECREL 0x000B */ /* va of containing section (as in an image sectionhdr) */ @@ -622,15 +616,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ ppc_secrel_reloc, /* special_function */ "SECREL", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - true), /* pcrel_offset */ + TRUE), /* pcrel_offset */ /* IMAGE_REL_PPC_SECTION 0x000C */ /* sectionheader number */ @@ -639,15 +633,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ ppc_section_reloc, /* special_function */ "SECTION", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - true), /* pcrel_offset */ + TRUE), /* pcrel_offset */ /* IMAGE_REL_PPC_IFGLUE 0x000D */ /* substitute TOC restore instruction iff symbol is glue code */ @@ -656,15 +650,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ 0, /* special_function */ "IFGLUE", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_IMGLUE 0x000E */ /* symbol is glue code; virtual address is TOC restore instruction */ @@ -673,15 +667,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ ppc_imglue_reloc, /* special_function */ "IMGLUE", /* name */ - false, /* partial_inplace */ + FALSE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_SECREL16 0x000F */ /* va of containing section (limited to 16 bits) */ @@ -690,15 +684,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ 0, /* special_function */ "SECREL16", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - true), /* pcrel_offset */ + TRUE), /* pcrel_offset */ /* IMAGE_REL_PPC_REFHI 0x0010 */ /* Unused: */ @@ -706,15 +700,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ ppc_refhi_reloc, /* special_function */ "REFHI", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_REFLO 0x0011 */ /* Unused: */ @@ -722,15 +716,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ ppc_refhi_reloc, /* special_function */ "REFLO", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_PAIR 0x0012 */ /* Unused: */ @@ -738,15 +732,15 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ ppc_pair_reloc, /* special_function */ "PAIR", /* name */ - true, /* partial_inplace */ + TRUE, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ /* IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 */ /* 16-bit offset from TOC base, without causing a definition */ @@ -755,19 +749,19 @@ static reloc_howto_type ppc_coff_howto_table[] = 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - false, /* pc_relative */ + FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ 0, /* special_function */ "TOCREL16, TOCDEFN", /* name */ - false, /* partial_inplace */ + FALSE, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - false), /* pcrel_offset */ + FALSE), /* pcrel_offset */ }; -/* Some really cheezy macros that can be turned on to test stderr :-) */ +/* Some really cheezy macros that can be turned on to test stderr :-) */ #ifdef DEBUG_RELOC #define UN_IMPL(x) \ @@ -792,16 +786,14 @@ static reloc_howto_type ppc_coff_howto_table[] = #define n_name _n._n_name #define n_zeroes _n._n_n._n_zeroes -#define n_offset _n._n_n._n_offset - -*/ +#define n_offset _n._n_n._n_offset */ -#define DUMP_RELOC2(n,r) \ -{ \ - fprintf (stderr,"%s sym %d, r_vaddr %d %s\n", \ - n, r->r_symndx, r->r_vaddr,\ +#define DUMP_RELOC2(n,r) \ +{ \ + fprintf (stderr,"%s sym %d, r_vaddr %d %s\n", \ + n, r->r_symndx, r->r_vaddr, \ (((r->r_type) & IMAGE_REL_PPC_TOCDEFN) == 0) \ - ?" ":" TOCDEFN" ); \ + ?" ":" TOCDEFN" ); \ } #else @@ -810,14 +802,13 @@ static reloc_howto_type ppc_coff_howto_table[] = #define DUMP_RELOC2(n,r) #endif -/* toc construction and management routines */ +/* TOC construction and management routines. */ /* This file is compiled twice, and these variables are defined in one of the compilations. FIXME: This is confusing and weird. Also, BFD should not use global variables. */ -extern bfd* bfd_of_toc_owner; +extern bfd * bfd_of_toc_owner; extern long int global_toc_size; - extern long int import_table_size; extern long int first_thunk_address; extern long int thunk_size; @@ -833,7 +824,7 @@ enum ref_category { priv, pub, - data + tocdata }; struct list_ele @@ -849,18 +840,19 @@ extern struct list_ele *head; extern struct list_ele *tail; static void record_toc - PARAMS ((asection *, int, enum ref_category, const char *)); + PARAMS ((asection *, bfd_signed_vma, enum ref_category, const char *)); static void record_toc (toc_section, our_toc_offset, cat, name) asection *toc_section; - int our_toc_offset; + bfd_signed_vma our_toc_offset; enum ref_category cat; const char *name; { - /* add this entry to our toc addr-offset-name list */ - struct list_ele *t; - t = (struct list_ele *) bfd_malloc (sizeof (struct list_ele)); + /* Add this entry to our toc addr-offset-name list. */ + bfd_size_type amt = sizeof (struct list_ele); + struct list_ele *t = (struct list_ele *) bfd_malloc (amt); + if (t == NULL) abort (); t->next = 0; @@ -883,13 +875,13 @@ record_toc (toc_section, our_toc_offset, cat, name) #ifdef COFF_IMAGE_WITH_PE -static boolean ppc_record_toc_entry +static bfd_boolean ppc_record_toc_entry PARAMS ((bfd *, struct bfd_link_info *, asection *, int, enum toc_type)); static void ppc_mark_symbol_as_glue PARAMS ((bfd *, int, struct internal_reloc *)); -/* record a toc offset against a symbol */ -static boolean +/* Record a toc offset against a symbol. */ +static bfd_boolean ppc_record_toc_entry(abfd, info, sec, sym, toc_kind) bfd *abfd; struct bfd_link_info *info ATTRIBUTE_UNUSED; @@ -913,19 +905,22 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind) if (h == 0) { local_syms = obj_coff_local_toc_table(abfd); + if (local_syms == 0) { unsigned int i; + bfd_size_type amt; + /* allocate a table */ - local_syms = - (int *) bfd_zalloc (abfd, - obj_raw_syment_count(abfd) * sizeof (int)); + amt = (bfd_size_type) obj_raw_syment_count (abfd) * sizeof (int); + local_syms = (int *) bfd_zalloc (abfd, amt); if (local_syms == 0) - return false; - obj_coff_local_toc_table(abfd) = local_syms; - for (i = 0; i < obj_raw_syment_count(abfd); ++i) + return FALSE; + obj_coff_local_toc_table (abfd) = local_syms; + + for (i = 0; i < obj_raw_syment_count (abfd); ++i) { - SET_UNALLOCATED(local_syms[i]); + SET_UNALLOCATED (local_syms[i]); } } @@ -934,12 +929,12 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind) local_syms[sym] = global_toc_size; global_toc_size += 4; - /* The size must fit in a 16bit displacment */ + /* The size must fit in a 16-bit displacement. */ if (global_toc_size > 65535) { (*_bfd_error_handler) (_("TOC overflow")); bfd_set_error (bfd_error_file_too_big); - return false; + return FALSE; } } } @@ -947,27 +942,27 @@ ppc_record_toc_entry(abfd, info, sec, sym, toc_kind) { name = h->root.root.root.string; - /* check to see if there's a toc slot allocated. If not, do it - here. It will be used in relocate_section */ + /* Check to see if there's a toc slot allocated. If not, do it + here. It will be used in relocate_section. */ if (IS_UNALLOCATED(h->toc_offset)) { h->toc_offset = global_toc_size; global_toc_size += 4; - /* The size must fit in a 16bit displacment */ + /* The size must fit in a 16-bit displacement. */ if (global_toc_size >= 65535) { (*_bfd_error_handler) (_("TOC overflow")); bfd_set_error (bfd_error_file_too_big); - return false; + return FALSE; } } } - return true; + return TRUE; } -/* record a toc offset against a symbol */ +/* Record a toc offset against a symbol. */ static void ppc_mark_symbol_as_glue(abfd, sym, rel) bfd *abfd; @@ -988,10 +983,10 @@ ppc_mark_symbol_as_glue(abfd, sym, rel) #endif /* COFF_IMAGE_WITH_PE */ -/* Return true if this relocation should +/* Return TRUE if this relocation should appear in the output .reloc section. */ -static boolean in_reloc_p(abfd, howto) +static bfd_boolean in_reloc_p(abfd, howto) bfd * abfd ATTRIBUTE_UNUSED; reloc_howto_type *howto; { @@ -1012,9 +1007,9 @@ static boolean in_reloc_p(abfd, howto) #if 0 -/* this function is in charge of performing all the ppc PE relocations */ -/* Don't yet know if we want to do this this particular way ... (krk) */ -/* FIXME: (it is not yet enabled) */ +/* This function is in charge of performing all the ppc PE relocations + Don't yet know if we want to do this this particular way ... (krk). */ +/* FIXME: (it is not yet enabled). */ static bfd_reloc_status_type pe_ppc_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, @@ -1027,9 +1022,9 @@ pe_ppc_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, bfd *output_bfd; char **error_message; { - /* the consth relocation comes in two parts, we have to remember - the state between calls, in these variables */ - static boolean part1_consth_active = false; + /* The consth relocation comes in two parts, we have to remember + the state between calls, in these variables. */ + static bfd_boolean part1_consth_active = FALSE; static unsigned long part1_consth_value; unsigned long sym_value; @@ -1040,7 +1035,7 @@ pe_ppc_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, if (output_bfd) { - /* Partial linking - do nothing */ + /* Partial linking - do nothing. */ reloc_entry->address += input_section->output_offset; return bfd_reloc_ok; } @@ -1048,10 +1043,10 @@ pe_ppc_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, if (symbol_in != NULL && bfd_is_und_section (symbol_in->section)) { - /* Keep the state machine happy in case we're called again */ + /* Keep the state machine happy in case we're called again. */ if (r_type == IMAGE_REL_PPC_REFHI) { - part1_consth_active = true; + part1_consth_active = TRUE; part1_consth_value = 0; } return(bfd_reloc_undefined); @@ -1059,7 +1054,7 @@ pe_ppc_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, if ((part1_consth_active) && (r_type != IMAGE_REL_PPC_PAIR)) { - part1_consth_active = false; + part1_consth_active = FALSE; *error_message = (char *) _("Missing PAIR"); return(bfd_reloc_dangerous); } @@ -1073,7 +1068,7 @@ pe_ppc_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, /* The reloc processing routine for the optimized COFF linker. */ -static boolean +static bfd_boolean coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, contents, relocs, syms, sections) bfd *output_bfd; @@ -1087,19 +1082,19 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, { struct internal_reloc *rel; struct internal_reloc *relend; - boolean hihalf; + bfd_boolean hihalf; bfd_vma hihalf_val; 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 + /* If we are performing a relocatable 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; + if (info->relocatable) + return TRUE; - hihalf = false; + hihalf = FALSE; hihalf_val = 0; rel = relocs; @@ -1150,7 +1145,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, sec = NULL; val = 0; - /* FIXME: PAIR unsupported in the following code */ + /* FIXME: PAIR unsupported in the following code. */ if (h == NULL) { if (symndx == -1) @@ -1181,25 +1176,25 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, { if (! ((*info->callbacks->undefined_symbol) (info, h->root.root.root.string, input_bfd, input_section, - rel->r_vaddr - input_section->vma, true))) - return false; + rel->r_vaddr - input_section->vma, TRUE))) + return FALSE; } } rstat = bfd_reloc_ok; - /* Each case must do its own relocation, setting rstat appropriately */ + /* Each case must do its own relocation, setting rstat appropriately. */ switch (r_type) { default: (*_bfd_error_handler) (_("%s: unsupported relocation type 0x%02x"), - bfd_get_filename (input_bfd), r_type); + bfd_archive_filename (input_bfd), r_type); bfd_set_error (bfd_error_bad_value); - return false; + return FALSE; case IMAGE_REL_PPC_TOCREL16: { - bfd_vma our_toc_offset; + bfd_signed_vma our_toc_offset; int fixit; DUMP_RELOC2(howto->name, rel); @@ -1216,16 +1211,15 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, } } - /* - * 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 - * the 1 bit to tell us if we've written this particular toc - * entry out. - */ - fixit = false; + /* 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 + the 1 bit to tell us if we've written this particular toc + entry out. */ + fixit = FALSE; if (h == 0) - { /* it is a file local symbol */ + { + /* It is a file local symbol. */ int *local_toc_table; const char *name; @@ -1237,26 +1231,22 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, 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. - */ + again. */ MAKE_ADDR_AGAIN(our_toc_offset); } else { - /* write out the toc entry */ - record_toc(toc_section, - our_toc_offset, - priv, - strdup(name)); - - bfd_put_32 (output_bfd, - val, + /* Write out the toc entry. */ + record_toc (toc_section, our_toc_offset, priv, + strdup (name)); + + bfd_put_32 (output_bfd, val, toc_section->contents + our_toc_offset); MARK_AS_WRITTEN(local_toc_table[symndx]); - fixit = true; + fixit = TRUE; } } else @@ -1279,97 +1269,92 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, 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 - the IAT to be part of the toc, thus saving a load. - */ + the IAT to be part of the toc, thus saving a load. */ - our_toc_offset = val - - (toc_section->output_section->vma + - toc_section->output_offset); + 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) + /* The size must still fit in a 16-bit displacement. */ + if ((bfd_vma) our_toc_offset >= 65535) { (*_bfd_error_handler) - (_("%s: Relocation for %s of %x exceeds Toc size limit"), - bfd_get_filename (input_bfd), name, our_toc_offset); + (_("%s: Relocation for %s of %lx exceeds Toc size limit"), + bfd_archive_filename (input_bfd), name, + (unsigned long) our_toc_offset); bfd_set_error (bfd_error_bad_value); - return false; + return FALSE; } - record_toc(toc_section, our_toc_offset, pub, strdup(name)); + record_toc (toc_section, our_toc_offset, pub, + strdup (name)); } - else if (IS_WRITTEN(our_toc_offset)) + 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. - */ + again. */ MAKE_ADDR_AGAIN(our_toc_offset); } else { - record_toc(toc_section, our_toc_offset, pub, strdup(name)); + record_toc(toc_section, our_toc_offset, pub, + strdup (name)); - /* write out the toc entry */ - bfd_put_32 (output_bfd, - val, + /* Write out the toc entry. */ + bfd_put_32 (output_bfd, val, toc_section->contents + our_toc_offset); MARK_AS_WRITTEN(h->toc_offset); - /* The tricky part is that this is the address that */ - /* needs a .reloc entry for it */ - fixit = true; + /* The tricky part is that this is the address that + needs a .reloc entry for it. */ + fixit = TRUE; } } 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 */ + to a section or a common symbol, then it needs a reloc. */ - /* relocation to a symbol in a section which + /* Relocation to a symbol in a section which 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; + to a file. */ + bfd_vma addr = (toc_section->output_section->vma + + toc_section->output_offset + our_toc_offset); - if (coff_data(output_bfd)->pe) + 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) + /* FIXME: this test is conservative. */ + if ((r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN + && (bfd_vma) our_toc_offset > toc_section->_raw_size) { (*_bfd_error_handler) - (_("%s: Relocation exceeds allocated TOC (%x)"), - bfd_get_filename (input_bfd), - toc_section->_raw_size); + (_("%s: Relocation exceeds allocated TOC (%lx)"), + bfd_archive_filename (input_bfd), + (unsigned long) toc_section->_raw_size); bfd_set_error (bfd_error_bad_value); - return false; + return FALSE; } - /* Now we know the relocation for this toc reference */ + /* Now we know the relocation for this toc reference. */ relocation = our_toc_offset + TOC_LOAD_ADJUSTMENT; - rstat = _bfd_relocate_contents (howto, - input_bfd, - relocation, - loc); + rstat = _bfd_relocate_contents (howto, 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. */ - /* A glue function must announce itself via a IMGLUE reloc, and */ - /* the reloc contains the required toc restore instruction */ - + /* To solve this, we need to know whether or not the symbol + 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); + + DUMP_RELOC2 (howto->name, rel); if (h != 0) { @@ -1377,36 +1362,35 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, if (h->symbol_is_glue == 1) { x = bfd_get_32 (input_bfd, loc); - bfd_put_32 (input_bfd, h->glue_insn, loc); + bfd_put_32 (input_bfd, (bfd_vma) h->glue_insn, loc); } } } break; case IMAGE_REL_PPC_SECREL: - /* Unimplemented: codeview debugging information */ + /* Unimplemented: codeview debugging information. */ /* For fast access to the header of the section containing the item. */ break; case IMAGE_REL_PPC_SECTION: - /* Unimplemented: codeview debugging information */ + /* Unimplemented: codeview debugging information. */ /* Is used to indicate that the value should be relative to the beginning of the section that contains the - symbol */ + symbol. */ break; case IMAGE_REL_PPC_ABSOLUTE: { const char *my_name; + if (h == 0) - my_name = (syms+symndx)->_n._n_name; + my_name = (syms+symndx)->_n._n_name; else - { - my_name = h->root.root.root.string; - } + my_name = h->root.root.root.string; fprintf (stderr, _("Warning: unsupported reloc %s \n"), howto->name, - bfd_get_filename(input_bfd), + bfd_archive_filename(input_bfd), input_section->name); fprintf (stderr,"sym %ld (%s), r_vaddr %ld (%lx)\n", @@ -1417,33 +1401,35 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, 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 */ + pass over the relocs, and the glue instruction extracted. */ const char *my_name; + 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"), - bfd_get_filename (input_bfd), my_name); + bfd_archive_filename (input_bfd), my_name); bfd_set_error (bfd_error_bad_value); - return false; + return FALSE; } case IMAGE_REL_PPC_ADDR32NB: { - struct coff_link_hash_entry *myh = 0; const char *name = 0; - DUMP_RELOC2(howto->name, rel); + + DUMP_RELOC2 (howto->name, rel); if (strncmp(".idata$2",input_section->name,8) == 0 && first_thunk_address == 0) { - /* set magic values */ + /* Set magic values. */ int idata5offset; - struct coff_link_hash_entry *myh = 0; + struct coff_link_hash_entry *myh; + myh = coff_link_hash_lookup (coff_hash_table (info), "__idata5_magic__", - false, false, true); + FALSE, FALSE, TRUE); first_thunk_address = myh->root.u.def.value + sec->output_section->vma + sec->output_offset - @@ -1452,17 +1438,18 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, idata5offset = myh->root.u.def.value; myh = coff_link_hash_lookup (coff_hash_table (info), "__idata6_magic__", - false, false, true); + FALSE, FALSE, TRUE); thunk_size = myh->root.u.def.value - idata5offset; myh = coff_link_hash_lookup (coff_hash_table (info), "__idata4_magic__", - false, false, true); + FALSE, FALSE, TRUE); import_table_size = myh->root.u.def.value; } if (h == 0) - { /* it is a file local symbol */ + { + /* It is a file local symbol. */ sym = syms + symndx; name = sym->_n._n_name; } @@ -1471,20 +1458,20 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, char *target = 0; name = h->root.root.root.string; - if (strcmp(".idata$2", name) == 0) + if (strcmp (".idata$2", name) == 0) target = "__idata2_magic__"; - else if (strcmp(".idata$4", name) == 0) + else if (strcmp (".idata$4", name) == 0) target = "__idata4_magic__"; - else if (strcmp(".idata$5", name) == 0) + else if (strcmp (".idata$5", name) == 0) target = "__idata5_magic__"; if (target != 0) { - myh = 0; + struct coff_link_hash_entry *myh; myh = coff_link_hash_lookup (coff_hash_table (info), target, - false, false, true); + FALSE, FALSE, TRUE); if (myh == 0) { /* Missing magic cookies. Something is very wrong. */ @@ -1498,7 +1485,7 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, int idata5offset; myh = coff_link_hash_lookup (coff_hash_table (info), "__idata5_magic__", - false, false, true); + FALSE, FALSE, TRUE); first_thunk_address = myh->root.u.def.value + sec->output_section->vma + sec->output_offset - @@ -1507,22 +1494,22 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, idata5offset = myh->root.u.def.value; myh = coff_link_hash_lookup (coff_hash_table (info), "__idata6_magic__", - false, false, true); + FALSE, FALSE, TRUE); thunk_size = myh->root.u.def.value - idata5offset; myh = coff_link_hash_lookup (coff_hash_table (info), "__idata4_magic__", - false, false, true); + FALSE, FALSE, TRUE); import_table_size = myh->root.u.def.value; } } } rstat = _bfd_relocate_contents (howto, - input_bfd, - val - - pe_data(output_bfd)->pe_opthdr.ImageBase, - loc); + input_bfd, + val - + pe_data (output_bfd)->pe_opthdr.ImageBase, + loc); } break; @@ -1547,24 +1534,23 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, break; } - if ( info->base_file ) + if (info->base_file) { /* So if this is non pcrelative, and is referenced - to a section or a common symbol, then it needs a reloc */ - if (sym && pe_data(output_bfd)->in_reloc_p(output_bfd, howto)) + to a section or a common symbol, then it needs a reloc. */ + if (sym && pe_data(output_bfd)->in_reloc_p (output_bfd, howto)) { - /* relocation to a symbol in a section which + /* Relocation to a symbol in a section which isn't absolute - we output the address here - to a file */ + to a file. */ bfd_vma addr = rel->r_vaddr - input_section->vma + input_section->output_offset + input_section->output_section->vma; - if (coff_data(output_bfd)->pe) - { - addr -= pe_data(output_bfd)->pe_opthdr.ImageBase; - } + if (coff_data (output_bfd)->pe) + addr -= pe_data (output_bfd)->pe_opthdr.ImageBase; + fwrite (&addr, 1,4, (FILE *) info->base_file); } } @@ -1600,15 +1586,12 @@ coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, (info, name, howto->name, (bfd_vma) 0, input_bfd, input_section, rel->r_vaddr - input_section->vma))) - { - return false; - } + return FALSE; } } - } - return true; + return TRUE; } #ifdef COFF_IMAGE_WITH_PE @@ -1654,7 +1637,7 @@ dump_toc (vfile) cat = _("private "); else if (t->cat == pub) cat = _("public "); - else if (t->cat == data) + else if (t->cat == tocdata) cat = _("data-in-toc "); if (t->offset > global_toc_size) @@ -1665,7 +1648,8 @@ dump_toc (vfile) { fprintf (file, _("**** global_toc_size %ld(%lx), thunk_size %ld(%lx)\n"), - global_toc_size, global_toc_size, thunk_size, thunk_size); + global_toc_size, global_toc_size, + thunk_size, thunk_size); cat = _("Out of bounds!"); } } @@ -1681,40 +1665,38 @@ dump_toc (vfile) fprintf (file, "\n"); } -boolean +bfd_boolean ppc_allocate_toc_section (info) struct bfd_link_info *info ATTRIBUTE_UNUSED; { asection *s; bfd_byte *foo; + bfd_size_type amt; static char test_char = '1'; - if ( global_toc_size == 0 ) /* FIXME: does this get me in trouble? */ - return true; + if ( global_toc_size == 0 ) /* FIXME: does this get me in trouble? */ + return TRUE; if (bfd_of_toc_owner == 0) - { - /* No toc owner? Something is very wrong. */ - abort (); - } + /* No toc owner? Something is very wrong. */ + abort (); s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME); if (s == NULL) - { - /* No toc section? Something is very wrong. */ - abort (); - } + /* No toc section? Something is very wrong. */ + abort (); - foo = (bfd_byte *) bfd_alloc(bfd_of_toc_owner, global_toc_size); - memset(foo, test_char, global_toc_size); + amt = global_toc_size; + foo = (bfd_byte *) bfd_alloc (bfd_of_toc_owner, amt); + memset(foo, test_char, (size_t) global_toc_size); s->_raw_size = s->_cooked_size = global_toc_size; s->contents = foo; - return true; + return TRUE; } -boolean +bfd_boolean ppc_process_before_allocation (abfd, info) bfd *abfd; struct bfd_link_info *info; @@ -1722,72 +1704,64 @@ ppc_process_before_allocation (abfd, info) asection *sec; struct internal_reloc *i, *rel; - /* here we have a bfd that is to be included on the link. We have a hook + /* 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. */ + _bfd_coff_get_external_symbols (abfd); - _bfd_coff_get_external_symbols(abfd); - - /* rummage around all the relocs and map the toc */ + /* Rummage around all the relocs and map the toc. */ sec = abfd->sections; if (sec == 0) - { - return true; - } + return TRUE; for (; sec != 0; sec = sec->next) - { - if (sec->reloc_count == 0) - continue; + { + 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); + /* 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 (); + if (i == 0) + abort (); - for (rel=i;relreloc_count;++rel) - { - unsigned short r_type = EXTRACT_TYPE (rel->r_type); - unsigned short r_flags = EXTRACT_FLAGS(rel->r_type); - boolean ok = true; + 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); + bfd_boolean ok = TRUE; - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel); + DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, rel); - 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, - rel->r_symndx, default_toc); - if (!ok) - return false; - break; - case IMAGE_REL_PPC_IMGLUE: - ppc_mark_symbol_as_glue(abfd, rel->r_symndx, rel); - break; - default: - break; - } - } - } + 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, + rel->r_symndx, default_toc); + if (!ok) + return FALSE; + break; + case IMAGE_REL_PPC_IMGLUE: + ppc_mark_symbol_as_glue (abfd, rel->r_symndx, rel); + break; + default: + break; + } + } + } - return true; + return TRUE; } #endif static bfd_reloc_status_type -ppc_refhi_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) +ppc_refhi_reloc (abfd, reloc_entry, symbol, data, + input_section, output_bfd, error_message) bfd *abfd ATTRIBUTE_UNUSED; arelent *reloc_entry ATTRIBUTE_UNUSED; asymbol *symbol ATTRIBUTE_UNUSED; @@ -1808,13 +1782,8 @@ ppc_refhi_reloc (abfd, #if 0 static bfd_reloc_status_type -ppc_reflo_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) +ppc_reflo_reloc (abfd, reloc_entry, symbol, data, + input_section, output_bfd, error_message) bfd *abfd; arelent *reloc_entry; asymbol *symbol; @@ -1835,13 +1804,8 @@ ppc_reflo_reloc (abfd, #endif static bfd_reloc_status_type -ppc_pair_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) +ppc_pair_reloc (abfd, reloc_entry, symbol, data, + input_section, output_bfd, error_message) bfd *abfd ATTRIBUTE_UNUSED; arelent *reloc_entry ATTRIBUTE_UNUSED; asymbol *symbol ATTRIBUTE_UNUSED; @@ -1860,13 +1824,8 @@ ppc_pair_reloc (abfd, } static bfd_reloc_status_type -ppc_toc16_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) +ppc_toc16_reloc (abfd, reloc_entry, symbol, data, + input_section, output_bfd, error_message) bfd *abfd ATTRIBUTE_UNUSED; arelent *reloc_entry ATTRIBUTE_UNUSED; asymbol *symbol ATTRIBUTE_UNUSED; @@ -1875,33 +1834,24 @@ ppc_toc16_reloc (abfd, bfd *output_bfd; char **error_message ATTRIBUTE_UNUSED; { - UN_IMPL("TOCREL16"); - DUMP_RELOC("TOCREL16",reloc_entry); + UN_IMPL ("TOCREL16"); + DUMP_RELOC ("TOCREL16",reloc_entry); if (output_bfd == (bfd *) NULL) - { - return bfd_reloc_continue; - } + return bfd_reloc_continue; return bfd_reloc_ok; } #if 0 -/* 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) */ -/* */ -/* */ +/* 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). */ static bfd_reloc_status_type -ppc_addr32nb_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) +ppc_addr32nb_reloc (abfd, reloc_entry, symbol, data, + input_section, output_bfd, error_message) bfd *abfd; arelent *reloc_entry; asymbol *symbol; @@ -1919,13 +1869,8 @@ ppc_addr32nb_reloc (abfd, #endif static bfd_reloc_status_type -ppc_secrel_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) +ppc_secrel_reloc (abfd, reloc_entry, symbol, data, + input_section, output_bfd, error_message) bfd *abfd ATTRIBUTE_UNUSED; arelent *reloc_entry ATTRIBUTE_UNUSED; asymbol *symbol ATTRIBUTE_UNUSED; @@ -1944,13 +1889,8 @@ ppc_secrel_reloc (abfd, } static bfd_reloc_status_type -ppc_section_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) +ppc_section_reloc (abfd, reloc_entry, symbol, data, + input_section, output_bfd, error_message) bfd *abfd ATTRIBUTE_UNUSED; arelent *reloc_entry ATTRIBUTE_UNUSED; asymbol *symbol ATTRIBUTE_UNUSED; @@ -1969,13 +1909,8 @@ ppc_section_reloc (abfd, } static bfd_reloc_status_type -ppc_imglue_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) +ppc_imglue_reloc (abfd, reloc_entry, symbol, data, + input_section, output_bfd, error_message) bfd *abfd ATTRIBUTE_UNUSED; arelent *reloc_entry ATTRIBUTE_UNUSED; asymbol *symbol ATTRIBUTE_UNUSED; @@ -1996,19 +1931,16 @@ ppc_imglue_reloc (abfd, #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, +/* FIXME: There is a possibility that when we read in a reloc from a file, 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, - struct internal_reloc *internal)); + type field. Not yet implemented. */ +static void ppc_coff_rtype2howto PARAMS ((arelent *, struct internal_reloc *)); static void 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: 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction @@ -2017,19 +1949,18 @@ ppc_coff_rtype2howto (relent, internal) the branch is expected to be taken or not. 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file For now, we just strip this stuff to find the type, and ignore it other - than that. - */ + than that. */ reloc_howto_type *howto; unsigned short r_type = EXTRACT_TYPE (internal->r_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. */ + /* 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 ) + /* Check for absolute crap. */ + if (junk != 0) abort (); switch(r_type) @@ -2042,15 +1973,15 @@ ppc_coff_rtype2howto (relent, internal) case IMAGE_REL_PPC_ADDR32NB: case IMAGE_REL_PPC_SECTION: case IMAGE_REL_PPC_SECREL: - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, internal); + DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal); howto = ppc_coff_howto_table + r_type; break; case IMAGE_REL_PPC_IMGLUE: - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, internal); + DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal); howto = ppc_coff_howto_table + r_type; break; case IMAGE_REL_PPC_TOCREL16: - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, internal); + DUMP_RELOC2 (ppc_coff_howto_table[r_type].name, internal); if (r_flags & IMAGE_REL_PPC_TOCDEFN) howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN; else @@ -2066,7 +1997,6 @@ ppc_coff_rtype2howto (relent, internal) } relent->howto = howto; - } static reloc_howto_type * @@ -2088,19 +2018,18 @@ coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp) the branch is expected to be taken or not. 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file For now, we just strip this stuff to find the type, and ignore it other - than that. - */ + than that. */ - unsigned short r_type = EXTRACT_TYPE (rel->r_type); - unsigned short r_flags = EXTRACT_FLAGS(rel->r_type); - unsigned short junk = EXTRACT_JUNK (rel->r_type); + unsigned short r_type = EXTRACT_TYPE (rel->r_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 ) + /* Check for absolute crap. */ + if (junk != 0) abort (); switch(r_type) @@ -2143,7 +2072,7 @@ coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp) return howto; } -/* a cheesy little macro to make the code a little more readable */ +/* 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] @@ -2169,7 +2098,6 @@ ppc_coff_reloc_type_lookup (abfd, code) default: return NULL; } - /*NOTREACHED*/ } #undef HOW2MAP @@ -2178,10 +2106,6 @@ ppc_coff_reloc_type_lookup (abfd, code) #define RTYPE2HOWTO(cache_ptr, dst) ppc_coff_rtype2howto (cache_ptr, dst) -#ifndef COFF_IMAGE_WITH_PE -static void ppc_coff_swap_sym_in_hook PARAMS ((bfd *, PTR, PTR)); -#endif - /* We use the special COFF backend linker, with our own special touch. */ #define coff_bfd_reloc_type_lookup ppc_coff_reloc_type_lookup @@ -2191,8 +2115,10 @@ static void ppc_coff_swap_sym_in_hook PARAMS ((bfd *, PTR, PTR)); #ifndef COFF_IMAGE_WITH_PE /* FIXME: This no longer works. */ +#if 0 #define coff_swap_sym_in_hook ppc_coff_swap_sym_in_hook #endif +#endif #define SELECT_RELOC(internal, howto) {internal.r_type=howto->type;} @@ -2220,6 +2146,8 @@ static void ppc_coff_swap_sym_in_hook PARAMS ((bfd *, PTR, PTR)); #include "coffcode.h" #ifndef COFF_IMAGE_WITH_PE +/* FIXME: This no longer works. */ +#if 0 /* FIXME: 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 @@ -2231,8 +2159,8 @@ static void ppc_coff_swap_sym_in_hook PARAMS ((bfd *, PTR, PTR)); 2. It's not clear to me that being the last bfd read necessarily means that you are the last bfd closed. 3. Doing it on a "swap in" hook depends on when the "swap in" is called, - and how often, etc. It's not clear to me that there isn't a hole here. -*/ + and how often, etc. It's not clear to me that there isn't a hole here. */ +static void ppc_coff_swap_sym_in_hook PARAMS ((bfd *, PTR, PTR)); static void ppc_coff_swap_sym_in_hook (abfd, ext1, in1) @@ -2240,21 +2168,19 @@ ppc_coff_swap_sym_in_hook (abfd, ext1, in1) PTR ext1 ATTRIBUTE_UNUSED; PTR in1; { - struct internal_syment *in = (struct internal_syment *)in1; + struct internal_syment * in = (struct internal_syment *)in1; - if (bfd_of_toc_owner != 0) /* we already have a toc, so go home */ + if (bfd_of_toc_owner != 0) /* We already have a toc, so go home. */ return; - if (strcmp(in->_n._n_name, ".toc") == 0) + if (strcmp (in->_n._n_name, ".toc") == 0) { flagword flags; register asection *s; - s = bfd_get_section_by_name ( abfd , TOC_SECTION_NAME); + s = bfd_get_section_by_name (abfd, TOC_SECTION_NAME); if (s != NULL) - { - return; - } + return; flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY ; @@ -2263,32 +2189,31 @@ ppc_coff_swap_sym_in_hook (abfd, ext1, in1) if (s == NULL || !bfd_set_section_flags (abfd, s, flags) || !bfd_set_section_alignment (abfd, s, 2)) - { - /* FIXME: set appropriate bfd error */ - abort (); - } + /* FIXME: set appropriate bfd error. */ + abort (); - /* save the bfd for later allocation */ + /* Save the bfd for later allocation. */ bfd_of_toc_owner = abfd; } return; } #endif +#endif #ifndef COFF_IMAGE_WITH_PE -static boolean ppc_do_last PARAMS ((bfd *)); +static bfd_boolean ppc_do_last PARAMS ((bfd *)); static bfd *ppc_get_last PARAMS ((void)); -static boolean +static bfd_boolean ppc_do_last (abfd) bfd *abfd; { if (abfd == bfd_of_toc_owner) - return true; + return TRUE; else - return false; + return FALSE; } static bfd * @@ -2297,7 +2222,7 @@ ppc_get_last() return bfd_of_toc_owner; } -/* this piece of machinery exists only to guarantee that the bfd that holds +/* This piece of machinery exists only to guarantee that the bfd that holds the toc section is written last. This does depend on bfd_make_section attaching a new section to the @@ -2306,26 +2231,25 @@ ppc_get_last() 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 -*/ + precise form of comment. krk@cygnus.com */ /* Do the final link step. */ -boolean +bfd_boolean ppc_bfd_coff_final_link (abfd, info) bfd *abfd; struct bfd_link_info *info; { bfd_size_type symesz; struct coff_final_link_info finfo; - boolean debug_merge_allocated; + bfd_boolean debug_merge_allocated; asection *o; struct bfd_link_order *p; - size_t max_sym_count; - size_t max_lineno_count; - size_t max_reloc_count; - size_t max_output_reloc_count; - size_t max_contents_size; + bfd_size_type max_sym_count; + bfd_size_type max_lineno_count; + bfd_size_type max_reloc_count; + bfd_size_type max_output_reloc_count; + bfd_size_type max_contents_size; file_ptr rel_filepos; unsigned int relsz; file_ptr line_filepos; @@ -2333,6 +2257,7 @@ ppc_bfd_coff_final_link (abfd, info) bfd *sub; bfd_byte *external_relocs = NULL; char strbuf[STRING_SIZE_SIZE]; + bfd_size_type amt; symesz = bfd_coff_symesz (abfd); @@ -2350,7 +2275,7 @@ ppc_bfd_coff_final_link (abfd, info) finfo.contents = NULL; finfo.external_relocs = NULL; finfo.internal_relocs = NULL; - debug_merge_allocated = false; + debug_merge_allocated = FALSE; coff_data (abfd)->link_info = info; @@ -2360,13 +2285,13 @@ ppc_bfd_coff_final_link (abfd, info) if (! coff_debug_merge_hash_table_init (&finfo.debug_merge)) goto error_return; - debug_merge_allocated = true; + debug_merge_allocated = TRUE; /* Compute the file positions for all the sections. */ if (! abfd->output_has_begun) { if (! bfd_coff_compute_section_file_positions (abfd)) - return false; + return FALSE; } /* Count the line numbers and relocation entries required for the @@ -2381,9 +2306,9 @@ ppc_bfd_coff_final_link (abfd, info) { o->reloc_count = 0; o->lineno_count = 0; + for (p = o->link_order_head; p != NULL; p = p->next) { - if (p->type == bfd_indirect_link_order) { asection *sec; @@ -2394,13 +2319,13 @@ ppc_bfd_coff_final_link (abfd, info) link. This will normally be every section. We need to do this so that we can identify any sections which the linker has decided to not include. */ - sec->linker_mark = true; + sec->linker_mark = TRUE; if (info->strip == strip_none || info->strip == strip_some) o->lineno_count += sec->lineno_count; - if (info->relocateable) + if (info->relocatable) o->reloc_count += sec->reloc_count; if (sec->_raw_size > max_contents_size) @@ -2410,7 +2335,7 @@ ppc_bfd_coff_final_link (abfd, info) if (sec->reloc_count > max_reloc_count) max_reloc_count = sec->reloc_count; } - else if (info->relocateable + else if (info->relocatable && (p->type == bfd_section_reloc_link_order || p->type == bfd_symbol_reloc_link_order)) ++o->reloc_count; @@ -2425,20 +2350,21 @@ ppc_bfd_coff_final_link (abfd, info) } } - /* If doing a relocateable link, allocate space for the pointers we + /* If doing a relocatable link, allocate space for the pointers we need to keep. */ - if (info->relocateable) + if (info->relocatable) { unsigned int i; /* We use section_count + 1, rather than section_count, because the target_index fields are 1 based. */ - finfo.section_info = - ((struct coff_link_section_info *) - bfd_malloc ((abfd->section_count + 1) - * sizeof (struct coff_link_section_info))); + amt = abfd->section_count + 1; + amt *= sizeof (struct coff_link_section_info); + finfo.section_info = (struct coff_link_section_info *) bfd_malloc (amt); + if (finfo.section_info == NULL) goto error_return; + for (i = 0; i <= abfd->section_count; i++) { finfo.section_info[i].relocs = NULL; @@ -2451,6 +2377,7 @@ ppc_bfd_coff_final_link (abfd, info) line_filepos = rel_filepos; linesz = bfd_coff_linesz (abfd); max_output_reloc_count = 0; + for (o = abfd->sections; o != NULL; o = o->next) { if (o->lineno_count == 0) @@ -2474,16 +2401,17 @@ ppc_bfd_coff_final_link (abfd, info) Because of this problem, we also keep the relocs in memory until the end of the link. This wastes memory, - but only when doing a relocateable link, which is not the + but only when doing a relocatable link, which is not the common case. */ - BFD_ASSERT (info->relocateable); + BFD_ASSERT (info->relocatable); + amt = o->reloc_count; + amt *= sizeof (struct internal_reloc); finfo.section_info[o->target_index].relocs = - ((struct internal_reloc *) - bfd_malloc (o->reloc_count * sizeof (struct internal_reloc))); + (struct internal_reloc *) bfd_malloc (amt); + amt = o->reloc_count; + amt *= sizeof (struct coff_link_hash_entry *); finfo.section_info[o->target_index].rel_hashes = - ((struct coff_link_hash_entry **) - bfd_malloc (o->reloc_count - * sizeof (struct coff_link_hash_entry *))); + (struct coff_link_hash_entry **) bfd_malloc (amt); if (finfo.section_info[o->target_index].relocs == NULL || finfo.section_info[o->target_index].rel_hashes == NULL) goto error_return; @@ -2506,31 +2434,32 @@ ppc_bfd_coff_final_link (abfd, info) max_sym_count = 0; for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) { - size_t sz; + bfd_size_type sz; - sub->output_has_begun = false; + sub->output_has_begun = FALSE; sz = obj_raw_syment_count (sub); if (sz > max_sym_count) max_sym_count = sz; } /* Allocate some buffers used while linking. */ - finfo.internal_syms = ((struct internal_syment *) - bfd_malloc (max_sym_count - * sizeof (struct internal_syment))); - finfo.sec_ptrs = (asection **) bfd_malloc (max_sym_count - * sizeof (asection *)); - finfo.sym_indices = (long *) bfd_malloc (max_sym_count * sizeof (long)); - finfo.outsyms = ((bfd_byte *) - bfd_malloc ((size_t) ((max_sym_count + 1) * symesz))); - finfo.linenos = (bfd_byte *) bfd_malloc (max_lineno_count - * bfd_coff_linesz (abfd)); + amt = max_sym_count * sizeof (struct internal_syment); + finfo.internal_syms = (struct internal_syment *) bfd_malloc (amt); + amt = max_sym_count * sizeof (asection *); + finfo.sec_ptrs = (asection **) bfd_malloc (amt); + amt = max_sym_count * sizeof (long); + finfo.sym_indices = (long *) bfd_malloc (amt); + amt = (max_sym_count + 1) * symesz; + finfo.outsyms = (bfd_byte *) bfd_malloc (amt); + amt = max_lineno_count * bfd_coff_linesz (abfd); + finfo.linenos = (bfd_byte *) bfd_malloc (amt); finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size); finfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz); - if (! info->relocateable) - finfo.internal_relocs = ((struct internal_reloc *) - bfd_malloc (max_reloc_count - * sizeof (struct internal_reloc))); + if (! info->relocatable) + { + amt = max_reloc_count * sizeof (struct internal_reloc); + finfo.internal_relocs = (struct internal_reloc *) bfd_malloc (amt); + } if ((finfo.internal_syms == NULL && max_sym_count > 0) || (finfo.sec_ptrs == NULL && max_sym_count > 0) || (finfo.sym_indices == NULL && max_sym_count > 0) @@ -2538,7 +2467,7 @@ ppc_bfd_coff_final_link (abfd, info) || (finfo.linenos == NULL && max_lineno_count > 0) || (finfo.contents == NULL && max_contents_size > 0) || (finfo.external_relocs == NULL && max_reloc_count > 0) - || (! info->relocateable + || (! info->relocatable && finfo.internal_relocs == NULL && max_reloc_count > 0)) goto error_return; @@ -2573,7 +2502,7 @@ ppc_bfd_coff_final_link (abfd, info) { if (! _bfd_coff_link_input_bfd (&finfo, sub)) goto error_return; - sub->output_has_begun = true; + sub->output_has_begun = TRUE; } } else if (p->type == bfd_section_reloc_link_order @@ -2598,14 +2527,13 @@ ppc_bfd_coff_final_link (abfd, info) if (! _bfd_coff_link_input_bfd (&finfo, last_one)) goto error_return; } - last_one->output_has_begun = true; + last_one->output_has_begun = TRUE; } #endif /* Free up the buffers used by _bfd_coff_link_input_bfd. */ - coff_debug_merge_hash_table_free (&finfo.debug_merge); - debug_merge_allocated = false; + debug_merge_allocated = FALSE; if (finfo.internal_syms != NULL) { @@ -2649,19 +2577,19 @@ ppc_bfd_coff_final_link (abfd, info) if (finfo.last_file_index != -1 && (unsigned int) finfo.last_file.n_value != obj_raw_syment_count (abfd)) { + file_ptr pos; + finfo.last_file.n_value = obj_raw_syment_count (abfd); bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file, (PTR) finfo.outsyms); - if (bfd_seek (abfd, - (obj_sym_filepos (abfd) - + finfo.last_file_index * symesz), - SEEK_SET) != 0 - || bfd_write (finfo.outsyms, symesz, 1, abfd) != symesz) - return false; + pos = obj_sym_filepos (abfd) + finfo.last_file_index * symesz; + if (bfd_seek (abfd, pos, SEEK_SET) != 0 + || bfd_bwrite (finfo.outsyms, symesz, abfd) != symesz) + return FALSE; } /* Write out the global symbols. */ - finfo.failed = false; + finfo.failed = FALSE; coff_link_hash_traverse (coff_hash_table (info), _bfd_coff_write_global_sym, (PTR) &finfo); if (finfo.failed) @@ -2674,13 +2602,13 @@ ppc_bfd_coff_final_link (abfd, info) finfo.outsyms = NULL; } - if (info->relocateable) + if (info->relocatable) { /* Now that we have written out all the global symbols, we know the symbol indices to use for relocs against them, and we can finally write out the relocs. */ - external_relocs = ((bfd_byte *) - bfd_malloc (max_output_reloc_count * relsz)); + amt = max_output_reloc_count * relsz; + external_relocs = (bfd_byte *) bfd_malloc (amt); if (external_relocs == NULL) goto error_return; @@ -2708,9 +2636,9 @@ ppc_bfd_coff_final_link (abfd, info) bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel); } + amt = relsz * o->reloc_count; if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0 - || bfd_write ((PTR) external_relocs, relsz, o->reloc_count, - abfd) != relsz * o->reloc_count) + || bfd_bwrite ((PTR) external_relocs, amt, abfd) != amt) goto error_return; } @@ -2738,31 +2666,32 @@ ppc_bfd_coff_final_link (abfd, info) if (coff_hash_table (info)->stab_info != NULL) { if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info)) - return false; + return FALSE; } /* Write out the string table. */ if (obj_raw_syment_count (abfd) != 0) { - if (bfd_seek (abfd, - (obj_sym_filepos (abfd) - + obj_raw_syment_count (abfd) * symesz), - SEEK_SET) != 0) - return false; + file_ptr pos; + + pos = obj_sym_filepos (abfd) + obj_raw_syment_count (abfd) * symesz; + if (bfd_seek (abfd, pos, SEEK_SET) != 0) + return FALSE; #if STRING_SIZE_SIZE == 4 - bfd_h_put_32 (abfd, - _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE, - (bfd_byte *) strbuf); + H_PUT_32 (abfd, + _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE, + strbuf); #else - #error Change bfd_h_put_32 + #error Change H_PUT_32 above #endif - if (bfd_write (strbuf, 1, STRING_SIZE_SIZE, abfd) != STRING_SIZE_SIZE) - return false; + if (bfd_bwrite (strbuf, (bfd_size_type) STRING_SIZE_SIZE, abfd) + != STRING_SIZE_SIZE) + return FALSE; if (! _bfd_stringtab_emit (abfd, finfo.strtab)) - return false; + return FALSE; } _bfd_stringtab_free (finfo.strtab); @@ -2771,7 +2700,7 @@ ppc_bfd_coff_final_link (abfd, info) not try to write out the symbols. */ bfd_get_symcount (abfd) = 0; - return true; + return TRUE; error_return: if (debug_merge_allocated) @@ -2809,7 +2738,7 @@ ppc_bfd_coff_final_link (abfd, info) free (finfo.internal_relocs); if (external_relocs != NULL) free (external_relocs); - return false; + return FALSE; } #endif