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.
This commit is contained in:
Tristan Gingold 2013-12-02 14:30:32 +01:00 committed by Tristan Gingold
parent 5e3a2c38d7
commit 167ad85bf0
24 changed files with 537 additions and 17 deletions

View File

@ -1,3 +1,36 @@
2014-03-13 Tristan Gingold <gingold@adacore.com>
* 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.
2014-03-12 Nick Clifton <nickc@redhat.com> 2014-03-12 Nick Clifton <nickc@redhat.com>
PR ld/16671 PR ld/16671

View File

@ -2241,7 +2241,7 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
alpha_ecoff_swap_filehdr_out, alpha_ecoff_swap_aouthdr_out, alpha_ecoff_swap_filehdr_out, alpha_ecoff_swap_aouthdr_out,
alpha_ecoff_swap_scnhdr_out, alpha_ecoff_swap_scnhdr_out,
FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, TRUE, FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, TRUE,
ECOFF_NO_LONG_SECTION_NAMES, 4, FALSE, 2, ECOFF_NO_LONG_SECTION_NAMES, 4, FALSE, 2, 32768,
alpha_ecoff_swap_filehdr_in, alpha_ecoff_swap_aouthdr_in, alpha_ecoff_swap_filehdr_in, alpha_ecoff_swap_aouthdr_in,
alpha_ecoff_swap_scnhdr_in, NULL, alpha_ecoff_swap_scnhdr_in, NULL,
alpha_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook, alpha_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook,

View File

@ -1254,7 +1254,7 @@ static const struct ecoff_backend_data mips_ecoff_backend_data =
mips_ecoff_swap_filehdr_out, mips_ecoff_swap_aouthdr_out, mips_ecoff_swap_filehdr_out, mips_ecoff_swap_aouthdr_out,
mips_ecoff_swap_scnhdr_out, mips_ecoff_swap_scnhdr_out,
FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, TRUE, FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, TRUE,
ECOFF_NO_LONG_SECTION_NAMES, 4, FALSE, 2, ECOFF_NO_LONG_SECTION_NAMES, 4, FALSE, 2, 32768,
mips_ecoff_swap_filehdr_in, mips_ecoff_swap_aouthdr_in, mips_ecoff_swap_filehdr_in, mips_ecoff_swap_aouthdr_in,
mips_ecoff_swap_scnhdr_in, NULL, mips_ecoff_swap_scnhdr_in, NULL,
mips_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook, mips_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook,

View File

@ -4105,6 +4105,7 @@ static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
3, /* _bfd_coff_default_section_alignment_power */ 3, /* _bfd_coff_default_section_alignment_power */
FALSE, /* _bfd_coff_force_symnames_in_strings */ FALSE, /* _bfd_coff_force_symnames_in_strings */
2, /* _bfd_coff_debug_string_prefix_length */ 2, /* _bfd_coff_debug_string_prefix_length */
32768, /* _bfd_coff_max_nscns */
coff_swap_filehdr_in, coff_swap_filehdr_in,
coff_swap_aouthdr_in, coff_swap_aouthdr_in,
coff_swap_scnhdr_in, coff_swap_scnhdr_in,
@ -4285,6 +4286,7 @@ static const struct xcoff_backend_data_rec bfd_pmac_xcoff_backend_data =
3, /* _bfd_coff_default_section_alignment_power */ 3, /* _bfd_coff_default_section_alignment_power */
FALSE, /* _bfd_coff_force_symnames_in_strings */ FALSE, /* _bfd_coff_force_symnames_in_strings */
2, /* _bfd_coff_debug_string_prefix_length */ 2, /* _bfd_coff_debug_string_prefix_length */
32768, /* _bfd_coff_max_nscns */
coff_swap_filehdr_in, coff_swap_filehdr_in,
coff_swap_aouthdr_in, coff_swap_aouthdr_in,
coff_swap_scnhdr_in, coff_swap_scnhdr_in,

View File

@ -3090,6 +3090,7 @@ static bfd_coff_backend_data bfd_coff_small_swap_table =
#else #else
2, 2,
#endif #endif
32768,
coff_swap_filehdr_in, coff_swap_aouthdr_in, coff_swap_scnhdr_in, coff_swap_filehdr_in, coff_swap_aouthdr_in, coff_swap_scnhdr_in,
coff_swap_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook, coff_swap_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook, coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,

View File

