Add x86_64-mingw64 target

This commit is contained in:
Nick Clifton 2006-09-20 11:35:11 +00:00
parent a8bbe5b03e
commit 99ad839030
78 changed files with 3806 additions and 157 deletions

View File

@ -1,3 +1,36 @@
2006-09-20 Kai Tietz <Kai.Tietz@onevision.com>
* configure.in: Added new target-vectors x86_64coff_vec,
x86_64pe_vec, and x86_64pei_vec.
* configure: Regenerate.
* config.bfd: Adjusted x86_64 target architecture detection.
* bfd.c: Add for new target "coff-x86-64"
(bfd_get_sign_extend): Add target vector idents for pe-x86-64. and pei-x86-64.
* coff-x86_64.c: Add new file for x86_64 (AMD64) coff support.
* libpei.h: Adjustments for COFF_WITH_pex64.
* coffcode.h: Add for new target machine, architecture, signature, and internal
signature handler.
* Makefile.am: Add new files to target-all and define make-rule for pex64igen.c
* Makefile.in: Regenerate.
* pe-x86_64.c: Add for new target "pe-x86-64".
* pei-x86_64.c: Add for new target "pei-x86-64".
* peicode.h: Adjusts for new targets.
(coff_swap_filehdr_out): Set for this target to
_bfd_pex64_only_swap_filehdr_out.
(SIZEOF_IDATA4): Define it as 8 byte size for this target.
(SIZEOF_IDATA5): Define it as 8 byte size for this target.
(jump_table jtab): Add for AMD64MAGIC.
(pe_ILF_build_a_bfd): Adjusts for new size of SIZEOF_IDATA4 and SIZE_IDATA5.
(pe_ILF_object_p): Add coff image-file signature to internal
signature translation.
* peXXigen.c: Adjust proper include of target coff-header and
introduced target specific code
(COFF_WITH_pex64): New macro for this target.
(pe_print_idata): New dumping method for import section of PE+ files.
* targets.c: Add new target vectors declarations for x86_64 coff targets.
* coffcode.h: Support code to support the x86_64 PE magic number.
* coff-x86_64.c: New file.
2006-09-17 Hans-Peter Nilsson <hp@axis.com>
* elf.c (special_sections_s): Revert last STRING_COMMA_LEN change

View File

@ -563,7 +563,11 @@ BFD64_BACKENDS = \
mmo.lo \
nlm32-alpha.lo \
nlm64.lo \
pepigen.lo
coff-x86_64.lo \
pe-x86_64.lo \
pei-x86_64.lo \
pepigen.lo \
pex64igen.lo
BFD64_BACKENDS_CFILES = \
aix5ppc-core.c \
@ -586,7 +590,10 @@ BFD64_BACKENDS_CFILES = \
elf64.c \
mmo.c \
nlm32-alpha.c \
nlm64.c
nlm64.c \
coff-x86_64.c \
pe-x86_64.c \
pei-x86_64.c
OPTIONAL_BACKENDS = \
aix386-core.lo \
@ -636,7 +643,7 @@ SOURCE_CFILES = \
$(OPTIONAL_BACKENDS_CFILES)
BUILD_CFILES = \
elf32-ia64.c elf64-ia64.c peigen.c pepigen.c
elf32-ia64.c elf64-ia64.c peigen.c pepigen.c pex64igen.c
CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
@ -794,6 +801,11 @@ pepigen.c : peXXigen.c
sed -e s/XX/pep/g < $(srcdir)/peXXigen.c > pepigen.new
mv -f pepigen.new pepigen.c
pex64igen.c: peXXigen.c
rm -f pex64igen.c
sed -e s/XX/pex64/g < $(srcdir)/peXXigen.c > pex64igen.new
mv -f pex64igen.new pex64igen.c
BFD_H_DEPS= $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h
LOCAL_H_DEPS= libbfd.h sysdep.h config.h
$(BFD32_LIBS) \
@ -1861,4 +1873,7 @@ peigen.lo: peigen.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
pepigen.lo: pepigen.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/coff/internal.h $(INCDIR)/coff/ia64.h $(INCDIR)/coff/external.h \
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h
pex64igen.lo: pex64igen.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/coff/internal.h $(INCDIR)/coff/x86_64.h $(INCDIR)/coff/external.h \
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h
# IF YOU PUT ANYTHING HERE IT WILL GO AWAY

View File

@ -796,7 +796,11 @@ BFD64_BACKENDS = \
mmo.lo \
nlm32-alpha.lo \
nlm64.lo \
pepigen.lo
coff-x86_64.lo \
pe-x86_64.lo \
pei-x86_64.lo \
pepigen.lo \
pex64igen.lo
BFD64_BACKENDS_CFILES = \
aix5ppc-core.c \
@ -819,7 +823,10 @@ BFD64_BACKENDS_CFILES = \
elf64.c \
mmo.c \
nlm32-alpha.c \
nlm64.c
nlm64.c \
coff-x86_64.c \
pe-x86_64.c \
pei-x86_64.c
OPTIONAL_BACKENDS = \
aix386-core.lo \
@ -870,7 +877,7 @@ SOURCE_CFILES = \
$(OPTIONAL_BACKENDS_CFILES)
BUILD_CFILES = \
elf32-ia64.c elf64-ia64.c peigen.c pepigen.c
elf32-ia64.c elf64-ia64.c peigen.c pepigen.c pex64igen.c
CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
SOURCE_HFILES = \
@ -1372,6 +1379,11 @@ pepigen.c : peXXigen.c
rm -f pepigen.c
sed -e s/XX/pep/g < $(srcdir)/peXXigen.c > pepigen.new
mv -f pepigen.new pepigen.c
pex64igen.c: peXXigen.c
rm -f pex64igen.c
sed -e s/XX/pex64/g < $(srcdir)/peXXigen.c > pex64igen.new
mv -f pex64igen.new pex64igen.c
$(BFD32_LIBS) \
$(BFD64_LIBS) \
$(ALL_MACHINES) \
@ -2422,6 +2434,9 @@ peigen.lo: peigen.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
pepigen.lo: pepigen.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/coff/internal.h $(INCDIR)/coff/ia64.h $(INCDIR)/coff/external.h \
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h
pex64igen.lo: pex64igen.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/coff/internal.h $(INCDIR)/coff/x86_64.h $(INCDIR)/coff/external.h \
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h
# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.

768
bfd/coff-x86_64.c Normal file
View File

