This is the mail archive of the binutils@sourceware.cygnus.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

include/coff patches for IA-64 EFI (64-bit PE) support


I've checked in this patch for IA-64 EFI support.  EFI uses a 64-bit version
of PE.  Patches for the bfd directory will follow.  Information about EFI can
be found at <http://developer.intel.com/technology/efi/index.htm>.  These
patches were reviewed by Richard Henderson.

Mon Apr 17 16:44:01 2000  David Mosberger  <davidm@hpl.hp.com>

	* pe.h (PEP64AOUTHDR): New header for PE+.
	(PEP64AOUTSZ): New macro.
	(IMAGE_SUBSYSTEM_UNKNOWN): New macro.
	(IMAGE_SUBSYSTEM_NATIVE): Ditto.
	(IMAGE_SUBSYSTEM_WINDOWS_GUI): Ditto.
	(IMAGE_SUBSYSTEM_WINDOWS_CUI): Ditto.
	(IMAGE_SUBSYSTEM_POSIX_CUI): Ditto.
	(IMAGE_SUBSYSTEM_WINDOWS_CE_GUI): Ditto.
	(IMAGE_SUBSYSTEM_EFI_APPLICATION): Ditto.
	(IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER): Ditto.
	(IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER): Ditto.
	* internal.h (PE_DEF_FILE_ALIGNMENT): Define only if not defined
	already.
	* ia64.h: New file.