@ -2542,6 +2542,7 @@ static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
3, /* _bfd_coff_default_section_alignment_power */ 3, /* _bfd_coff_default_section_alignment_power */
TRUE, /* _bfd_coff_force_symnames_in_strings */ TRUE, /* _bfd_coff_force_symnames_in_strings */
4, /* _bfd_coff_debug_string_prefix_length */ 4, /* _bfd_coff_debug_string_prefix_length */
32768, /* _bfd_coff_max_nscns */
coff_swap_filehdr_in, coff_swap_filehdr_in,
coff_swap_aouthdr_in, coff_swap_aouthdr_in,
coff_swap_scnhdr_in, coff_swap_scnhdr_in,
@ -2801,6 +2802,7 @@ static const struct xcoff_backend_data_rec bfd_xcoff_aix5_backend_data =
3, /* _bfd_coff_default_section_alignment_power */ 3, /* _bfd_coff_default_section_alignment_power */
TRUE, /* _bfd_coff_force_symnames_in_strings */ TRUE, /* _bfd_coff_force_symnames_in_strings */
4, /* _bfd_coff_debug_string_prefix_length */ 4, /* _bfd_coff_debug_string_prefix_length */
32768, /* _bfd_coff_max_nscns */
coff_swap_filehdr_in, coff_swap_filehdr_in,
coff_swap_aouthdr_in, coff_swap_aouthdr_in,
coff_swap_scnhdr_in, coff_swap_scnhdr_in,

View File