@ -0,0 +1,768 @@
/* BFD back-end for AMD 64 COFF files.
Copyright 2006 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
Written by Kai Tietz, OneVision Software GmbH&CoKg. */
#ifndef COFF_WITH_pex64
#define COFF_WITH_pex64
#endif
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
#include "coff/x86_64.h"
#include "coff/internal.h"
#include "coff/pe.h"
#include "libcoff.h"
#include "libiberty.h"
#define BADMAG(x) AMD64BADMAG(x)
#ifdef COFF_WITH_pex64
# undef AOUTSZ
# define AOUTSZ PEPAOUTSZ
# define PEAOUTHDR PEPAOUTHDR
#endif
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
/* The page size is a guess based on ELF. */
#define COFF_PAGE_SIZE 0x1000
/* For some reason when using AMD COFF the value stored in the .text
section for a reference to a common symbol is the value itself plus
any desired offset. Ian Taylor, Cygnus Support. */
/* If we are producing relocatable output, we need to do some
adjustments to the object file that are not done by the
bfd_perform_relocation function. This function is called by every
reloc type to make any required adjustments. */
static bfd_reloc_status_type
coff_amd64_reloc (bfd *abfd,
arelent *reloc_entry,
asymbol *symbol,
void * data,
asection *input_section ATTRIBUTE_UNUSED,
bfd *output_bfd,
char **error_message ATTRIBUTE_UNUSED)
{
symvalue diff;
#if !defined(COFF_WITH_PE)
if (output_bfd == NULL)
return bfd_reloc_continue;
#endif
if (bfd_is_com_section (symbol->section))
{
#if !defined(COFF_WITH_PE)
/* We are relocating a common symbol. The current value in the
object file is ORIG + OFFSET, where ORIG is the value of the
common symbol as seen by the object file when it was compiled
(this may be zero if the symbol was undefined) and OFFSET is
the offset into the common symbol (normally zero, but may be
non-zero when referring to a field in a common structure).
ORIG is the negative of reloc_entry->addend, which is set by
the CALC_ADDEND macro below. We want to replace the value in
the object file with NEW + OFFSET, where NEW is the value of
the common symbol which we are going to put in the final
object file. NEW is symbol->value. */
diff = symbol->value + reloc_entry->addend;
#else
/* In PE mode, we do not offset the common symbol. */
diff = reloc_entry->addend;
#endif
}
else
{
/* For some reason bfd_perform_relocation always effectively
ignores the addend for a COFF target when producing
relocatable output. This seems to be always wrong for 386
COFF, so we handle the addend here instead. */
#if defined(COFF_WITH_PE)
if (output_bfd == NULL)
{
reloc_howto_type *howto = reloc_entry->howto;
/* Although PC relative relocations are very similar between
PE and non-PE formats, but they are off by 1 << howto->size
bytes. For the external relocation, PE is very different
from others. See md_apply_fix3 () in gas/config/tc-amd64.c.
When we link PE and non-PE object files together to
generate a non-PE executable, we have to compensate it
here. */
if(howto->pc_relative && howto->pcrel_offset)
diff = -(1 << howto->size);
else if(symbol->flags & BSF_WEAK)
diff = reloc_entry->addend - symbol->value;
else
diff = -reloc_entry->addend;
}
else
#endif
diff = reloc_entry->addend;
}
#if defined(COFF_WITH_PE)
/* FIXME: How should this case be handled? */
if (reloc_entry->howto->type == R_AMD64_IMAGEBASE
&& output_bfd != NULL
&& bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
diff -= pe_data (output_bfd)->pe_opthdr.ImageBase;
#endif
#define DOIT(x) \
x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask))
if (diff != 0)
{
reloc_howto_type *howto = reloc_entry->howto;
unsigned char *addr = (unsigned char *) data + reloc_entry->address;
switch (howto->size)
{
case 0:
{
char x = bfd_get_8 (abfd, addr);
DOIT (x);
bfd_put_8 (abfd, x, addr);
}
break;
case 1:
{
short x = bfd_get_16 (abfd, addr);
DOIT (x);
bfd_put_16 (abfd, (bfd_vma) x, addr);
}
break;
case 2:
{
long x = bfd_get_32 (abfd, addr);
DOIT (x);
bfd_put_32 (abfd, (bfd_vma) x, addr);
}
break;
case 4:
{
long long x = bfd_get_64 (abfd, addr);
DOIT (x);
bfd_put_64 (abfd, (bfd_vma) x, addr);
}
break;
default:
abort ();
}
}
/* Now let bfd_perform_relocation finish everything up. */
return bfd_reloc_continue;
}
#if defined(COFF_WITH_PE)
/* Return TRUE if this relocation should appear in the output .reloc
section. */
static bfd_boolean
in_reloc_p (bfd *abfd ATTRIBUTE_UNUSED, reloc_howto_type *howto)
{
return ! howto->pc_relative && howto->type != R_AMD64_IMAGEBASE;
}
#endif /* COFF_WITH_PE */
#ifndef PCRELOFFSET
#define PCRELOFFSET TRUE
#endif
static reloc_howto_type howto_table[] =
{
EMPTY_HOWTO (0),
HOWTO (R_AMD64_DIR64, /* type 1*/
0, /* rightshift */
4, /* size (0 = byte, 1 = short, 2 = long, 4 = long long) */
64, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"R_X86_64_64", /* name */
TRUE, /* partial_inplace */
0xffffffffffffffffll, /* src_mask */
0xffffffffffffffffll, /* dst_mask */
TRUE), /* pcrel_offset */
HOWTO (R_AMD64_DIR32, /* type 2 */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"R_X86_64_32", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
TRUE), /* pcrel_offset */
/* PE IMAGE_REL_AMD64_ADDR32NB relocation (3). */
HOWTO (R_AMD64_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 */
coff_amd64_reloc, /* special_function */
"rva32", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
/* 32-bit longword PC relative relocation (4). */
HOWTO (R_AMD64_PCRLONG, /* type 4 */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"R_X86_64_PC32", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
HOWTO (R_AMD64_PCRLONG_1, /* type 5 */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"DISP32+1", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
HOWTO (R_AMD64_PCRLONG_2, /* type 6 */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"DISP32+2", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
HOWTO (R_AMD64_PCRLONG_3, /* type 7 */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"DISP32+3", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
HOWTO (R_AMD64_PCRLONG_4, /* type 8 */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"DISP32+4", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
HOWTO (R_AMD64_PCRLONG_5, /* type 9 */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"DISP32+5", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
EMPTY_HOWTO (10), /* R_AMD64_SECTION 10 */
#if defined(COFF_WITH_PE)
/* 32-bit longword section relative relocation (11). */
HOWTO (R_AMD64_SECREL, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"secrel32", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
TRUE), /* pcrel_offset */
#else
EMPTY_HOWTO (11),
#endif
EMPTY_HOWTO (12),
EMPTY_HOWTO (13),
#ifndef DONT_EXTEND_AMD64
HOWTO (R_AMD64_PCRQUAD,
0, /* rightshift */
4, /* size (0 = byte, 1 = short, 2 = long) */
64, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"R_X86_64_PC64", /* name */
TRUE, /* partial_inplace */
0xffffffffffffffffll, /* src_mask */
0xffffffffffffffffll, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
#else
EMPTY_HOWTO (14),
#endif
/* Byte relocation (15). */
HOWTO (R_RELBYTE, /* type */
0, /* rightshift */
0, /* size (0 = byte, 1 = short, 2 = long) */
8, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"R_X86_64_8", /* name */
TRUE, /* partial_inplace */
0x000000ff, /* src_mask */
0x000000ff, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
/* 16-bit word relocation (16). */
HOWTO (R_RELWORD, /* type */
0, /* rightshift */
1, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"R_X86_64_16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
/* 32-bit longword relocation (17). */
HOWTO (R_RELLONG, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"R_X86_64_32S", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
/* Byte PC relative relocation (18). */
HOWTO (R_PCRBYTE, /* type */
0, /* rightshift */
0, /* size (0 = byte, 1 = short, 2 = long) */
8, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"R_X86_64_PC8", /* name */
TRUE, /* partial_inplace */
0x000000ff, /* src_mask */
0x000000ff, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
/* 16-bit word PC relative relocation (19). */
HOWTO (R_PCRWORD, /* type */
0, /* rightshift */
1, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"R_X86_64_PC16", /* name */
TRUE, /* partial_inplace */
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
PCRELOFFSET), /* pcrel_offset */
/* 32-bit longword PC relative relocation (20). */
HOWTO (R_PCRLONG, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
TRUE, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
coff_amd64_reloc, /* special_function */
"R_X86_64_PC32", /* name */
TRUE, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
PCRELOFFSET) /* pcrel_offset */
};
/* Turn a howto into a reloc nunmber */
#define SELECT_RELOC(x,howto) { x.r_type = howto->type; }
#define I386 1 /* Customize coffcode.h */
#define AMD64 1
#define RTYPE2HOWTO(cache_ptr, dst) \
((cache_ptr)->howto = \
((dst)->r_type < ARRAY_SIZE (howto_table)) \
? howto_table + (dst)->r_type \
: NULL)
/* For 386 COFF a STYP_NOLOAD | STYP_BSS section is part of a shared
library. On some other COFF targets STYP_BSS is normally
STYP_NOLOAD. */
#define BSS_NOLOAD_IS_SHARED_LIBRARY
/* Compute the addend of a reloc. If the reloc is to a common symbol,
the object file contains the value of the common symbol. By the
time this is called, the linker may be using a different symbol
from a different object file with a different value. Therefore, we
hack wildly to locate the original symbol from this file so that we
can make the correct adjustment. This macro sets coffsym to the
symbol from the original file, and uses it to set the addend value
correctly. If this is not a common symbol, the usual addend
calculation is done, except that an additional tweak is needed for
PC relative relocs.
FIXME: This macro refers to symbols and asect; these are from the
calling function, not the macro arguments. */
#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \
{ \
coff_symbol_type *coffsym = NULL; \
\
if (ptr && bfd_asymbol_bfd (ptr) != abfd) \
coffsym = (obj_symbols (abfd) \
+ (cache_ptr->sym_ptr_ptr - symbols)); \
else if (ptr) \
coffsym = coff_symbol_from (abfd, ptr); \
\
if (coffsym != NULL \
&& coffsym->native->u.syment.n_scnum == 0) \
cache_ptr->addend = - coffsym->native->u.syment.n_value; \
else if (ptr && bfd_asymbol_bfd (ptr) == abfd \
&& ptr->section != NULL) \
cache_ptr->addend = - (ptr->section->vma + ptr->value); \
else \
cache_ptr->addend = 0; \
if (ptr && howto_table[reloc.r_type].pc_relative) \
cache_ptr->addend += asect->vma; \
}
/* We use the special COFF backend linker. For normal AMD64 COFF, we
can use the generic relocate_section routine. For PE, we need our
own routine. */
#if !defined(COFF_WITH_PE)
#define coff_relocate_section _bfd_coff_generic_relocate_section
#else /* COFF_WITH_PE */
/* The PE relocate section routine. The only difference between this
and the regular routine is that we don't want to do anything for a
relocatable link. */
static bfd_boolean
coff_pe_amd64_relocate_section (bfd *output_bfd,
struct bfd_link_info *info,
bfd *input_bfd,
asection *input_section,
bfd_byte *contents,
struct internal_reloc *relocs,
struct internal_syment *syms,
asection **sections)
{
if (info->relocatable)
return TRUE;
return _bfd_coff_generic_relocate_section (output_bfd, info, input_bfd,input_section, contents,relocs, syms, sections);
}
#define coff_relocate_section coff_pe_amd64_relocate_section
#endif /* COFF_WITH_PE */
/* Convert an rtype to howto for the COFF backend linker. */
static reloc_howto_type *
coff_amd64_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
asection *sec,
struct internal_reloc *rel,
struct coff_link_hash_entry *h,
struct internal_syment *sym,
bfd_vma *addendp)
{
reloc_howto_type *howto;
if (rel->r_type > ARRAY_SIZE (howto_table))
{
bfd_set_error (bfd_error_bad_value);
return NULL;
}
if (rel->r_type >= R_AMD64_PCRLONG_1 && rel->r_type <= R_AMD64_PCRLONG_5)
{
rel->r_vaddr += (bfd_vma)(rel->r_type-R_AMD64_PCRLONG);
rel->r_type = R_AMD64_PCRLONG;
}
howto = howto_table + rel->r_type;
#if defined(COFF_WITH_PE)
/* Cancel out code in _bfd_coff_generic_relocate_section. */
*addendp = 0;
#endif
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 !defined(COFF_WITH_PE)
/* I think we *do* want to bypass this. If we don't, I have
seen some data parameters get the wrong relocation address.
If I link two versions with and without this section bypassed
and then do a binary comparison, the addresses which are
different can be looked up in the map. The case in which
this section has been bypassed has addresses which correspond
to values I can find in the map. */
*addendp -= sym->n_value;
#endif
}
#if !defined(COFF_WITH_PE)
/* If the output symbol is common (in which case this must be a
relocatable link), we need to add in the final size of the
common symbol. */
if (h != NULL && h->root.type == bfd_link_hash_common)
*addendp += h->root.u.c.size;
#endif
#if defined(COFF_WITH_PE)
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_AMD64_IMAGEBASE
&& (bfd_get_flavour (sec->output_section->owner) == bfd_target_coff_flavour))
*addendp -= pe_data (sec->output_section->owner)->pe_opthdr.ImageBase;
if (rel->r_type == R_AMD64_SECREL)
{
bfd_vma osect_vma;
if (h && (h->type == bfd_link_hash_defined || h->type == bfd_link_hash_defweak))
osect_vma = h->root.u.def.section->output_section->vma;
else
{
asection *sec;
int i;
/* Sigh, the only way to get the section to offset against
is to find it the hard way. */
for (sec = abfd->sections, i = 1; i < sym->n_scnum; i++)
sec = sec->next;
osect_vma = sec->output_section->vma;
}
*addendp -= osect_vma;
}
#endif
return howto;
}
#define coff_bfd_reloc_type_lookup coff_amd64_reloc_type_lookup
static reloc_howto_type *
coff_amd64_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, bfd_reloc_code_real_type code)
{
switch (code)
{
case BFD_RELOC_RVA:
return howto_table + R_AMD64_IMAGEBASE;
case BFD_RELOC_32:
return howto_table + R_AMD64_DIR32;
case BFD_RELOC_64:
return howto_table + R_AMD64_DIR64;
case BFD_RELOC_64_PCREL:
#ifndef DONT_EXTEND_AMD64
return howto_table + R_AMD64_PCRQUAD;
#else
/* Fall through. */
#endif
case BFD_RELOC_32_PCREL:
return howto_table + R_AMD64_PCRLONG;
case BFD_RELOC_X86_64_32S:
return howto_table + R_RELLONG;
case BFD_RELOC_16:
return howto_table + R_RELWORD;
case BFD_RELOC_16_PCREL:
return howto_table + R_PCRWORD;
case BFD_RELOC_8:
return howto_table + R_RELBYTE;
case BFD_RELOC_8_PCREL:
return howto_table + R_PCRBYTE;
#if defined(COFF_WITH_PE)
case BFD_RELOC_32_SECREL:
return howto_table + R_AMD64_SECREL;
#endif
default:
BFD_FAIL ();
return 0;
}
}
#define coff_rtype_to_howto coff_amd64_rtype_to_howto
#ifdef TARGET_UNDERSCORE
/* If amd64 gcc uses underscores for symbol names, then it does not use
a leading dot for local labels, so if TARGET_UNDERSCORE is defined
we treat all symbols starting with L as local. */
static bfd_boolean
coff_amd64_is_local_label_name (bfd *abfd, const char *name)
{
if (name[0] == 'L')
return TRUE;
return _bfd_coff_is_local_label_name (abfd, name);
}
#define coff_bfd_is_local_label_name coff_amd64_is_local_label_name
#endif /* TARGET_UNDERSCORE */
#include "coffcode.h"
#ifdef PE
#define amd64coff_object_p pe_bfd_object_p
#else
#define amd64coff_object_p coff_object_p
#endif
const bfd_target
#ifdef TARGET_SYM
TARGET_SYM =
#else
x86_64coff_vec =
#endif
{
#ifdef TARGET_NAME
TARGET_NAME,
#else
"coff-x86-64", /* Name. */
#endif
bfd_target_coff_flavour,
BFD_ENDIAN_LITTLE, /* Data byte order is little. */
BFD_ENDIAN_LITTLE, /* Header byte order is little. */
(HAS_RELOC | EXEC_P | /* Object flags. */
HAS_LINENO | HAS_DEBUG |
HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* Section flags. */
#if defined(COFF_WITH_PE)
| SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_READONLY
#endif
| SEC_CODE | SEC_DATA),
#ifdef TARGET_UNDERSCORE
TARGET_UNDERSCORE, /* Leading underscore. */
#else
0, /* Leading underscore. */
#endif
'/', /* Ar_pad_char. */
15, /* Ar_max_namelen. */
bfd_getl64, bfd_getl_signed_64, bfd_putl64,
bfd_getl32, bfd_getl_signed_32, bfd_putl32,
bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data. */
bfd_getl64, bfd_getl_signed_64, bfd_putl64,
bfd_getl32, bfd_getl_signed_32, bfd_putl32,
bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Hdrs. */
/* Note that we allow an object file to be treated as a core file as well. */
{ _bfd_dummy_target, amd64coff_object_p, /* BFD_check_format. */
bfd_generic_archive_p, amd64coff_object_p },
{ bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format. */
bfd_false },
{ bfd_false, coff_write_object_contents, /* bfd_write_contents. */
_bfd_write_archive_contents, bfd_false },
BFD_JUMP_TABLE_GENERIC (coff),
BFD_JUMP_TABLE_COPY (coff),
BFD_JUMP_TABLE_CORE (_bfd_nocore),
BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
BFD_JUMP_TABLE_SYMBOLS (coff),
BFD_JUMP_TABLE_RELOCS (coff),
BFD_JUMP_TABLE_WRITE (coff),
BFD_JUMP_TABLE_LINK (coff),
BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
NULL,
COFF_SWAP_TABLE
};

View File

@ -1882,11 +1882,17 @@ coff_set_arch_mach_hook (bfd *abfd, void * filehdr)
#ifdef I386MAGIC
case I386MAGIC:
case I386PTXMAGIC:
case I386AIXMAGIC: /* Danbury PS/2 AIX C Compiler */
case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */
case I386AIXMAGIC: /* Danbury PS/2 AIX C Compiler. */
case LYNXCOFFMAGIC: /* Shadows the m68k Lynx number below, sigh. */
arch = bfd_arch_i386;
break;
#endif
#ifdef AMD64MAGIC
case AMD64MAGIC:
arch = bfd_arch_i386;
machine = bfd_mach_x86_64;
break;
#endif
#ifdef IA64MAGIC
case IA64MAGIC:
arch = bfd_arch_ia64;
@ -2721,12 +2727,17 @@ coff_set_flags (bfd * abfd,
return TRUE;
#endif
#ifdef I386MAGIC
#if defined(I386MAGIC) || defined(AMD64MAGIC)
case bfd_arch_i386:
#if defined(I386MAGIC)
*magicp = I386MAGIC;
#ifdef LYNXOS
#endif
#if defined LYNXOS
/* Just overwrite the usual value if we're doing Lynx. */
*magicp = LYNXCOFFMAGIC;
#endif
#if defined AMD64MAGIC
*magicp = AMD64MAGIC;
#endif
return TRUE;
#endif
@ -3759,6 +3770,7 @@ coff_write_object_contents (bfd * abfd)
internal_f.f_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
#endif
#ifndef COFF_WITH_pex64
#ifdef COFF_WITH_PE
internal_f.f_flags |= IMAGE_FILE_32BIT_MACHINE;
#else
@ -3767,6 +3779,7 @@ coff_write_object_contents (bfd * abfd)
else
internal_f.f_flags |= F_AR32W;
#endif
#endif
#ifdef TI_TARGET_ID
/* Target id is used in TI COFF v1 and later; COFF0 won't use this field,
@ -3860,11 +3873,13 @@ coff_write_object_contents (bfd * abfd)
#if defined(I386)
#define __A_MAGIC_SET__
#if defined(LYNXOS)
#if defined LYNXOS
internal_a.magic = LYNXCOFFMAGIC;
#else /* LYNXOS */
#elif defined AMD64
internal_a.magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC;
#else
internal_a.magic = ZMAGIC;
#endif /* LYNXOS */
#endif
#endif /* I386 */
#if defined(IA64)

View File

@ -98,7 +98,7 @@ sparc*) targ_archs=bfd_sparc_arch ;;
strongarm*) targ_archs=bfd_arm_arch ;;
thumb*) targ_archs=bfd_arm_arch ;;
v850*) targ_archs=bfd_v850_arch ;;
x86_64) targ_archs=bfd_i386_arch ;;
x86_64*) targ_archs=bfd_i386_arch ;;
xscale*) targ_archs=bfd_arm_arch ;;
xtensa*) targ_archs=bfd_xtensa_arch ;;
z80|r800) targ_archs=bfd_z80_arch ;;
@ -578,6 +578,12 @@ case "${targ}" in
targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec"
want64=true
;;
x86_64-*-mingw64*)
targ_defvec=x86_64pe_vec
targ_selvecs="x86_64pe_vec x86_64pei_vec x86_64coff_vec bfd_elf64_x86_64_vec"
want64=true
targ_underscore=yes
;;
#endif
i[3-7]86-*-lynxos*)
targ_defvec=bfd_elf32_i386_vec

9
bfd/configure vendored
View File

@ -4086,7 +4086,7 @@ ia64-*-hpux*)
rm -rf conftest*
;;
x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
x86_64-*linux*|x86_64-*mingw64*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
@ -4097,7 +4097,7 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
case "`/usr/bin/file conftest.o`" in
*32-bit*)
case $host in
x86_64-*linux*)
x86_64-*linux*|x86_64-*mingw64*)
LD="${LD-ld} -m elf_i386"
;;
ppc64-*linux*|powerpc64-*linux*)
@ -4113,7 +4113,7 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
;;
*64-bit*)
case $host in
x86_64-*linux*)
x86_64-*linux*|x86_64-*mingw64*)
LD="${LD-ld} -m elf_x86_64"
;;
ppc*-*linux*|powerpc*-*linux*)
@ -10951,6 +10951,7 @@ do
i386aout_vec) tb="$tb i386aout.lo aout32.lo" ;;
i386bsd_vec) tb="$tb i386bsd.lo aout32.lo" ;;
i386coff_vec) tb="$tb coff-i386.lo cofflink.lo" ;;
x86_64coff_vec) tb="$tb coff-x86_64.lo cofflink.lo"; target_size=64 ;;
i386dynix_vec) tb="$tb i386dynix.lo aout32.lo" ;;
i386freebsd_vec) tb="$tb i386freebsd.lo aout32.lo" ;;
i386linux_vec) tb="$tb i386linux.lo aout32.lo" ;;
@ -10962,6 +10963,8 @@ do
i386os9k_vec) tb="$tb i386os9k.lo aout32.lo" ;;
i386pe_vec) tb="$tb pe-i386.lo peigen.lo cofflink.lo" ;;
i386pei_vec) tb="$tb pei-i386.lo peigen.lo cofflink.lo" ;;
x86_64pe_vec) tb="$tb pe-x86_64.lo pex64igen.lo cofflink.lo"; target_size=64 ;;
x86_64pei_vec) tb="$tb pei-x86_64.lo pex64igen.lo cofflink.lo"; target_size=64 ;;
i860coff_vec) tb="$tb coff-i860.lo cofflink.lo" ;;
icoff_big_vec) tb="$tb coff-i960.lo cofflink.lo" ;;
icoff_little_vec) tb="$tb coff-i960.lo cofflink.lo" ;;