Index: ia64.h
===================================================================
RCS file: ia64.h
diff -N ia64.h
*** /dev/null	Tue May  5 13:32:27 1998
--- ia64.h	Mon Apr 17 16:43:22 2000
***************
*** 0 ****
--- 1,222 ----
+ /*** coff information for HP/Intel IA-64.  */
+ 
+ 
+ /********************** FILE HEADER **********************/
+ 
+ struct external_filehdr {
+ 	char f_magic[2];	/* magic number			*/
+ 	char f_nscns[2];	/* number of sections		*/
+ 	char f_timdat[4];	/* time & date stamp		*/
+ 	char f_symptr[4];	/* file pointer to symtab	*/
+ 	char f_nsyms[4];	/* number of symtab entries	*/
+ 	char f_opthdr[2];	/* sizeof(optional hdr)		*/
+ 	char f_flags[2];	/* flags			*/
+ };
+ 
+ #define IA64MAGIC	0x200
+ 
+ #define IA64BADMAG(x)	(((x).f_magic != IA64MAGIC))
+ 
+ /* Bits for f_flags:
+  *	F_RELFLG	relocation info stripped from file
+  *	F_EXEC		file is executable (no unresolved external references)
+  *	F_LNNO		line numbers stripped from file
+  *	F_LSYMS		local symbols stripped from file
+  *	F_AR32WR	file has byte ordering of an AR32WR machine (e.g. vax)
+  */
+ 
+ #define F_RELFLG	(0x0001)
+ #define F_EXEC		(0x0002)
+ #define F_LNNO		(0x0004)
+ #define F_LSYMS		(0x0008)
+ 
+ 
+ #define	FILHDR	struct external_filehdr
+ #define	FILHSZ	20
+ 
+ 
+ /********************** AOUT "OPTIONAL HEADER" **********************/
+ 
+ 
+ typedef struct 
+ {
+   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	*/
+ #ifndef BFD64
+   char 	data_start[4];		/* base of data used for this file	*/
+ #endif
+ }
+ AOUTHDR;
+ 
+ #define PE32MAGIC	0x10b	/* 32-bit image */
+ #define PE32PMAGIC	0x20b	/* 32-bit image inside 64-bit address space */
+ 
+ #define PE32PBADMAG(x) (((x).f_magic != PE32PMAGIC))
+ 
+ #define AOUTSZ		108
+ #define AOUTHDRSZ	108
+ 
+ #define OMAGIC          0404    /* object files, eg as output */
+ #define ZMAGIC          0413    /* demand load format, eg normal ld output */
+ #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
+ 
+ /********************** SECTION HEADER **********************/
+ 
+ 
+ struct external_scnhdr {
+ 	char		s_name[8];	/* section name			*/
+ 	char		s_paddr[4];	/* physical address, aliased s_nlib */
+ 	char		s_vaddr[4];	/* virtual address		*/
+ 	char		s_size[4];	/* section size			*/
+ 	char		s_scnptr[4];	/* file ptr to raw data for section */
+ 	char		s_relptr[4];	/* file ptr to relocation	*/
+ 	char		s_lnnoptr[4];	/* file ptr to line numbers	*/
+ 	char		s_nreloc[2];	/* number of relocation entries	*/
+ 	char		s_nlnno[2];	/* number of line number entries*/
+ 	char		s_flags[4];	/* flags			*/
+ };
+ 
+ #define	SCNHDR	struct external_scnhdr
+ #define	SCNHSZ	40
+ 
+ /*
+  * names of "special" sections
+  */
+ #define _TEXT	".text"
+ #define _DATA	".data"
+ #define _BSS	".bss"
+ #define _COMMENT ".comment"
+ #define _LIB ".lib"
+ 
+ /********************** LINE NUMBERS **********************/
+ 
+ /* 1 line number entry for every "breakpointable" source line in a section.
+  * Line numbers are grouped on a per function basis; first entry in a function
+  * grouping will have l_lnno = 0 and in place of physical address will be the
+  * symbol table index of the function name.
+  */
+ struct external_lineno {
+ 	union {
+ 		char l_symndx[4];	/* function name symbol index, iff l_lnno == 0*/
+ 		char l_paddr[4];	/* (physical) address of line number	*/
+ 	} l_addr;
+ 	char l_lnno[2];	/* line number		*/
+ };
+ 
+ 
+ #define	LINENO	struct external_lineno
+ #define	LINESZ	6
+ 
+ 
+ /********************** SYMBOLS **********************/
+ 
+ #define E_SYMNMLEN	8	/* # characters in a symbol name	*/
+ #define E_FILNMLEN	14	/* # characters in a file name		*/
+ #define E_DIMNUM	4	/* # array dimensions in auxiliary entry */
+ 
+ struct external_syment 
+ {
+   union {
+     char e_name[E_SYMNMLEN];
+     struct {
+       char e_zeroes[4];
+       char e_offset[4];
+     } e;
+   } e;
+   char e_value[4];
+   char e_scnum[2];
+   char e_type[2];
+   char e_sclass[1];
+   char e_numaux[1];
+ };
+ 
+ #define N_BTMASK	(0xf)
+ #define N_TMASK		(0x30)
+ #define N_BTSHFT	(4)
+ #define N_TSHIFT	(2)
+   
+ union external_auxent {
+ 	struct {
+ 		char x_tagndx[4];	/* str, un, or enum tag indx */
+ 		union {
+ 			struct {
+ 			    char  x_lnno[2]; /* declaration line number */
+ 			    char  x_size[2]; /* str/union/array size */
+ 			} x_lnsz;
+ 			char x_fsize[4];	/* size of function */
+ 		} x_misc;
+ 		union {
+ 			struct {		/* if ISFCN, tag, or .bb */
+ 			    char x_lnnoptr[4];	/* ptr to fcn line # */
+ 			    char x_endndx[4];	/* entry ndx past block end */
+ 			} x_fcn;
+ 			struct {		/* if ISARY, up to 4 dimen. */
+ 			    char x_dimen[E_DIMNUM][2];
+ 			} x_ary;
+ 		} x_fcnary;
+ 		char x_tvndx[2];		/* tv index */
+ 	} x_sym;
+ 
+ 	union {
+ 		char x_fname[E_FILNMLEN];
+ 		struct {
+ 			char x_zeroes[4];
+ 			char x_offset[4];
+ 		} x_n;
+ 	} x_file;
+ 
+ 	struct {
+ 		char x_scnlen[4];	/* section length */
+ 		char x_nreloc[2];	/* # relocation entries */
+ 		char x_nlinno[2];	/* # line numbers */
+ 		char x_checksum[4];	/* section COMDAT checksum */
+ 		char x_associated[2];	/* COMDAT associated section index */
+ 		char x_comdat[1];	/* COMDAT selection number */
+ 	} x_scn;
+ 
+         struct {
+ 		char x_tvfill[4];	/* tv fill value */
+ 		char x_tvlen[2];	/* length of .tv */
+ 		char x_tvran[2][2];	/* tv range */
+ 	} x_tv;		/* info about .tv section (in auxent of symbol .tv)) */
+ 
+ 
+ };
+ 
+ #define	SYMENT	struct external_syment
+ #define	SYMESZ	18	
+ #define	AUXENT	union external_auxent
+ #define	AUXESZ	18
+ 
+ 
+ #	define _ETEXT	"etext"
+ 
+ 
+ /********************** 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
+ 
Index: internal.h
===================================================================
RCS file: /cvs/src/src/include/coff/internal.h,v
retrieving revision 1.6
diff -p -r1.6 internal.h
*** internal.h	2000/04/07 17:06:58	1.6
--- internal.h	2000/04/17 23:43:22
*************** typedef struct _IMAGE_DATA_DIRECTORY 
*** 100,106 ****
  /* Extra stuff in a PE aouthdr */
  
  #define PE_DEF_SECTION_ALIGNMENT 0x1000