@ -1393,6 +1393,7 @@ Special entry points for gdb to swap in coff symbol table parts:
. unsigned int _bfd_coff_default_section_alignment_power; . unsigned int _bfd_coff_default_section_alignment_power;
. bfd_boolean _bfd_coff_force_symnames_in_strings; . bfd_boolean _bfd_coff_force_symnames_in_strings;
. unsigned int _bfd_coff_debug_string_prefix_length; . unsigned int _bfd_coff_debug_string_prefix_length;
. unsigned int _bfd_coff_max_nscns;
. .
. void (*_bfd_coff_swap_filehdr_in) . void (*_bfd_coff_swap_filehdr_in)
. (bfd *, void *, void *); . (bfd *, void *, void *);
@ -1530,6 +1531,9 @@ Special entry points for gdb to swap in coff symbol table parts:
. ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable)) . ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable))
.#define bfd_coff_default_section_alignment_power(abfd) \ .#define bfd_coff_default_section_alignment_power(abfd) \
. (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power) . (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
.#define bfd_coff_max_nscns(abfd) \
. (coff_backend_info (abfd)->_bfd_coff_max_nscns)
.
.#define bfd_coff_swap_filehdr_in(abfd, i,o) \ .#define bfd_coff_swap_filehdr_in(abfd, i,o) \
. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o)) . ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
. .
@ -3136,7 +3140,7 @@ coff_compute_section_file_positions (bfd * abfd)
asection *current; asection *current;
file_ptr sofar = bfd_coff_filhsz (abfd); file_ptr sofar = bfd_coff_filhsz (abfd);
bfd_boolean align_adjust; bfd_boolean align_adjust;
int target_index; unsigned int target_index;
#ifdef ALIGN_SECTIONS_IN_FILE #ifdef ALIGN_SECTIONS_IN_FILE
asection *previous = NULL; asection *previous = NULL;
file_ptr old_sofar; file_ptr old_sofar;
@ -3304,7 +3308,7 @@ coff_compute_section_file_positions (bfd * abfd)
} }
#endif /* ! COFF_IMAGE_WITH_PE */ #endif /* ! COFF_IMAGE_WITH_PE */
if (target_index >= 32768) if (target_index >= bfd_coff_max_nscns (abfd))
{ {
bfd_set_error (bfd_error_file_too_big); bfd_set_error (bfd_error_file_too_big);
(*_bfd_error_handler) (*_bfd_error_handler)
@ -5497,6 +5501,7 @@ static bfd_coff_backend_data bfd_coff_std_swap_table ATTRIBUTE_UNUSED =
#else #else
2, 2,
#endif #endif
32768,
coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in, coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook, coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook, coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
@ -5537,6 +5542,7 @@ static bfd_coff_backend_data ticoff0_swap_table =
#else #else
2, 2,
#endif #endif
32768,
coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in, coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
coff_SWAP_reloc_in, ticoff0_bad_format_hook, coff_set_arch_mach_hook, coff_SWAP_reloc_in, ticoff0_bad_format_hook, coff_set_arch_mach_hook,
coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook, coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
@ -5578,6 +5584,7 @@ static bfd_coff_backend_data ticoff1_swap_table =
#else #else
2, 2,
#endif #endif
32768,
coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in, coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
coff_SWAP_reloc_in, ticoff1_bad_format_hook, coff_set_arch_mach_hook, coff_SWAP_reloc_in, ticoff1_bad_format_hook, coff_set_arch_mach_hook,
coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook, coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
@ -5591,6 +5598,253 @@ static bfd_coff_backend_data ticoff1_swap_table =
}; };
#endif #endif
#ifdef COFF_WITH_PE_BIGOBJ
/* The UUID for bigobj files. */
static const char header_bigobj_classid[16] =
{
0xC7, 0xA1, 0xBA, 0xD1,
0xEE, 0xBA,
0xa9, 0x4b,
0xAF, 0x20,
0xFA, 0xF6, 0x6A, 0xA4, 0xDC, 0xB8
};
/* Swap routines. */
static void
coff_bigobj_swap_filehdr_in (bfd * abfd, void * src, void * dst)
{
struct external_ANON_OBJECT_HEADER_BIGOBJ *filehdr_src =
(struct external_ANON_OBJECT_HEADER_BIGOBJ *) src;
struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
filehdr_dst->f_magic = H_GET_16 (abfd, filehdr_src->Machine);
filehdr_dst->f_nscns = H_GET_32 (abfd, filehdr_src->NumberOfSections);
filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->TimeDateStamp);
filehdr_dst->f_symptr =
GET_FILEHDR_SYMPTR (abfd, filehdr_src->PointerToSymbolTable);
filehdr_dst->f_nsyms = H_GET_32 (abfd, filehdr_src->NumberOfSymbols);
filehdr_dst->f_opthdr = 0;
filehdr_dst->f_flags = 0;
/* Check other magic numbers. */
if (H_GET_16 (abfd, filehdr_src->Sig1) != IMAGE_FILE_MACHINE_UNKNOWN
|| H_GET_16 (abfd, filehdr_src->Sig2) != 0xffff
|| H_GET_16 (abfd, filehdr_src->Version) != 2
|| memcmp (filehdr_src->ClassID, header_bigobj_classid, 16) != 0)
filehdr_dst->f_opthdr = 0xffff;
/* Note that CLR metadata are ignored. */
}
static unsigned int
coff_bigobj_swap_filehdr_out (bfd *abfd, void * in, void * out)
{
struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
struct external_ANON_OBJECT_HEADER_BIGOBJ *filehdr_out =
(struct external_ANON_OBJECT_HEADER_BIGOBJ *) out;
memset (filehdr_out, 0, sizeof (*filehdr_out));
H_PUT_16 (abfd, IMAGE_FILE_MACHINE_UNKNOWN, filehdr_out->Sig1);
H_PUT_16 (abfd, 0xffff, filehdr_out->Sig2);
H_PUT_16 (abfd, 2, filehdr_out->Version);
memcpy (filehdr_out->ClassID, header_bigobj_classid, 16);
H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->Machine);
H_PUT_32 (abfd, filehdr_in->f_nscns, filehdr_out->NumberOfSections);
H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->TimeDateStamp);
PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
filehdr_out->PointerToSymbolTable);
H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->NumberOfSymbols);
return bfd_coff_filhsz (abfd);
}
static void
coff_bigobj_swap_sym_in (bfd * abfd, void * ext1, void * in1)
{
SYMENT_BIGOBJ *ext = (SYMENT_BIGOBJ *) ext1;
struct internal_syment *in = (struct internal_syment *) in1;
if (ext->e.e_name[0] == 0)
{
in->_n._n_n._n_zeroes = 0;
in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
}
else
{
#if SYMNMLEN != E_SYMNMLEN
#error we need to cope with truncating or extending SYMNMLEN
#else
memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
#endif
}
in->n_value = H_GET_32 (abfd, ext->e_value);
in->n_scnum = H_GET_32 (abfd, ext->e_scnum);
in->n_type = H_GET_16 (abfd, ext->e_type);
in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
}
static unsigned int
coff_bigobj_swap_sym_out (bfd * abfd, void * inp, void * extp)
{
struct internal_syment *in = (struct internal_syment *) inp;
SYMENT_BIGOBJ *ext = (SYMENT_BIGOBJ *) extp;
if (in->_n._n_name[0] == 0)
{
H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
}
else
{
#if SYMNMLEN != E_SYMNMLEN
#error we need to cope with truncating or extending SYMNMLEN
#else
memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
#endif
}
H_PUT_32 (abfd, in->n_value, ext->e_value);
H_PUT_32 (abfd, in->n_scnum, ext->e_scnum);
H_PUT_16 (abfd, in->n_type, ext->e_type);
H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
return SYMESZ_BIGOBJ;
}
static void
coff_bigobj_swap_aux_in (bfd *abfd,
void * ext1,
int type,
int in_class,
int indx,
int numaux,
void * in1)
{
AUXENT_BIGOBJ *ext = (AUXENT_BIGOBJ *) ext1;
union internal_auxent *in = (union internal_auxent *) in1;
switch (in_class)
{
case C_FILE:
if (numaux > 1)
{
if (indx == 0)
memcpy (in->x_file.x_fname, ext->File.Name,
numaux * sizeof (AUXENT_BIGOBJ));
}
else
memcpy (in->x_file.x_fname, ext->File.Name, sizeof (ext->File.Name));
break;
case C_STAT:
case C_LEAFSTAT:
case C_HIDDEN:
if (type == T_NULL)
{
in->x_scn.x_scnlen = H_GET_32 (abfd, ext->Section.Length);
in->x_scn.x_nreloc =
H_GET_16 (abfd, ext->Section.NumberOfRelocations);
in->x_scn.x_nlinno =
H_GET_16 (abfd, ext->Section.NumberOfLinenumbers);
in->x_scn.x_checksum = H_GET_32 (abfd, ext->Section.Checksum);
in->x_scn.x_associated = H_GET_16 (abfd, ext->Section.Number)
| (H_GET_16 (abfd, ext->Section.HighNumber) << 16);
in->x_scn.x_comdat = H_GET_8 (abfd, ext->Section.Selection);
return;
}
break;
default:
in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->Sym.WeakDefaultSymIndex);
/* Characteristics is ignored. */
break;
}
}
static unsigned int
coff_bigobj_swap_aux_out (bfd * abfd,
void * inp,
int type,
int in_class,
int indx ATTRIBUTE_UNUSED,
int numaux ATTRIBUTE_UNUSED,
void * extp)
{
union internal_auxent * in = (union internal_auxent *) inp;
AUXENT_BIGOBJ *ext = (AUXENT_BIGOBJ *) extp;
memset (ext, 0, AUXESZ);
switch (in_class)
{
case C_FILE:
memcpy (ext->File.Name, in->x_file.x_fname, sizeof (ext->File.Name));
return AUXESZ;
case C_STAT:
case C_LEAFSTAT:
case C_HIDDEN:
if (type == T_NULL)
{
H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->Section.Length);
H_PUT_16 (abfd, in->x_scn.x_nreloc,
ext->Section.NumberOfRelocations);
H_PUT_16 (abfd, in->x_scn.x_nlinno,
ext->Section.NumberOfLinenumbers);
H_PUT_32 (abfd, in->x_scn.x_checksum, ext->Section.Checksum);
H_PUT_16 (abfd, in->x_scn.x_associated & 0xffff,
ext->Section.Number);
H_PUT_16 (abfd, (in->x_scn.x_associated >> 16),
ext->Section.HighNumber);
H_PUT_8 (abfd, in->x_scn.x_comdat, ext->Section.Selection);
return AUXESZ;
}
break;
}
H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->Sym.WeakDefaultSymIndex);
H_PUT_32 (abfd, 1, ext->Sym.WeakSearchType);
return AUXESZ;
}
static bfd_coff_backend_data bigobj_swap_table =
{
coff_bigobj_swap_aux_in, coff_bigobj_swap_sym_in, coff_SWAP_lineno_in,
coff_bigobj_swap_aux_out, coff_bigobj_swap_sym_out,
coff_SWAP_lineno_out, coff_SWAP_reloc_out,
coff_bigobj_swap_filehdr_out, coff_SWAP_aouthdr_out,
coff_SWAP_scnhdr_out,
FILHSZ_BIGOBJ, AOUTSZ, SCNHSZ, SYMESZ_BIGOBJ, AUXESZ_BIGOBJ,
RELSZ, LINESZ, FILNMLEN_BIGOBJ,
TRUE,
COFF_DEFAULT_LONG_SECTION_NAMES,
COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
FALSE,
2,
1U << 31,
coff_bigobj_swap_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
coff_classify_symbol, coff_compute_section_file_positions,
coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
coff_adjust_symndx, coff_link_add_one_symbol,
coff_link_output_has_begun, coff_final_link_postscript,
bfd_pe_print_pdata /* huh */
};
#endif /* COFF_WITH_PE_BIGOBJ */
#ifndef coff_close_and_cleanup #ifndef coff_close_and_cleanup
#define coff_close_and_cleanup _bfd_generic_close_and_cleanup #define coff_close_and_cleanup _bfd_generic_close_and_cleanup
#endif #endif

