Add support for WinCE binaries to include

Nick Clifton nickc@cygnus.com
Tue Feb 22 14:53:00 GMT 2000


Hi Guys,

  Unless anybody has any objections I would like to check in the
  following patch.  It adds support to the COFF header files for the
  SH and ARM ports for Microsoft's CE format, and in particular for
  when this format is being used for WinCE binaries.  (Patches for
  other binutils subdirectories will be following shortly).

Cheers
	Nick


2000-02-22  Nick Clifton  <nickc@cygnus.com>  DJ Delorie <dj@cygnus.com>

	* sh.h: Add Windows CE definitions.
	* arm.h: Add Windows CE definitions.

Index: include/coff/sh.h
===================================================================
RCS file: /cvs/src//src/include/coff/sh.h,v
retrieving revision 1.1.1.1
diff -p -w -r1.1.1.1 sh.h
*** sh.h	1999/05/03 07:29:03	1.1.1.1
--- sh.h	2000/02/22 22:48:10
*************** struct external_filehdr {
*** 16,25 ****
--- 16,27 ----
  
  #define	SH_ARCH_MAGIC_BIG	0x0500
  #define	SH_ARCH_MAGIC_LITTLE	0x0550  /* Little endian SH */
+ #define SH_ARCH_MAGIC_WINCE	0x01a2  /* Windows CE - little endian */
  
  
  #define SHBADMAG(x) \
   (((x).f_magic!=SH_ARCH_MAGIC_BIG) && \
+   ((x).f_magic!=SH_ARCH_MAGIC_WINCE) && \
    ((x).f_magic!=SH_ARCH_MAGIC_LITTLE))
  
  #define	FILHDR	struct external_filehdr
*************** AOUTHDR;
*** 48,53 ****
--- 50,61 ----
  
  
  
+ /* 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_lineno {
*** 89,102 ****
--- 97,122 ----
  		char l_symndx[4];	/* function name symbol index, iff l_lnno == 0*/
  		char l_paddr[4];	/* (physical) address of line number	*/
  	} l_addr;
+ #ifdef COFF_WITH_PE
+ 	char l_lnno[2];	/* line number		*/
+ #else
  	char l_lnno[4];	/* line number		*/
+ #endif
  };
  
  #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) (ext->l_lnno));
  #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_32(abfd,val,  (bfd_byte *) (ext->l_lnno));
  
  #define	LINENO	struct external_lineno
+ #ifdef COFF_WITH_PE
+ #define	LINESZ	6
+ #undef GET_LINENO_LNNO
+ #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno));
+ #undef PUT_LINENO_LNNO
+ #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val,  (bfd_byte *) (ext->l_lnno));
+ #else
  #define	LINESZ	8
+ #endif
  
  
  /********************** SYMBOLS **********************/
*************** union external_auxent {
*** 163,168 ****
--- 183,191 ----
  		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 {
*************** union external_auxent {
*** 187,192 ****
--- 210,216 ----
     types on the h8 don't have room in the instruction for the entire
     offset - eg the strange jump and high page addressing modes */
  
+ #ifndef COFF_WITH_PE
  struct external_reloc {
    char r_vaddr[4];
    char r_symndx[4];
*************** struct external_reloc {
*** 194,207 ****
--- 218,243 ----
    char r_type[2];
    char r_stuff[2];
  };
+ #else
+ struct external_reloc {
+   char r_vaddr[4];
+   char r_symndx[4];
+   char r_type[2];
+ };
+ #endif
  
  
  #define RELOC struct external_reloc
+ #ifdef COFF_WITH_PE
+ #define RELSZ 10
+ #else
  #define RELSZ 16
+ #endif
  
  /* SH relocation types.  Not all of these are actually used.  */
  
  #define R_SH_UNUSED	0		/* only used internally */
+ #define R_SH_IMM32CE	2		/* 32 bit immediate for WinCE */
  #define R_SH_PCREL8 	3		/*  8 bit pcrel 	*/
  #define R_SH_PCREL16 	4		/* 16 bit pcrel 	*/
  #define R_SH_HIGH8  	5		/* high 8 bits of 24 bit address */
*************** struct external_reloc {
*** 213,218 ****
--- 249,255 ----
  #define R_SH_PCDISP     12  		/* 12 bit branch */
  #define R_SH_IMM32      14    		/* 32 bit immediate */
  #define R_SH_IMM8   	16		/* 8 bit immediate */
+ #define R_SH_IMAGEBASE	16		/* Windows CE */
  #define R_SH_IMM8BY2    17		/* 8 bit immediate *2 */
  #define R_SH_IMM8BY4    18		/* 8 bit immediate *4 */
  #define R_SH_IMM4   	19		/* 4 bit immediate */

Index: include/coff/arm.h
===================================================================
RCS file: /cvs/src//src/include/coff/arm.h,v
retrieving revision 1.5
diff -p -w -r1.5 arm.h
*** arm.h	1999/07/17 15:40:17	1.5
--- arm.h	2000/02/22 22:48:10
*************** struct external_filehdr
*** 89,94 ****
--- 89,100 ----
  
  #define ARMBADMAG(x) (((x).f_magic != ARMMAGIC))
  
+ #define	ARMPEMAGIC	0x1c0
+ #define	THUMBPEMAGIC	0x1c2
+ 
+ #undef  ARMBADMAG
+ #define ARMBADMAG(x) (((x).f_magic != ARMMAGIC) && ((x).f_magic != ARMPEMAGIC) && ((x).f_magic != THUMBPEMAGIC))
+ 
  #define	FILHDR	struct external_filehdr
  #define	FILHSZ	20
  
*************** union external_auxent
*** 272,277 ****
--- 278,295 ----
  #define _ETEXT	"etext"
  
  /********************** RELOCATION DIRECTIVES **********************/
+ #ifdef ARM_WINCE
+ struct external_reloc
+ {
+   char r_vaddr[4];
+   char r_symndx[4];
+   char r_type[2];
+ };
+ 
+ #define RELOC struct external_reloc
+ #define RELSZ 10
+ 
+ #else
  struct external_reloc
  {
    char r_vaddr[4];
*************** struct external_reloc
*** 282,284 ****
--- 300,303 ----
  
  #define RELOC struct external_reloc
  #define RELSZ 14
+ #endif


More information about the Binutils mailing list