Add WinCE support.
This commit is contained in:
parent
77343c58f9
commit
17505c5cfa
18 changed files with 2475 additions and 92 deletions
|
@ -1,3 +1,52 @@
|
|||
2000-02-28 Nick Clifton <nickc@cygnus.com>
|
||||
|
||||
* Makefile.am: Add rules to build pe[i]-{sh|mips}.lo objects.
|
||||
* Makefile.in: Regenerate.
|
||||
|
||||
* configure.in: Add support for mips and sh pe vectors.
|
||||
* configure: regenerate.
|
||||
|
||||
* config.bfd: Add support for arm-wince, mips-pe and sh-pe
|
||||
targets.
|
||||
|
||||
* targets.c: Add mips and sh pe vectors.
|
||||
|
||||
* libpei.h (coff_final_link_postscript): Only define if not
|
||||
already defined.
|
||||
|
||||
* coffcode.h: Add support for WinCE magic numbers.
|
||||
|
||||
* peigen.c (pe_print_reloc): Update comment and rearrange
|
||||
appending of newline character.
|
||||
|
||||
* peicode.h: Add support for Image Library Format.
|
||||
(pe_ILF_vars): Structure containing data used by ILF code.
|
||||
(pe_ILF_make_a_section): New function. Create a section based
|
||||
on ILF data.
|
||||
(pe_ILF_make_a_reloc): New function. Create a reloc based on
|
||||
ILF data.
|
||||
(pe_ILF_make_a_symbol): New function. Create a symbol based
|
||||
on ILF data.
|
||||
(pe_ILF_save_relocs): New function. Store the relocs created
|
||||
by pe_ILF_make_a_reloc in a section.
|
||||
(pe_ILF_build_a_bfd): New function. Create a BFD describing
|
||||
an ILF object.
|
||||
(pe_ILF_object_p): New function. Return a bfd_target pointer
|
||||
for an ILF object.
|
||||
(pe_bfd_object_p): If an ILF object is detected call
|
||||
pe_ILF_object_p on it.
|
||||
|
||||
* coff-arm.c: Add support for WinCE relocs which are different
|
||||
from normal ARM COFF relocs.
|
||||
* pe-arm.c: Unset TARGET_UNDERSCORE for a WinCE target.
|
||||
|
||||
* coff-sh.c: Add support for sh-pe target.
|
||||
* pe-sh.c: New file. Support code for sh-pe target.
|
||||
* pei-sh.c: New file. Support code for sh-pe target.
|
||||
|
||||
* pe-mips.c: New file. Support code for mips-pe target.
|
||||
* pei-mips.c: New file. Support code for mips-pe target.
|
||||
|
||||
2000-02-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* elf32-sparc.c (elf32_sparc_merge_private_bfd_data): Don't bump
|
||||
|
|
|
@ -218,6 +218,10 @@ BFD32_BACKENDS = \
|
|||
pei-mcore.lo \
|
||||
pe-ppc.lo \
|
||||
pei-ppc.lo \
|
||||
pe-sh.lo \
|
||||
pei-sh.lo \
|
||||
pe-mips.lo \
|
||||
pei-mips.lo \
|
||||
peigen.lo \
|
||||
ppcboot.lo \
|
||||
reloc16.lo \
|
||||
|
@ -343,6 +347,10 @@ BFD32_BACKENDS_CFILES = \
|
|||
pei-mcore.c \
|
||||
pe-ppc.c \
|
||||
pei-ppc.c \
|
||||
pe-sh.c \
|
||||
pei-sh.c \
|
||||
pe-mips.c \
|
||||
pei-mips.c \
|
||||
peigen.c \
|
||||
ppcboot.c \
|
||||
reloc16.c \
|
||||
|
@ -1011,6 +1019,12 @@ pe-i386.lo: pe-i386.c coff-i386.c $(INCDIR)/coff/i386.h \
|
|||
pei-i386.lo: pei-i386.c coff-i386.c $(INCDIR)/coff/i386.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.h
|
||||
pe-mips.lo: pe-mips.c $(INCDIR)/coff/mipspe.h $(INCDIR)/coff/internal.h \
|
||||
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h coffcode.h \
|
||||
peicode.h
|
||||
pei-mips.lo: pei-mips.c pe-mips.c $(INCDIR)/coff/mipspe.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h
|
||||
pe-mcore.lo: pe-mcore.c coff-mcore.c $(INCDIR)/coff/mcore.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.h
|
||||
|
@ -1023,6 +1037,12 @@ pe-ppc.lo: pe-ppc.c coff-ppc.c $(INCDIR)/coff/powerpc.h \
|
|||
pei-ppc.lo: pei-ppc.c coff-ppc.c $(INCDIR)/coff/powerpc.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.h
|
||||
pe-sh.lo: pe-sh.c coff-sh.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/sh.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
coffcode.h peicode.h
|
||||
pei-sh.lo: pei-sh.c coff-sh.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/sh.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
coffcode.h peicode.h
|
||||
peigen.lo: peigen.c $(INCDIR)/coff/internal.h $(INCDIR)/coff/i386.h \
|
||||
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h
|
||||
ppcboot.lo: ppcboot.c
|
||||
|
|
|
@ -335,6 +335,10 @@ BFD32_BACKENDS = \
|
|||
pei-mcore.lo \
|
||||
pe-ppc.lo \
|
||||
pei-ppc.lo \
|
||||
pe-sh.lo \
|
||||
pei-sh.lo \
|
||||
pe-mips.lo \
|
||||
pei-mips.lo \
|
||||
peigen.lo \
|
||||
ppcboot.lo \
|
||||
reloc16.lo \
|
||||
|
@ -461,6 +465,10 @@ BFD32_BACKENDS_CFILES = \
|
|||
pei-mcore.c \
|
||||
pe-ppc.c \
|
||||
pei-ppc.c \
|
||||
pe-sh.c \
|
||||
pei-sh.c \
|
||||
pe-mips.c \
|
||||
pei-mips.c \
|
||||
peigen.c \
|
||||
ppcboot.c \
|
||||
reloc16.c \
|
||||
|
@ -1539,6 +1547,12 @@ pe-i386.lo: pe-i386.c coff-i386.c $(INCDIR)/coff/i386.h \
|
|||
pei-i386.lo: pei-i386.c coff-i386.c $(INCDIR)/coff/i386.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.h
|
||||
pe-mips.lo: pe-mips.c $(INCDIR)/coff/mipspe.h $(INCDIR)/coff/internal.h \
|
||||
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h coffcode.h \
|
||||
peicode.h
|
||||
pei-mips.lo: pei-mips.c pe-mips.c $(INCDIR)/coff/mipspe.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h
|
||||
pe-mcore.lo: pe-mcore.c coff-mcore.c $(INCDIR)/coff/mcore.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.h
|
||||
|
@ -1551,6 +1565,12 @@ pe-ppc.lo: pe-ppc.c coff-ppc.c $(INCDIR)/coff/powerpc.h \
|
|||
pei-ppc.lo: pei-ppc.c coff-ppc.c $(INCDIR)/coff/powerpc.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.h
|
||||
pe-sh.lo: pe-sh.c coff-sh.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/sh.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
coffcode.h peicode.h
|
||||
pei-sh.lo: pei-sh.c coff-sh.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/sh.h \
|
||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||
coffcode.h peicode.h
|
||||
peigen.lo: peigen.c $(INCDIR)/coff/internal.h $(INCDIR)/coff/i386.h \
|
||||
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h
|
||||
ppcboot.lo: ppcboot.c
|
||||
|
|
213
bfd/coff-arm.c
213
bfd/coff-arm.c
|
@ -1,5 +1,5 @@
|
|||
/* BFD back-end for ARM COFF files.
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
|
||||
Free Software Foundation, Inc.
|
||||
Written by Cygnus Support.
|
||||
|
||||
|
@ -199,8 +199,7 @@ coff_arm_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
|
|||
#endif
|
||||
|
||||
/* These most certainly belong somewhere else. Just had to get rid of
|
||||
the manifest constants in the code. */
|
||||
|
||||
the manifest constants in the code. */
|
||||
#define ARM_8 0
|
||||
#define ARM_16 1
|
||||
#define ARM_32 2
|
||||
|
@ -217,9 +216,127 @@ coff_arm_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
|
|||
#define ARM_THUMB12 13
|
||||
#define ARM_THUMB23 14
|
||||
|
||||
#ifdef ARM_WINCE
|
||||
#undef ARM_32
|
||||
#undef ARM_RVA32
|
||||
#undef ARM_26
|
||||
#undef ARM_THUMB12
|
||||
#undef ARM_26D
|
||||
|
||||
#define ARM_32 1
|
||||
#define ARM_RVA32 2
|
||||
#define ARM_26 3
|
||||
#define ARM_THUMB12 4
|
||||
#define ARM_26D 5
|
||||
#define ARM_SECTION 14
|
||||
#define ARM_SECREL 15
|
||||
#endif
|
||||
|
||||
static reloc_howto_type aoutarm_std_reloc_howto[] =
|
||||
{
|
||||
/* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone */
|
||||
#ifdef ARM_WINCE
|
||||
EMPTY_HOWTO (-1),
|
||||
HOWTO (ARM_32,
|
||||
0,
|
||||
2,
|
||||
32,
|
||||
false,
|
||||
0,
|
||||
complain_overflow_bitfield,
|
||||
coff_arm_reloc,
|
||||
"ARM_32",
|
||||
true,
|
||||
0xffffffff,
|
||||
0xffffffff,
|
||||
PCRELOFFSET),
|
||||
HOWTO (ARM_RVA32,
|
||||
0,
|
||||
2,
|
||||
32,
|
||||
false,
|
||||
0,
|
||||
complain_overflow_bitfield,
|
||||
coff_arm_reloc,
|
||||
"ARM_RVA32",
|
||||
true,
|
||||
0xffffffff,
|
||||
0xffffffff,
|
||||
PCRELOFFSET),
|
||||
HOWTO (ARM_26,
|
||||
2,
|
||||
2,
|
||||
24,
|
||||
true,
|
||||
0,
|
||||
complain_overflow_signed,
|
||||
aoutarm_fix_pcrel_26 ,
|
||||
"ARM_26",
|
||||
false,
|
||||
0x00ffffff,
|
||||
0x00ffffff,
|
||||
PCRELOFFSET),
|
||||
HOWTO (ARM_THUMB12,
|
||||
1,
|
||||
1,
|
||||
11,
|
||||
true,
|
||||
0,
|
||||
complain_overflow_signed,
|
||||
coff_thumb_pcrel_12 ,
|
||||
"ARM_THUMB12",
|
||||
false,
|
||||
0x000007ff,
|
||||
0x000007ff,
|
||||
PCRELOFFSET),
|
||||
HOWTO (ARM_26D,
|
||||
2,
|
||||
2,
|
||||
24,
|
||||
false,
|
||||
0,
|
||||
complain_overflow_dont,
|
||||
aoutarm_fix_pcrel_26_done,
|
||||
"ARM_26D",
|
||||
true,
|
||||
0x00ffffff,
|
||||
0x0,
|
||||
false),
|
||||
EMPTY_HOWTO (-1),
|
||||
EMPTY_HOWTO (-1),
|
||||
EMPTY_HOWTO (-1),
|
||||
EMPTY_HOWTO (-1),
|
||||
EMPTY_HOWTO (-1),
|
||||
EMPTY_HOWTO (-1),
|
||||
EMPTY_HOWTO (-1),
|
||||
EMPTY_HOWTO (-1),
|
||||
HOWTO (ARM_SECTION,
|
||||
0,
|
||||
1,
|
||||
16,
|
||||
false,
|
||||
0,
|
||||
complain_overflow_bitfield,
|
||||
coff_arm_reloc,
|
||||
"ARM_16",
|
||||
true,
|
||||
0x0000ffff,
|
||||
0x0000ffff,
|
||||
PCRELOFFSET),
|
||||
HOWTO (ARM_SECREL,
|
||||
0,
|
||||
2,
|
||||
32,
|
||||
false,
|
||||
0,
|
||||
complain_overflow_bitfield,
|
||||
coff_arm_reloc,
|
||||
"ARM_32",
|
||||
true,
|
||||
0xffffffff,
|
||||
0xffffffff,
|
||||
PCRELOFFSET),
|
||||
#else /* not ARM_WINCE */
|
||||
HOWTO(ARM_8, /* type */
|
||||
0, /* rightshift */
|
||||
0, /* size */
|
||||
|
@ -403,7 +520,8 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
|
|||
false,
|
||||
0x07ff07ff,
|
||||
0x07ff07ff,
|
||||
PCRELOFFSET),
|
||||
PCRELOFFSET)
|
||||
#endif /* not ARM_WINCE */
|
||||
};
|
||||
|
||||
#define NUM_RELOCS NUM_ELEM (aoutarm_std_reloc_howto)
|
||||
|
@ -446,7 +564,7 @@ coff_arm_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
|
|||
howto = aoutarm_std_reloc_howto + rel->r_type;
|
||||
|
||||
if (rel->r_type == ARM_RVA32)
|
||||
*addendp -= pe_data(sec->output_section->owner)->pe_opthdr.ImageBase;
|
||||
*addendp -= pe_data (sec->output_section->owner)->pe_opthdr.ImageBase;
|
||||
|
||||
return howto;
|
||||
}
|
||||
|
@ -719,6 +837,12 @@ coff_arm_reloc_type_lookup (abfd, code)
|
|||
|
||||
switch (code)
|
||||
{
|
||||
#ifdef ARM_WINCE
|
||||
ASTD (BFD_RELOC_32, ARM_32);
|
||||
ASTD (BFD_RELOC_RVA, ARM_RVA32);
|
||||
ASTD (BFD_RELOC_ARM_PCREL_BRANCH, ARM_26);
|
||||
ASTD (BFD_RELOC_THUMB_PCREL_BRANCH12, ARM_THUMB12);
|
||||
#else
|
||||
ASTD (BFD_RELOC_8, ARM_8);
|
||||
ASTD (BFD_RELOC_16, ARM_16);
|
||||
ASTD (BFD_RELOC_32, ARM_32);
|
||||
|
@ -730,6 +854,7 @@ coff_arm_reloc_type_lookup (abfd, code)
|
|||
ASTD (BFD_RELOC_THUMB_PCREL_BRANCH9, ARM_THUMB9);
|
||||
ASTD (BFD_RELOC_THUMB_PCREL_BRANCH12, ARM_THUMB12);
|
||||
ASTD (BFD_RELOC_THUMB_PCREL_BRANCH23, ARM_THUMB23);
|
||||
#endif
|
||||
default: return (CONST struct reloc_howto_struct *) 0;
|
||||
}
|
||||
}
|
||||
|
@ -1106,6 +1231,13 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||
howto = &fake_arm26_reloc;
|
||||
}
|
||||
|
||||
#ifdef ARM_WINCE
|
||||
/* MS ARM-CE makes the reloc relative to the opcode's pc, not
|
||||
the next opcode's pc, so is off by one. */
|
||||
if (howto->pc_relative && !info->relocateable)
|
||||
addend -= 8;
|
||||
#endif
|
||||
|
||||
/* If we are doing a relocateable link, then we can just ignore
|
||||
a PC relative reloc that is pcrel_offset. It will already
|
||||
have the correct value. If this is not a relocateable link,
|
||||
|
@ -1248,6 +1380,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||
}
|
||||
}
|
||||
|
||||
#ifndef ARM_WINCE
|
||||
/* Note: We used to check for ARM_THUMB9 and ARM_THUMB12 */
|
||||
else if (howto->type == ARM_THUMB23)
|
||||
{
|
||||
|
@ -1376,6 +1509,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||
done = 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* If the relocation type and destination symbol does not
|
||||
|
@ -1416,6 +1550,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||
#if 1 /* THUMBEXTENSION */
|
||||
if (done)
|
||||
rstat = bfd_reloc_ok;
|
||||
#ifndef ARM_WINCE
|
||||
/* Only perform this fix during the final link, not a relocatable link. nickc@cygnus.com */
|
||||
else if (! info->relocateable
|
||||
&& howto->type == ARM_THUMB23)
|
||||
|
@ -1530,6 +1665,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||
rstat = overflow ? bfd_reloc_overflow : bfd_reloc_ok;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
else
|
||||
#endif /* THUMBEXTENSION */
|
||||
rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
|
||||
|
@ -1918,6 +2054,7 @@ bfd_arm_process_before_allocation (abfd, info, support_old_code)
|
|||
if (symndx == -1)
|
||||
continue;
|
||||
|
||||
/* If the index is outside of the range of our table, something has gone wrong. */
|
||||
if (symndx >= obj_conv_table_size (abfd))
|
||||
{
|
||||
_bfd_error_handler (_("%s: illegal symbol index in reloc: %d"),
|
||||
|
@ -1943,6 +2080,7 @@ bfd_arm_process_before_allocation (abfd, info, support_old_code)
|
|||
record_arm_to_thumb_glue (info, h);
|
||||
break;
|
||||
|
||||
#ifndef ARM_WINCE
|
||||
case ARM_THUMB23:
|
||||
/* This one is a call from thumb code. We used to look
|
||||
for ARM_THUMB9 and ARM_THUMB12 as well. We need to look
|
||||
|
@ -1963,6 +2101,7 @@ bfd_arm_process_before_allocation (abfd, info, support_old_code)
|
|||
;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
break;
|
||||
|
@ -2379,70 +2518,6 @@ coff_arm_final_link_postscript (abfd, pfinfo)
|
|||
return true;
|
||||
}
|
||||
|
||||
#if 0
|
||||
#define coff_SWAP_sym_in arm_bfd_coff_swap_sym_in
|
||||
|
||||
static void coff_swap_sym_in PARAMS ((bfd *, PTR, PTR));
|
||||
|
||||
/* Sepcial version of symbol swapper, used to grab a bfd
|
||||
onto which the glue sections can be attached. */
|
||||
static void
|
||||
arm_bfd_coff_swap_sym_in (abfd, ext1, in1)
|
||||
bfd * abfd;
|
||||
PTR ext1;
|
||||
PTR in1;
|
||||
{
|
||||
flagword flags;
|
||||
register asection * s;
|
||||
|
||||
/* Do the normal swap in. */
|
||||
coff_swap_sym_in (abfd, ext1, in1);
|
||||
|
||||
if (bfd_of_glue_owner != NULL) /* we already have a toc, so go home */
|
||||
return;
|
||||
|
||||
/* Save the bfd for later allocation. */
|
||||
bfd_of_glue_owner = abfd;
|
||||
|
||||
s = bfd_get_section_by_name (bfd_of_glue_owner ,
|
||||
ARM2THUMB_GLUE_SECTION_NAME);
|
||||
|
||||
if (s == NULL)
|
||||
{
|
||||
flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY ;
|
||||
|
||||
s = bfd_make_section (bfd_of_glue_owner, ARM2THUMB_GLUE_SECTION_NAME);
|
||||
|
||||
if (s == NULL
|
||||
|| !bfd_set_section_flags (bfd_of_glue_owner, s, flags)
|
||||
|| !bfd_set_section_alignment (bfd_of_glue_owner, s, 2))
|
||||
{
|
||||
/* FIXME: set appropriate bfd error */
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
s = bfd_get_section_by_name (bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
|
||||
|
||||
if (s == NULL)
|
||||
{
|
||||
flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY ;
|
||||
|
||||
s = bfd_make_section (bfd_of_glue_owner, THUMB2ARM_GLUE_SECTION_NAME);
|
||||
|
||||
if (s == NULL
|
||||
|| !bfd_set_section_flags (bfd_of_glue_owner, s, flags)
|
||||
|| !bfd_set_section_alignment (bfd_of_glue_owner, s, 2))
|
||||
{
|
||||
/* FIXME: set appropriate bfd error krk@cygnus.com */
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#include "coffcode.h"
|
||||
|
||||
#ifndef TARGET_LITTLE_SYM
|
||||
|
|
209
bfd/coff-sh.c
209
bfd/coff-sh.c
|
@ -26,6 +26,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||
#include "bfdlink.h"
|
||||
#include "coff/sh.h"
|
||||
#include "coff/internal.h"
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
#include "coff/pe.h"
|
||||
#endif
|
||||
|
||||
#include "libcoff.h"
|
||||
|
||||
/* Internal functions. */
|
||||
|
@ -48,19 +53,57 @@ static bfd_byte *sh_coff_get_relocated_section_contents
|
|||
PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
|
||||
bfd_byte *, boolean, asymbol **));
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
/* Can't build import tables with 2**4 alignment. */
|
||||
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 2
|
||||
#else
|
||||
/* Default section alignment to 2**4. */
|
||||
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (4)
|
||||
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 4
|
||||
#endif
|
||||
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
/* Align PE executables. */
|
||||
#define COFF_PAGE_SIZE 0x1000
|
||||
#endif
|
||||
|
||||
/* Generate long file names. */
|
||||
#define COFF_LONG_FILENAMES
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
/* Return true if this relocation should
|
||||
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 && howto->type != R_SH_IMAGEBASE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* The supported relocations. There are a lot of relocations defined
|
||||
in coff/internal.h which we do not expect to ever see. */
|
||||
static reloc_howto_type sh_coff_howtos[] =
|
||||
{
|
||||
EMPTY_HOWTO (0),
|
||||
EMPTY_HOWTO (1),
|
||||
#ifdef COFF_WITH_PE
|
||||
/* Windows CE */
|
||||
HOWTO (R_SH_IMM32CE, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
32, /* bitsize */
|
||||
false, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_bitfield, /* complain_on_overflow */
|
||||
sh_reloc, /* special_function */
|
||||
"r_imm32ce", /* name */
|
||||
true, /* partial_inplace */
|
||||
0xffffffff, /* src_mask */
|
||||
0xffffffff, /* dst_mask */
|
||||
false), /* pcrel_offset */
|
||||
#else
|
||||
EMPTY_HOWTO (2),
|
||||
#endif
|
||||
EMPTY_HOWTO (3), /* R_SH_PCREL8 */
|
||||
EMPTY_HOWTO (4), /* R_SH_PCREL16 */
|
||||
EMPTY_HOWTO (5), /* R_SH_HIGH8 */
|
||||
|
@ -116,7 +159,23 @@ static reloc_howto_type sh_coff_howtos[] =
|
|||
false), /* pcrel_offset */
|
||||
|
||||
EMPTY_HOWTO (15),
|
||||
#ifdef COFF_WITH_PE
|
||||
HOWTO (R_SH_IMAGEBASE, /* type */
|
||||
0, /* rightshift */
|
||||
2, /* size (0 = byte, 1 = short, 2 = long) */
|
||||
32, /* bitsize */
|
||||
false, /* pc_relative */
|
||||
0, /* bitpos */
|
||||
complain_overflow_bitfield, /* complain_on_overflow */
|
||||
sh_reloc, /* special_function */
|
||||
"rva32", /* name */
|
||||
true, /* partial_inplace */
|
||||
0xffffffff, /* src_mask */
|
||||
0xffffffff, /* dst_mask */
|
||||
false), /* pcrel_offset */
|
||||
#else
|
||||
EMPTY_HOWTO (16), /* R_SH_IMM8 */
|
||||
#endif
|
||||
EMPTY_HOWTO (17), /* R_SH_IMM8BY2 */
|
||||
EMPTY_HOWTO (18), /* R_SH_IMM8BY4 */
|
||||
EMPTY_HOWTO (19), /* R_SH_IMM4 */
|
||||
|
@ -303,6 +362,7 @@ static reloc_howto_type sh_coff_howtos[] =
|
|||
/* FIXME: This should not be set here. */
|
||||
#define __A_MAGIC_SET__
|
||||
|
||||
#ifndef COFF_WITH_PE
|
||||
/* Swap the r_offset field in and out. */
|
||||
#define SWAP_IN_RELOC_OFFSET bfd_h_get_32
|
||||
#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32
|
||||
|
@ -315,6 +375,7 @@ static reloc_howto_type sh_coff_howtos[] =
|
|||
dst->r_stuff[1] = 'C'; \
|
||||
} \
|
||||
while (0)
|
||||
#endif
|
||||
|
||||
/* Get the value of a symbol, when performing a relocation. */
|
||||
|
||||
|
@ -334,6 +395,96 @@ get_symbol_value (symbol)
|
|||
return relocation;
|
||||
}
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
/* Convert an rtype to howto for the COFF backend linker.
|
||||
Copied from coff-i386. */
|
||||
#define coff_rtype_to_howto coff_sh_rtype_to_howto
|
||||
|
||||
static reloc_howto_type *
|
||||
coff_sh_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
|
||||
bfd * abfd;
|
||||
asection * sec;
|
||||
struct internal_reloc * rel;
|
||||
struct coff_link_hash_entry * h;
|
||||
struct internal_syment * sym;
|
||||
bfd_vma * addendp;
|
||||
{
|
||||
reloc_howto_type * howto;
|
||||
|
||||
howto = sh_coff_howtos + rel->r_type;
|
||||
|
||||
*addendp = 0;
|
||||
|
||||
if (howto->pc_relative)
|
||||
*addendp += sec->vma;
|
||||
|
||||
if (sym != NULL && sym->n_scnum == 0 && sym->n_value != 0)
|
||||
{
|
||||
/* This is a common symbol. The section contents include the
|
||||
size (sym->n_value) as an addend. The relocate_section
|
||||
function will be adding in the final value of the symbol. We
|
||||
need to subtract out the current size in order to get the
|
||||
correct result. */
|
||||
BFD_ASSERT (h != NULL);
|
||||
}
|
||||
|
||||
if (howto->pc_relative)
|
||||
{
|
||||
*addendp -= 4;
|
||||
|
||||
/* If the symbol is defined, then the generic code is going to
|
||||
add back the symbol value in order to cancel out an
|
||||
adjustment it made to the addend. However, we set the addend
|
||||
to 0 at the start of this function. We need to adjust here,
|
||||
to avoid the adjustment the generic code will make. FIXME:
|
||||
This is getting a bit hackish. */
|
||||
if (sym != NULL && sym->n_scnum != 0)
|
||||
*addendp -= sym->n_value;
|
||||
}
|
||||
|
||||
if (rel->r_type == R_SH_IMAGEBASE)
|
||||
*addendp -= pe_data (sec->output_section->owner)->pe_opthdr.ImageBase;
|
||||
|
||||
return howto;
|
||||
}
|
||||
|
||||
/* This structure is used to map BFD reloc codes to SH PE relocs. */
|
||||
struct shcoff_reloc_map
|
||||
{
|
||||
unsigned char bfd_reloc_val;
|
||||
unsigned char shcoff_reloc_val;
|
||||
};
|
||||
|
||||
/* An array mapping BFD reloc codes to SH PE relocs. */
|
||||
static const struct shcoff_reloc_map sh_reloc_map[] =
|
||||
{
|
||||
{ BFD_RELOC_32, R_SH_IMM32CE },
|
||||
{ BFD_RELOC_RVA, R_SH_IMAGEBASE },
|
||||
{ BFD_RELOC_CTOR, R_SH_IMM32CE },
|
||||
};
|
||||
|
||||
/* Given a BFD reloc code, return the howto structure for the
|
||||
corresponding SH PE reloc. */
|
||||
#define coff_bfd_reloc_type_lookup sh_coff_reloc_type_lookup
|
||||
|
||||
static reloc_howto_type *
|
||||
sh_coff_reloc_type_lookup (abfd, code)
|
||||
bfd * abfd ATTRIBUTE_UNUSED;
|
||||
bfd_reloc_code_real_type code;
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < sizeof (sh_reloc_map) / sizeof (struct shcoff_reloc_map); i++)
|
||||
{
|
||||
if (sh_reloc_map[i].bfd_reloc_val == code)
|
||||
return &sh_coff_howtos[(int) sh_reloc_map[i].shcoff_reloc_val];
|
||||
}
|
||||
|
||||
fprintf (stderr, "SH Error: unknown reloc type %d\n", code);
|
||||
return NULL;
|
||||
}
|
||||
#endif /* COFF_WITH_PE */
|
||||
|
||||
/* This macro is used in coffcode.h to get the howto corresponding to
|
||||
an internal reloc. */
|
||||
|
||||
|
@ -401,6 +552,10 @@ sh_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
|
|||
/* Almost all relocs have to do with relaxing. If any work must be
|
||||
done for them, it has been done in sh_relax_section. */
|
||||
if (r_type != R_SH_IMM32
|
||||
#ifdef COFF_WITH_PE
|
||||
&& r_type != R_SH_IMM32CE
|
||||
&& r_type != R_SH_IMAGEBASE
|
||||
#endif
|
||||
&& (r_type != R_SH_PCDISP
|
||||
|| (symbol_in->flags & BSF_LOCAL) != 0))
|
||||
return bfd_reloc_ok;
|
||||
|
@ -414,10 +569,21 @@ sh_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
|
|||
switch (r_type)
|
||||
{
|
||||
case R_SH_IMM32:
|
||||
#ifdef COFF_WITH_PE
|
||||
case R_SH_IMM32CE:
|
||||
#endif
|
||||
insn = bfd_get_32 (abfd, hit_data);
|
||||
insn += sym_value + reloc_entry->addend;
|
||||
bfd_put_32 (abfd, insn, hit_data);
|
||||
break;
|
||||
#ifdef COFF_WITH_PE
|
||||
case R_SH_IMAGEBASE:
|
||||
insn = bfd_get_32 (abfd, hit_data);
|
||||
insn += (sym_value + reloc_entry->addend
|
||||
- pe_data (input_section->output_section->owner)->pe_opthdr.ImageBase);
|
||||
bfd_put_32 (abfd, insn, hit_data);
|
||||
break;
|
||||
#endif
|
||||
case R_SH_PCDISP:
|
||||
insn = bfd_get_16 (abfd, hit_data);
|
||||
sym_value += reloc_entry->addend;
|
||||
|
@ -618,7 +784,14 @@ sh_relax_section (abfd, sec, link_info, again)
|
|||
paddr += sec->vma;
|
||||
for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
|
||||
if (irelfn->r_vaddr == paddr
|
||||
#ifdef COFF_WITH_PE
|
||||
&& (irelfn->r_type == R_SH_IMM32
|
||||
|| irelfn->r_type == R_SH_IMM32CE
|
||||
|| irelfn->r_type == R_SH_IMAGEBASE))
|
||||
|
||||
#else
|
||||
&& irelfn->r_type == R_SH_IMM32)
|
||||
#endif
|
||||
break;
|
||||
if (irelfn >= irelend)
|
||||
{
|
||||
|
@ -996,6 +1169,10 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
|
|||
break;
|
||||
|
||||
case R_SH_IMM32:
|
||||
#ifdef COFF_WITH_PE
|
||||
case R_SH_IMM32CE:
|
||||
case R_SH_IMAGEBASE:
|
||||
#endif
|
||||
/* If this reloc is against a symbol defined in this
|
||||
section, and the symbol will not be adjusted below, we
|
||||
must check the addend to see it will put the value in
|
||||
|
@ -1212,7 +1389,13 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
|
|||
{
|
||||
struct internal_syment sym;
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
if (irelscan->r_type != R_SH_IMM32
|
||||
&& irelscan->r_type != R_SH_IMAGEBASE
|
||||
&& irelscan->r_type != R_SH_IMM32CE)
|
||||
#else
|
||||
if (irelscan->r_type != R_SH_IMM32)
|
||||
#endif
|
||||
continue;
|
||||
|
||||
bfd_coff_swap_sym_in (abfd,
|
||||
|
@ -1364,7 +1547,7 @@ struct sh_opcode
|
|||
mask value in the sh_major_opcode structure. */
|
||||
unsigned short opcode;
|
||||
/* Flags for this instruction. */
|
||||
unsigned flags;
|
||||
unsigned short flags;
|
||||
};
|
||||
|
||||
/* Flag which appear in the sh_opcode structure. */
|
||||
|
@ -1993,6 +2176,7 @@ sh_insn_uses_reg (insn, op, reg)
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* See whether an instruction sets a general purpose register. */
|
||||
|
||||
static boolean
|
||||
|
@ -2200,6 +2384,7 @@ sh_load_use (i1, op1, i2, op2)
|
|||
return false;
|
||||
}
|
||||
|
||||
#ifndef COFF_IMAGE_WITH_PE
|
||||
/* Try to align loads and stores within a span of memory. This is
|
||||
called by both the ELF and the COFF sh targets. ABFD and SEC are
|
||||
the BFD and section we are examining. CONTENTS is the contents of
|
||||
|
@ -2419,6 +2604,7 @@ _bfd_sh_align_load_span (abfd, sec, contents, swap, relocs,
|
|||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Look for loads and stores which we can align to four byte
|
||||
boundaries. See the longer comment above sh_relax_section for why
|
||||
|
@ -2659,6 +2845,10 @@ sh_relocate_section (output_bfd, info, input_bfd, input_section, contents,
|
|||
/* Almost all relocs have to do with relaxing. If any work must
|
||||
be done for them, it has been done in sh_relax_section. */
|
||||
if (rel->r_type != R_SH_IMM32
|
||||
#ifdef COFF_WITH_PE
|
||||
&& rel->r_type != R_SH_IMM32CE
|
||||
&& rel->r_type != R_SH_IMAGEBASE
|
||||
#endif
|
||||
&& rel->r_type != R_SH_PCDISP)
|
||||
continue;
|
||||
|
||||
|
@ -2703,6 +2893,11 @@ sh_relocate_section (output_bfd, info, input_bfd, input_section, contents,
|
|||
return false;
|
||||
}
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
if (rel->r_type == R_SH_IMAGEBASE)
|
||||
addend -= pe_data (input_section->output_section->owner)->pe_opthdr.ImageBase;
|
||||
#endif
|
||||
|
||||
val = 0;
|
||||
|
||||
if (h == NULL)
|
||||
|
@ -2899,7 +3094,9 @@ sh_coff_get_relocated_section_contents (output_bfd, link_info, link_order,
|
|||
|
||||
/* The target vectors. */
|
||||
|
||||
#ifndef TARGET_SHL_SYM
|
||||
CREATE_BIG_COFF_TARGET_VEC (shcoff_vec, "coff-sh", BFD_IS_RELAXABLE, 0, '_', NULL)
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_SHL_SYM
|
||||
#define TARGET_SYM TARGET_SHL_SYM
|
||||
|
@ -2911,9 +3108,14 @@ CREATE_BIG_COFF_TARGET_VEC (shcoff_vec, "coff-sh", BFD_IS_RELAXABLE, 0, '_', NUL
|
|||
#define TARGET_SHL_NAME "coff-shl"
|
||||
#endif
|
||||
|
||||
#ifdef COFF_WITH_PE
|
||||
CREATE_LITTLE_COFF_TARGET_VEC (TARGET_SYM, TARGET_SHL_NAME, BFD_IS_RELAXABLE,
|
||||
SEC_CODE | SEC_DATA, '_', NULL);
|
||||
#else
|
||||
CREATE_LITTLE_COFF_TARGET_VEC (TARGET_SYM, TARGET_SHL_NAME, BFD_IS_RELAXABLE, 0, '_', NULL)
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef TARGET_SHL_SYM
|
||||
/* Some people want versions of the SH COFF target which do not align
|
||||
to 16 byte boundaries. We implement that by adding a couple of new
|
||||
target vectors. These are just like the ones above, but they
|
||||
|
@ -3089,3 +3291,4 @@ const bfd_target shlcoff_small_vec =
|
|||
|
||||
(PTR) &bfd_coff_small_swap_table
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Support for the generic parts of most COFF variants, for BFD.
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
|
||||
Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
|
||||
Free Software Foundation, Inc.
|
||||
Written by Cygnus Support.
|
||||
|
||||
|
@ -1765,6 +1765,8 @@ coff_set_arch_mach_hook (abfd, filehdr)
|
|||
#endif
|
||||
#ifdef ARMMAGIC
|
||||
case ARMMAGIC:
|
||||
case ARMPEMAGIC:
|
||||
case THUMBPEMAGIC:
|
||||
arch = bfd_arch_arm;
|
||||
switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
|
||||
{
|
||||
|
@ -1975,11 +1977,21 @@ coff_set_arch_mach_hook (abfd, filehdr)
|
|||
#ifdef SH_ARCH_MAGIC_BIG
|
||||
case SH_ARCH_MAGIC_BIG:
|
||||
case SH_ARCH_MAGIC_LITTLE:
|
||||
#ifdef COFF_WITH_PE
|
||||
case SH_ARCH_MAGIC_WINCE:
|
||||
#endif
|
||||
arch = bfd_arch_sh;
|
||||
machine = 0;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef MIPS_ARCH_MAGIC_WINCE
|
||||
case MIPS_ARCH_MAGIC_WINCE:
|
||||
arch = bfd_arch_mips;
|
||||
machine = 0;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef H8500MAGIC
|
||||
case H8500MAGIC:
|
||||
arch = bfd_arch_h8500;
|
||||
|
@ -2402,7 +2414,11 @@ coff_set_flags (abfd, magicp, flagsp)
|
|||
#endif
|
||||
#ifdef ARMMAGIC
|
||||
case bfd_arch_arm:
|
||||
#ifdef ARM_WINCE
|
||||
* magicp = ARMPEMAGIC;
|
||||
#else
|
||||
* magicp = ARMMAGIC;
|
||||
#endif
|
||||
* flagsp = 0;
|
||||
if (APCS_SET (abfd))
|
||||
{
|
||||
|
@ -2497,10 +2513,21 @@ coff_set_flags (abfd, magicp, flagsp)
|
|||
|
||||
#ifdef SH_ARCH_MAGIC_BIG
|
||||
case bfd_arch_sh:
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
*magicp = SH_ARCH_MAGIC_WINCE;
|
||||
#else
|
||||
if (bfd_big_endian (abfd))
|
||||
*magicp = SH_ARCH_MAGIC_BIG;
|
||||
else
|
||||
*magicp = SH_ARCH_MAGIC_LITTLE;
|
||||
#endif
|
||||
return true;
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef MIPS_ARCH_MAGIC_WINCE
|
||||
case bfd_arch_mips:
|
||||
*magicp = MIPS_ARCH_MAGIC_WINCE;
|
||||
return true;
|
||||
break;
|
||||
#endif
|
||||
|
@ -3518,6 +3545,16 @@ coff_write_object_contents (abfd)
|
|||
RS6K_AOUTHDR_OMAGIC;
|
||||
#endif
|
||||
|
||||
#if defined(SH) && defined(COFF_WITH_PE)
|
||||
#define __A_MAGIC_SET__
|
||||
internal_a.magic = SH_PE_MAGIC;
|
||||
#endif
|
||||
|
||||
#if defined(MIPS) && defined(COFF_WITH_PE)
|
||||
#define __A_MAGIC_SET__
|
||||
internal_a.magic = MIPS_PE_MAGIC;
|
||||
#endif
|
||||
|
||||
#ifndef __A_MAGIC_SET__
|
||||
#include "Your aouthdr magic number is not being set!"
|
||||
#else
|
||||
|
|
|
@ -98,6 +98,12 @@ case "${targ}" in
|
|||
targ_selvecs="arm_epoc_pe_little_vec arm_epoc_pe_big_vec arm_epoc_pei_little_vec arm_epoc_pei_big_vec"
|
||||
targ_underscore=no
|
||||
;;
|
||||
arm-wince-pe | arm-*-wince)
|
||||
targ_defvec=armpe_little_vec
|
||||
targ_selvecs="armpe_little_vec armpe_big_vec armpei_little_vec armpei_big_vec"
|
||||
targ_underscore=no
|
||||
targ_cflags=-DARM_WINCE
|
||||
;;
|
||||
arm-*-pe*)
|
||||
targ_defvec=armpe_little_vec
|
||||
targ_selvecs="armpe_little_vec armpe_big_vec armpei_little_vec armpei_big_vec"
|
||||
|
@ -530,6 +536,11 @@ case "${targ}" in
|
|||
targ_defvec=aout_mips_little_vec
|
||||
targ_cflags=-DSTAT_FOR_EXEC
|
||||
;;
|
||||
mips*-*-pe*)
|
||||
targ_defvec=mipslpe_vec
|
||||
targ_selvecs="mipslpei_vec mipslpei_vec ecoff_little_vec ecoff_big_vec"
|
||||
targ_underscore=yes
|
||||
;;
|
||||
mips*-*-sysv4*)
|
||||
targ_defvec=bfd_elf32_bigmips_vec
|
||||
targ_selvecs="bfd_elf32_littlemips_vec ecoff_big_vec ecoff_little_vec"
|
||||
|
@ -623,6 +634,11 @@ case "${targ}" in
|
|||
targ_selvecs="bfd_elf32_shl_vec shcoff_vec shlcoff_vec shcoff_small_vec shlcoff_small_vec"
|
||||
targ_underscore=yes
|
||||
;;
|
||||
sh-*-pe)
|
||||
targ_defvec=shlpe_vec
|
||||
targ_selvecs="shlpe_vec shlpei_vec"
|
||||
targ_underscore=yes
|
||||
;;
|
||||
sh-*-* | sh-*-rtems*)
|
||||
targ_defvec=shcoff_vec
|
||||
targ_selvecs="shcoff_vec shlcoff_vec shcoff_small_vec shlcoff_small_vec"
|
||||
|
|
4
bfd/configure
vendored
4
bfd/configure
vendored
|
@ -5167,6 +5167,8 @@ do
|
|||
m68kaux_coff_vec) tb="$tb coff-aux.lo coff-m68k.lo cofflink.lo" ;;
|
||||
m68ksysvcoff_vec) tb="$tb coff-svm68k.lo cofflink.lo" ;;
|
||||
m88kbcs_vec) tb="$tb coff-m88k.lo" ;;
|
||||
mipslpe_vec) tb="$tb pe-mips.lo cofflink.lo" ;;
|
||||
mipslpei_vec) tb="$tb pei-mips.lo cofflink.lo" ;;
|
||||
mcore_pe_big_vec) tb="$tb pe-mcore.lo peigen.lo cofflink.lo" ;;
|
||||
mcore_pe_little_vec) tb="$tb pe-mcore.lo peigen.lo cofflink.lo" ;;
|
||||
mcore_pei_big_vec) tb="$tb pei-mcore.lo peigen.lo cofflink.lo" ;;
|
||||
|
@ -5191,6 +5193,8 @@ do
|
|||
shlcoff_vec) tb="$tb coff-sh.lo cofflink.lo" ;;
|
||||
shcoff_small_vec) tb="$tb coff-sh.lo cofflink.lo" ;;
|
||||
shlcoff_small_vec) tb="$tb coff-sh.lo cofflink.lo" ;;
|
||||
shlpe_vec) tb="$tb pe-sh.lo coff-sh.lo cofflink.lo" ;;
|
||||
shlpei_vec) tb="$tb pei-sh.lo coff-sh.lo cofflink.lo" ;;
|
||||
som_vec) tb="$tb som.lo" ;;
|
||||
sparcle_aout_vec) tb="$tb aout-sparcle.lo aout32.lo" ;;
|
||||
sparclinux_vec) tb="$tb sparclinux.lo aout32.lo" ;;
|
||||
|
|
|
@ -526,6 +526,8 @@ do
|
|||
m68kaux_coff_vec) tb="$tb coff-aux.lo coff-m68k.lo cofflink.lo" ;;
|
||||
m68ksysvcoff_vec) tb="$tb coff-svm68k.lo cofflink.lo" ;;
|
||||
m88kbcs_vec) tb="$tb coff-m88k.lo" ;;
|
||||
mipslpe_vec) tb="$tb pe-mips.lo cofflink.lo" ;;
|
||||
mipslpei_vec) tb="$tb pei-mips.lo cofflink.lo" ;;
|
||||
mcore_pe_big_vec) tb="$tb pe-mcore.lo peigen.lo cofflink.lo" ;;
|
||||
mcore_pe_little_vec) tb="$tb pe-mcore.lo peigen.lo cofflink.lo" ;;
|
||||
mcore_pei_big_vec) tb="$tb pei-mcore.lo peigen.lo cofflink.lo" ;;
|
||||
|
@ -550,6 +552,8 @@ do
|
|||
shlcoff_vec) tb="$tb coff-sh.lo cofflink.lo" ;;
|
||||
shcoff_small_vec) tb="$tb coff-sh.lo cofflink.lo" ;;
|
||||
shlcoff_small_vec) tb="$tb coff-sh.lo cofflink.lo" ;;
|
||||
shlpe_vec) tb="$tb pe-sh.lo coff-sh.lo cofflink.lo" ;;
|
||||
shlpei_vec) tb="$tb pei-sh.lo coff-sh.lo cofflink.lo" ;;
|
||||
som_vec) tb="$tb som.lo" ;;
|
||||
sparcle_aout_vec) tb="$tb aout-sparcle.lo aout32.lo" ;;
|
||||
sparclinux_vec) tb="$tb sparclinux.lo aout32.lo" ;;
|
||||
|
|
|
@ -240,8 +240,10 @@ void _bfd_pe_get_symbol_info PARAMS ((bfd *, asymbol *, symbol_info *));
|
|||
|
||||
boolean _bfd_pei_final_link_postscript
|
||||
PARAMS ((bfd *, struct coff_final_link_info *));
|
||||
#define coff_final_link_postscript _bfd_pei_final_link_postscript
|
||||
|
||||
#ifndef coff_final_link_postscript
|
||||
#define coff_final_link_postscript _bfd_pei_final_link_postscript
|
||||
#endif
|
||||
/* The following are needed only for ONE of pe or pei, but don't
|
||||
otherwise vary; peicode.h fixes up ifdefs but we provide the
|
||||
prototype. */
|
||||
|
|
|
@ -40,4 +40,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||
bfd_arm_pe_process_before_allocation
|
||||
#endif
|
||||
|
||||
#ifdef ARM_WINCE
|
||||
#define TARGET_UNDERSCORE 0
|
||||
#endif
|
||||
|
||||
#include "coff-arm.c"
|
||||
|
|
1004
bfd/pe-mips.c
Normal file
1004
bfd/pe-mips.c
Normal file
File diff suppressed because it is too large
Load diff
31
bfd/pe-sh.c
Normal file
31
bfd/pe-sh.c
Normal file
|
@ -0,0 +1,31 @@
|
|||
/* BFD back-end for SH PECOFF files.
|
||||
Copyright 1995, 2000 Free Software Foundation, Inc.
|
||||
|
||||
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 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, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "bfd.h"
|
||||
#include "sysdep.h"
|
||||
|
||||
|
||||
#define TARGET_SHL_SYM shlpe_vec
|
||||
#define TARGET_SHL_NAME "pe-shl"
|
||||
#define COFF_WITH_PE
|
||||
#define PCRELOFFSET true
|
||||
#define TARGET_UNDERSCORE '_'
|
||||
#define COFF_LONG_SECTION_NAMES
|
||||
|
||||
#include "coff-sh.c"
|
32
bfd/pei-mips.c
Normal file
32
bfd/pei-mips.c
Normal file
|
@ -0,0 +1,32 @@
|
|||
/* BFD back-end for MIPS PE IMAGE COFF files.
|
||||
Copyright 1995, 2000 Free Software Foundation, Inc.
|
||||
|
||||
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 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, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "bfd.h"
|
||||
#include "sysdep.h"
|
||||
|
||||
#define TARGET_SYM mipslpei_vec
|
||||
#define TARGET_NAME "pei-mips"
|
||||
#define COFF_IMAGE_WITH_PE
|
||||
#define PCRELOFFSET true
|
||||
#define COFF_LONG_SECTION_NAMES
|
||||
|
||||
#include "pe-mips.c"
|
||||
|
||||
|
||||
|
35
bfd/pei-sh.c
Normal file
35
bfd/pei-sh.c
Normal file
|
@ -0,0 +1,35 @@
|
|||
/* BFD back-end for SH PE IMAGE COFF files.
|
||||
Copyright 1995, 2000 Free Software Foundation, Inc.
|
||||
|
||||
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 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, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "bfd.h"
|
||||
#include "sysdep.h"
|
||||
|
||||
#define TARGET_SHL_SYM shlpei_vec
|
||||
#define TARGET_SHL_NAME "pei-shl"
|
||||
#define IMAGE_BASE NT_IMAGE_BASE
|
||||
#define COFF_IMAGE_WITH_PE
|
||||
#define COFF_WITH_PE
|
||||
#define PCRELOFFSET true
|
||||
#define TARGET_UNDERSCORE '_'
|
||||
#define COFF_LONG_SECTION_NAMES
|
||||
|
||||
#include "coff-sh.c"
|
||||
|
||||
|
||||
|
868
bfd/peicode.h
868
bfd/peicode.h
|
@ -85,15 +85,64 @@ static boolean pe_bfd_copy_private_bfd_data PARAMS ((bfd *, bfd *));
|
|||
#define coff_mkobject pe_mkobject
|
||||
#define coff_mkobject_hook pe_mkobject_hook
|
||||
|
||||
#ifndef NO_COFF_RELOCS
|
||||
static void coff_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
|
||||
static unsigned int coff_swap_reloc_out PARAMS ((bfd *, PTR, PTR));
|
||||
#endif
|
||||
static void coff_swap_filehdr_in PARAMS ((bfd *, PTR, PTR));
|
||||
static void coff_swap_scnhdr_in PARAMS ((bfd *, PTR, PTR));
|
||||
static boolean pe_mkobject PARAMS ((bfd *));
|
||||
static PTR pe_mkobject_hook PARAMS ((bfd *, PTR, PTR));
|
||||
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
/* This structure contains static variables used by the ILF code. */
|
||||
typedef asection * asection_ptr;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bfd * abfd;
|
||||
bfd_byte * data;
|
||||
struct bfd_in_memory * bim;
|
||||
unsigned short magic;
|
||||
|
||||
arelent * reltab;
|
||||
unsigned int relcount;
|
||||
|
||||
coff_symbol_type * sym_cache;
|
||||
coff_symbol_type * sym_ptr;
|
||||
unsigned int sym_index;
|
||||
|
||||
unsigned int * sym_table;
|
||||
unsigned int * table_ptr;
|
||||
|
||||
combined_entry_type * native_syms;
|
||||
combined_entry_type * native_ptr;
|
||||
|
||||
unsigned int sec_index;
|
||||
|
||||
char * string_table;
|
||||
char * string_ptr;
|
||||
char * end_string_ptr;
|
||||
|
||||
SYMENT * esym_table;
|
||||
SYMENT * esym_ptr;
|
||||
|
||||
struct internal_reloc * int_reltab;
|
||||
}
|
||||
pe_ILF_vars;
|
||||
|
||||
static asection_ptr pe_ILF_make_a_section PARAMS ((pe_ILF_vars *, const char *, unsigned int, flagword));
|
||||
static void pe_ILF_make_a_reloc PARAMS ((pe_ILF_vars *, bfd_vma, bfd_reloc_code_real_type, asection_ptr));
|
||||
static void pe_ILF_make_a_symbol PARAMS ((pe_ILF_vars *, const char *, const char *, asection_ptr, flagword));
|
||||
static void pe_ILF_save_relocs PARAMS ((pe_ILF_vars *, asection_ptr));
|
||||
static boolean pe_ILF_build_a_bfd PARAMS ((bfd *, unsigned short, bfd_byte *, bfd_byte *, unsigned int, unsigned int));
|
||||
static const bfd_target * pe_ILF_object_p PARAMS ((bfd *));
|
||||
static const bfd_target * pe_bfd_object_p PARAMS ((bfd *));
|
||||
#endif /* COFF_IMAGE_WITH_PE */
|
||||
|
||||
/**********************************************************************/
|
||||
|
||||
#ifndef NO_COFF_RELOCS
|
||||
static void
|
||||
coff_swap_reloc_in (abfd, src, dst)
|
||||
bfd *abfd;
|
||||
|
@ -139,7 +188,7 @@ coff_swap_reloc_out (abfd, src, dst)
|
|||
#endif
|
||||
return RELSZ;
|
||||
}
|
||||
|
||||
#endif /* not NO_COFF_RELOCS */
|
||||
|
||||
static void
|
||||
coff_swap_filehdr_in (abfd, src, dst)
|
||||
|
@ -236,6 +285,7 @@ coff_swap_scnhdr_in (abfd, ext, in)
|
|||
scnhdr_int->s_vaddr &= 0xffffffff;
|
||||
}
|
||||
|
||||
#ifndef COFF_NO_HACK_SCNHDR_SIZE
|
||||
/* If this section holds uninitialized data, use the virtual size
|
||||
(stored in s_paddr) instead of the physical size. */
|
||||
if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0)
|
||||
|
@ -246,6 +296,7 @@ coff_swap_scnhdr_in (abfd, ext, in)
|
|||
only works if it correctly holds the virtual size of the
|
||||
section. */
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static boolean
|
||||
|
@ -363,9 +414,809 @@ pe_bfd_copy_private_bfd_data (ibfd, obfd)
|
|||
#define coff_get_symbol_info _bfd_pe_get_symbol_info
|
||||
|
||||
#ifdef COFF_IMAGE_WITH_PE
|
||||
|
||||
/* Code to handle Microsoft's Image Library Format.
|
||||
Also known as LINK6 format.
|
||||
Documentation about this format can be found at:
|
||||
|
||||
http://msdn.microsoft.com/library/specs/pecoff_section8.htm */
|
||||
|
||||
/* The following constants specify the sizes of the various data
|
||||
structures that we have to create in order to build a bfd describing
|
||||
an ILF object file. The final "+ 1" in the definitions of SIZEOF_IDATA6
|
||||
and SIZEOF_IDATA7 below is to allow for the possibility that we might
|
||||
need a padding byte in order to ensure 16 bit alignment for the section's
|
||||
contents.
|
||||
|
||||
The value for SIZEOF_ILF_STRINGS is computed as follows:
|
||||
|
||||
There will be NUM_ILF_SECTIONS section symbols. Allow 9 characters
|
||||
per symbol for their names (longest section name is .idata$2).
|
||||
|
||||
There will be two symbols for the imported value, one the symbol name
|
||||
and one with _imp__ prefixed. Allowing for the terminating nul's this
|
||||
is strlen (symbol_name) * 2 + 8.
|
||||
|
||||
The strings in the string table must start STRING__SIZE_SIZE bytes into
|
||||
the table in order to for the string lookup code in coffgen/coffcode to
|
||||
work. */
|
||||
#define NUM_ILF_RELOCS 8
|
||||
#define NUM_ILF_SECTIONS 6
|
||||
#define NUM_ILF_SYMS (2 + NUM_ILF_SECTIONS)
|
||||
|
||||
#define SIZEOF_ILF_SYMS (NUM_ILF_SYMS * sizeof (* vars.sym_cache))
|
||||
#define SIZEOF_ILF_SYM_TABLE (NUM_ILF_SYMS * sizeof (* vars.sym_table))
|
||||
#define SIZEOF_ILF_NATIVE_SYMS (NUM_ILF_SYMS * sizeof (* vars.native_syms))
|
||||
#define SIZEOF_ILF_EXT_SYMS (NUM_ILF_SYMS * sizeof (* vars.esym_table))
|
||||
#define SIZEOF_ILF_RELOCS (NUM_ILF_RELOCS * sizeof (* vars.reltab))
|
||||
#define SIZEOF_ILF_INT_RELOCS (NUM_ILF_RELOCS * sizeof (* vars.int_reltab))
|
||||
#define SIZEOF_ILF_STRINGS (strlen (symbol_name) * 2 + 8 + NUM_ILF_SECTIONS * 9 + STRING_SIZE_SIZE)
|
||||
#define SIZEOF_IDATA2 (5 * 4)
|
||||
#define SIZEOF_IDATA4 (1 * 4)
|
||||
#define SIZEOF_IDATA5 (1 * 4)
|
||||
#define SIZEOF_IDATA6 (2 + strlen (symbol_name) + 1 + 1)
|
||||
#define SIZEOF_IDATA7 (strlen (source_dll) + 1 + 1)
|
||||
#define SIZEOF_ILF_SECTIONS (NUM_ILF_SECTIONS * sizeof (struct coff_section_tdata))
|
||||
|
||||
#define ILF_DATA_SIZE \
|
||||
sizeof (* vars.bim) \
|
||||
+ SIZEOF_ILF_SYMS \
|
||||
+ SIZEOF_ILF_SYM_TABLE \
|
||||
+ SIZEOF_ILF_NATIVE_SYMS \
|
||||
+ SIZEOF_ILF_EXT_SYMS \
|
||||
+ SIZEOF_ILF_RELOCS \
|
||||
+ SIZEOF_ILF_INT_RELOCS \
|
||||
+ SIZEOF_ILF_STRINGS \
|
||||
+ SIZEOF_IDATA2 \
|
||||
+ SIZEOF_IDATA4 \
|
||||
+ SIZEOF_IDATA5 \
|
||||
+ SIZEOF_IDATA6 \
|
||||
+ SIZEOF_IDATA7 \
|
||||
+ SIZEOF_ILF_SECTIONS \
|
||||
+ MAX_TEXT_SECTION_SIZE
|
||||
|
||||
|
||||
/* Create an empty relocation against the given symbol. */
|
||||
static void
|
||||
pe_ILF_make_a_reloc (pe_ILF_vars * vars,
|
||||
bfd_vma address,
|
||||
bfd_reloc_code_real_type reloc,
|
||||
asection_ptr sec)
|
||||
{
|
||||
arelent * entry;
|
||||
struct internal_reloc * internal;
|
||||
|
||||
entry = vars->reltab + vars->relcount;
|
||||
internal = vars->int_reltab + vars->relcount;
|
||||
|
||||
entry->address = address;
|
||||
entry->addend = 0;
|
||||
entry->howto = bfd_reloc_type_lookup (vars->abfd, reloc);
|
||||
entry->sym_ptr_ptr = sec->symbol_ptr_ptr;
|
||||
|
||||
internal->r_vaddr = address;
|
||||
internal->r_symndx = coff_section_data (vars->abfd, sec)->i;
|
||||
internal->r_type = entry->howto->type;
|
||||
#if 0 /* These fields do not need to be initialised. */
|
||||
internal->r_size = 0;
|
||||
internal->r_extern = 0;
|
||||
internal->r_offset = 0;
|
||||
#endif
|
||||
|
||||
vars->relcount ++;
|
||||
|
||||
BFD_ASSERT (vars->relcount <= NUM_ILF_RELOCS);
|
||||
}
|
||||
|
||||
/* Move the queued relocs into the given section. */
|
||||
static void
|
||||
pe_ILF_save_relocs (pe_ILF_vars * vars,
|
||||
asection_ptr sec)
|
||||
{
|
||||
/* Make sure that there is somewhere to store the internal relocs. */
|
||||
if (coff_section_data (vars->abfd, sec) == NULL)
|
||||
/* We should probably return an error indication here. */
|
||||
abort ();
|
||||
|
||||
coff_section_data (vars->abfd, sec)->relocs = vars->int_reltab;
|
||||
coff_section_data (vars->abfd, sec)->keep_relocs = true;
|
||||
|
||||
sec->relocation = vars->reltab;
|
||||
sec->reloc_count = vars->relcount;
|
||||
sec->flags |= SEC_RELOC;
|
||||
|
||||
vars->reltab += vars->relcount;
|
||||
vars->int_reltab += vars->relcount;
|
||||
vars->relcount = 0;
|
||||
|
||||
BFD_ASSERT ((bfd_byte *)vars->int_reltab < (bfd_byte *)vars->string_table);
|
||||
}
|
||||
|
||||
/* Create a global symbol and add it to the relevant tables. */
|
||||
static void
|
||||
pe_ILF_make_a_symbol (pe_ILF_vars * vars,
|
||||
const char * prefix,
|
||||
const char * symbol_name,
|
||||
asection_ptr section,
|
||||
flagword extra_flags)
|
||||
{
|
||||
coff_symbol_type * sym;
|
||||
combined_entry_type * ent;
|
||||
SYMENT * esym;
|
||||
unsigned short sclass;
|
||||
|
||||
if (extra_flags & BSF_LOCAL)
|
||||
sclass = C_LABEL;
|
||||
else
|
||||
sclass = C_EXT;
|
||||
|
||||
#ifdef THUMBPEMAGIC
|
||||
if (vars->magic == THUMBPEMAGIC)
|
||||
{
|
||||
if (extra_flags & BSF_FUNCTION)
|
||||
sclass = C_THUMBEXTFUNC;
|
||||
else if (extra_flags & BSF_LOCAL)
|
||||
sclass = C_THUMBLABEL;
|
||||
else
|
||||
sclass = C_THUMBEXT;
|
||||
}
|
||||
#endif
|
||||
|
||||
BFD_ASSERT (vars->sym_index < NUM_ILF_SYMS);
|
||||
|
||||
sym = vars->sym_ptr;
|
||||
ent = vars->native_ptr;
|
||||
esym = vars->esym_ptr;
|
||||
|
||||
/* Copy the symbol's name into the string table. */
|
||||
sprintf (vars->string_ptr, "%s%s", prefix, symbol_name);
|
||||
|
||||
/* Initialise the external symbol. */
|
||||
bfd_h_put_32 (vars->abfd, vars->string_ptr - vars->string_table, (bfd_byte *) esym->e.e.e_offset);
|
||||
bfd_h_put_16 (vars->abfd, section->target_index, (bfd_byte *) esym->e_scnum);
|
||||
esym->e_sclass[0] = sclass;
|
||||
|
||||
/* The following initialisations are unnecessary - the memory is
|
||||
zero initialised. They are just kept here as reminders. */
|
||||
#if 0
|
||||
esym->e.e.e_zeroes = 0;
|
||||
esym->e_value = 0;
|
||||
esym->e_type = T_NULL;
|
||||
esym->e_numaux = 0;
|
||||
#endif
|
||||
|
||||
/* Initialise the internal symbol structure. */
|
||||
ent->u.syment.n_sclass = sclass;
|
||||
ent->u.syment.n_scnum = section->target_index;
|
||||
ent->u.syment._n._n_n._n_offset = (long) sym;
|
||||
|
||||
#if 0 /* See comment above. */
|
||||
ent->u.syment.n_value = 0;
|
||||
ent->u.syment.n_flags = 0;
|
||||
ent->u.syment.n_type = T_NULL;
|
||||
ent->u.syment.n_numaux = 0;
|
||||
ent->fix_value = 0;
|
||||
#endif
|
||||
|
||||
sym->symbol.the_bfd = vars->abfd;
|
||||
sym->symbol.name = vars->string_ptr;
|
||||
sym->symbol.flags = BSF_EXPORT | BSF_GLOBAL | extra_flags;
|
||||
sym->symbol.section = section;
|
||||
sym->native = ent;
|
||||
|
||||
#if 0 /* See comment above. */
|
||||
sym->symbol.value = 0;
|
||||
sym->symbol.udata.i = 0;
|
||||
sym->done_lineno = false;
|
||||
sym->lineno = NULL;
|
||||
#endif
|
||||
|
||||
* vars->table_ptr = vars->sym_index;
|
||||
|
||||
/* Adjust pointers for the next symbol. */
|
||||
vars->sym_index ++;
|
||||
vars->sym_ptr ++;
|
||||
vars->table_ptr ++;
|
||||
vars->native_ptr ++;
|
||||
vars->esym_ptr ++;
|
||||
vars->string_ptr += strlen (symbol_name) + 1;
|
||||
|
||||
BFD_ASSERT (vars->string_ptr < vars->end_string_ptr);
|
||||
}
|
||||
|
||||
/* Create a section. */
|
||||
static asection_ptr
|
||||
pe_ILF_make_a_section (pe_ILF_vars * vars,
|
||||
const char * name,
|
||||
unsigned int size,
|
||||
flagword extra_flags)
|
||||
{
|
||||
asection_ptr sec;
|
||||
flagword flags;
|
||||
|
||||
sec = bfd_make_section_old_way (vars->abfd, name);
|
||||
if (sec == NULL)
|
||||
return NULL;
|
||||
|
||||
flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_KEEP | SEC_IN_MEMORY;
|
||||
|
||||
bfd_set_section_flags (vars->abfd, sec, flags | extra_flags);
|
||||
|
||||
bfd_set_section_alignment (vars->abfd, sec, 2);
|
||||
|
||||
/* Check that we will not run out of space. */
|
||||
BFD_ASSERT (vars->data + size < vars->bim->buffer + vars->bim->size);
|
||||
|
||||
/* Set the section size and contents. The actual
|
||||
contents are filled in by our parent. */
|
||||
bfd_set_section_size (vars->abfd, sec, size);
|
||||
sec->contents = vars->data;
|
||||
sec->target_index = vars->sec_index ++;
|
||||
|
||||
/* Advance data pointer in the vars structure. */
|
||||
vars->data += size;
|
||||
|
||||
/* Skip the padding byte if it was not needed.
|
||||
The logic here is that if the string length is odd,
|
||||
then the entire string length, including the null byte,
|
||||
is even and so the extra, padding byte, is not needed. */
|
||||
if (size & 1)
|
||||
vars->data --;
|
||||
|
||||
/* Create a coff_section_tdata structure for our use. */
|
||||
sec->used_by_bfd = (struct coff_section_tdata *) vars->data;
|
||||
vars->data += sizeof (struct coff_section_tdata);
|
||||
|
||||
BFD_ASSERT (vars->data <= vars->bim->buffer + vars->bim->size);
|
||||
|
||||
/* Create a symbol to refer to this section. */
|
||||
pe_ILF_make_a_symbol (vars, "", name, sec, BSF_LOCAL);
|
||||
|
||||
/* Cache the index to the symbol in the coff_section_data structire. */
|
||||
coff_section_data (vars->abfd, sec)->i = vars->sym_index - 1;
|
||||
|
||||
return sec;
|
||||
}
|
||||
|
||||
/* This structure contains the code that goes into the .text section
|
||||
in order to perform a jump into the DLL lookup table. The entries
|
||||
in the table are index by the magic number used to represent the
|
||||
machine type in the PE file. The contents of the data[] arrays in
|
||||
these entries are stolen from the jtab[] arrays in ld/pe-dll.c.
|
||||
The SIZE field says how many bytes in the DATA array are actually
|
||||
used. The OFFSET field says where in the data array the address
|
||||
of the .idata$5 section should be placed. */
|
||||
#define MAX_TEXT_SECTION_SIZE 32
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned short magic;
|
||||
unsigned char data[MAX_TEXT_SECTION_SIZE];
|
||||
unsigned int size;
|
||||
unsigned int offset;
|
||||
}
|
||||
jump_table;
|
||||
|
||||
jump_table jtab[] =
|
||||
{
|
||||
#ifdef I386MAGIC
|
||||
{ I386MAGIC,
|
||||
{ 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90 },
|
||||
8, 2
|
||||
},
|
||||
#endif
|
||||
|
||||
#ifdef MC68MAGIC
|
||||
{ MC68MAGIC, { /* XXX fill me in */ }, 0, 0 },
|
||||
#endif
|
||||
#ifdef MIPS_ARCH_MAGIC_WINCE
|
||||
{ MIPS_ARCH_MAGIC_WINCE,
|
||||
{ 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
|
||||
0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 },
|
||||
16, 0
|
||||
},
|
||||
#endif
|
||||
|
||||
#ifdef SH_ARCH_MAGIC_WINCE
|
||||
{ SH_ARCH_MAGIC_WINCE,
|
||||
{ 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40,
|
||||
0x09, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||
12, 8
|
||||
},
|
||||
#endif
|
||||
|
||||
#ifdef ARMPEMAGIC
|
||||
{ ARMPEMAGIC,
|
||||
{ 0x00, 0xc0, 0x9f, 0xe5, 0x00, 0xf0,
|
||||
0x9c, 0xe5, 0x00, 0x00, 0x00, 0x00},
|
||||
12, 8
|
||||
},
|
||||
#endif
|
||||
|
||||
#ifdef THUMBPEMAGIC
|
||||
{ THUMBPEMAGIC,
|
||||
{ 0x40, 0xb4, 0x02, 0x4e, 0x36, 0x68, 0xb4, 0x46,
|
||||
0x40, 0xbc, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00 },
|
||||
16, 12
|
||||
},
|
||||
#endif
|
||||
{ 0, { 0 }, 0, 0 }
|
||||
};
|
||||
|
||||
#ifndef NUM_ENTRIES
|
||||
#define NUM_ENTRIES(a) (sizeof (a) / sizeof (a)[0])
|
||||
#endif
|
||||
|
||||
/* Build a full BFD from the information supplied in a ILF object. */
|
||||
static boolean
|
||||
pe_ILF_build_a_bfd (bfd * abfd,
|
||||
unsigned short magic,
|
||||
bfd_byte * symbol_name,
|
||||
bfd_byte * source_dll,
|
||||
unsigned int ordinal,
|
||||
unsigned int types)
|
||||
{
|
||||
bfd_byte * ptr;
|
||||
pe_ILF_vars vars;
|
||||
struct internal_filehdr internal_f;
|
||||
unsigned int import_type;
|
||||
unsigned int import_name_type;
|
||||
asection_ptr id2, id4, id5, id6, id7, text;
|
||||
|
||||
text = NULL;
|
||||
|
||||
/* Decode and verify the types field of the ILF structure. */
|
||||
import_type = types & 0x3;
|
||||
import_name_type = (types & 0x1c) >> 2;
|
||||
|
||||
switch (import_type)
|
||||
{
|
||||
case IMPORT_CODE:
|
||||
case IMPORT_DATA:
|
||||
break;
|
||||
|
||||
case IMPORT_CONST:
|
||||
/* XXX code yet to be written. */
|
||||
_bfd_error_handler (_("%s: Unhandled import type; %x"),
|
||||
bfd_get_filename (abfd), import_type);
|
||||
return false;
|
||||
|
||||
default:
|
||||
_bfd_error_handler (_("%s: Unrecognised import type; %x"),
|
||||
bfd_get_filename (abfd), import_type);
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (import_name_type)
|
||||
{
|
||||
case IMPORT_ORDINAL:
|
||||
case IMPORT_NAME:
|
||||
case IMPORT_NAME_NOPREFIX:
|
||||
case IMPORT_NAME_UNDECORATE:
|
||||
break;
|
||||
|
||||
default:
|
||||
_bfd_error_handler (_("%s: Unrecognised import name type; %x"),
|
||||
bfd_get_filename (abfd), import_name_type);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Initialise local variables.
|
||||
|
||||
Note these are kept in a structure rather than being
|
||||
declared as statics since bfd frowns on global variables.
|
||||
|
||||
We are going to construct the contents of the BFD in memory,
|
||||
so allocate all the space that we will need right now. */
|
||||
ptr = bfd_zalloc (abfd, ILF_DATA_SIZE);
|
||||
if (ptr == NULL)
|
||||
return false;
|
||||
|
||||
/* Create a bfd_in_memory structure. */
|
||||
vars.bim = (struct bfd_in_memory *) ptr;
|
||||
vars.bim->buffer = ptr;
|
||||
vars.bim->size = ILF_DATA_SIZE;
|
||||
ptr += sizeof (* vars.bim);
|
||||
|
||||
/* Initialise the pointers to regions of the memory and the
|
||||
other contents of the pe_ILF_vars structure as well. */
|
||||
vars.sym_cache = (coff_symbol_type *) ptr;
|
||||
vars.sym_ptr = (coff_symbol_type *) ptr;
|
||||
vars.sym_index = 0;
|
||||
ptr += SIZEOF_ILF_SYMS;
|
||||
|
||||
vars.sym_table = (unsigned int *) ptr;
|
||||
vars.table_ptr = (unsigned int *) ptr;
|
||||
ptr += SIZEOF_ILF_SYM_TABLE;
|
||||
|
||||
vars.native_syms = (combined_entry_type *) ptr;
|
||||
vars.native_ptr = (combined_entry_type *) ptr;
|
||||
ptr += SIZEOF_ILF_NATIVE_SYMS;
|
||||
|
||||
vars.esym_table = (SYMENT *) ptr;
|
||||
vars.esym_ptr = (SYMENT *) ptr;
|
||||
ptr += SIZEOF_ILF_EXT_SYMS;
|
||||
|
||||
vars.reltab = (arelent *) ptr;
|
||||
vars.relcount = 0;
|
||||
ptr += SIZEOF_ILF_RELOCS;
|
||||
|
||||
vars.int_reltab = (struct internal_reloc *) ptr;
|
||||
ptr += SIZEOF_ILF_INT_RELOCS;
|
||||
|
||||
vars.string_table = ptr;
|
||||
vars.string_ptr = ptr + STRING_SIZE_SIZE;
|
||||
ptr += SIZEOF_ILF_STRINGS;
|
||||
vars.end_string_ptr = ptr;
|
||||
|
||||
/* The remaining space in bim->buffer is used
|
||||
by the pe_ILF_make_a_section() function. */
|
||||
vars.data = ptr;
|
||||
vars.abfd = abfd;
|
||||
vars.sec_index = 0;
|
||||
vars.magic = magic;
|
||||
|
||||
/* Create the initial .idata$<n> sections:
|
||||
.idata$2: Import Directory Table
|
||||
.idata$4: Import Lookup Table
|
||||
.idata$5: Import Address Table
|
||||
|
||||
Note we do not create a .idata$3 section as this is
|
||||
created for us by the linker script. */
|
||||
id2 = pe_ILF_make_a_section (& vars, ".idata$2", SIZEOF_IDATA2, 0);
|
||||
id4 = pe_ILF_make_a_section (& vars, ".idata$4", SIZEOF_IDATA4, 0);
|
||||
id5 = pe_ILF_make_a_section (& vars, ".idata$5", SIZEOF_IDATA5, 0);
|
||||
if (id2 == NULL || id4 == NULL || id5 == NULL)
|
||||
return false;
|
||||
|
||||
/* Fill in the contents of these sections. */
|
||||
if (import_name_type == IMPORT_ORDINAL)
|
||||
{
|
||||
if (ordinal == 0)
|
||||
/* XXX - treat as IMPORT_NAME ??? */
|
||||
abort ();
|
||||
|
||||
* (unsigned int *) id4->contents = ordinal | 0x80000000;
|
||||
* (unsigned int *) id5->contents = ordinal | 0x80000000;
|
||||
}
|
||||
else
|
||||
{
|
||||
char * symbol;
|
||||
|
||||
/* Create .idata$6 - the Hint Name Table. */
|
||||
id6 = pe_ILF_make_a_section (& vars, ".idata$6", SIZEOF_IDATA6, 0);
|
||||
if (id6 == NULL)
|
||||
return false;
|
||||
|
||||
/* If necessary, trim the import symbol name. */
|
||||
symbol = symbol_name;
|
||||
|
||||
if (import_name_type != IMPORT_NAME)
|
||||
/* Skip any prefix in symbol_name. */
|
||||
while (*symbol == '@' || * symbol == '?' || * symbol == '_')
|
||||
++ symbol;
|
||||
|
||||
if (import_name_type == IMPORT_NAME_UNDECORATE)
|
||||
{
|
||||
/* Truncate at the first '@' */
|
||||
while (* symbol != 0 && * symbol != '@')
|
||||
symbol ++;
|
||||
|
||||
* symbol = 0;
|
||||
}
|
||||
|
||||
strcpy (id6->contents, symbol);
|
||||
}
|
||||
|
||||
/* Create .idata$7 - the Dll Name Table. */
|
||||
id7 = pe_ILF_make_a_section (& vars, ".idata$7", SIZEOF_IDATA7, 0);
|
||||
if (id7 == NULL)
|
||||
return false;
|
||||
|
||||
strcpy (id7->contents + 2, source_dll);
|
||||
|
||||
/* Now generate the relocs for the sections. */
|
||||
pe_ILF_make_a_reloc (& vars, 0, BFD_RELOC_RVA, id4);
|
||||
pe_ILF_make_a_reloc (& vars, 12, BFD_RELOC_RVA, id7);
|
||||
pe_ILF_make_a_reloc (& vars, 16, BFD_RELOC_RVA, id5);
|
||||
pe_ILF_save_relocs (& vars, id2);
|
||||
|
||||
if (import_name_type != IMPORT_ORDINAL)
|
||||
{
|
||||
pe_ILF_make_a_reloc (& vars, 0, BFD_RELOC_RVA, id6);
|
||||
pe_ILF_save_relocs (& vars, id4);
|
||||
|
||||
pe_ILF_make_a_reloc (& vars, 0, BFD_RELOC_RVA, id6);
|
||||
pe_ILF_save_relocs (& vars, id5);
|
||||
}
|
||||
|
||||
/* Create extra sections depending upon the type of import we are dealing with. */
|
||||
switch (import_type)
|
||||
{
|
||||
int i;
|
||||
|
||||
case IMPORT_CODE:
|
||||
/* Create a .text section.
|
||||
First we need to look up its contents in the jump table. */
|
||||
for (i = NUM_ENTRIES (jtab); i--;)
|
||||
{
|
||||
if (jtab[i].size == 0)
|
||||
continue;
|
||||
if (jtab[i].magic == magic)
|
||||
break;
|
||||
}
|
||||
/* If we did not find a matching entry something is wrong. */
|
||||
if (i < 0)
|
||||
abort ();
|
||||
|
||||
/* Create the .text section. */
|
||||
text = pe_ILF_make_a_section (& vars, ".text", jtab[i].size, SEC_CODE);
|
||||
if (text == NULL)
|
||||
return false;
|
||||
|
||||
/* Copy in the jump code. */
|
||||
memcpy (text->contents, jtab[i].data, jtab[i].size);
|
||||
|
||||
/* Create a reloc for the data in the text section. */
|
||||
#ifdef MIPS_ARCH_MAGIC_WINCE
|
||||
if (magic == MIPS_ARCH_MAGIC_WINCE)
|
||||
{
|
||||
pe_ILF_make_a_reloc (& vars, 0, BFD_RELOC_HI16_S, id5);
|
||||
pe_ILF_make_a_reloc (& vars, 0, BFD_RELOC_LO16, text);
|
||||
pe_ILF_make_a_reloc (& vars, 4, BFD_RELOC_LO16, id5);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
pe_ILF_make_a_reloc (& vars, jtab[i].offset, BFD_RELOC_32, id5);
|
||||
|
||||
pe_ILF_save_relocs (& vars, text);
|
||||
break;
|
||||
|
||||
case IMPORT_DATA:
|
||||
break;
|
||||
|
||||
default:
|
||||
/* XXX code not yet written. */
|
||||
abort ();
|
||||
}
|
||||
|
||||
/* Initialise the bfd. */
|
||||
memset (& internal_f, 0, sizeof (internal_f));
|
||||
|
||||
internal_f.f_magic = magic;
|
||||
internal_f.f_symptr = 0;
|
||||
internal_f.f_nsyms = 0;
|
||||
internal_f.f_flags = F_AR32WR | F_LNNO; /* XXX is this correct ? */
|
||||
|
||||
if ( ! bfd_set_start_address (abfd, 0)
|
||||
|| ! bfd_coff_set_arch_mach_hook (abfd, & internal_f))
|
||||
return false;
|
||||
|
||||
if (bfd_coff_mkobject_hook (abfd, (PTR) & internal_f, NULL) == NULL)
|
||||
return false;
|
||||
|
||||
coff_data (abfd)->pe = 1;
|
||||
#ifdef THUMBPEMAGIC
|
||||
if (vars.magic == THUMBPEMAGIC)
|
||||
/* Stop some linker warnings about thumb code not supporting interworking. */
|
||||
coff_data (abfd)->flags |= F_INTERWORK | F_INTERWORK_SET;
|
||||
#endif
|
||||
|
||||
/* Switch from file contents to memory contents. */
|
||||
bfd_cache_close (abfd);
|
||||
|
||||
abfd->iostream = (PTR) vars.bim;
|
||||
abfd->flags |= BFD_IN_MEMORY /* | HAS_LOCALS */;
|
||||
abfd->where = 0;
|
||||
obj_sym_filepos (abfd) = 0;
|
||||
|
||||
/* Now create a symbol describing the imported value. */
|
||||
switch (import_type)
|
||||
{
|
||||
case IMPORT_CODE:
|
||||
pe_ILF_make_a_symbol (& vars, "", symbol_name, text,
|
||||
BSF_NOT_AT_END | BSF_FUNCTION);
|
||||
break;
|
||||
|
||||
case IMPORT_DATA:
|
||||
/* XXX not sure if I need to do anythign here. */
|
||||
break;
|
||||
|
||||
default:
|
||||
/* XXX code not yet written. */
|
||||
abort ();
|
||||
}
|
||||
|
||||
pe_ILF_make_a_symbol (& vars, "_imp__", symbol_name, id5, 0);
|
||||
|
||||
/* Point the bfd at the symbol table. */
|
||||
obj_symbols (abfd) = vars.sym_cache;
|
||||
bfd_get_symcount (abfd) = vars.sym_index;
|
||||
|
||||
obj_raw_syments (abfd) = vars.native_syms;
|
||||
obj_raw_syment_count (abfd) = vars.sym_index;
|
||||
|
||||
obj_coff_external_syms (abfd) = (PTR) vars.esym_table;
|
||||
obj_coff_keep_syms (abfd) = true;
|
||||
|
||||
obj_convert (abfd) = vars.sym_table;
|
||||
obj_conv_table_size (abfd) = vars.sym_index;
|
||||
|
||||
obj_coff_strings (abfd) = vars.string_table;
|
||||
obj_coff_keep_strings (abfd) = true;
|
||||
|
||||
abfd->flags |= HAS_SYMS;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* We have detected a Image Library Format archive element.
|
||||
Decode the element and return the appropriate target. */
|
||||
static const bfd_target *
|
||||
pe_bfd_object_p (abfd)
|
||||
bfd * abfd;
|
||||
pe_ILF_object_p (bfd * abfd)
|
||||
{
|
||||
bfd_byte buffer[16];
|
||||
bfd_byte * ptr;
|
||||
bfd_byte * symbol_name;
|
||||
bfd_byte * source_dll;
|
||||
unsigned int machine;
|
||||
unsigned long size;
|
||||
unsigned int ordinal;
|
||||
unsigned int types;
|
||||
unsigned short magic;
|
||||
|
||||
/* Upon entry the first four buyes of the ILF header have
|
||||
already been read. Now read the rest of the header. */
|
||||
if (bfd_read (buffer, 1, 16, abfd) != 16)
|
||||
return NULL;
|
||||
|
||||
ptr = buffer;
|
||||
|
||||
/* We do not bother to check the version number.
|
||||
version = bfd_h_get_16 (abfd, ptr); */
|
||||
ptr += 2;
|
||||
|
||||
machine = bfd_h_get_16 (abfd, ptr);
|
||||
ptr += 2;
|
||||
|
||||
/* Check that the machine type is recognised. */
|
||||
magic = 0;
|
||||
|
||||
switch (machine)
|
||||
{
|
||||
case IMAGE_FILE_MACHINE_UNKNOWN:
|
||||
case IMAGE_FILE_MACHINE_ALPHA:
|
||||
case IMAGE_FILE_MACHINE_ALPHA64:
|
||||
case IMAGE_FILE_MACHINE_IA64:
|
||||
break;
|
||||
|
||||
case IMAGE_FILE_MACHINE_I386:
|
||||
#ifdef I386MAGIC
|
||||
magic = I386MAGIC;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case IMAGE_FILE_MACHINE_M68K:
|
||||
#ifdef MC68AGIC
|
||||
magic = MC68MAGIC;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case IMAGE_FILE_MACHINE_R3000:
|
||||
case IMAGE_FILE_MACHINE_R4000:
|
||||
case IMAGE_FILE_MACHINE_R10000:
|
||||
|
||||
case IMAGE_FILE_MACHINE_MIPS16:
|
||||
case IMAGE_FILE_MACHINE_MIPSFPU:
|
||||
case IMAGE_FILE_MACHINE_MIPSFPU16:
|
||||
#ifdef MIPS_ARCH_MAGIC_WINCE
|
||||
magic = MIPS_ARCH_MAGIC_WINCE;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case IMAGE_FILE_MACHINE_SH3:
|
||||
case IMAGE_FILE_MACHINE_SH4:
|
||||
#ifdef SH_ARCH_MAGIC_WINCE
|
||||
magic = SH_ARCH_MAGIC_WINCE;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case IMAGE_FILE_MACHINE_ARM:
|
||||
#ifdef ARMPEMAGIC
|
||||
magic = ARMPEMAGIC;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case IMAGE_FILE_MACHINE_THUMB:
|
||||
#ifdef THUMBPEMAGIC
|
||||
{
|
||||
extern bfd_target armpei_little_vec;
|
||||
|
||||
if (abfd->xvec == & armpei_little_vec)
|
||||
magic = THUMBPEMAGIC;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
case IMAGE_FILE_MACHINE_POWERPC:
|
||||
/* We no longer support PowerPC. */
|
||||
default:
|
||||
_bfd_error_handler
|
||||
(
|
||||
_("%s: Unrecognised machine type (0x%x) in Import Library Format archive"),
|
||||
bfd_get_filename (abfd), machine);
|
||||
bfd_set_error (bfd_error_malformed_archive);
|
||||
|
||||
return NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (magic == 0)
|
||||
{
|
||||
_bfd_error_handler
|
||||
(
|
||||
_("%s: Recognised but unhandled machine type (0x%x) in Import Library Format archive"),
|
||||
bfd_get_filename (abfd), machine);
|
||||
bfd_set_error (bfd_error_wrong_format);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* We do not bother to check the date.
|
||||
date = bfd_h_get_32 (abfd, ptr); */
|
||||
ptr += 4;
|
||||
|
||||
size = bfd_h_get_32 (abfd, ptr);
|
||||
ptr += 4;
|
||||
|
||||
if (size == 0)
|
||||
{
|
||||
_bfd_error_handler
|
||||
(_("%s: size field is zero in Import Library Format header"),
|
||||
bfd_get_filename (abfd));
|
||||
bfd_set_error (bfd_error_malformed_archive);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ordinal = bfd_h_get_16 (abfd, ptr);
|
||||
ptr += 2;
|
||||
|
||||
types = bfd_h_get_16 (abfd, ptr);
|
||||
/* ptr += 2; */
|
||||
|
||||
/* Now read in the two strings that follow. */
|
||||
ptr = bfd_alloc (abfd, size);
|
||||
if (ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
if (bfd_read (ptr, 1, size, abfd) != size)
|
||||
return NULL;
|
||||
|
||||
symbol_name = ptr;
|
||||
source_dll = ptr + strlen (ptr) + 1;
|
||||
|
||||
/* Verify that the strings are null terminated. */
|
||||
if (ptr[size - 1] != 0 || ((source_dll - ptr) >= size))
|
||||
{
|
||||
_bfd_error_handler
|
||||
(_("%s: string not null terminated in ILF object file."),
|
||||
bfd_get_filename (abfd));
|
||||
bfd_set_error (bfd_error_malformed_archive);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Now construct the bfd. */
|
||||
if (! pe_ILF_build_a_bfd (abfd, magic, symbol_name,
|
||||
source_dll, ordinal, types))
|
||||
return NULL;
|
||||
|
||||
return abfd->xvec;
|
||||
}
|
||||
|
||||
static const bfd_target *
|
||||
pe_bfd_object_p (bfd * abfd)
|
||||
{
|
||||
/* We need to handle a PE image correctly. In PE images created by
|
||||
the GNU linker, the offset to the COFF header is always the size.
|
||||
|
@ -390,14 +1241,7 @@ pe_bfd_object_p (abfd)
|
|||
signature = bfd_h_get_32 (abfd, buffer);
|
||||
|
||||
if (signature == 0xffff0000)
|
||||
{
|
||||
_bfd_error_handler (
|
||||
_("%s: Import Library Format archives are not currently supported"),
|
||||
bfd_get_filename (abfd));
|
||||
bfd_set_error (bfd_error_wrong_format);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
return pe_ILF_object_p (abfd);
|
||||
|
||||
if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0
|
||||
|| bfd_read (buffer, 1, 4, abfd) != 4)
|
||||
|
@ -444,4 +1288,4 @@ _("%s: Import Library Format archives are not currently supported"),
|
|||
}
|
||||
|
||||
#define coff_object_p pe_bfd_object_p
|
||||
#endif
|
||||
#endif /* COFF_IMAGE_WITH_PE */
|
||||
|
|
11
bfd/peigen.c
11
bfd/peigen.c
|
@ -1676,18 +1676,17 @@ pe_print_reloc (abfd, vfile)
|
|||
_("\treloc %4d offset %4x [%4lx] %s"),
|
||||
j, off, (long) (off + virtual_address), tbl[t]);
|
||||
|
||||
/* HIGHADJ takes an argument, but there's no documentation
|
||||
on what it does, or what it means. Inferred from
|
||||
DUMPBIN. */
|
||||
/* HIGHADJ takes an argument, - the next record *is* the
|
||||
low 16 bits of addend. */
|
||||
if (t == IMAGE_REL_BASED_HIGHADJ)
|
||||
{
|
||||
fprintf (file, " (%4x)\n",
|
||||
fprintf (file, " (%4x)",
|
||||
((unsigned int)
|
||||
bfd_get_16 (abfd, data + i + 8 + j * 2 + 2)));
|
||||
j++;
|
||||
}
|
||||
else
|
||||
fprintf (file, "\n");
|
||||
|
||||
fprintf (file, "\n");
|
||||
}
|
||||
i += size;
|
||||
}
|
||||
|
|
|
@ -590,6 +590,8 @@ extern const bfd_target m68ksysvcoff_vec;
|
|||
extern const bfd_target m68k4knetbsd_vec;
|
||||
extern const bfd_target m88kbcs_vec;
|
||||
extern const bfd_target m88kmach3_vec;
|
||||
extern const bfd_target mipslpe_vec;
|
||||
extern const bfd_target mipslpei_vec;
|
||||
extern const bfd_target mcore_pe_big_vec;
|
||||
extern const bfd_target mcore_pe_little_vec;
|
||||
extern const bfd_target mcore_pei_big_vec;
|
||||
|
@ -610,6 +612,8 @@ extern const bfd_target shcoff_vec;
|
|||
extern const bfd_target shlcoff_vec;
|
||||
extern const bfd_target shcoff_small_vec;
|
||||
extern const bfd_target shlcoff_small_vec;
|
||||
extern const bfd_target shlpe_vec;
|
||||
extern const bfd_target shlpei_vec;
|
||||
extern const bfd_target sparcle_aout_vec;
|
||||
extern const bfd_target sparclinux_vec;
|
||||
extern const bfd_target sparclynx_aout_vec;
|
||||
|
|
Loading…
Reference in a new issue