View File

@ -741,6 +741,7 @@ do
i386aout_vec) tb="$tb i386aout.lo aout32.lo" ;;
i386bsd_vec) tb="$tb i386bsd.lo aout32.lo" ;;
i386coff_vec) tb="$tb coff-i386.lo cofflink.lo" ;;
x86_64coff_vec) tb="$tb coff-x86_64.lo cofflink.lo"; target_size=64 ;;
i386dynix_vec) tb="$tb i386dynix.lo aout32.lo" ;;
i386freebsd_vec) tb="$tb i386freebsd.lo aout32.lo" ;;
i386linux_vec) tb="$tb i386linux.lo aout32.lo" ;;
@ -752,6 +753,8 @@ do
i386os9k_vec) tb="$tb i386os9k.lo aout32.lo" ;;
i386pe_vec) tb="$tb pe-i386.lo peigen.lo cofflink.lo" ;;
i386pei_vec) tb="$tb pei-i386.lo peigen.lo cofflink.lo" ;;
x86_64pe_vec) tb="$tb pe-x86_64.lo pex64igen.lo cofflink.lo"; target_size=64 ;;
x86_64pei_vec) tb="$tb pei-x86_64.lo pex64igen.lo cofflink.lo"; target_size=64 ;;
i860coff_vec) tb="$tb coff-i860.lo cofflink.lo" ;;
icoff_big_vec) tb="$tb coff-i960.lo cofflink.lo" ;;
icoff_little_vec) tb="$tb coff-i960.lo cofflink.lo" ;;

View File

@ -204,7 +204,39 @@
#define PUT_SCNHDR_LNNOPTR H_PUT_32
#endif
#ifdef COFF_WITH_pep
#ifdef COFF_WITH_pex64
#define GET_OPTHDR_IMAGE_BASE H_GET_64
#define PUT_OPTHDR_IMAGE_BASE H_PUT_64
#define GET_OPTHDR_SIZE_OF_STACK_RESERVE H_GET_64
#define PUT_OPTHDR_SIZE_OF_STACK_RESERVE H_PUT_64
#define GET_OPTHDR_SIZE_OF_STACK_COMMIT H_GET_64
#define PUT_OPTHDR_SIZE_OF_STACK_COMMIT H_PUT_64
#define GET_OPTHDR_SIZE_OF_HEAP_RESERVE H_GET_64
#define PUT_OPTHDR_SIZE_OF_HEAP_RESERVE H_PUT_64
#define GET_OPTHDR_SIZE_OF_HEAP_COMMIT H_GET_64
#define PUT_OPTHDR_SIZE_OF_HEAP_COMMIT H_PUT_64
#define GET_PDATA_ENTRY bfd_get_32
#define _bfd_XX_bfd_copy_private_bfd_data_common _bfd_pex64_bfd_copy_private_bfd_data_common
#define _bfd_XX_bfd_copy_private_section_data _bfd_pex64_bfd_copy_private_section_data
#define _bfd_XX_get_symbol_info _bfd_pex64_get_symbol_info
#define _bfd_XX_only_swap_filehdr_out _bfd_pex64_only_swap_filehdr_out
#define _bfd_XX_print_private_bfd_data_common _bfd_pex64_print_private_bfd_data_common
#define _bfd_XXi_final_link_postscript _bfd_pex64i_final_link_postscript
#define _bfd_XXi_final_link_postscript _bfd_pex64i_final_link_postscript
#define _bfd_XXi_only_swap_filehdr_out _bfd_pex64i_only_swap_filehdr_out
#define _bfd_XXi_swap_aouthdr_in _bfd_pex64i_swap_aouthdr_in
#define _bfd_XXi_swap_aouthdr_out _bfd_pex64i_swap_aouthdr_out
#define _bfd_XXi_swap_aux_in _bfd_pex64i_swap_aux_in
#define _bfd_XXi_swap_aux_out _bfd_pex64i_swap_aux_out
#define _bfd_XXi_swap_lineno_in _bfd_pex64i_swap_lineno_in
#define _bfd_XXi_swap_lineno_out _bfd_pex64i_swap_lineno_out
#define _bfd_XXi_swap_scnhdr_out _bfd_pex64i_swap_scnhdr_out
#define _bfd_XXi_swap_sym_in _bfd_pex64i_swap_sym_in
#define _bfd_XXi_swap_sym_out _bfd_pex64i_swap_sym_out
#elif defined COFF_WITH_pep
#define GET_OPTHDR_IMAGE_BASE H_GET_64
#define PUT_OPTHDR_IMAGE_BASE H_PUT_64

53
bfd/pe-x86_64.c Normal file
View File

