Add WinCE support.
This commit is contained in:
parent
77343c58f9
commit
17505c5cfa
|
@ -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>
|
2000-02-27 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* elf32-sparc.c (elf32_sparc_merge_private_bfd_data): Don't bump
|
* elf32-sparc.c (elf32_sparc_merge_private_bfd_data): Don't bump
|
||||||
|
|
|
@ -218,6 +218,10 @@ BFD32_BACKENDS = \
|
||||||
pei-mcore.lo \
|
pei-mcore.lo \
|
||||||
pe-ppc.lo \
|
pe-ppc.lo \
|
||||||
pei-ppc.lo \
|
pei-ppc.lo \
|
||||||
|
pe-sh.lo \
|
||||||
|
pei-sh.lo \
|
||||||
|
pe-mips.lo \
|
||||||
|
pei-mips.lo \
|
||||||
peigen.lo \
|
peigen.lo \
|
||||||
ppcboot.lo \
|
ppcboot.lo \
|
||||||
reloc16.lo \
|
reloc16.lo \
|
||||||
|
@ -343,6 +347,10 @@ BFD32_BACKENDS_CFILES = \
|
||||||
pei-mcore.c \
|
pei-mcore.c \
|
||||||
pe-ppc.c \
|
pe-ppc.c \
|
||||||
pei-ppc.c \
|
pei-ppc.c \
|
||||||
|
pe-sh.c \
|
||||||
|
pei-sh.c \
|
||||||
|
pe-mips.c \
|
||||||
|
pei-mips.c \
|
||||||
peigen.c \
|
peigen.c \
|
||||||
ppcboot.c \
|
ppcboot.c \
|
||||||
reloc16.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 \
|
pei-i386.lo: pei-i386.c coff-i386.c $(INCDIR)/coff/i386.h \
|
||||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.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 \
|
pe-mcore.lo: pe-mcore.c coff-mcore.c $(INCDIR)/coff/mcore.h \
|
||||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.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 \
|
pei-ppc.lo: pei-ppc.c coff-ppc.c $(INCDIR)/coff/powerpc.h \
|
||||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.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 \
|
peigen.lo: peigen.c $(INCDIR)/coff/internal.h $(INCDIR)/coff/i386.h \
|
||||||
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h
|
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h
|
||||||
ppcboot.lo: ppcboot.c
|
ppcboot.lo: ppcboot.c
|
||||||
|
|
|
@ -335,6 +335,10 @@ BFD32_BACKENDS = \
|
||||||
pei-mcore.lo \
|
pei-mcore.lo \
|
||||||
pe-ppc.lo \
|
pe-ppc.lo \
|
||||||
pei-ppc.lo \
|
pei-ppc.lo \
|
||||||
|
pe-sh.lo \
|
||||||
|
pei-sh.lo \
|
||||||
|
pe-mips.lo \
|
||||||
|
pei-mips.lo \
|
||||||
peigen.lo \
|
peigen.lo \
|
||||||
ppcboot.lo \
|
ppcboot.lo \
|
||||||
reloc16.lo \
|
reloc16.lo \
|
||||||
|
@ -461,6 +465,10 @@ BFD32_BACKENDS_CFILES = \
|
||||||
pei-mcore.c \
|
pei-mcore.c \
|
||||||
pe-ppc.c \
|
pe-ppc.c \
|
||||||
pei-ppc.c \
|
pei-ppc.c \
|
||||||
|
pe-sh.c \
|
||||||
|
pei-sh.c \
|
||||||
|
pe-mips.c \
|
||||||
|
pei-mips.c \
|
||||||
peigen.c \
|
peigen.c \
|
||||||
ppcboot.c \
|
ppcboot.c \
|
||||||
reloc16.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 \
|
pei-i386.lo: pei-i386.c coff-i386.c $(INCDIR)/coff/i386.h \
|
||||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.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 \
|
pe-mcore.lo: pe-mcore.c coff-mcore.c $(INCDIR)/coff/mcore.h \
|
||||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.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 \
|
pei-ppc.lo: pei-ppc.c coff-ppc.c $(INCDIR)/coff/powerpc.h \
|
||||||
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
|
||||||
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.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 \
|
peigen.lo: peigen.c $(INCDIR)/coff/internal.h $(INCDIR)/coff/i386.h \
|
||||||
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h
|
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h
|
||||||
ppcboot.lo: ppcboot.c
|
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.
|
/* 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.
|
Free Software Foundation, Inc.
|
||||||
Written by Cygnus Support.
|
Written by Cygnus Support.
|
||||||
|
|
||||||
|
@ -199,8 +199,7 @@ coff_arm_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* These most certainly belong somewhere else. Just had to get rid of
|
/* 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_8 0
|
||||||
#define ARM_16 1
|
#define ARM_16 1
|
||||||
#define ARM_32 2
|
#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_THUMB12 13
|
||||||
#define ARM_THUMB23 14
|
#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[] =
|
static reloc_howto_type aoutarm_std_reloc_howto[] =
|
||||||
{
|
{
|
||||||
/* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone */
|
/* 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 */
|
HOWTO(ARM_8, /* type */
|
||||||
0, /* rightshift */
|
0, /* rightshift */
|
||||||
0, /* size */
|
0, /* size */
|
||||||
|
@ -403,7 +520,8 @@ static reloc_howto_type aoutarm_std_reloc_howto[] =
|
||||||
false,
|
false,
|
||||||
0x07ff07ff,
|
0x07ff07ff,
|
||||||
0x07ff07ff,
|
0x07ff07ff,
|
||||||
PCRELOFFSET),
|
PCRELOFFSET)
|
||||||
|
#endif /* not ARM_WINCE */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NUM_RELOCS NUM_ELEM (aoutarm_std_reloc_howto)
|
#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;
|
howto = aoutarm_std_reloc_howto + rel->r_type;
|
||||||
|
|
||||||
if (rel->r_type == ARM_RVA32)
|
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;
|
return howto;
|
||||||
}
|
}
|
||||||
|
@ -719,6 +837,12 @@ coff_arm_reloc_type_lookup (abfd, code)
|
||||||
|
|
||||||
switch (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_8, ARM_8);
|
||||||
ASTD (BFD_RELOC_16, ARM_16);
|
ASTD (BFD_RELOC_16, ARM_16);
|
||||||
ASTD (BFD_RELOC_32, ARM_32);
|
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_BRANCH9, ARM_THUMB9);
|
||||||
ASTD (BFD_RELOC_THUMB_PCREL_BRANCH12, ARM_THUMB12);
|
ASTD (BFD_RELOC_THUMB_PCREL_BRANCH12, ARM_THUMB12);
|
||||||
ASTD (BFD_RELOC_THUMB_PCREL_BRANCH23, ARM_THUMB23);
|
ASTD (BFD_RELOC_THUMB_PCREL_BRANCH23, ARM_THUMB23);
|
||||||
|
#endif
|
||||||
default: return (CONST struct reloc_howto_struct *) 0;
|
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;
|
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
|
/* If we are doing a relocateable link, then we can just ignore
|
||||||
a PC relative reloc that is pcrel_offset. It will already
|
a PC relative reloc that is pcrel_offset. It will already
|
||||||
have the correct value. If this is not a relocateable link,
|
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 */
|
/* Note: We used to check for ARM_THUMB9 and ARM_THUMB12 */
|
||||||
else if (howto->type == ARM_THUMB23)
|
else if (howto->type == ARM_THUMB23)
|
||||||
{
|
{
|
||||||
|
@ -1376,6 +1509,7 @@ coff_arm_relocate_section (output_bfd, info, input_bfd, input_section,
|
||||||
done = 1;
|
done = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the relocation type and destination symbol does not
|
/* 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 1 /* THUMBEXTENSION */
|
||||||
if (done)
|
if (done)
|
||||||
rstat = bfd_reloc_ok;
|
rstat = bfd_reloc_ok;
|
||||||
|
#ifndef ARM_WINCE
|
||||||
/* Only perform this fix during the final link, not a relocatable link. nickc@cygnus.com */
|
/* Only perform this fix during the final link, not a relocatable link. nickc@cygnus.com */
|
||||||
else if (! info->relocateable
|
else if (! info->relocateable
|
||||||
&& howto->type == ARM_THUMB23)
|
&& 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;
|
rstat = overflow ? bfd_reloc_overflow : bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
#endif /* THUMBEXTENSION */
|
#endif /* THUMBEXTENSION */
|
||||||
rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
|
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)
|
if (symndx == -1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* If the index is outside of the range of our table, something has gone wrong. */
|
||||||
if (symndx >= obj_conv_table_size (abfd))
|
if (symndx >= obj_conv_table_size (abfd))
|
||||||
{
|
{
|
||||||
_bfd_error_handler (_("%s: illegal symbol index in reloc: %d"),
|
_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);
|
record_arm_to_thumb_glue (info, h);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifndef ARM_WINCE
|
||||||
case ARM_THUMB23:
|
case ARM_THUMB23:
|
||||||
/* This one is a call from thumb code. We used to look
|
/* This one is a call from thumb code. We used to look
|
||||||
for ARM_THUMB9 and ARM_THUMB12 as well. We need 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;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -2379,70 +2518,6 @@ coff_arm_final_link_postscript (abfd, pfinfo)
|
||||||
return true;
|
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"
|
#include "coffcode.h"
|
||||||
|
|
||||||
#ifndef TARGET_LITTLE_SYM
|
#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 "bfdlink.h"
|
||||||
#include "coff/sh.h"
|
#include "coff/sh.h"
|
||||||
#include "coff/internal.h"
|
#include "coff/internal.h"
|
||||||
|
|
||||||
|
#ifdef COFF_WITH_PE
|
||||||
|
#include "coff/pe.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "libcoff.h"
|
#include "libcoff.h"
|
||||||
|
|
||||||
/* Internal functions. */
|
/* 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 *,
|
PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
|
||||||
bfd_byte *, boolean, asymbol **));
|
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. */
|
/* 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. */
|
/* Generate long file names. */
|
||||||
#define COFF_LONG_FILENAMES
|
#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
|
/* The supported relocations. There are a lot of relocations defined
|
||||||
in coff/internal.h which we do not expect to ever see. */
|
in coff/internal.h which we do not expect to ever see. */
|
||||||
static reloc_howto_type sh_coff_howtos[] =
|
static reloc_howto_type sh_coff_howtos[] =
|
||||||
{
|
{
|
||||||
EMPTY_HOWTO (0),
|
EMPTY_HOWTO (0),
|
||||||
EMPTY_HOWTO (1),
|
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),
|
EMPTY_HOWTO (2),
|
||||||
|
#endif
|
||||||
EMPTY_HOWTO (3), /* R_SH_PCREL8 */
|
EMPTY_HOWTO (3), /* R_SH_PCREL8 */
|
||||||
EMPTY_HOWTO (4), /* R_SH_PCREL16 */
|
EMPTY_HOWTO (4), /* R_SH_PCREL16 */
|
||||||
EMPTY_HOWTO (5), /* R_SH_HIGH8 */
|
EMPTY_HOWTO (5), /* R_SH_HIGH8 */
|
||||||
|
@ -116,7 +159,23 @@ static reloc_howto_type sh_coff_howtos[] =
|
||||||
false), /* pcrel_offset */
|
false), /* pcrel_offset */
|
||||||
|
|
||||||
EMPTY_HOWTO (15),
|
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 */
|
EMPTY_HOWTO (16), /* R_SH_IMM8 */
|
||||||
|
#endif
|
||||||
EMPTY_HOWTO (17), /* R_SH_IMM8BY2 */
|
EMPTY_HOWTO (17), /* R_SH_IMM8BY2 */
|
||||||
EMPTY_HOWTO (18), /* R_SH_IMM8BY4 */
|
EMPTY_HOWTO (18), /* R_SH_IMM8BY4 */
|
||||||
EMPTY_HOWTO (19), /* R_SH_IMM4 */
|
EMPTY_HOWTO (19), /* R_SH_IMM4 */
|
||||||
|
@ -303,6 +362,7 @@ static reloc_howto_type sh_coff_howtos[] =
|
||||||
/* FIXME: This should not be set here. */
|
/* FIXME: This should not be set here. */
|
||||||
#define __A_MAGIC_SET__
|
#define __A_MAGIC_SET__
|
||||||
|
|
||||||
|
#ifndef COFF_WITH_PE
|
||||||
/* Swap the r_offset field in and out. */
|
/* Swap the r_offset field in and out. */
|
||||||
#define SWAP_IN_RELOC_OFFSET bfd_h_get_32
|
#define SWAP_IN_RELOC_OFFSET bfd_h_get_32
|
||||||
#define SWAP_OUT_RELOC_OFFSET bfd_h_put_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'; \
|
dst->r_stuff[1] = 'C'; \
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Get the value of a symbol, when performing a relocation. */
|
/* Get the value of a symbol, when performing a relocation. */
|
||||||
|
|
||||||
|
@ -334,6 +395,96 @@ get_symbol_value (symbol)
|
||||||
return relocation;
|
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
|
/* This macro is used in coffcode.h to get the howto corresponding to
|
||||||
an internal reloc. */
|
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
|
/* Almost all relocs have to do with relaxing. If any work must be
|
||||||
done for them, it has been done in sh_relax_section. */
|
done for them, it has been done in sh_relax_section. */
|
||||||
if (r_type != R_SH_IMM32
|
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
|
&& (r_type != R_SH_PCDISP
|
||||||
|| (symbol_in->flags & BSF_LOCAL) != 0))
|
|| (symbol_in->flags & BSF_LOCAL) != 0))
|
||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
|
@ -414,10 +569,21 @@ sh_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
|
||||||
switch (r_type)
|
switch (r_type)
|
||||||
{
|
{
|
||||||
case R_SH_IMM32:
|
case R_SH_IMM32:
|
||||||
|
#ifdef COFF_WITH_PE
|
||||||
|
case R_SH_IMM32CE:
|
||||||
|
#endif
|
||||||
insn = bfd_get_32 (abfd, hit_data);
|
insn = bfd_get_32 (abfd, hit_data);
|
||||||
insn += sym_value + reloc_entry->addend;
|
insn += sym_value + reloc_entry->addend;
|
||||||
bfd_put_32 (abfd, insn, hit_data);
|
bfd_put_32 (abfd, insn, hit_data);
|
||||||
break;
|
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:
|
case R_SH_PCDISP:
|
||||||
insn = bfd_get_16 (abfd, hit_data);
|
insn = bfd_get_16 (abfd, hit_data);
|
||||||
sym_value += reloc_entry->addend;
|
sym_value += reloc_entry->addend;
|
||||||
|
@ -618,7 +784,14 @@ sh_relax_section (abfd, sec, link_info, again)
|
||||||
paddr += sec->vma;
|
paddr += sec->vma;
|
||||||
for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
|
for (irelfn = internal_relocs; irelfn < irelend; irelfn++)
|
||||||
if (irelfn->r_vaddr == paddr
|
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)
|
&& irelfn->r_type == R_SH_IMM32)
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
if (irelfn >= irelend)
|
if (irelfn >= irelend)
|
||||||
{
|
{
|
||||||
|
@ -996,6 +1169,10 @@ sh_relax_delete_bytes (abfd, sec, addr, count)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_SH_IMM32:
|
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
|
/* If this reloc is against a symbol defined in this
|
||||||
section, and the symbol will not be adjusted below, we
|
section, and the symbol will not be adjusted below, we
|
||||||
must check the addend to see it will put the value in
|
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;
|
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)
|
if (irelscan->r_type != R_SH_IMM32)
|
||||||
|
#endif
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bfd_coff_swap_sym_in (abfd,
|
bfd_coff_swap_sym_in (abfd,
|
||||||
|
@ -1364,7 +1547,7 @@ struct sh_opcode
|
||||||
mask value in the sh_major_opcode structure. */
|
mask value in the sh_major_opcode structure. */
|
||||||
unsigned short opcode;
|
unsigned short opcode;
|
||||||
/* Flags for this instruction. */
|
/* Flags for this instruction. */
|
||||||
unsigned flags;
|
unsigned short flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Flag which appear in the sh_opcode structure. */
|
/* Flag which appear in the sh_opcode structure. */
|
||||||
|
@ -1993,6 +2176,7 @@ sh_insn_uses_reg (insn, op, reg)
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See whether an instruction sets a general purpose register. */
|
/* See whether an instruction sets a general purpose register. */
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
|
@ -2200,6 +2384,7 @@ sh_load_use (i1, op1, i2, op2)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef COFF_IMAGE_WITH_PE
|
||||||
/* Try to align loads and stores within a span of memory. This is
|
/* 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
|
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
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Look for loads and stores which we can align to four byte
|
/* Look for loads and stores which we can align to four byte
|
||||||
boundaries. See the longer comment above sh_relax_section for why
|
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
|
/* Almost all relocs have to do with relaxing. If any work must
|
||||||
be done for them, it has been done in sh_relax_section. */
|
be done for them, it has been done in sh_relax_section. */
|
||||||
if (rel->r_type != R_SH_IMM32
|
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)
|
&& rel->r_type != R_SH_PCDISP)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -2703,6 +2893,11 @@ sh_relocate_section (output_bfd, info, input_bfd, input_section, contents,
|
||||||
return false;
|
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;
|
val = 0;
|
||||||
|
|
||||||
if (h == NULL)
|
if (h == NULL)
|
||||||
|
@ -2899,7 +3094,9 @@ sh_coff_get_relocated_section_contents (output_bfd, link_info, link_order,
|
||||||
|
|
||||||
/* The target vectors. */
|
/* The target vectors. */
|
||||||
|
|
||||||
|
#ifndef TARGET_SHL_SYM
|
||||||
CREATE_BIG_COFF_TARGET_VEC (shcoff_vec, "coff-sh", BFD_IS_RELAXABLE, 0, '_', NULL)
|
CREATE_BIG_COFF_TARGET_VEC (shcoff_vec, "coff-sh", BFD_IS_RELAXABLE, 0, '_', NULL)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef TARGET_SHL_SYM
|
#ifdef TARGET_SHL_SYM
|
||||||
#define TARGET_SYM 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"
|
#define TARGET_SHL_NAME "coff-shl"
|
||||||
#endif
|
#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)
|
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
|
/* 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
|
to 16 byte boundaries. We implement that by adding a couple of new
|
||||||
target vectors. These are just like the ones above, but they
|
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
|
(PTR) &bfd_coff_small_swap_table
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Support for the generic parts of most COFF variants, for BFD.
|
/* 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.
|
Free Software Foundation, Inc.
|
||||||
Written by Cygnus Support.
|
Written by Cygnus Support.
|
||||||
|
|
||||||
|
@ -1765,6 +1765,8 @@ coff_set_arch_mach_hook (abfd, filehdr)
|
||||||
#endif
|
#endif
|
||||||
#ifdef ARMMAGIC
|
#ifdef ARMMAGIC
|
||||||
case ARMMAGIC:
|
case ARMMAGIC:
|
||||||
|
case ARMPEMAGIC:
|
||||||
|
case THUMBPEMAGIC:
|
||||||
arch = bfd_arch_arm;
|
arch = bfd_arch_arm;
|
||||||
switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
|
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
|
#ifdef SH_ARCH_MAGIC_BIG
|
||||||
case SH_ARCH_MAGIC_BIG:
|
case SH_ARCH_MAGIC_BIG:
|
||||||
case SH_ARCH_MAGIC_LITTLE:
|
case SH_ARCH_MAGIC_LITTLE:
|
||||||
|
#ifdef COFF_WITH_PE
|
||||||
|
case SH_ARCH_MAGIC_WINCE:
|
||||||
|
#endif
|
||||||
arch = bfd_arch_sh;
|
arch = bfd_arch_sh;
|
||||||
machine = 0;
|
machine = 0;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef MIPS_ARCH_MAGIC_WINCE
|
||||||
|
case MIPS_ARCH_MAGIC_WINCE:
|
||||||
|
arch = bfd_arch_mips;
|
||||||
|
machine = 0;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef H8500MAGIC
|
#ifdef H8500MAGIC
|
||||||
case H8500MAGIC:
|
case H8500MAGIC:
|
||||||
arch = bfd_arch_h8500;
|
arch = bfd_arch_h8500;
|
||||||
|
@ -2402,7 +2414,11 @@ coff_set_flags (abfd, magicp, flagsp)
|
||||||
#endif
|
#endif
|
||||||
#ifdef ARMMAGIC
|
#ifdef ARMMAGIC
|
||||||
case bfd_arch_arm:
|
case bfd_arch_arm:
|
||||||
|
#ifdef ARM_WINCE
|
||||||
|
* magicp = ARMPEMAGIC;
|
||||||
|
#else
|
||||||
* magicp = ARMMAGIC;
|
* magicp = ARMMAGIC;
|
||||||
|
#endif
|
||||||
* flagsp = 0;
|
* flagsp = 0;
|
||||||
if (APCS_SET (abfd))
|
if (APCS_SET (abfd))
|
||||||
{
|
{
|
||||||
|
@ -2497,10 +2513,21 @@ coff_set_flags (abfd, magicp, flagsp)
|
||||||
|
|
||||||
#ifdef SH_ARCH_MAGIC_BIG
|
#ifdef SH_ARCH_MAGIC_BIG
|
||||||
case bfd_arch_sh:
|
case bfd_arch_sh:
|
||||||
|
#ifdef COFF_IMAGE_WITH_PE
|
||||||
|
*magicp = SH_ARCH_MAGIC_WINCE;
|
||||||
|
#else
|
||||||
if (bfd_big_endian (abfd))
|
if (bfd_big_endian (abfd))
|
||||||
*magicp = SH_ARCH_MAGIC_BIG;
|
*magicp = SH_ARCH_MAGIC_BIG;
|
||||||
else
|
else
|
||||||
*magicp = SH_ARCH_MAGIC_LITTLE;
|
*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;
|
return true;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
@ -3518,6 +3545,16 @@ coff_write_object_contents (abfd)
|
||||||
RS6K_AOUTHDR_OMAGIC;
|
RS6K_AOUTHDR_OMAGIC;
|
||||||
#endif
|
#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__
|
#ifndef __A_MAGIC_SET__
|
||||||
#include "Your aouthdr magic number is not being set!"
|
#include "Your aouthdr magic number is not being set!"
|
||||||
#else
|
#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_selvecs="arm_epoc_pe_little_vec arm_epoc_pe_big_vec arm_epoc_pei_little_vec arm_epoc_pei_big_vec"
|
||||||
targ_underscore=no
|
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*)
|
arm-*-pe*)
|
||||||
targ_defvec=armpe_little_vec
|
targ_defvec=armpe_little_vec
|
||||||
targ_selvecs="armpe_little_vec armpe_big_vec armpei_little_vec armpei_big_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_defvec=aout_mips_little_vec
|
||||||
targ_cflags=-DSTAT_FOR_EXEC
|
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*)
|
mips*-*-sysv4*)
|
||||||
targ_defvec=bfd_elf32_bigmips_vec
|
targ_defvec=bfd_elf32_bigmips_vec
|
||||||
targ_selvecs="bfd_elf32_littlemips_vec ecoff_big_vec ecoff_little_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_selvecs="bfd_elf32_shl_vec shcoff_vec shlcoff_vec shcoff_small_vec shlcoff_small_vec"
|
||||||
targ_underscore=yes
|
targ_underscore=yes
|
||||||
;;
|
;;
|
||||||
|
sh-*-pe)
|
||||||
|
targ_defvec=shlpe_vec
|
||||||
|
targ_selvecs="shlpe_vec shlpei_vec"
|
||||||
|
targ_underscore=yes
|
||||||
|
;;
|
||||||
sh-*-* | sh-*-rtems*)
|
sh-*-* | sh-*-rtems*)
|
||||||
targ_defvec=shcoff_vec
|
targ_defvec=shcoff_vec
|
||||||
targ_selvecs="shcoff_vec shlcoff_vec shcoff_small_vec shlcoff_small_vec"
|
targ_selvecs="shcoff_vec shlcoff_vec shcoff_small_vec shlcoff_small_vec"
|
||||||
|
|
|
@ -5167,6 +5167,8 @@ do
|
||||||
m68kaux_coff_vec) tb="$tb coff-aux.lo coff-m68k.lo cofflink.lo" ;;
|
m68kaux_coff_vec) tb="$tb coff-aux.lo coff-m68k.lo cofflink.lo" ;;
|
||||||
m68ksysvcoff_vec) tb="$tb coff-svm68k.lo cofflink.lo" ;;
|
m68ksysvcoff_vec) tb="$tb coff-svm68k.lo cofflink.lo" ;;
|
||||||
m88kbcs_vec) tb="$tb coff-m88k.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_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_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" ;;
|
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" ;;
|
shlcoff_vec) tb="$tb coff-sh.lo cofflink.lo" ;;
|
||||||
shcoff_small_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" ;;
|
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" ;;
|
som_vec) tb="$tb som.lo" ;;
|
||||||
sparcle_aout_vec) tb="$tb aout-sparcle.lo aout32.lo" ;;
|
sparcle_aout_vec) tb="$tb aout-sparcle.lo aout32.lo" ;;
|
||||||
sparclinux_vec) tb="$tb sparclinux.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" ;;
|
m68kaux_coff_vec) tb="$tb coff-aux.lo coff-m68k.lo cofflink.lo" ;;
|
||||||
m68ksysvcoff_vec) tb="$tb coff-svm68k.lo cofflink.lo" ;;
|
m68ksysvcoff_vec) tb="$tb coff-svm68k.lo cofflink.lo" ;;
|
||||||
m88kbcs_vec) tb="$tb coff-m88k.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_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_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" ;;
|
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" ;;
|
shlcoff_vec) tb="$tb coff-sh.lo cofflink.lo" ;;
|
||||||
shcoff_small_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" ;;
|
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" ;;
|
som_vec) tb="$tb som.lo" ;;
|
||||||
sparcle_aout_vec) tb="$tb aout-sparcle.lo aout32.lo" ;;
|
sparcle_aout_vec) tb="$tb aout-sparcle.lo aout32.lo" ;;
|
||||||
sparclinux_vec) tb="$tb sparclinux.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
|
boolean _bfd_pei_final_link_postscript
|
||||||
PARAMS ((bfd *, struct coff_final_link_info *));
|
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
|
/* 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
|
otherwise vary; peicode.h fixes up ifdefs but we provide the
|
||||||
prototype. */
|
prototype. */
|
||||||
|
|
|
@ -40,4 +40,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
bfd_arm_pe_process_before_allocation
|
bfd_arm_pe_process_before_allocation
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARM_WINCE
|
||||||
|
#define TARGET_UNDERSCORE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "coff-arm.c"
|
#include "coff-arm.c"
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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"
|
|
@ -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"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 pe_mkobject
|
||||||
#define coff_mkobject_hook pe_mkobject_hook
|
#define coff_mkobject_hook pe_mkobject_hook
|
||||||
|
|
||||||
|
#ifndef NO_COFF_RELOCS
|
||||||
static void coff_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
|
static void coff_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
|
||||||
static unsigned int coff_swap_reloc_out 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_filehdr_in PARAMS ((bfd *, PTR, PTR));
|
||||||
static void coff_swap_scnhdr_in PARAMS ((bfd *, PTR, PTR));
|
static void coff_swap_scnhdr_in PARAMS ((bfd *, PTR, PTR));
|
||||||
static boolean pe_mkobject PARAMS ((bfd *));
|
static boolean pe_mkobject PARAMS ((bfd *));
|
||||||
static PTR pe_mkobject_hook PARAMS ((bfd *, PTR, PTR));
|
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
|
static void
|
||||||
coff_swap_reloc_in (abfd, src, dst)
|
coff_swap_reloc_in (abfd, src, dst)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
|
@ -139,7 +188,7 @@ coff_swap_reloc_out (abfd, src, dst)
|
||||||
#endif
|
#endif
|
||||||
return RELSZ;
|
return RELSZ;
|
||||||
}
|
}
|
||||||
|
#endif /* not NO_COFF_RELOCS */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
coff_swap_filehdr_in (abfd, src, dst)
|
coff_swap_filehdr_in (abfd, src, dst)
|
||||||
|
@ -236,6 +285,7 @@ coff_swap_scnhdr_in (abfd, ext, in)
|
||||||
scnhdr_int->s_vaddr &= 0xffffffff;
|
scnhdr_int->s_vaddr &= 0xffffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef COFF_NO_HACK_SCNHDR_SIZE
|
||||||
/* If this section holds uninitialized data, use the virtual size
|
/* If this section holds uninitialized data, use the virtual size
|
||||||
(stored in s_paddr) instead of the physical size. */
|
(stored in s_paddr) instead of the physical size. */
|
||||||
if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0)
|
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
|
only works if it correctly holds the virtual size of the
|
||||||
section. */
|
section. */
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
|
@ -363,9 +414,809 @@ pe_bfd_copy_private_bfd_data (ibfd, obfd)
|
||||||
#define coff_get_symbol_info _bfd_pe_get_symbol_info
|
#define coff_get_symbol_info _bfd_pe_get_symbol_info
|
||||||
|
|
||||||
#ifdef COFF_IMAGE_WITH_PE
|
#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 *
|
static const bfd_target *
|
||||||
pe_bfd_object_p (abfd)
|
pe_ILF_object_p (bfd * abfd)
|
||||||
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
|
/* 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.
|
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);
|
signature = bfd_h_get_32 (abfd, buffer);
|
||||||
|
|
||||||
if (signature == 0xffff0000)
|
if (signature == 0xffff0000)
|
||||||
{
|
return pe_ILF_object_p (abfd);
|
||||||
_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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0
|
if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0
|
||||||
|| bfd_read (buffer, 1, 4, abfd) != 4)
|
|| 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
|
#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"),
|
_("\treloc %4d offset %4x [%4lx] %s"),
|
||||||
j, off, (long) (off + virtual_address), tbl[t]);
|
j, off, (long) (off + virtual_address), tbl[t]);
|
||||||
|
|
||||||
/* HIGHADJ takes an argument, but there's no documentation
|
/* HIGHADJ takes an argument, - the next record *is* the
|
||||||
on what it does, or what it means. Inferred from
|
low 16 bits of addend. */
|
||||||
DUMPBIN. */
|
|
||||||
if (t == IMAGE_REL_BASED_HIGHADJ)
|
if (t == IMAGE_REL_BASED_HIGHADJ)
|
||||||
{
|
{
|
||||||
fprintf (file, " (%4x)\n",
|
fprintf (file, " (%4x)",
|
||||||
((unsigned int)
|
((unsigned int)
|
||||||
bfd_get_16 (abfd, data + i + 8 + j * 2 + 2)));
|
bfd_get_16 (abfd, data + i + 8 + j * 2 + 2)));
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
fprintf (file, "\n");
|
fprintf (file, "\n");
|
||||||
}
|
}
|
||||||
i += size;
|
i += size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -590,6 +590,8 @@ extern const bfd_target m68ksysvcoff_vec;
|
||||||
extern const bfd_target m68k4knetbsd_vec;
|
extern const bfd_target m68k4knetbsd_vec;
|
||||||
extern const bfd_target m88kbcs_vec;
|
extern const bfd_target m88kbcs_vec;
|
||||||
extern const bfd_target m88kmach3_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_big_vec;
|
||||||
extern const bfd_target mcore_pe_little_vec;
|
extern const bfd_target mcore_pe_little_vec;
|
||||||
extern const bfd_target mcore_pei_big_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 shlcoff_vec;
|
||||||
extern const bfd_target shcoff_small_vec;
|
extern const bfd_target shcoff_small_vec;
|
||||||
extern const bfd_target shlcoff_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 sparcle_aout_vec;
|
||||||
extern const bfd_target sparclinux_vec;
|
extern const bfd_target sparclinux_vec;
|
||||||
extern const bfd_target sparclynx_aout_vec;
|
extern const bfd_target sparclynx_aout_vec;
|
||||||
|
|
Loading…
Reference in New Issue