! #define PE_DEF_FILE_ALIGNMENT 0x200
  
  struct internal_extra_pe_aouthdr 
  {
--- 100,108 ----
  /* Extra stuff in a PE aouthdr */
  
  #define PE_DEF_SECTION_ALIGNMENT 0x1000
! #ifndef PE_DEF_FILE_ALIGNMENT
! # define PE_DEF_FILE_ALIGNMENT 0x200
! #endif
  
  struct internal_extra_pe_aouthdr 
  {
Index: pe.h
===================================================================
RCS file: /cvs/src/src/include/coff/pe.h,v
retrieving revision 1.4
diff -p -r1.4 pe.h
*** pe.h	2000/02/24 19:49:18	1.4
--- pe.h	2000/04/17 23:43:22
***************
*** 89,100 ****
  #define IMAGE_FILE_MACHINE_SH4               0x1a6
  #define IMAGE_FILE_MACHINE_THUMB             0x1c2
                                                                             
  /* Magic values that are true for all dos/nt implementations */
  #define DOSMAGIC       0x5a4d  
  #define NT_SIGNATURE   0x00004550
  
!   /* NT allows long filenames, we want to accommodate this.  This may break
!      some of the bfd functions */
  #undef  FILNMLEN
  #define FILNMLEN	18	/* # characters in a file name		*/
  
--- 89,110 ----
  #define IMAGE_FILE_MACHINE_SH4               0x1a6
  #define IMAGE_FILE_MACHINE_THUMB             0x1c2
                                                                             
+ #define IMAGE_SUBSYSTEM_UNKNOWN			 0
+ #define IMAGE_SUBSYSTEM_NATIVE			 1
+ #define IMAGE_SUBSYSTEM_WINDOWS_GUI		 2
+ #define IMAGE_SUBSYSTEM_WINDOWS_CUI		 3
+ #define IMAGE_SUBSYSTEM_POSIX_CUI		 7
+ #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI		 9
+ #define IMAGE_SUBSYSTEM_EFI_APPLICATION		10
+ #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER	11
+ #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER	12
+   
  /* Magic values that are true for all dos/nt implementations */
  #define DOSMAGIC       0x5a4d  
  #define NT_SIGNATURE   0x00004550
  
! /* NT allows long filenames, we want to accommodate this.  This may break
!    some of the bfd functions */
  #undef  FILNMLEN
  #define FILNMLEN	18	/* # characters in a file name		*/
  
*************** struct external_PEI_filehdr
*** 132,138 ****
    char f_nsyms[4];		/* number of symtab entries	*/
    char f_opthdr[2];		/* sizeof(optional hdr)		*/
    char f_flags[2];		/* flags			*/
- 
  };
  
  #ifdef COFF_IMAGE_WITH_PE
--- 142,147 ----
*************** struct external_PEI_filehdr
*** 146,151 ****
--- 155,162 ----
  
  #endif /* COFF_IMAGE_WITH_PE */
  
+ /* 32-bit PE a.out header: */
+ 
  typedef struct 
  {
    AOUTHDR standard;
*************** typedef struct 
*** 174,186 ****
    char  NumberOfRvaAndSizes[4];
    /* 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)
  
  #undef  E_FILNMLEN
  #define E_FILNMLEN	18	/* # characters in a file name		*/
  
--- 185,228 ----
    char  NumberOfRvaAndSizes[4];
    /* 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)
  
+ /* Like PEAOUTHDR, except that the "standard" member has no BaseOfData
+    (aka data_start) member and that some of the members are 8 instead
+    of just 4 bytes long.  */
+ typedef struct 
+ {
+   AOUTHDR standard;
+ 
+   /* NT extra fields; see internal.h for descriptions */
+   char  ImageBase[8];
+   char  SectionAlignment[4];
+   char  FileAlignment[4];
+   char  MajorOperatingSystemVersion[2];
+   char  MinorOperatingSystemVersion[2];
+   char  MajorImageVersion[2];
+   char  MinorImageVersion[2];
+   char  MajorSubsystemVersion[2];
+   char  MinorSubsystemVersion[2];
+   char  Reserved1[4];
+   char  SizeOfImage[4];
+   char  SizeOfHeaders[4];
+   char  CheckSum[4];
+   char  Subsystem[2];
+   char  DllCharacteristics[2];
+   char  SizeOfStackReserve[8];
+   char  SizeOfStackCommit[8];
+   char  SizeOfHeapReserve[8];
+   char  SizeOfHeapCommit[8];
+   char  LoaderFlags[4];
+   char  NumberOfRvaAndSizes[4];
+   /* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */
+   char  DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars */
+ } PEP64AOUTHDR;
+ #define PEP64AOUTSZ	240
+   
  #undef  E_FILNMLEN
  #define E_FILNMLEN	18	/* # characters in a file name		*/
  

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]