@ -0,0 +1,53 @@
/* BFD back-end for Intel/AMD x86_64 PECOFF files.
Copyright 2006 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
Written by Kai Tietz, OneVision Software GmbH&CoKg. */
#include "bfd.h"
#include "sysdep.h"
#define TARGET_SYM x86_64pe_vec
#define TARGET_NAME "pe-x86-64"
#define COFF_WITH_PE
#define COFF_WITH_pex64
#define PCRELOFFSET TRUE
#define TARGET_UNDERSCORE '_'
#define COFF_LONG_SECTION_NAMES
#define COFF_SUPPORT_GNU_LINKONCE
#define COFF_LONG_FILENAMES
#define COFF_SECTION_ALIGNMENT_ENTRIES \
{ COFF_SECTION_NAME_EXACT_MATCH (".bss"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
{ COFF_SECTION_NAME_EXACT_MATCH (".data"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
{ COFF_SECTION_NAME_EXACT_MATCH (".rdata"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
{ COFF_SECTION_NAME_EXACT_MATCH (".text"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
{ COFF_SECTION_NAME_PARTIAL_MATCH (".idata"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
{ COFF_SECTION_NAME_EXACT_MATCH (".pdata"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
{ COFF_SECTION_NAME_PARTIAL_MATCH (".debug"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
{ COFF_SECTION_NAME_PARTIAL_MATCH (".gnu.linkonce.wi."), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }
#include "coff-x86_64.c"

View File

@ -52,8 +52,8 @@
on this code has a chance of getting something accomplished without
wasting too much time. */
/* This expands into COFF_WITH_pe or COFF_WITH_pep depending on whether
we're compiling for straight PE or PE+. */
/* This expands into COFF_WITH_pe, COFF_WITH_pep, or COFF_WITH_pex64
depending on whether we're compiling for straight PE or PE+. */
#define COFF_WITH_XX
#include "bfd.h"
@ -67,7 +67,9 @@
within PE/PEI, so we get them from there. FIXME: The lack of
variance is an assumption which may prove to be incorrect if new
PE/PEI targets are created. */
#ifdef COFF_WITH_pep
#if defined COFF_WITH_pex64
# include "coff/x86_64.h"
#elif defined COFF_WITH_pep
# include "coff/ia64.h"
#else
# include "coff/i386.h"
@ -77,7 +79,7 @@
#include "libcoff.h"
#include "libpei.h"
#ifdef COFF_WITH_pep
#if defined COFF_WITH_pep || defined COFF_WITH_pex64
# undef AOUTSZ
# define AOUTSZ PEPAOUTSZ
# define PEAOUTHDR PEPAOUTHDR
@ -399,7 +401,7 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd,
aouthdr_int->entry = GET_AOUTHDR_ENTRY (abfd, aouthdr_ext->entry);
aouthdr_int->text_start =
GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start);
#ifndef COFF_WITH_pep
#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
/* PE32+ does not have data_start member! */
aouthdr_int->data_start =
GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start);
@ -442,6 +444,7 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd,
/* If data directory is empty, rva also should be 0. */
int size =
H_GET_32 (abfd, src->DataDirectory[idx][1]);
a->DataDirectory[idx].Size = size;
if (size)
@ -455,7 +458,7 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd,
if (aouthdr_int->entry)
{
aouthdr_int->entry += a->ImageBase;
#ifndef COFF_WITH_pep
#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
aouthdr_int->entry &= 0xffffffff;
#endif
}
@ -463,12 +466,12 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd,
if (aouthdr_int->tsize)
{
aouthdr_int->text_start += a->ImageBase;
#ifndef COFF_WITH_pep
#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
aouthdr_int->text_start &= 0xffffffff;
#endif
}
#ifndef COFF_WITH_pep
#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
/* PE32+ does not have data_start member! */
if (aouthdr_int->dsize)
{
@ -548,7 +551,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
if (aouthdr_in->tsize)
{
aouthdr_in->text_start -= ib;
#ifndef COFF_WITH_pep
#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
aouthdr_in->text_start &= 0xffffffff;
#endif
}
@ -556,7 +559,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
if (aouthdr_in->dsize)
{
aouthdr_in->data_start -= ib;
#ifndef COFF_WITH_pep
#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
aouthdr_in->data_start &= 0xffffffff;
#endif
}
@ -564,7 +567,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
if (aouthdr_in->entry)
{
aouthdr_in->entry -= ib;
#ifndef COFF_WITH_pep
#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
aouthdr_in->entry &= 0xffffffff;
#endif
}
@ -661,7 +664,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
aouthdr_out->standard.text_start);
#ifndef COFF_WITH_pep
#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
/* PE32+ does not have data_start member! */
PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
aouthdr_out->standard.data_start);
@ -1262,6 +1265,38 @@ pe_print_idata (bfd * abfd, void * vfile)
}
/* Print HintName vector entries. */
#ifdef COFF_WITH_pex64
for (j = 0; j < datasize; j += 8)
{
unsigned long member = bfd_get_32 (abfd, data + idx + j);
unsigned long member_high = bfd_get_32 (abfd, data + idx + j + 4);
if (!member && !member_high)
break;
if (member_high & 0x80000000)
fprintf (file, "\t%lx%08lx\t %4lx%08lx <none>",
member_high,member, member_high & 0x7fffffff, member);
else
{
int ordinal;
char *member_name;
ordinal = bfd_get_16 (abfd, data + member - adj);
member_name = (char *) data + member - adj + 2;
fprintf (file, "\t%04lx\t %4d %s",member, ordinal, member_name);
}
/* If the time stamp is not zero, the import address
table holds actual addresses. */
if (time_stamp != 0
&& first_thunk != 0
&& first_thunk != hint_addr)
fprintf (file, "\t%04lx",
(long) bfd_get_32 (abfd, ft_data + ft_idx + j));
fprintf (file, "\n");
}
#else
for (j = 0; j < datasize; j += 4)
{
unsigned long member = bfd_get_32 (abfd, data + idx + j);
@ -1294,7 +1329,7 @@ pe_print_idata (bfd * abfd, void * vfile)
fprintf (file, "\n");
}
#endif
if (ft_allocated)
free (ft_data);
}
@ -1534,10 +1569,10 @@ pe_print_edata (bfd * abfd, void * vfile)
static bfd_boolean
pe_print_pdata (bfd * abfd, void * vfile)
{
#ifdef COFF_WITH_pep
# define PDATA_ROW_SIZE (3*8)
#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
# define PDATA_ROW_SIZE (3 * 8)
#else
# define PDATA_ROW_SIZE (5*4)
# define PDATA_ROW_SIZE (5 * 4)
#endif
FILE *file = (FILE *) vfile;
bfd_byte *data = 0;
@ -1560,7 +1595,7 @@ pe_print_pdata (bfd * abfd, void * vfile)
fprintf (file,
_("\nThe Function Table (interpreted .pdata section contents)\n"));
#ifdef COFF_WITH_pep
#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
fprintf (file,
_(" vma:\t\t\tBegin Address End Address Unwind Info\n"));
#else
@ -1614,7 +1649,7 @@ pe_print_pdata (bfd * abfd, void * vfile)
fprintf_vma (file, begin_addr); fputc (' ', file);
fprintf_vma (file, end_addr); fputc (' ', file);
fprintf_vma (file, eh_handler);
#ifndef COFF_WITH_pep
#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
fputc (' ', file);
fprintf_vma (file, eh_data); fputc (' ', file);
fprintf_vma (file, prolog_end_addr);

54
bfd/pei-x86_64.c Normal file
View File

@ -0,0 +1,54 @@
/* BFD back-end for Intel 386 PE IMAGE COFF files.
Copyright 2006 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
Written by Kai Tietz, OneVision Software GmbH&CoKg. */
#include "bfd.h"
#include "sysdep.h"
#define TARGET_SYM x86_64pei_vec
#define TARGET_NAME "pei-x86-64"
#define COFF_IMAGE_WITH_PE
#define COFF_WITH_PE
#define COFF_WITH_pex64
#define PCRELOFFSET TRUE
#define TARGET_UNDERSCORE '_'
#define COFF_LONG_SECTION_NAMES
#define COFF_SUPPORT_GNU_LINKONCE
#define COFF_LONG_FILENAMES
#define COFF_SECTION_ALIGNMENT_ENTRIES \
{ COFF_SECTION_NAME_EXACT_MATCH (".bss"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
{ COFF_SECTION_NAME_EXACT_MATCH (".data"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
{ COFF_SECTION_NAME_EXACT_MATCH (".rdata"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
{ COFF_SECTION_NAME_EXACT_MATCH (".text"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
{ COFF_SECTION_NAME_PARTIAL_MATCH (".idata"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
{ COFF_SECTION_NAME_EXACT_MATCH (".pdata"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
{ COFF_SECTION_NAME_PARTIAL_MATCH (".debug"), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
{ COFF_SECTION_NAME_PARTIAL_MATCH (".gnu.linkonce.wi."), \
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }
#include "coff-x86_64.c"

View File

@ -1,6 +1,6 @@
/* Support for the generic parts of PE/PEI, for BFD.
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005 Free Software Foundation, Inc.
2005, 2006 Free Software Foundation, Inc.
Written by Cygnus Solutions.
This file is part of BFD, the Binary File Descriptor library.
@ -182,6 +182,10 @@ coff_swap_filehdr_in (bfd * abfd, void * src, void * dst)
#ifdef COFF_IMAGE_WITH_PE
# define coff_swap_filehdr_out _bfd_XXi_only_swap_filehdr_out
#elif defined COFF_WITH_pex64
# define coff_swap_filehdr_out _bfd_pex64_only_swap_filehdr_out
#elif defined COFF_WITH_pep
# define coff_swap_filehdr_out _bfd_pep_only_swap_filehdr_out
#else
# define coff_swap_filehdr_out _bfd_pe_only_swap_filehdr_out
#endif
@ -217,7 +221,10 @@ coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in)
if (scnhdr_int->s_vaddr != 0)
{
scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
/* Do not cut upper 32-bits for 64-bit vma. */
#ifndef COFF_WITH_pex64
scnhdr_int->s_vaddr &= 0xffffffff;
#endif
}
#ifndef COFF_NO_HACK_SCNHDR_SIZE
@ -405,8 +412,16 @@ pe_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
+ NUM_ILF_SECTIONS * 9 \
+ STRING_SIZE_SIZE)
#define SIZEOF_IDATA2 (5 * 4)
/* For PEx64 idata4 & 5 have thumb size of 8 bytes. */
#ifdef COFF_WITH_pex64
#define SIZEOF_IDATA4 (2 * 4)
#define SIZEOF_IDATA5 (2 * 4)
#else
#define SIZEOF_IDATA4 (1 * 4)
#define SIZEOF_IDATA5 (1 * 4)
#endif
#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))
@ -656,9 +671,20 @@ static jump_table jtab[] =
},
#endif
#ifdef MC68MAGIC
{ MC68MAGIC, { /* XXX fill me in */ }, 0, 0 },
#ifdef AMD64MAGIC
{ AMD64MAGIC,
{ 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,
@ -830,8 +856,15 @@ pe_ILF_build_a_bfd (bfd * abfd,
/* XXX - treat as IMPORT_NAME ??? */
abort ();
#ifdef COFF_WITH_pex64
((unsigned int *) id4->contents)[0] = ordinal;
((unsigned int *) id4->contents)[1] = 0x80000000;
((unsigned int *) id5->contents)[0] = ordinal;
((unsigned int *) id5->contents)[1] = 0x80000000;
#else
* (unsigned int *) id4->contents = ordinal | 0x80000000;
* (unsigned int *) id5->contents = ordinal | 0x80000000;
#endif
}
else
{
@ -1071,6 +1104,12 @@ pe_ILF_object_p (bfd * abfd)
#endif
break;
case IMAGE_FILE_MACHINE_AMD64:
#ifdef AMD64MAGIC
magic = AMD64MAGIC;
#endif
break;
case IMAGE_FILE_MACHINE_M68K:
#ifdef MC68AGIC
magic = MC68MAGIC;

View File

@ -789,6 +789,9 @@ extern const bfd_target vms_alpha_vec;
extern const bfd_target vms_vax_vec;
extern const bfd_target w65_vec;
extern const bfd_target we32kcoff_vec;
extern const bfd_target x86_64pe_vec;
extern const bfd_target x86_64pei_vec;
extern const bfd_target x86_64coff_vec;
extern const bfd_target z80coff_vec;
extern const bfd_target z8kcoff_vec;
@ -813,8 +816,8 @@ extern const bfd_target sco5_core_vec;
extern const bfd_target trad_core_vec;
extern const bfd_target bfd_elf32_am33lin_vec;
static const bfd_target * const _bfd_target_vector[] = {
static const bfd_target * const _bfd_target_vector[] =
{
#ifdef SELECT_VECS
SELECT_VECS,
@ -1054,6 +1057,11 @@ static const bfd_target * const _bfd_target_vector[] = {
&i386os9k_vec,
&i386pe_vec,
&i386pei_vec,
#ifdef BFD64
&x86_64coff_vec,
&x86_64pe_vec,
&x86_64pei_vec,
#endif
&i860coff_vec,
&icoff_big_vec,
&icoff_little_vec,

View File

@ -1,3 +1,16 @@
2006-09-20 Kai Tietz <Kai.Tietz@onevision.com>
* configure.in: Add new target x86_64-pc-mingw64.
* configure: Regenerate.
* dlltool.c: Adjust include for this target.
(DLLTOOL_MX86_64): Added macro to handle target specific code.
(mname): Added default target static as "i386:x86-64".
(MX86): Added macro for target ident.
(mtable): Added target specific definitions.
(rvaafter): Add handling of MX86.
(rvabefore): Add handling of MX86.
(asmprefix): Add handling of MX86.
2006-09-17 Mei Ligang <ligang@sunnorth.com.cn>
* readelf.c: Add support for Score binaries.

6
binutils/configure vendored
View File

@ -8445,6 +8445,12 @@ do
DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_ARM"
BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
;;
x86_64-*-mingw64*)
BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_MX86_64"
BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
BUILD_DLLWRAP='$(DLLWRAP_PROG)$(EXEEXT)'
;;
i[3-7]86-*-pe* | i[3-7]86-*-cygwin* | i[3-7]86-*-mingw32** | i[3-7]86-*-netbsdpe*)
BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_I386"

View File

@ -257,6 +257,14 @@ changequote([,])dnl
DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_ARM"
BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
;;
x86_64-*-mingw64*)
changequote([,])dnl
BUILD_DLLTOOL='$(DLLTOOL_PROG)$(EXEEXT)'
DLLTOOL_DEFS="$DLLTOOL_DEFS -DDLLTOOL_MX86_64"
BUILD_WINDRES='$(WINDRES_PROG)$(EXEEXT)'
BUILD_DLLWRAP='$(DLLWRAP_PROG)$(EXEEXT)'
;;
changequote(,)dnl
changequote(,)dnl
i[3-7]86-*-pe* | i[3-7]86-*-cygwin* | i[3-7]86-*-mingw32** | i[3-7]86-*-netbsdpe*)
changequote([,])dnl

View File

@ -261,6 +261,9 @@
#include "coff/arm.h"
#include "coff/internal.h"
#endif
#ifdef DLLTOOL_MX86_64
#include "coff/x86_64.h"
#endif
/* Forward references. */
static char *look_for_prog (const char *, const char *, int);
@ -398,6 +401,10 @@ static const char *mname = "arm";
static const char *mname = "i386";
#endif
#ifdef DLLTOOL_MX86_64
static const char *mname = "i386:x86-64";
#endif
#ifdef DLLTOOL_PPC
static const char *mname = "ppc";
#endif
@ -640,6 +647,14 @@ mtable[] =
arm_jtab, sizeof (arm_jtab), 8
}
,
{
#define MX86 11
"i386:x86-64", ".byte", ".short", ".long", ".asciz", "#",
"jmp *", ".global", ".space", ".align\t2",".align\t4", "",
"pe-x86-64",bfd_arch_i386,
i386_jtab, sizeof (i386_jtab), 2
}
,
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
@ -763,6 +778,7 @@ rvaafter (int machine)
{
case MARM:
case M386:
case MX86:
case MPPC:
case MTHUMB:
case MARM_INTERWORK:
@ -788,6 +804,7 @@ rvabefore (int machine)
{
case MARM:
case M386:
case MX86:
case MPPC:
case MTHUMB:
case MARM_INTERWORK:
@ -823,6 +840,7 @@ asm_prefix (int machine, const char *name)
case MARM_WINCE:
break;
case M386:
case MX86:
/* Symbol names starting with ? do not have a leading underscore. */
if (name && *name == '?')
break;
@ -1700,10 +1718,19 @@ generate_idata_ofile (FILE *filvar)
for (headptr = import_list; headptr != NULL; headptr = headptr->next)
{
fprintf (filvar, "listone%d:\n", headindex);
for ( funcindex = 0; funcindex < headptr->nfuncs; funcindex++ )
for (funcindex = 0; funcindex < headptr->nfuncs; funcindex++)
#ifdef DLLTOOL_MX86_64
fprintf (filvar, "\t%sfuncptr%d_%d%s\n%s\t0\n",
ASM_RVA_BEFORE, headindex, funcindex, ASM_RVA_AFTER,ASM_LONG);
#else
fprintf (filvar, "\t%sfuncptr%d_%d%s\n",
ASM_RVA_BEFORE, headindex, funcindex, ASM_RVA_AFTER);
fprintf (filvar,"\t%s\t0\n", ASM_LONG); /* NULL terminating list */
#endif
#ifdef DLLTOOL_MX86_64
fprintf (filvar, "\t%s\t0\n\t%s\t0\n", ASM_LONG, ASM_LONG); /* NULL terminating list. */
#else
fprintf (filvar, "\t%s\t0\n", ASM_LONG); /* NULL terminating list. */
#endif
headindex++;
}
@ -1712,10 +1739,19 @@ generate_idata_ofile (FILE *filvar)
for (headptr = import_list; headptr != NULL; headptr = headptr->next)
{
fprintf (filvar, "listtwo%d:\n", headindex);
for ( funcindex = 0; funcindex < headptr->nfuncs; funcindex++ )
for (funcindex = 0; funcindex < headptr->nfuncs; funcindex++)
#ifdef DLLTOOL_MX86_64
fprintf (filvar, "\t%sfuncptr%d_%d%s\n%s\t0\n",
ASM_RVA_BEFORE, headindex, funcindex, ASM_RVA_AFTER,ASM_LONG);
#else
fprintf (filvar, "\t%sfuncptr%d_%d%s\n",
ASM_RVA_BEFORE, headindex, funcindex, ASM_RVA_AFTER);
fprintf (filvar, "\t%s\t0\n", ASM_LONG); /* NULL terminating list */
#endif
#ifdef DLLTOOL_MX86_64
fprintf (filvar, "\t%s\t0\n\t%s\t0\n", ASM_LONG, ASM_LONG); /* NULL terminating list. */
#else
fprintf (filvar, "\t%s\t0\n", ASM_LONG); /* NULL terminating list. */
#endif
headindex++;
}
@ -2358,7 +2394,7 @@ make_one_lib_file (export_type *exp, int i)
si->data = xmalloc (HOW_JTAB_SIZE);
memcpy (si->data, HOW_JTAB, HOW_JTAB_SIZE);
/* add the reloc into idata$5 */
/* Add the reloc into idata$5. */
rel = xmalloc (sizeof (arelent));
rpp = xmalloc (sizeof (arelent *) * 2);
@ -2388,6 +2424,36 @@ make_one_lib_file (export_type *exp, int i)
/* An idata$4 or idata$5 is one word long, and has an
rva to idata$6. */
#ifdef DLLTOOL_MX86_64
si->data = xmalloc (8);
si->size = 8;
if (exp->noname)
{
si->data[0] = exp->ordinal ;
si->data[1] = exp->ordinal >> 8;
si->data[2] = exp->ordinal >> 16;
si->data[3] = exp->ordinal >> 24;
si->data[4] = 0;
si->data[5] = 0;
si->data[6] = 0;
si->data[7] = 0x80;
}
else
{
sec->reloc_count = 1;
memset (si->data, 0, si->size);
rel = xmalloc (sizeof (arelent));
rpp = xmalloc (sizeof (arelent *) * 2);
rpp[0] = rel;
rpp[1] = 0;
rel->address = 0;
rel->addend = 0;
rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_RVA);
rel->sym_ptr_ptr = secdata[IDATA6].sympp;
sec->orelocation = rpp;
}
#else
si->data = xmalloc (4);
si->size = 4;
@ -2412,7 +2478,7 @@ make_one_lib_file (export_type *exp, int i)
rel->sym_ptr_ptr = secdata[IDATA6].sympp;
sec->orelocation = rpp;
}
#endif
break;
case IDATA6:
@ -2626,14 +2692,17 @@ make_head (void)
if (!no_idata5)
{
fprintf (f, "\t.section\t.idata$5\n");
fprintf (f, "\t%s\t0\n", ASM_LONG);
#ifdef DLLTOOL_MX86_64
fprintf (f,"\t%s\t0\n\t%s\t0\n", ASM_LONG, ASM_LONG); /* NULL terminating list. */
#else
fprintf (f,"\t%s\t0\n", ASM_LONG); /* NULL terminating list. */
#endif
fprintf (f, "fthunk:\n");
}
if (!no_idata4)
{
fprintf (f, "\t.section\t.idata$4\n");
fprintf (f, "\t%s\t0\n", ASM_LONG);
fprintf (f, "\t.section .idata$4\n");
fprintf (f, "hname:\n");
@ -2660,13 +2729,21 @@ make_tail (void)
if (!no_idata4)
{
fprintf (f, "\t.section .idata$4\n");
fprintf (f, "\t%s\t0\n", ASM_LONG);
#ifdef DLLTOOL_MX86_64
fprintf (f,"\t%s\t0\n\t%s\t0\n", ASM_LONG, ASM_LONG); /* NULL terminating list. */
#else
fprintf (f,"\t%s\t0\n", ASM_LONG); /* NULL terminating list. */
#endif
}
if (!no_idata5)
{
fprintf (f, "\t.section .idata$5\n");
fprintf (f, "\t%s\t0\n", ASM_LONG);
#ifdef DLLTOOL_MX86_64
fprintf (f,"\t%s\t0\n\t%s\t0\n", ASM_LONG, ASM_LONG); /* NULL terminating list. */
#else
fprintf (f,"\t%s\t0\n", ASM_LONG); /* NULL terminating list. */
#endif
}
#ifdef DLLTOOL_PPC

View File

@ -1,3 +1,13 @@
2006-09-20 Kai Tietz <Kai.Tietz@onevision.com>
* binutils-all/copy-3.d: Add support for target x86_64-pc-mingw64.
* binutils-all/dlltool.exp: Likewise.
* binutils-all/objcopy.exp: Likewise.
* binutils-all/windres/windres.exp: Likewise.
* binutils-all/windres/lang.rc: xfail it as long as there is no windows.h.
* binutils-all/windres/strtab1.rc: Likewise.
* lib/utils-lib.exp: Adjust executable prefix detection (as .exe).
2006-09-14 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/3181

View File

@ -3,7 +3,7 @@
#objcopy: --set-section-flags .text=alloc,data
#name: copy with setting section flags 3
#source: bintest.s
#not-target: *-*-aout *-*-*pe *-*-*coff i*86-*-cygwin* i*86-*-mingw32*
#not-target: *-*-aout *-*-*pe *-*-*coff i*86-*-cygwin* i*86-*-mingw32* x86_64-*-mingw64*
# The .text # section in PE/COFF has a fixed set of flags and these
# cannot be changed. We skip it for them.

View File

@ -1,4 +1,4 @@
# Copyright 2002, 2004 Free Software Foundation, Inc.
# Copyright 2002, 2004, 2006 Free Software Foundation, Inc.
# 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
@ -14,13 +14,14 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
if {![istarget "i*86-*-*"]} {
if {![istarget "i*86-*-*"] && ![istarget "x86_64-*-mingw64*"] } {
return
}
if {![istarget "i*86-*-*pe*"] \
&& ![istarget "i*86-*-cygwin*"] \
&& ![istarget "i*86-*-mingw32*"] } {
&& ![istarget "i*86-*-mingw32*"] \
&& ![istarget "x86_64-*-mingw64*"] } {
set target_xfail "yes"
} else {
set target_xfail "no"

View File

@ -1,5 +1,5 @@
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
# 2004
# 2004, 2006
# Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
@ -443,7 +443,7 @@ strip_test_with_saving_a_symbol
# Build a final executable.
if { [istarget *-*-cygwin] || [istarget *-*-mingw32] } {
if { [istarget *-*-cygwin] || [istarget *-*-mingw*] } {
set test_prog "testprog.exe"
} else {
set test_prog "testprog"

View File

@ -1,3 +1,4 @@
//#xfail *-*-mingw64
#include "windows.h"
LANGUAGE 0, 0

View File

@ -1,3 +1,4 @@
//#xfail *-*-mingw64
#include "windows.h"
LANGUAGE 0, 0

View File

@ -1,4 +1,4 @@
# Copyright 2001, 2003, 2004 Free Software Foundation, Inc.
# Copyright 2001, 2003, 2004, 2006 Free Software Foundation, Inc.
# 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
@ -19,13 +19,14 @@
# Written by DJ Delorie <dj@redhat.com>
if {![istarget "i*86-*-*"]} {
if {![istarget "i*86-*-*"] && ![istarget "x86_64-*-mingw64"] } {
return
}
if {![istarget "i*86-*-*pe*"] \
&& ![istarget "i*86-*-cygwin*"] \
&& ![istarget "i*86-*-mingw32*"] } {
&& ![istarget "i*86-*-mingw32*"] \
&& ![istarget "x86_64-*-mingw64*"] } {
set target_xfail "yes"
} else {
set target_xfail "no"

View File

@ -1,4 +1,4 @@
# Copyright 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2003, 2004
# Copyright 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2003, 2004, 2006
# Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
@ -161,7 +161,7 @@ proc is_elf_format {} {
# Returns target executable extension, if any.
#
proc exe_ext {} {
if { [istarget *-*-mingw32] || [istarget *-*-cygwin*] } {
if { [istarget *-*-mingw*] || [istarget *-*-cygwin*] } {
return ".exe"
} else {
return ""

View File

@ -1,3 +1,17 @@
2006-09-20 Kai Tietz <Kai.Tietz@onevision.com>
* configure.in: Add new target x86_64-pc-mingw64.
* configure: Regenerate.
* configure.tgt: Add new target x86_64-pc-mingw64.
* config/obj-coff.h: Add handling for TE_PEP target specific code and definitions.
* config/tc-i386.c: Add new targets.
(md_parse_option): Add targets to OPTION_64.
(x86_64_target_format): Add new method for setup proper default target cpu mode.
* config/te-pep.h: Add new target definition header.
(TE_PEP): New macro: Identifies new target architecture.
(COFF_WITH_pex64): Set proper includes in bfd.
* NEWS: Mention new target.
2006-09-18 Bernd Schmidt <bernd.schmidt@analog.com>
* config/bfin-parse.y (binary): Change sub of const to add of negated

View File

@ -1,4 +1,6 @@
-*- text -*-
* Add support for x86_64 PE+ target.
* Add support for Score target.
* Support for the Infineon XC16X has been added by KPIT Cummins Infosystems.

View File

@ -55,16 +55,30 @@
#endif
#ifdef TC_I386
#ifndef TE_PEP
#include "coff/x86_64.h"
#else
#include "coff/i386.h"
#endif
#ifdef TE_PE
#ifdef TE_PEP
extern const char * x86_64_target_format (void);
#define TARGET_FORMAT x86_64_target_format ()
#define COFF_TARGET_FORMAT "pe-x86-64"
#else
#define TARGET_FORMAT "pe-i386"
#endif
#endif
#ifndef TARGET_FORMAT
#ifdef TE_PEP
#define TARGET_FORMAT "coff-x86-64"
#else
#define TARGET_FORMAT "coff-i386"
#endif
#endif
#endif
#ifdef TC_M68K
#include "coff/m68k.h"

View File

@ -5766,9 +5766,10 @@ const char *md_shortopts = "qn";
#define OPTION_MARCH (OPTION_MD_BASE + 3)
#define OPTION_MTUNE (OPTION_MD_BASE + 4)
struct option md_longopts[] = {
struct option md_longopts[] =
{
{"32", no_argument, NULL, OPTION_32},
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
{"64", no_argument, NULL, OPTION_64},
#endif
{"divide", no_argument, NULL, OPTION_DIVIDE},
@ -5812,14 +5813,18 @@ md_parse_option (int c, char *arg)
/* -s: On i386 Solaris, this tells the native assembler to use
.stab instead of .stab.excl. We always use .stab anyhow. */
break;
#endif
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
case OPTION_64:
{
const char **list, **l;
list = bfd_target_list ();
for (l = list; *l != NULL; l++)
if (strncmp (*l, "elf64-x86-64", 12) == 0)
if ( strncmp (*l, "elf64-x86-64", 12) == 0
|| strcmp (*l, "coff-x86-64") == 0
|| strcmp (*l, "pe-x86-64") == 0
|| strcmp (*l, "pei-x86-64") == 0)
{
default_arch = "x86_64";
break;
@ -5927,6 +5932,26 @@ md_show_usage (stream)
}
#if defined(TE_PEP)
const char *
x86_64_target_format (void)
{
if (strcmp (default_arch, "x86_64") == 0)
{
set_code_flag (CODE_64BIT);
return COFF_TARGET_FORMAT;
}
else if (strcmp (default_arch, "i386") == 0)
{
set_code_flag (CODE_32BIT);
return "coff-i386";
}
as_fatal (_("Unknown architecture"));
return NULL;
}
#endif
#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
|| defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))

10
gas/config/te-pep.h Normal file
View File

@ -0,0 +1,10 @@
#define TE_PEP
#define COFF_WITH_pex64
#define TE_PE
#define LEX_AT (LEX_BEGIN_NAME | LEX_NAME) /* Can have @'s inside labels. */
/* The PE format supports long section names. */
#define COFF_LONG_SECTION_NAMES
#include "obj-format.h"

24
gas/configure vendored
View File

@ -3921,7 +3921,7 @@ ia64-*-hpux*)
rm -rf conftest*
;;
x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
x86_64-*linux*|x86_64-*mingw64*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
# Find out which ABI we are using.
echo 'int i;' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
@ -3932,7 +3932,7 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
case "`/usr/bin/file conftest.o`" in
*32-bit*)
case $host in
x86_64-*linux*)
x86_64-*linux*|x86_64-*mingw64*)
LD="${LD-ld} -m elf_i386"
;;
ppc64-*linux*|powerpc64-*linux*)
@ -3948,7 +3948,7 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
;;
*64-bit*)
case $host in
x86_64-*linux*)
x86_64-*linux*|x86_64-*mingw64*)
LD="${LD-ld} -m elf_x86_64"
;;
ppc*-*linux*|powerpc*-*linux*)
@ -4895,6 +4895,19 @@ if test ${all_targets} = "yes"; then
;;
esac
;;
x86_64)
case ${obj_format} in
aout)
emulations="$emulations i386coff i386elf"
;;
coff)
emulations="$emulations i386aout i386elf"
;;
elf)
emulations="$emulations i386aout i386coff"
;;
esac
;;
esac
fi
@ -4956,6 +4969,11 @@ _ACEOF
m88k)
cat >>confdefs.h <<\_ACEOF
#define M88KCOFF 1
_ACEOF
;;
x86_64)
cat >>confdefs.h <<\_ACEOF
#define I386COFF 1
_ACEOF
;;
esac

View File

@ -417,6 +417,19 @@ if test ${all_targets} = "yes"; then
;;
esac
;;
x86_64)
case ${obj_format} in
aout)
emulations="$emulations i386coff i386elf"
;;
coff)
emulations="$emulations i386aout i386elf"
;;
elf)
emulations="$emulations i386aout i386coff"
;;
esac
;;
esac
fi
@ -461,6 +474,7 @@ case ${obj_format} in
i386) AC_DEFINE(I386COFF, 1, [Using i386 COFF?]) ;;
m68k) AC_DEFINE(M68KCOFF, 1, [Using m68k COFF?]) ;;
m88k) AC_DEFINE(M88KCOFF, 1, [Using m88k COFF?]) ;;
x86_64) AC_DEFINE(I386COFF, 1, [Using i386 COFF?]) ;;
esac
;;
esac

View File

@ -79,7 +79,7 @@ case ${cpu} in
strongarm*b) cpu_type=arm endian=big ;;
strongarm*) cpu_type=arm endian=little ;;
v850*) cpu_type=v850 ;;
x86_64) cpu_type=i386 arch=x86_64;;
x86_64*) cpu_type=i386 arch=x86_64;;
xscale*be|xscale*b) cpu_type=arm endian=big ;;
xscale*) cpu_type=arm endian=little ;;
xtensa*) cpu_type=xtensa arch=xtensa ;;
@ -212,6 +212,7 @@ case ${generic_target} in
i386-*-cygwin*) fmt=coff em=pe ;;
i386-*-interix*) fmt=coff em=interix ;;
i386-*-mingw32*) fmt=coff em=pe ;;
i386-*-mingw64*) fmt=coff em=pep ;;
i386-*-nto-qnx*) fmt=elf ;;
i386-*-*nt*) fmt=coff em=pe ;;
i386-*-chaos) fmt=elf ;;