View File

@ -676,7 +676,7 @@ case "${targ}" in
;; ;;
x86_64-*-mingw* | x86_64-*-pe | x86_64-*-pep | x86_64-*-cygwin) x86_64-*-mingw* | x86_64-*-pe | x86_64-*-pep | x86_64-*-cygwin)
targ_defvec=x86_64pe_vec targ_defvec=x86_64pe_vec
targ_selvecs="x86_64pe_vec x86_64pei_vec bfd_elf64_x86_64_vec bfd_elf64_l1om_vec bfd_elf64_k1om_vec i386pe_vec i386pei_vec bfd_elf32_i386_vec" targ_selvecs="x86_64pe_vec x86_64pei_vec x86_64pe_bigobj_vec bfd_elf64_x86_64_vec bfd_elf64_l1om_vec bfd_elf64_k1om_vec i386pe_vec i386pei_vec bfd_elf32_i386_vec"
want64=true want64=true
targ_underscore=no targ_underscore=no
;; ;;

1
bfd/configure vendored
View File

@ -15453,6 +15453,7 @@ do
i386pei_vec) tb="$tb pei-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_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 ;; x86_64pei_vec) tb="$tb pei-x86_64.lo pex64igen.lo cofflink.lo"; target_size=64 ;;
x86_64pe_bigobj_vec) tb="$tb pe-x86_64.lo pex64igen.lo cofflink.lo"; target_size=64 ;;
i860coff_vec) tb="$tb coff-i860.lo cofflink.lo" ;; i860coff_vec) tb="$tb coff-i860.lo cofflink.lo" ;;
icoff_big_vec) tb="$tb coff-i960.lo cofflink.lo" ;; icoff_big_vec) tb="$tb coff-i960.lo cofflink.lo" ;;
icoff_little_vec) tb="$tb coff-i960.lo cofflink.lo" ;; icoff_little_vec) tb="$tb coff-i960.lo cofflink.lo" ;;

