diff options
author | Tristan Gingold <gingold@adacore.com> | 2013-12-02 14:30:32 +0100 |
---|---|---|
committer | Tristan Gingold <tristan.gingold@adacore.com> | 2014-03-13 09:33:07 +0100 |
commit | 167ad85bf06582759e8dfe021aac9da79b81340d (patch) | |
tree | ca992034e6e0a0475963e057eb3044a90d1a5f6a /bfd/peicode.h | |
parent | 5e3a2c38d793123e32547f165f18b362438ce603 (diff) | |
download | binutils-gdb-167ad85bf06582759e8dfe021aac9da79b81340d.tar.gz |
Add pe/x86_64 bigobj file format.
bfd/
* peicode.h (pe_ILF_object_p): Adjust, as the version number
has been read.
(pe_bfd_object_p): Also read version number to detect ILF.
* pe-x86_64.c (COFF_WITH_PE_BIGOBJ): Define.
(x86_64pe_bigobj_vec): Define
* coffcode.h (bfd_coff_backend_data): Add _bfd_coff_max_nscns field.
(bfd_coff_max_nscns): New macro.
(coff_compute_section_file_positions): Use unsigned int for
target_index. Compare with bfd_coff_max_nscns.
(bfd_coff_std_swap_table, ticoff0_swap_table, ticoff1_swap_table):
Set a value for _bfd_coff_max_nscns.
(header_bigobj_classid): New constant.
(coff_bigobj_swap_filehdr_in, coff_bigobj_swap_filehdr_out)
(coff_bigobj_swap_sym_in, coff_bigobj_swap_sym_out)
(coff_bigobj_swap_aux_in, coff_bigobj_swap_aux_out): New
functions.
(bigobj_swap_table): New table.
* libcoff.h: Regenerate.
* coff-sh.c (bfd_coff_small_swap_table): Likewise.
* coff-alpha.c (alpha_ecoff_backend_data): Add value for
_bfd_coff_max_nscns.
* coff-mips.c (mips_ecoff_backend_data): Likewise.
* coff-rs6000.c (bfd_xcoff_backend_data)
(bfd_pmac_xcoff_backend_data): Likewise.
* coff64-rs6000.c (bfd_xcoff_backend_data)
(bfd_xcoff_aix5_backend_data): Likewise.
* targets.c (x86_64pe_bigobj_vec): Declare.
* configure.in (x86_64pe_bigobj_vec): New vector.
* configure: Regenerate.
* config.bfd: Add bigobj object format for Windows targets.
gas/
* config/tc-i386.c (use_big_obj): Declare.
(OPTION_MBIG_OBJ): Define.
(md_longopts): Add -mbig-obj option.
(md_parse_option): Handle it.
(md_show_usage): Display help for this option.
(i386_target_format): Use bigobj for x86-64 if -mbig-obj.
* doc/c-i386.texi: Document the option.
gas/testsuite/
* gas/pe/big-obj.d, gas/pe/big-obj.s: Add test.
* gas/pe/pe.exp: Add test.
include/coff/
* pe.h (struct external_ANON_OBJECT_HEADER_BIGOBJ): Declare.
(FILHSZ_BIGOBJ): Define.
(struct external_SYMBOL_EX): Declare.
(SYMENT_BIGOBJ, SYMESZ_BIGOBJ): Define.
(union external_AUX_SYMBOL_EX): Declare.
(AUXENT_BIGOBJ, AUXESZ_BIGOBJ): Define.
* internal.h (struct internal_filehdr): Change type
of f_nscns.
Diffstat (limited to 'bfd/peicode.h')
-rw-r--r-- | bfd/peicode.h | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/bfd/peicode.h b/bfd/peicode.h index 8fd689c38ec..157879b478a 100644 --- a/bfd/peicode.h +++ b/bfd/peicode.h @@ -1077,7 +1077,7 @@ pe_ILF_build_a_bfd (bfd * abfd, static const bfd_target * pe_ILF_object_p (bfd * abfd) { - bfd_byte buffer[16]; + bfd_byte buffer[14]; bfd_byte * ptr; char * symbol_name; char * source_dll; @@ -1087,17 +1087,13 @@ pe_ILF_object_p (bfd * abfd) unsigned int types; unsigned int magic; - /* Upon entry the first four buyes of the ILF header have + /* Upon entry the first six bytes of the ILF header have already been read. Now read the rest of the header. */ - if (bfd_bread (buffer, (bfd_size_type) 16, abfd) != 16) + if (bfd_bread (buffer, (bfd_size_type) 14, abfd) != 14) return NULL; ptr = buffer; - /* We do not bother to check the version number. - version = H_GET_16 (abfd, ptr); */ - ptr += 2; - machine = H_GET_16 (abfd, ptr); ptr += 2; @@ -1251,7 +1247,7 @@ pe_ILF_object_p (bfd * abfd) static const bfd_target * pe_bfd_object_p (bfd * abfd) { - bfd_byte buffer[4]; + bfd_byte buffer[6]; struct external_PEI_DOS_hdr dos_hdr; struct external_PEI_IMAGE_hdr image_hdr; struct internal_filehdr internal_f; @@ -1260,15 +1256,18 @@ pe_bfd_object_p (bfd * abfd) file_ptr offset; /* Detect if this a Microsoft Import Library Format element. */ + /* First read the beginning of the header. */ if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || bfd_bread (buffer, (bfd_size_type) 4, abfd) != 4) + || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6) { if (bfd_get_error () != bfd_error_system_call) bfd_set_error (bfd_error_wrong_format); return NULL; } - if (H_GET_32 (abfd, buffer) == 0xffff0000) + /* Then check the magic and the version (only 0 is supported). */ + if (H_GET_32 (abfd, buffer) == 0xffff0000 + && H_GET_16 (abfd, buffer + 4) == 0) return pe_ILF_object_p (abfd); if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 |