View File

@ -1,3 +1,18 @@
2006-09-20 Kai Tietz <Kai.Tietz@onevision.com>
* gas/all/gas.exp: Add support for x86_64-*-mingw64.
* gas/i386/immed64.d: Add #pass for avoid proplems with alignment paddings.
* gas/i386/rex.d: Changed for x86_64-mingw32 target matching and padding.
* gas/i386/i386.d: Likewise.
* gas/i386/x86-64-addr32.d: Likewise.
* gas/i386/x86-64-branch.d: Likewise.
* gas/i386/x86-64-crx-suffix.d: Likewise.
* gas/i386/x86-64-crx.d: Likewise.
* gas/i386/x86-64-drx-suffix.d: Likewise.
* gas/i386/x86-64-crx-suffix.d: Likewise.
* gas/i386/x86-64-opcode.d: Likewise.
* gas/i386/x86-64-pcrel.d: Likewise.
2006-09-19 Bernd Schmidt <bernd.schmidt@analog.com>
* gas/bfin/load.s, gas/bfin/load.d: Add constant folding tests.

View File

@ -207,6 +207,7 @@ if { ([istarget *-*-coff*] && ![istarget *arm*-*-coff] && ![istarget thumb*-*-
|| [istarget i*86-*-isc*] \
|| [istarget i*86-*-go32*] \
|| [istarget i*86-*-cygwin*] \
|| [istarget x86_64-*-mingw64*] \
|| [istarget i*86-*-*nt] \
|| [istarget i*86-*-interix*] \
|| ([istarget i960-*-vxworks5.*] && ![istarget i960-*-vxworks5.0*]) } {

View File

@ -155,7 +155,9 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
run_dump_test "x86-64-rep-suffix"
run_dump_test "x86-64-gidt"
run_dump_test "x86-64-nops"
if ![istarget "*-*-mingw64*"] then {
run_dump_test "x86-64-nops-1"
}
run_dump_test "x86-64-nops-1-k8"
run_dump_test "x86-64-nops-1-nocona"
run_dump_test "x86-64-nops-1-merom"

View File

@ -57,3 +57,4 @@ Disassembly of section \.text:
[ ]*[0-9a-fA-F]+:[ ]+e5 04[ ]+inl? +\$0x4,%eax
[ ]*[0-9a-fA-F]+:[ ]+e5 08[ ]+inl? +\$0x8,%eax
[ ]*[0-9a-fA-F]+:[ ]+e5 00[ ]+inl? +\$0x0,%eax
#pass

View File

@ -1,7 +1,7 @@
#objdump: -dw
#name: x86-64 manual rex prefix use
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:

View File

@ -2,7 +2,7 @@
#objdump: -drw
#name: x86-64 32-bit addressing
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:
@ -11,3 +11,4 @@ Disassembly of section .text:
[ ]*8:[ ]+67 49 8d 80 00 00 00 00[ ]+addr32[ ]+lea[ ]+0x0\(%r8d?\),%rax.*
[ ]*10:[ ]+67 48 8d 05 00 00 00 00[ ]+addr32[ ]+lea[ ]+0\(%[re]ip\),%rax.*
[ ]*18:[ ]+67 48 8d 04 25 00 00 00 00[ ]+addr32[ ]+lea[ ]+0x0,%rax.*
#pass

View File

@ -2,7 +2,7 @@
#objdump: -drw
#name: x86-64 indirect branch
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:
@ -11,3 +11,4 @@ Disassembly of section .text:
[ ]*2:[ ]+ff d0[ ]+callq[ ]+\*%rax
[ ]*4:[ ]+ff e0[ ]+jmpq[ ]+\*%rax
[ ]*6:[ ]+ff e0[ ]+jmpq[ ]+\*%rax
#pass

View File

@ -2,7 +2,7 @@
#name: x86-64 control register related opcodes (with suffixes)
#source: x86-64-crx.s
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:

View File

@ -2,7 +2,7 @@
#name: x86-64 control register related opcodes
#source: x86-64-crx.s
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:

View File

@ -2,7 +2,7 @@
#name: x86-64 debug register related opcodes (with suffixes)
#source: x86-64-drx.s
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:

View File

@ -1,7 +1,7 @@
#objdump: -dw
#name: x86-64 debug register related opcodes
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:

View File

@ -2,7 +2,7 @@
#objdump: -drw
#name: x86-64 opcode
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:

View File

@ -1,7 +1,7 @@
#objdump: -drw
#name: x86-64 pcrel
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:

View File

@ -2,7 +2,7 @@
#objdump: -drw
#name: x86-64 rip addressing
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:
@ -11,3 +11,4 @@ Disassembly of section .text:
[ ]*6:[ ]+8d 05 11 11 11 11[ ]+lea[ ]+286331153\(%rip\),%eax[ ]*(#.*)?
[ ]*c:[ ]+8d 05 01 00 00 00[ ]+lea[ ]+1\(%rip\),%eax[ ]*(#.*)?
[ ]*12:[ ]+8d 05 00 00 00 00[ ]+lea[ ]+0\(%rip\),%eax[ ]*(#.*)?
#pass

View File

@ -2,7 +2,7 @@
#name: x86-64 stack-related opcodes (Intel mode)
#source: x86-64-stack.s
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:

View File

@ -2,7 +2,7 @@
#name: x86-64 stack-related opcodes (with suffixes)
#source: x86-64-stack.s
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:

View File

@ -1,7 +1,7 @@
#objdump: -dw
#name: x86-64 stack-related opcodes
.*: +file format elf64-x86-64
.*: +file format .*
Disassembly of section .text:

View File

@ -6,7 +6,7 @@
Disassembly of section .text:
0+ <bar-0x1a7>:
0+ <.*>:
[ ]+0: 01 ca[ ]+add[ ]+%ecx,%edx
[ ]+2: 44 01 ca[ ]+add[ ]+%r9d,%edx
[ ]+5: 41 01 ca[ ]+add[ ]+%ecx,%r10d

View File

@ -1,3 +1,15 @@
2006-09-20 Kai Tietz <Kai.Tietz@onevision.com>
* external.h: Add proper external_aouthdr64 structure (without
data_start member).
(AOUTHDRSZ64): Set according structure size.
(AOUTHDR64): As typedef of external_aouthdr64 structure.
* internal.h: Add relocation identifiers for coff.
* pe.h: Add define IMAGE_FILE_MACHINE_AMD64 the coff signature.
(PEPAOUTHDR): Adjust structure to have proper size (using AOUTHDR64).
(PEPAOUTSZ): Calculated size of 240.
* x86_64.h: Coff information for x86_64 (AMD64).
2006-02-05 Arnold Metselaar <arnold.metselaar@planet.nl>
* internal.h: Add relocation number R_IMM24 for Z80.

View File

@ -1,6 +1,6 @@
/* external.h -- External COFF structures
Copyright 2001 Free Software Foundation, Inc.
Copyright 2001, 2006 Free Software Foundation, Inc.
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
@ -55,7 +55,21 @@ AOUTHDR;
#define AOUTHDRSZ 28
#define AOUTSZ 28
#endif
typedef struct external_aouthdr64
{
char magic[2]; /* Type of file. */
char vstamp[2]; /* Version stamp. */
char tsize[4]; /* Text size in bytes, padded to FW bdry*/
char dsize[4]; /* Initialized data " ". */
char bsize[4]; /* Uninitialized data " ". */
char entry[4]; /* Entry pt. */
char text_start[4]; /* Base of text used for this file. */
}
AOUTHDR64;
#define AOUTHDRSZ64 24
#endif /* not DO_NOT_DEFINE_AOUTHDR */
#ifndef DO_NOT_DEFINE_SCNHDR
/********************** SECTION HEADER **********************/

View File

@ -1,7 +1,7 @@
/* Internal format of COFF object file data structures, for GNU BFD.
This file is part of BFD, the Binary File Descriptor library.
Copyright 1999, 2000, 2001, 2002, 2003, 2004. 2005
Copyright 1999, 2000, 2001, 2002, 2003, 2004. 2005, 2006
Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
@ -604,6 +604,25 @@ struct internal_reloc
unsigned long r_offset; /* Used by Alpha ECOFF, SPARC, others */
};
/* X86-64 relocations. */
#define R_AMD64_ABS 0 /* Reference is absolute, no relocation is necessary. */
#define R_AMD64_DIR64 1 /* 64-bit address (VA). */
#define R_AMD64_DIR32 2 /* 32-bit address (VA) R_DIR32. */
#define R_AMD64_IMAGEBASE 3 /* 32-bit absolute ref w/o base R_IMAGEBASE. */
#define R_AMD64_PCRLONG 4 /* 32-bit relative address from byte following reloc R_PCRLONG. */
#define R_AMD64_PCRLONG_1 5 /* 32-bit relative address from byte distance 1 from reloc. */
#define R_AMD64_PCRLONG_2 6 /* 32-bit relative address from byte distance 2 from reloc. */
#define R_AMD64_PCRLONG_3 7 /* 32-bit relative address from byte distance 3 from reloc. */
#define R_AMD64_PCRLONG_4 8 /* 32-bit relative address from byte distance 4 from reloc. */
#define R_AMD64_PCRLONG_5 9 /* 32-bit relative address from byte distance 5 from reloc. */
#define R_AMD64_SECTION 10 /* Section index. */
#define R_AMD64_SECREL 11 /* 32 bit offset from base of section containing target R_SECREL. */
#define R_AMD64_SECREL7 12 /* 7 bit unsigned offset from base of section containing target. */
#define R_AMD64_TOKEN 13 /* 32 bit metadata token. */
#define R_AMD64_PCRQUAD 14 /* Pseude PC64 relocation - Note: not specified by MS/AMD but need for gas pc-relative 64bit wide relocation generated by ELF. */
/* i386 Relocations. */
#define R_DIR16 1
#define R_REL24 5
#define R_DIR32 6

View File

@ -1,6 +1,6 @@
/* pe.h - PE COFF header information
Copyright 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
Copyright 1999, 2000, 2001, 2003, 2004, 2006 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -119,6 +119,7 @@
#define IMAGE_FILE_MACHINE_THUMB 0x01c2
#define IMAGE_FILE_MACHINE_TRICORE 0x0520
#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169
#define IMAGE_FILE_MACHINE_AMD64 0x8664
#define IMAGE_SUBSYSTEM_UNKNOWN 0
#define IMAGE_SUBSYSTEM_NATIVE 1
@ -259,6 +260,7 @@ typedef struct
/* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */
char DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars. */
} PEAOUTHDR;
#undef AOUTSZ
#define AOUTSZ (AOUTHDRSZ + 196)
@ -267,8 +269,11 @@ typedef struct
of just 4 bytes long. */
typedef struct
{
#ifdef AOUTHDRSZ64
AOUTHDR64 standard;
#else
AOUTHDR standard;
#endif
/* NT extra fields; see internal.h for descriptions. */
char ImageBase[8];
char SectionAlignment[4];
@ -294,7 +299,12 @@ typedef struct
/* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */
char DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars. */
} PEPAOUTHDR;
#ifdef AOUTHDRSZ64
#define PEPAOUTSZ (AOUTHDRSZ64 + 196 + 5 * 4) /* = 240 */
#else
#define PEPAOUTSZ 240
#endif
#undef E_FILNMLEN
#define E_FILNMLEN 18 /* # characters in a file name. */

54
include/coff/x86_64.h Normal file
View File

@ -0,0 +1,54 @@
/* COFF information for AMD 64.
Copyright 2006 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
Written by Kai Tietz, OneVision Software GmbH&CoKg. */
#define L_LNNO_SIZE 2
#define INCLUDE_COMDAT_FIELDS_IN_AUXENT
#include "coff/external.h"
#define AMD64MAGIC 0x8664
#define AMD64BADMAG(x) ((x).f_magic != AMD64MAGIC)
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
#define OMAGIC 0404 /* Object files, eg as output. */
#define ZMAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC /* Demand load format, eg normal ld output 0x10b. */
#define STMAGIC 0401 /* Target shlib. */
#define SHMAGIC 0443 /* Host shlib. */
/* Define some NT default values. */
/* #define NT_IMAGE_BASE 0x400000 moved to internal.h. */
#define NT_SECTION_ALIGNMENT 0x1000
#define NT_FILE_ALIGNMENT 0x200
#define NT_DEF_RESERVE 0x100000
#define NT_DEF_COMMIT 0x1000
/* Relocation directives. */
struct external_reloc
{
char r_vaddr[4];
char r_symndx[4];
char r_type[2];
};
#define RELOC struct external_reloc
#define RELSZ 10

View File

@ -1,3 +1,20 @@
2006-09-20 Kai Tietz <Kai.Tietz@onevision.com>
* configure.in: Add new target x86_64-pc-mingw64.
* configure: Regenerate.
* configure.tgt: Add definition of target emulation i386pep.
* Makefile.am: Add new target files for target-all.
* Makefile.in: Regenerate.
* pe-dll.c: Adjust to be inheritable by pep_dll.c as include.
Fix memory out of bounds excess for idata relocation section data.
* pep-dll.c: Add target specific shared object handling.
* pep-dll.h: Add target specific definitions for shared object handling.
* emulparams/i386pep.sh: Add new emulation params for target x86_64 coff.
* emultempl/pep.em: Add new emulation file for target x86_64 coff.
* po/POTFILES.in: Regenerate.
* scripttempl/pep.sc: Add linker script template for target x86_64 coff.
* NEWS: Mention new target.
2006-09-18 Thiemo Seufer <ths@networkno.de>
* configure.tgt: Add mips*el-sde-elf* and mips*-sde-elf*

View File

@ -240,6 +240,7 @@ ALL_EMULATIONS = \
ei386nw.o \
ei386pe.o \
ei386pe_posix.o \
ei386pep.o \
elnk960.o \
em32relf.o \
em32rlelf.o \
@ -412,15 +413,16 @@ ALL_64_EMULATIONS = \
ALL_EMUL_EXTRA_OFILES = \
deffilep.o \
pe-dll.o
pe-dll.o \
pep-dll.o
CFILES = ldctor.c ldemul.c ldexp.c ldfile.c ldlang.c \
ldmain.c ldmisc.c ldver.c ldwrite.c lexsup.c \
mri.c ldcref.c pe-dll.c
mri.c ldcref.c pe-dll.c pep-dll.c
HFILES = ld.h ldctor.h ldemul.h ldexp.h ldfile.h \
ldlang.h ldlex.h ldmain.h ldmisc.h ldver.h \
ldwrite.h mri.h deffile.h pe-dll.h elf-hints-local.h
ldwrite.h mri.h deffile.h pe-dll.h pep-dll.h elf-hints-local.h
GENERATED_CFILES = ldgram.c ldlex.c deffilep.c
GENERATED_HFILES = ldgram.h ldemul-list.h deffilep.h
@ -1103,6 +1105,9 @@ ei386pe.c: $(srcdir)/emulparams/i386pe.sh \
ei386pe_posix.c: $(srcdir)/emulparams/i386pe_posix.sh \
$(srcdir)/emultempl/pe.em $(srcdir)/scripttempl/pe.sc ${GEN_DEPENDS}
${GENSCRIPTS} i386pe_posix "$(tdir_i386pe_posix)"
ei386pep.c: $(srcdir)/emulparams/i386pep.sh \
$(srcdir)/emultempl/pep.em $(srcdir)/scripttempl/pep.sc ${GEN_DEPENDS}
${GENSCRIPTS} i386pep "$(tdir_i386pe)"
elnk960.c: $(srcdir)/emulparams/lnk960.sh \
$(srcdir)/emultempl/lnk960.em $(srcdir)/scripttempl/i960.sc ${GEN_DEPENDS}
${GENSCRIPTS} lnk960 "$(tdir_lnk960)"
@ -1970,6 +1975,12 @@ pe-dll.o: pe-dll.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
ld.h $(INCDIR)/bin-bugs.h ldexp.h ldlang.h ldwrite.h \
ldmisc.h ldgram.h ldmain.h ldfile.h ldemul.h $(INCDIR)/coff/internal.h \
$(BFDDIR)/libcoff.h deffile.h pe-dll.h
pep-dll.o: pep-dll.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
$(INCDIR)/symcat.h sysdep.h config.h $(INCDIR)/fopen-same.h \
$(INCDIR)/bfdlink.h $(INCDIR)/libiberty.h $(INCDIR)/safe-ctype.h \
ld.h $(INCDIR)/bin-bugs.h ldexp.h ldlang.h ldwrite.h \
ldmisc.h ldgram.h ldmain.h ldfile.h ldemul.h $(INCDIR)/coff/internal.h \
$(BFDDIR)/libcoff.h deffile.h pep-dll.h
ldgram.o: ldgram.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
$(INCDIR)/symcat.h sysdep.h config.h $(INCDIR)/fopen-same.h \
$(INCDIR)/bfdlink.h ld.h $(INCDIR)/bin-bugs.h ldexp.h \

View File

@ -464,6 +464,7 @@ ALL_EMULATIONS = \
ei386nw.o \
ei386pe.o \
ei386pe_posix.o \
ei386pep.o \
elnk960.o \
em32relf.o \
em32rlelf.o \
@ -636,15 +637,16 @@ ALL_64_EMULATIONS = \
ALL_EMUL_EXTRA_OFILES = \
deffilep.o \
pe-dll.o
pe-dll.o \
pep-dll.o
CFILES = ldctor.c ldemul.c ldexp.c ldfile.c ldlang.c \
ldmain.c ldmisc.c ldver.c ldwrite.c lexsup.c \
mri.c ldcref.c pe-dll.c
mri.c ldcref.c pe-dll.c pep-dll.c
HFILES = ld.h ldctor.h ldemul.h ldexp.h ldfile.h \
ldlang.h ldlex.h ldmain.h ldmisc.h ldver.h \
ldwrite.h mri.h deffile.h pe-dll.h elf-hints-local.h
ldwrite.h mri.h deffile.h pe-dll.h pep-dll.h elf-hints-local.h
GENERATED_CFILES = ldgram.c ldlex.c deffilep.c
GENERATED_HFILES = ldgram.h ldemul-list.h deffilep.h
@ -1914,6 +1916,9 @@ ei386pe.c: $(srcdir)/emulparams/i386pe.sh \
ei386pe_posix.c: $(srcdir)/emulparams/i386pe_posix.sh \
$(srcdir)/emultempl/pe.em $(srcdir)/scripttempl/pe.sc ${GEN_DEPENDS}
${GENSCRIPTS} i386pe_posix "$(tdir_i386pe_posix)"
ei386pep.c: $(srcdir)/emulparams/i386pep.sh \
$(srcdir)/emultempl/pep.em $(srcdir)/scripttempl/pep.sc ${GEN_DEPENDS}
${GENSCRIPTS} i386pep "$(tdir_i386pe)"
elnk960.c: $(srcdir)/emulparams/lnk960.sh \
$(srcdir)/emultempl/lnk960.em $(srcdir)/scripttempl/i960.sc ${GEN_DEPENDS}
${GENSCRIPTS} lnk960 "$(tdir_lnk960)"
@ -2751,6 +2756,12 @@ pe-dll.o: pe-dll.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
ld.h $(INCDIR)/bin-bugs.h ldexp.h ldlang.h ldwrite.h \
ldmisc.h ldgram.h ldmain.h ldfile.h ldemul.h $(INCDIR)/coff/internal.h \
$(BFDDIR)/libcoff.h deffile.h pe-dll.h
pep-dll.o: pep-dll.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
$(INCDIR)/symcat.h sysdep.h config.h $(INCDIR)/fopen-same.h \
$(INCDIR)/bfdlink.h $(INCDIR)/libiberty.h $(INCDIR)/safe-ctype.h \
ld.h $(INCDIR)/bin-bugs.h ldexp.h ldlang.h ldwrite.h \
ldmisc.h ldgram.h ldmain.h ldfile.h ldemul.h $(INCDIR)/coff/internal.h \
$(BFDDIR)/libcoff.h deffile.h pep-dll.h
ldgram.o: ldgram.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
$(INCDIR)/symcat.h sysdep.h config.h $(INCDIR)/fopen-same.h \
$(INCDIR)/bfdlink.h ld.h $(INCDIR)/bin-bugs.h ldexp.h \

View File

@ -1,4 +1,6 @@
-*- text -*-
* Add support for x86_64 PE+ target.
* Add support for Score target.
* ELF: Add --dynamic-list option to specify a list of global symbols

View File

@ -219,6 +219,8 @@ i[3-7]86-*-cygwin*) targ_emul=i386pe ;
test "$targ" != "$host" && LIB_PATH='${tooldir}/lib/w32api' ;;
i[3-7]86-*-mingw32*) targ_emul=i386pe ;
targ_extra_ofiles="deffilep.o pe-dll.o" ;;
x86_64-*-mingw64*) targ_emul=i386pep ;
targ_extra_ofiles="deffilep.o pep-dll.o" ;;
i[3-7]86-*-interix*) targ_emul=i386pe_posix;
targ_extra_ofiles="deffilep.o pe-dll.o" ;;
i[3-7]86-*-beospe*) targ_emul=i386beos ;;