View File

@ -942,6 +942,7 @@ do
i386pei_vec) tb="$tb pei-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_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 ;; x86_64pei_vec) tb="$tb pei-x86_64.lo pex64igen.lo cofflink.lo"; target_size=64 ;;
x86_64pe_bigobj_vec) tb="$tb pe-x86_64.lo pex64igen.lo cofflink.lo"; target_size=64 ;;
i860coff_vec) tb="$tb coff-i860.lo cofflink.lo" ;; i860coff_vec) tb="$tb coff-i860.lo cofflink.lo" ;;
icoff_big_vec) tb="$tb coff-i960.lo cofflink.lo" ;; icoff_big_vec) tb="$tb coff-i960.lo cofflink.lo" ;;
icoff_little_vec) tb="$tb coff-i960.lo cofflink.lo" ;; icoff_little_vec) tb="$tb coff-i960.lo cofflink.lo" ;;

View File

@ -736,6 +736,7 @@ typedef struct
unsigned int _bfd_coff_default_section_alignment_power; unsigned int _bfd_coff_default_section_alignment_power;
bfd_boolean _bfd_coff_force_symnames_in_strings; bfd_boolean _bfd_coff_force_symnames_in_strings;
unsigned int _bfd_coff_debug_string_prefix_length; unsigned int _bfd_coff_debug_string_prefix_length;
unsigned int _bfd_coff_max_nscns;
void (*_bfd_coff_swap_filehdr_in) void (*_bfd_coff_swap_filehdr_in)
(bfd *, void *, void *); (bfd *, void *, void *);
@ -873,6 +874,9 @@ typedef struct
((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable)) ((coff_backend_info (abfd)->_bfd_coff_set_long_section_names) (abfd, enable))
#define bfd_coff_default_section_alignment_power(abfd) \ #define bfd_coff_default_section_alignment_power(abfd) \
(coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power) (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
#define bfd_coff_max_nscns(abfd) \
(coff_backend_info (abfd)->_bfd_coff_max_nscns)
#define bfd_coff_swap_filehdr_in(abfd, i,o) \ #define bfd_coff_swap_filehdr_in(abfd, i,o) \
((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o)) ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))