9
ld/emulparams/i386pep.sh Normal file
View File

@ -0,0 +1,9 @@
ARCH="i386:x86-64"
SCRIPT_NAME=pep
OUTPUT_FORMAT="pei-x86-64"
RELOCATEABLE_OUTPUT_FORMAT="pe-x86-64"
TEMPLATE_NAME=pep
ENTRY="_mainCRTStartup"
SUBSYSTEM=PE_DEF_SUBSYSTEM
INITIAL_SYMBOL_CHAR=\"_\"
TARGET_PAGE_SIZE=0x1000

1706
ld/emultempl/pep.em Normal file

File diff suppressed because it is too large Load Diff

View File

@ -40,8 +40,30 @@
#include "coff/internal.h"
#include "../bfd/libcoff.h"
#include "deffile.h"
#ifdef pe_use_x86_64
#define PE_IDATA4_SIZE 8
#define PE_IDATA5_SIZE 8
#include "pep-dll.h"
#undef AOUTSZ
#define AOUTSZ PEPAOUTSZ
#define PEAOUTHDR PEPAOUTHDR
#else
#include "pe-dll.h"
#endif
#ifndef PE_IDATA4_SIZE
#define PE_IDATA4_SIZE 4
#endif
#ifndef PE_IDATA5_SIZE
#define PE_IDATA5_SIZE 4
#endif
/* This file turns a regular Windows PE image into a DLL. Because of
the complexity of this operation, it has been broken down into a
number of separate modules which are all called by the main function
@ -49,7 +71,7 @@
normally only called once, so static variables are used to reduce
the number of parameters and return values required.
See also: ld/emultempl/pe.em. */
See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
/* Auto-import feature by Paul Sokolovsky
@ -119,7 +141,7 @@
not, prohibiting that (detecting violation) would require more work on
behalf of loader than not doing it.
See also: ld/emultempl/pe.em. */
See also: ld/emultempl/pe.em and ld/emultempl/pep.em. */
static void add_bfd_to_link (bfd *, const char *, struct bfd_link_info *);
@ -212,9 +234,15 @@ static autofilter_entry_type autofilter_symbollist_i386[] =
static pe_details_type pe_detail_list[] =
{
{
#ifdef pe_use_x86_64
"pei-x86-64",
"pe-x86-64",
3 /* R_IMAGEBASE */,
#else
"pei-i386",
"pe-i386",
7 /* R_IMAGEBASE */,
#endif
PE_ARCH_i386,
bfd_arch_i386,
TRUE,
@ -480,6 +508,7 @@ auto_export (bfd *abfd, def_file *d, const char *n)
it is too restrictive. Instead we have
a target specific list to use: */
afptr = pe_details->autofilter_symbollist;
while (afptr->name)
{
if (strcmp (n, afptr->name) == 0)
@ -1214,6 +1243,12 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
switch BITS_AND_SHIFT (relocs[i]->howto->bitsize,
relocs[i]->howto->rightshift)
{
#ifdef pe_use_x86_64
case BITS_AND_SHIFT (64, 0):
reloc_data[total_relocs].type = 10;
total_relocs++;
break;
#endif
case BITS_AND_SHIFT (32, 0):
reloc_data[total_relocs].type = 3;
total_relocs++;
@ -1679,21 +1714,21 @@ make_head (bfd *parent)
quick_reloc (abfd, 16, BFD_RELOC_RVA, 1);
save_relocs (id2);
bfd_set_section_size (abfd, id5, 4);
d5 = xmalloc (4);
bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
d5 = xmalloc (PE_IDATA5_SIZE);
id5->contents = d5;
memset (d5, 0, 4);
memset (d5, 0, PE_IDATA5_SIZE);
bfd_set_section_size (abfd, id4, 4);
d4 = xmalloc (4);
bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
d4 = xmalloc (PE_IDATA4_SIZE);
id4->contents = d4;
memset (d4, 0, 4);
memset (d4, 0, PE_IDATA4_SIZE);
bfd_set_symtab (abfd, symtab, symptr);
bfd_set_section_contents (abfd, id2, d2, 0, 20);
bfd_set_section_contents (abfd, id5, d5, 0, 4);
bfd_set_section_contents (abfd, id4, d4, 0, 4);
bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
bfd_make_readable (abfd);
return abfd;
@ -1701,8 +1736,10 @@ make_head (bfd *parent)
/* .section .idata$4
.long 0
[.long 0] for PE+
.section .idata$5
.long 0
[.long 0] for PE+
.section idata$7
.global __my_dll_iname
__my_dll_iname:
@ -1735,15 +1772,15 @@ make_tail (bfd *parent)
id7 = quick_section (abfd, ".idata$7", SEC_HAS_CONTENTS, 2);
quick_symbol (abfd, U (""), dll_symname, "_iname", id7, BSF_GLOBAL, 0);
bfd_set_section_size (abfd, id4, 4);
d4 = xmalloc (4);
bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
d4 = xmalloc (PE_IDATA4_SIZE);
id4->contents = d4;
memset (d4, 0, 4);
memset (d4, 0, PE_IDATA4_SIZE);
bfd_set_section_size (abfd, id5, 4);
d5 = xmalloc (4);
bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
d5 = xmalloc (PE_IDATA5_SIZE);
id5->contents = d5;
memset (d5, 0, 4);
memset (d5, 0, PE_IDATA5_SIZE);
len = strlen (dll_filename) + 1;
if (len & 1)
@ -1755,8 +1792,8 @@ make_tail (bfd *parent)
bfd_set_symtab (abfd, symtab, symptr);
bfd_set_section_contents (abfd, id4, d4, 0, 4);
bfd_set_section_contents (abfd, id5, d5, 0, 4);
bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
bfd_set_section_contents (abfd, id7, d7, 0, len);
bfd_make_readable (abfd);
@ -1943,16 +1980,16 @@ make_one (def_file_export *exp, bfd *parent)
quick_reloc (abfd, 0, BFD_RELOC_RVA, 5);
save_relocs (id7);
bfd_set_section_size (abfd, id5, 4);
d5 = xmalloc (4);
bfd_set_section_size (abfd, id5, PE_IDATA5_SIZE);
d5 = xmalloc (PE_IDATA5_SIZE);
id5->contents = d5;
memset (d5, 0, 4);
memset (d5, 0, PE_IDATA5_SIZE);
if (exp->flag_noname)
{
d5[0] = exp->ordinal;
d5[1] = exp->ordinal >> 8;
d5[3] = 0x80;
d5[PE_IDATA5_SIZE - 1] = 0x80;
}
else
{
@ -1960,16 +1997,16 @@ make_one (def_file_export *exp, bfd *parent)
save_relocs (id5);
}
bfd_set_section_size (abfd, id4, 4);
d4 = xmalloc (4);
bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
d4 = xmalloc (PE_IDATA4_SIZE);
id4->contents = d4;
memset (d4, 0, 4);
memset (d4, 0, PE_IDATA4_SIZE);
if (exp->flag_noname)
{
d4[0] = exp->ordinal;
d4[1] = exp->ordinal >> 8;
d4[3] = 0x80;
d4[PE_IDATA4_SIZE - 1] = 0x80;
}
else
{
@ -2000,8 +2037,8 @@ make_one (def_file_export *exp, bfd *parent)
bfd_set_section_contents (abfd, tx, td, 0, jmp_byte_count);
bfd_set_section_contents (abfd, id7, d7, 0, 4);
bfd_set_section_contents (abfd, id5, d5, 0, 4);
bfd_set_section_contents (abfd, id4, d4, 0, 4);
bfd_set_section_contents (abfd, id5, d5, 0, PE_IDATA5_SIZE);
bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
if (!exp->flag_noname)
bfd_set_section_contents (abfd, id6, d6, 0, len);
@ -2035,16 +2072,16 @@ make_singleton_name_thunk (const char *import, bfd *parent)
quick_symbol (abfd, U ("_nm_thnk_"), import, "", id4, BSF_GLOBAL, 0);
quick_symbol (abfd, U ("_nm_"), import, "", UNDSEC, BSF_GLOBAL, 0);
bfd_set_section_size (abfd, id4, 8);
d4 = xmalloc (4);
bfd_set_section_size (abfd, id4, PE_IDATA4_SIZE);
d4 = xmalloc (PE_IDATA4_SIZE);
id4->contents = d4;
memset (d4, 0, 8);
memset (d4, 0, PE_IDATA4_SIZE);
quick_reloc (abfd, 0, BFD_RELOC_RVA, 2);
save_relocs (id4);
bfd_set_symtab (abfd, symtab, symptr);
bfd_set_section_contents (abfd, id4, d4, 0, 8);
bfd_set_section_contents (abfd, id4, d4, 0, PE_IDATA4_SIZE);
bfd_make_readable (abfd);
return abfd;
@ -2088,15 +2125,6 @@ make_import_fixup_mark (arelent *rel)
current_sec, /* sym->section, */
rel->address, NULL, TRUE, FALSE, &bh);
if (0)
{
struct coff_link_hash_entry *myh;
myh = (struct coff_link_hash_entry *) bh;
printf ("type:%d\n", myh->type);
printf ("%s\n", myh->root.u.def.section->name);
}
return fixup_name;
}
@ -2558,13 +2586,23 @@ pe_implied_import_dll (const char *filename)
/* Get pe_header, optional header and numbers of export entries. */
pe_header_offset = pe_get32 (dll, 0x3c);
opthdr_ofs = pe_header_offset + 4 + 20;
#ifdef pe_use_x86_64
num_entries = pe_get32 (dll, opthdr_ofs + 92 + 4 * 4); /* & NumberOfRvaAndSizes. */
#else
num_entries = pe_get32 (dll, opthdr_ofs + 92);
#endif
if (num_entries < 1) /* No exports. */
return FALSE;
#ifdef pe_use_x86_64
export_rva = pe_get32 (dll, opthdr_ofs + 96 + 4 * 4);
export_size = pe_get32 (dll, opthdr_ofs + 100 + 4 * 4);
#else
export_rva = pe_get32 (dll, opthdr_ofs + 96);
export_size = pe_get32 (dll, opthdr_ofs + 100);
#endif
nsections = pe_get16 (dll, pe_header_offset + 4 + 2);
secptr = (pe_header_offset + 4 + 20 +
pe_get16 (dll, pe_header_offset + 4 + 16));

57
ld/pep-dll.c Normal file
View File

@ -0,0 +1,57 @@
/* Routines to help build PEPI-format DLLs (Win64 etc)
Copyright 2006 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
Written by Kai Tietz, OneVision Software GmbH&CoKg. */
#define COFF_IMAGE_WITH_PE
#define COFF_WITH_PE
#define COFF_WITH_pex64
/* Local defined globals. */
#define pe_def_file pep_def_file
#define pe_details pep_details
#define pe_dll_compat_implib pep_dll_compat_implib
#define pe_dll_extra_pe_debug pep_dll_extra_pe_debug
#define pe_dll_export_everything pep_dll_export_everything
#define pe_dll_do_default_excludes pep_dll_do_default_excludes
#define pe_dll_kill_ats pep_dll_kill_ats
#define pe_dll_stdcall_aliases pep_dll_stdcall_aliases
#define pe_dll_warn_dup_exports pep_dll_warn_dup_exports
/* External globals. */
#define pe_data_import_dll pep_data_import_dll
/* Unique global name for functions to avoid double defined symbols. */
#define pe_create_import_fixup pep_create_import_fixup
#define pe_dll_generate_def_file pep_dll_generate_def_file
#define pe_process_import_defs pep_process_import_defs
#define pe_dll_id_target pep_dll_id_target
#define pe_implied_import_dll pep_implied_import_dll
#define pe_dll_build_sections pep_dll_build_sections
#define pe_exe_build_sections pep_exe_build_sections
#define pe_dll_fill_sections pep_dll_fill_sections
#define pe_exe_fill_sections pep_exe_fill_sections
#define pe_dll_generate_implib pep_dll_generate_implib
#define pe_dll_add_excludes pep_dll_add_excludes
#define pe_walk_relocs_of_symbol pep_walk_relocs_of_symbol
/* Uses x86_64 PE+. */
#define pe_use_x86_64
#include "pe-dll.c"

53
ld/pep-dll.h Normal file
View File

@ -0,0 +1,53 @@
/* pep-dll.h: Header file for routines used to build Windows DLLs.
Copyright 2006 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
Written by Kai Tietz, OneVision Software GmbH&CoKg. */
#ifndef PEP_DLL_H
#define PEP_DLL_H
#include "bfd.h"
#include "sysdep.h"
#include "bfdlink.h"
#include "deffile.h"
extern def_file * pep_def_file;
extern int pep_dll_export_everything;
extern int pep_dll_do_default_excludes;
extern int pep_dll_kill_ats;
extern int pep_dll_stdcall_aliases;
extern int pep_dll_warn_dup_exports;
extern int pep_dll_compat_implib;
extern int pep_dll_extra_pe_debug;
extern void pep_dll_id_target (const char *);
extern void pep_dll_add_excludes (const char *, const int);
extern void pep_dll_generate_def_file (const char *);
extern void pep_dll_generate_implib (def_file *, const char *);
extern void pep_process_import_defs (bfd *, struct bfd_link_info *);
extern bfd_boolean pep_implied_import_dll (const char *);
extern void pep_dll_build_sections (bfd *, struct bfd_link_info *);
extern void pep_exe_build_sections (bfd *, struct bfd_link_info *);
extern void pep_dll_fill_sections (bfd *, struct bfd_link_info *);
extern void pep_exe_fill_sections (bfd *, struct bfd_link_info *);
extern void pep_walk_relocs_of_symbol
(struct bfd_link_info *, const char *, int (*) (arelent *, asection *));
extern void pep_create_import_fixup (arelent * rel, asection *, int);
#endif /* PEP_DLL_H */

View File

@ -28,3 +28,5 @@ mri.c
mri.h
pe-dll.c
pe-dll.h
pep-dll.c
pep-dll.h

272
ld/scripttempl/pep.sc Normal file
View File

@ -0,0 +1,272 @@
# Linker script for PE.
if test -z "${RELOCATEABLE_OUTPUT_FORMAT}"; then
RELOCATEABLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
fi
# We can't easily and portably get an unquoted $ in a shell
# substitution, so we do this instead.
# Sorting of the .foo$* sections is required by the definition of
# grouped sections in PE.
# Sorting of the file names in R_IDATA is required by the
# current implementation of dlltool (this could probably be changed to
# use grouped sections instead).
if test "${RELOCATING}"; then
R_TEXT='*(SORT(.text$*))'
R_DATA='*(SORT(.data$*))'
R_RDATA='*(SORT(.rdata$*))'
R_IDATA='
SORT(*)(.idata$2)
SORT(*)(.idata$3)
/* These zeroes mark the end of the import list. */
LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
SORT(*)(.idata$4)
SORT(*)(.idata$5)
SORT(*)(.idata$6)
SORT(*)(.idata$7)'
R_CRT_XC='*(SORT(.CRT$XC*)) /* C initialization */'
R_CRT_XI='*(SORT(.CRT$XI*)) /* C++ initialization */'
R_CRT_XL='*(SORT(.CRT$XL*)) /* TLS callbacks */'
R_CRT_XP='*(SORT(.CRT$XP*)) /* Pre-termination */'
R_CRT_XT='*(SORT(.CRT$XT*)) /* Termination */'
R_TLS='
*(.tls)
*(.tls$)
*(SORT(.tls$*))'
R_RSRC='*(SORT(.rsrc$*))'
else
R_TEXT=
R_DATA=
R_RDATA=
R_IDATA=
R_CRT=
R_RSRC=
fi
cat <<EOF
${RELOCATING+OUTPUT_FORMAT(${OUTPUT_FORMAT})}
${RELOCATING-OUTPUT_FORMAT(${RELOCATEABLE_OUTPUT_FORMAT})}
${OUTPUT_ARCH+OUTPUT_ARCH(${OUTPUT_ARCH})}
${LIB_SEARCH_DIRS}
SECTIONS
{
${RELOCATING+/* Make the virtual address and file offset synced if the alignment is}
${RELOCATING+ lower than the target page size. */}
${RELOCATING+. = SIZEOF_HEADERS;}
${RELOCATING+. = ALIGN(__section_alignment__);}
.text ${RELOCATING+ __image_base__ + ( __section_alignment__ < ${TARGET_PAGE_SIZE} ? . : __section_alignment__ )} :
{
${RELOCATING+ *(.init)}
*(.text)
${R_TEXT}
*(.glue_7t)
*(.glue_7)
${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
LONG (-1);*(.ctors); *(.ctor); *(SORT(.ctors.*)); LONG (0); }
${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
LONG (-1); *(.dtors); *(.dtor); *(SORT(.dtors.*)); LONG (0); }
${RELOCATING+ *(.fini)}
/* ??? Why is .gcc_exc here? */
${RELOCATING+ *(.gcc_exc)}
${RELOCATING+PROVIDE (etext = .);}
*(.gcc_except_table)
}
/* The Cygwin32 library uses a section to avoid copying certain data
on fork. This used to be named ".data$nocopy". The linker used
to include this between __data_start__ and __data_end__, but that
breaks building the cygwin32 dll. Instead, we name the section
".data_cygwin_nocopy" and explictly include it after __data_end__. */
.data ${RELOCATING+BLOCK(__section_alignment__)} :
{
${RELOCATING+__data_start__ = . ;}
*(.data)
*(.data2)
${R_DATA}
*(.jcr)
${RELOCATING+__data_end__ = . ;}
${RELOCATING+*(.data_cygwin_nocopy)}
}
.rdata ${RELOCATING+BLOCK(__section_alignment__)} :
{
*(.rdata)
${R_RDATA}
*(.eh_frame)
${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST__ = .;}
${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST__ = .;}
*(.rdata_runtime_pseudo_reloc)
${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;}
${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST_END__ = .;}
}
.pdata ${RELOCATING+BLOCK(__section_alignment__)} :
{
*(.pdata)
}
.bss ${RELOCATING+BLOCK(__section_alignment__)} :
{
${RELOCATING+__bss_start__ = . ;}
*(.bss)
*(COMMON)
${RELOCATING+__bss_end__ = . ;}
}
.edata ${RELOCATING+BLOCK(__section_alignment__)} :
{
*(.edata)
}
/DISCARD/ :
{
*(.debug\$S)
*(.debug\$T)
*(.debug\$F)
*(.drectve)
}
.idata ${RELOCATING+BLOCK(__section_alignment__)} :
{
/* This cannot currently be handled with grouped sections.
See pep.em:sort_sections. */
${R_IDATA}
}
.CRT ${RELOCATING+BLOCK(__section_alignment__)} :
{
${RELOCATING+___crt_xc_start__ = . ;}
${R_CRT_XC}
${RELOCATING+___crt_xc_end__ = . ;}
${RELOCATING+___crt_xi_start__ = . ;}
${R_CRT_XI}
${RELOCATING+___crt_xi_end__ = . ;}
${RELOCATING+___crt_xl_start__ = . ;}
${R_CRT_XL}
/* ___crt_xl_end__ is defined in the TLS Directory support code */
${RELOCATING+___crt_xp_start__ = . ;}
${R_CRT_XP}
${RELOCATING+___crt_xp_end__ = . ;}
${RELOCATING+___crt_xt_start__ = . ;}
${R_CRT_XT}
${RELOCATING+___crt_xt_end__ = . ;}
}
.tls ${RELOCATING+BLOCK(__section_alignment__)} :
{
${RELOCATING+___tls_start__ = . ;}
${R_TLS}
${RELOCATING+___tls_end__ = . ;}
}
.endjunk ${RELOCATING+BLOCK(__section_alignment__)} :
{
/* end is deprecated, don't use it */
${RELOCATING+PROVIDE (end = .);}
${RELOCATING+PROVIDE ( _end = .);}
${RELOCATING+ __end__ = .;}
}
.rsrc ${RELOCATING+BLOCK(__section_alignment__)} :
{
*(.rsrc)
${R_RSRC}
}
.reloc ${RELOCATING+BLOCK(__section_alignment__)} :
{
*(.reloc)
}
.stab ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.stab)
}
.stabstr ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.stabstr)
}
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section. Unlike other targets that fake this by putting the
section VMA at 0, the PE format will not allow it. */
/* DWARF 1.1 and DWARF 2. */
.debug_aranges ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_aranges)
}
.debug_pubnames ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_pubnames)
}
/* DWARF 2. */
.debug_info ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_info) *(.gnu.linkonce.wi.*)
}
.debug_abbrev ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_abbrev)
}
.debug_line ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_line)
}
.debug_frame ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_frame)
}
.debug_str ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_str)
}
.debug_loc ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_loc)
}
.debug_macinfo ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_macinfo)
}
/* SGI/MIPS DWARF 2 extensions. */
.debug_weaknames ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_weaknames)
}
.debug_funcnames ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_funcnames)
}
.debug_typenames ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_typenames)
}
.debug_varnames ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_varnames)
}
/* DWARF 3. */
.debug_ranges ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
{
*(.debug_ranges)
}
}
EOF

View File

@ -1,3 +1,15 @@
2006-09-20 Kai Tietz <Kai.Tietz@onevision.com>
* bootstrap/bootstrap.exp: Fix x86_64-mingw32 target test.
* ld-fastcall/fastcall.exp: Likewise.
* ld-scripts/align.exp: Likewise.
* ld-scripts/align2a.d: Likewise.
* ld-scripts/defined.exp: Likewise.
* ld-scripts/provide.exp: Likewise.
* ld-scripts/script.exp: Likewise.
* ld-scripts/weak.exp: Likewise.
* lib/ld-lib.exp: Detect target as pecoff file format.
2006-09-18 Thiemo Seufer <ths@networkno.de>
Maciej W. Rozycki <macro@mips.com>

View File

@ -1,5 +1,5 @@
# Expect script for LD Bootstrap Tests
# Copyright 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2004
# Copyright 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2004, 2006
# Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify
@ -140,7 +140,7 @@ foreach flags {"" "strip" "--static" "--traditional-format"
|| [istarget "*-*-wince"]
|| [istarget "*-*-cygwin*"]
|| [istarget "*-*-winnt*"]
|| [istarget "*-*-mingw32*"]
|| [istarget "*-*-mingw*"]
|| [istarget "*-*-interix*"]
|| [istarget "*-*-beospe*"]
|| [istarget "*-*-netbsdpe*"]} {

View File

@ -1,5 +1,5 @@
# Test that the linker can handle fastcall symbols correctly.
# Copyright 2002 Free Software Foundation, Inc.
# Copyright 2002, 2006 Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -17,13 +17,13 @@
set testname "ld (fastcall symbols)"
if {![istarget "i*86-*-*"]} {
if {![istarget "i*86-*-*"] && ![istarget "x86_64-*-mingw64*"] } {
return
}
if { !([istarget "i*86-*-*pe*"] && ![istarget "i*86-*-opensd*"]) \
&& ![istarget "i*86-*-cygwin*"] \
&& ![istarget "i*86-*-mingw32*"] } {
&& ![istarget "i*86-*-mingw*"] } {
return
}

View File

@ -1,6 +1,6 @@
# Test ALIGN in a linker script.
# By Nathan Sidwell, CodeSourcery LLC
# Copyright 2004, 2005
# Copyright 2004, 2005, 2006
# Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify
@ -29,13 +29,20 @@ if ![ld_assemble $as $srcdir/$subdir/align.s tmpdir/align.o] {
return
}
# Doesn't work on PECOFF, appears to be a genuine bug
if [is_pecoff_format] {
# Doesn't work on PECOFF, appears to be a genuine bug.
# mingw64 targets need to set the image base to 0 to avoid auto image-basing.
global LDFLAGS
set saved_LDFLAGS "$LDFLAGS"
if [istarget "*-*-mingw64*"] then {
set LDFLAGS "$LDFLAGS --image-base 0"
} else {
if [is_pecoff_format] {
global target_triplet
setup_xfail $target_triplet
}
}
if ![ld_simple_link $ld tmpdir/align "-T $srcdir/$subdir/align.t tmpdir/align.o"] {
if ![ld_simple_link $ld tmpdir/align "$LDFLAGS -T $srcdir/$subdir/align.t tmpdir/align.o"] {
fail $testname
} else {
pass $testname
@ -50,3 +57,4 @@ if ![is_aout_format] {
run_dump_test align2b
}
run_dump_test align2c
set LDFLAGS "$saved_LDFLAGS"

View File

@ -5,8 +5,8 @@
Sections:
Idx +Name +Size +VMA +LMA +File +off +Algn
+0 +\.text +[^ ]* +0+ +0+ .*
+CONTENTS, +ALLOC, +LOAD,.* CODE
+1 +\.data +[^ ]* +0+10 +0+10 .*
+CONTENTS, +ALLOC, +LOAD, +DATA
[ ]+0 +\.text +[^ ]* +0+ +0+ .*
[ ]+CONTENTS, +ALLOC, +LOAD,.* CODE
[ ]+1 +\.data +[^ ]* +0+10 +0+10 .*
[ ]+CONTENTS, +ALLOC, +LOAD, +DATA
#pass

View File

@ -1,6 +1,6 @@
# Test DEFINED in a linker script.
# By Ian Lance Taylor, Cygnus Support.
# Copyright 2001, 2003
# Copyright 2001, 2003. 2006
# Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify
@ -25,7 +25,13 @@ if ![ld_assemble $as $srcdir/$subdir/defined.s tmpdir/def.o] {
return
}
if ![ld_simple_link $ld tmpdir/def "-T $srcdir/$subdir/defined.t tmpdir/def.o"] {
global LDFLAGS
set saved_LDFLAGS "$LDFLAGS"
if [istarget "*-*-mingw64*"] then {
set LDFLAGS "$LDFLAGS --image-base 0"
}
if ![ld_simple_link $ld tmpdir/def "$LDFLAGS -T $srcdir/$subdir/defined.t tmpdir/def.o"] {
fail $testname
} else {
if ![ld_nm $nm "" tmpdir/def] {
@ -57,3 +63,4 @@ if ![ld_simple_link $ld tmpdir/def "-T $srcdir/$subdir/defined.t tmpdir/def.o"]
set prms_id 0
run_dump_test "defined2"
run_dump_test "defined3"
set LDFLAGS "$saved_LDFLAGS"

View File

@ -1,6 +1,6 @@
# Test PROVIDE in a linker script.
# By Nathan Sidwell, CodeSourcery LLC
# Copyright 2004
# Copyright 2004, 2006
# Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify
@ -29,7 +29,15 @@ if {[istarget "rs6000-*-aix*"] || [is_aout_format]} {
return
}
global LDFLAGS
set saved_LDFLAGS "$LDFLAGS"
if [istarget "*-*-mingw64*"] then {
set LDFLAGS "$LDFLAGS --image-base 0"
}
run_dump_test provide-1
run_dump_test provide-2
setup_xfail *-*-*
run_dump_test provide-3
set LDFLAGS "$saved_LDFLAGS"

View File

@ -1,6 +1,6 @@
# Test basic linker script functionality
# By Ian Lance Taylor, Cygnus Support
# Copyright 1999, 2000, 2001, 2002, 2004
# Copyright 1999, 2000, 2001, 2002, 2004, 2006
# Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify
@ -95,7 +95,7 @@ proc check_script { } {
set flags ""
if {[istarget "*-*-pe*"] \
|| [istarget "*-*-cygwin*"] \
|| [istarget "*-*-mingw32*"] \
|| [istarget "*-*-mingw*"] \
|| [istarget "*-*-winnt*"] \
|| [istarget "*-*-nt"] \
|| [istarget "*-*-interix*"] } then {
@ -123,5 +123,3 @@ if ![ld_simple_link $ld tmpdir/script "$flags -T $srcdir/$subdir/memory.t tmpdir
} else {
check_script
}

View File

@ -1,6 +1,6 @@
# Test weak symbols.
# By Ian Lance Taylor, Cygnus Solutions.
# Copyright 1999, 2000, 2002, 2004
# Copyright 1999, 2000, 2002, 2004, 2006
# Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify
@ -29,6 +29,7 @@ if {! [is_elf_format] && ! [is_pecoff_format]} {
# Weak symbols are broken for non-i386 PE targets.
if {! [istarget i?86-*-*]} {
setup_xfail *-*-pe*
setup_xfail *-*-mingw64*
}
# hppa64 and or32 are incredibly broken
@ -41,6 +42,12 @@ if {! [ld_assemble $as $srcdir/$subdir/weak1.s tmpdir/weak1.o]
return
}
global LDFLAGS
set saved_LDFLAGS "$LDFLAGS"
if [istarget "*-*-mingw64*"] then {
set LDFLAGS "$LDFLAGS --image-base 0"
}
set weak_regexp_big \
".*Contents of section .text:.*1000 00001008 0000200c 12121212 34343434.*Contents of section .data:.*2000 00001008 0000200c 56565656 78787878.*"
@ -52,6 +59,7 @@ if {! [ld_simple_link $ld tmpdir/weak "$flags -T $srcdir/$subdir/weak.t tmpdir/w
} else {
if {[which $objdump] == 0} then {
unresolved $testname
set LDFLAGS "$saved_LDFLAGS"
return
}
@ -67,3 +75,5 @@ if {! [ld_simple_link $ld tmpdir/weak "$flags -T $srcdir/$subdir/weak.t tmpdir/w
fail $testname
}
}
set LDFLAGS "$saved_LDFLAGS"