View File

@ -27,6 +27,7 @@
#define TARGET_NAME "pe-x86-64" #define TARGET_NAME "pe-x86-64"
#define COFF_WITH_PE #define COFF_WITH_PE
#define COFF_WITH_pex64 #define COFF_WITH_pex64
#define COFF_WITH_PE_BIGOBJ
#define PCRELOFFSET TRUE #define PCRELOFFSET TRUE
#if defined (USE_MINGW64_LEADING_UNDERSCORES) #if defined (USE_MINGW64_LEADING_UNDERSCORES)
#define TARGET_UNDERSCORE '_' #define TARGET_UNDERSCORE '_'
@ -58,3 +59,56 @@
COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 } COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }
#include "coff-x86_64.c" #include "coff-x86_64.c"
/* Entry for big object files. */
const bfd_target
x86_64pe_bigobj_vec =
{
"pe-bigobj-x86-64", /* Name. */
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 | BFD_COMPRESS | BFD_DECOMPRESS),
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* Section flags. */
| SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_READONLY | SEC_DEBUGGING
| SEC_CODE | SEC_DATA | SEC_EXCLUDE ),
TARGET_UNDERSCORE, /* Leading underscore. */
'/', /* Ar_pad_char. */
15, /* Ar_max_namelen. */
0, /* match priority. */
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,
&bigobj_swap_table
};

View File

@ -1077,7 +1077,7 @@ pe_ILF_build_a_bfd (bfd * abfd,
static const bfd_target * static const bfd_target *
pe_ILF_object_p (bfd * abfd) pe_ILF_object_p (bfd * abfd)
{ {
bfd_byte buffer[16]; bfd_byte buffer[14];
bfd_byte * ptr; bfd_byte * ptr;
char * symbol_name; char * symbol_name;
char * source_dll; char * source_dll;
@ -1087,17 +1087,13 @@ pe_ILF_object_p (bfd * abfd)
unsigned int types; unsigned int types;
unsigned int magic; 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. */ 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; return NULL;
ptr = buffer; 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); machine = H_GET_16 (abfd, ptr);
ptr += 2; ptr += 2;
@ -1251,7 +1247,7 @@ pe_ILF_object_p (bfd * abfd)
static const bfd_target * static const bfd_target *
pe_bfd_object_p (bfd * abfd) pe_bfd_object_p (bfd * abfd)
{ {
bfd_byte buffer[4]; bfd_byte buffer[6];
struct external_PEI_DOS_hdr dos_hdr; struct external_PEI_DOS_hdr dos_hdr;
struct external_PEI_IMAGE_hdr image_hdr; struct external_PEI_IMAGE_hdr image_hdr;
struct internal_filehdr internal_f; struct internal_filehdr internal_f;
@ -1260,15 +1256,18 @@ pe_bfd_object_p (bfd * abfd)
file_ptr offset; file_ptr offset;
/* Detect if this a Microsoft Import Library Format element. */ /* 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 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) if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format); bfd_set_error (bfd_error_wrong_format);
return NULL; 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); return pe_ILF_object_p (abfd);
if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0

View File

@ -896,6 +896,7 @@ extern const bfd_target w65_vec;
extern const bfd_target we32kcoff_vec; extern const bfd_target we32kcoff_vec;
extern const bfd_target x86_64pe_vec; extern const bfd_target x86_64pe_vec;
extern const bfd_target x86_64pei_vec; extern const bfd_target x86_64pei_vec;
extern const bfd_target x86_64pe_bigobj_vec;
extern const bfd_target x86_64coff_vec; extern const bfd_target x86_64coff_vec;
extern const bfd_target z80coff_vec; extern const bfd_target z80coff_vec;
extern const bfd_target z8kcoff_vec; extern const bfd_target z8kcoff_vec;
@ -1231,6 +1232,7 @@ static const bfd_target * const _bfd_target_vector[] =
&x86_64coff_vec, &x86_64coff_vec,
&x86_64pe_vec, &x86_64pe_vec,
&x86_64pei_vec, &x86_64pei_vec,
&x86_64pe_bigobj_vec,
#endif #endif
&i860coff_vec, &i860coff_vec,
&icoff_big_vec, &icoff_big_vec,

View File

@ -1,3 +1,13 @@
2014-03-13 Tristan Gingold <gingold@adacore.com>
* 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.
2014-03-12 Nick Clifton <nickc@redhat.com> 2014-03-12 Nick Clifton <nickc@redhat.com>
PR gas/16688 PR gas/16688

View File

@ -513,6 +513,11 @@ enum x86_elf_abi
static enum x86_elf_abi x86_elf_abi = I386_ABI; static enum x86_elf_abi x86_elf_abi = I386_ABI;
#endif #endif
#if defined (TE_PE) || defined (TE_PEP)
/* Use big object file format. */
static int use_big_obj = 0;
#endif
/* 1 for intel syntax, /* 1 for intel syntax,
0 if att syntax. */ 0 if att syntax. */
static int intel_syntax = 0; static int intel_syntax = 0;
@ -9497,6 +9502,7 @@ const char *md_shortopts = "qn";
#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15) #define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16) #define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17) #define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
struct option md_longopts[] = struct option md_longopts[] =
{ {
@ -9523,6 +9529,9 @@ struct option md_longopts[] =
{"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX}, {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
{"mevexlig", required_argument, NULL, OPTION_MEVEXLIG}, {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
{"mevexwig", required_argument, NULL, OPTION_MEVEXWIG}, {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
# if defined (TE_PE) || defined (TE_PEP)
{"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
#endif
{NULL, no_argument, NULL, 0} {NULL, no_argument, NULL, 0}
}; };
size_t md_longopts_size = sizeof (md_longopts); size_t md_longopts_size = sizeof (md_longopts);
@ -9804,6 +9813,12 @@ md_parse_option (int c, char *arg)
as_fatal (_("invalid -mevexwig= option: `%s'"), arg); as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
break; break;
# if defined (TE_PE) || defined (TE_PEP)
case OPTION_MBIG_OBJ:
use_big_obj = 1;
break;
#endif
default: default:
return 0; return 0;
} }
@ -9956,6 +9971,10 @@ md_show_usage (FILE *stream)
-mold-gcc support old (<= 2.8.1) versions of gcc\n")); -mold-gcc support old (<= 2.8.1) versions of gcc\n"));
fprintf (stream, _("\ fprintf (stream, _("\
-madd-bnd-prefix add BND prefix for all valid branches\n")); -madd-bnd-prefix add BND prefix for all valid branches\n"));
# if defined (TE_PE) || defined (TE_PEP)
fprintf (stream, _("\
-mbig-obj generate big object files\n"));
#endif
} }
#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \ #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
@ -9994,7 +10013,10 @@ i386_target_format (void)
#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF) #if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
# if defined (TE_PE) || defined (TE_PEP) # if defined (TE_PE) || defined (TE_PEP)
case bfd_target_coff_flavour: case bfd_target_coff_flavour:
return flag_code == CODE_64BIT ? "pe-x86-64" : "pe-i386"; if (flag_code == CODE_64BIT)
return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
else
return "pe-i386";
# elif defined (TE_GO32) # elif defined (TE_GO32)
case bfd_target_coff_flavour: case bfd_target_coff_flavour:
return "coff-go32"; return "coff-go32";

View File

@ -283,6 +283,11 @@ The @code{.att_syntax} and @code{.intel_syntax} directives will take precedent.
This option forces the assembler to add BND prefix to all branches, even This option forces the assembler to add BND prefix to all branches, even
if such prefix was not explicitly specified in the source code. if such prefix was not explicitly specified in the source code.
@cindex @samp{-mbig-obj} option, x86-64
@item -mbig-obj
On x86-64 PE/COFF target this option forces the use of big object file
format, which allows more than 32768 sections.
@end table @end table
@c man end @c man end

View File

@ -1,3 +1,8 @@
2014-03-13 Tristan Gingold <gingold@adacore.com>
* gas/pe/big-obj.d, gas/pe/big-obj.s: Add test.
* gas/pe/pe.exp: Add test.
2014-03-12 Nick Clifton <nickc@redhat.com> 2014-03-12 Nick Clifton <nickc@redhat.com>
PR gas/16688 PR gas/16688

View File

@ -0,0 +1,11 @@
#as: -mbig-obj
#objdump: -h
#name: PE x64 big obj
.*: *file format pe-bigobj-.*
Sections:
#...
5000. \.data\$a49999 .*
CONTENTS, ALLOC, LOAD, DATA

View File

@ -0,0 +1,16 @@
.file "big-obj.s"
.irp n,0,1,2,3,4
.irp m,0,1,2,3,4,5,6,7,8,9
.irp c,0,1,2,3,4,5,6,7,8,9
.irp d,0,1,2,3,4,5,6,7,8,9
.irp u,0,1,2,3,4,5,6,7,8,9
.globl a\n\m\c\d\u
.section .data$a\n\m\c\d\u,"w"
a\n\m\c\d\u :
.byte 1
.endr
.endr
.endr
.endr
.endr

View File

@ -48,3 +48,11 @@ if ([istarget "x86_64-*-mingw*"]) then {
run_dump_test "peseh-x64-5" run_dump_test "peseh-x64-5"
run_dump_test "peseh-x64-6" run_dump_test "peseh-x64-6"
} }
# Big obj
if ([istarget "x86_64-*-mingw*"]) then {
# Currently only supported on x86_64
run_dump_test "big-obj"
}

View File

@ -1,3 +1,14 @@
2014-03-13 Tristan Gingold <gingold@adacore.com>
* 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.
2014-03-05 Alan Modra <amodra@gmail.com> 2014-03-05 Alan Modra <amodra@gmail.com>
Update copyright years. Update copyright years.

View File

@ -73,7 +73,7 @@ struct internal_filehdr
/* Standard coff internal info. */ /* Standard coff internal info. */
unsigned short f_magic; /* magic number */ unsigned short f_magic; /* magic number */
unsigned short f_nscns; /* number of sections */ unsigned int f_nscns; /* number of sections */
long f_timdat; /* time & date stamp */ long f_timdat; /* time & date stamp */
bfd_vma f_symptr; /* file pointer to symtab */ bfd_vma f_symptr; /* file pointer to symtab */
long f_nsyms; /* number of symtab entries */ long f_nsyms; /* number of symtab entries */

View File

@ -358,6 +358,85 @@ typedef struct
#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 #define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2
#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3 #define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3
/* Bigobj header. */
struct external_ANON_OBJECT_HEADER_BIGOBJ
{
/* ANON_OBJECT_HEADER_V2 header. */
char Sig1[2];
char Sig2[2];
char Version[2];
char Machine[2];
char TimeDateStamp[4];
char ClassID[16];
char SizeOfData[4];
char Flags[4];
char MetaDataSize[4];
char MetaDataOffset[4];
/* BIGOBJ specific. */
char NumberOfSections[4];
char PointerToSymbolTable[4];
char NumberOfSymbols[4];
};
#define FILHSZ_BIGOBJ (14 * 4)
struct external_SYMBOL_EX
{
union
{
char e_name[E_SYMNMLEN];
struct
{
char e_zeroes[4];
char e_offset[4];
} e;
} e;
char e_value[4];
char e_scnum[4];
char e_type[2];
char e_sclass[1];
char e_numaux[1];
} ATTRIBUTE_PACKED ;
#define SYMENT_BIGOBJ struct external_SYMBOL_EX
#define SYMESZ_BIGOBJ 20
#define FILNMLEN_BIGOBJ 20
union external_AUX_SYMBOL_EX
{
struct
{
char WeakDefaultSymIndex[4];
char WeakSearchType[4];
char rgbReserved[12];
} Sym;
struct
{
char Name[FILNMLEN_BIGOBJ];
} File;
struct
{
char Length[4]; /* section length */
char NumberOfRelocations[2]; /* # relocation entries */
char NumberOfLinenumbers[2]; /* # line numbers */
char Checksum[4]; /* section COMDAT checksum */
char Number[2]; /* COMDAT associated section index */
char Selection[1]; /* COMDAT selection number */
char bReserved[1];
char HighNumber[2]; /* High bits of COMDAT associated sec. */
char rgbReserved[2];
} Section;
} ATTRIBUTE_PACKED;
#define AUXENT_BIGOBJ union external_AUX_SYMBOL_EX
#define AUXESZ_BIGOBJ 20
/* .pdata/.xdata defines and structures for x64 PE+ for exception handling. */ /* .pdata/.xdata defines and structures for x64 PE+ for exception handling. */
/* .pdata in exception directory. */ /* .pdata in exception directory. */