On 3/11/2013 1:43 PM, Corinna Vinschen wrote:
On Mar 11 12:13, Ken Brown wrote:
On 3/10/2013 4:52 PM, Corinna Vinschen wrote:
No, we shouldn't include windows.h.  Some of the values are already
defined using another name in a.out.h, see I386MAGIC, DOSMAGIC, or
NT_SIGNATURE.

I'm pretty open to add definitions for other values, as long as they
either match the already used naimg scheme, or, if they are entirely
new, are similar, but not exactly named like the original Windows
definitions.  I don't think anything speaks against adding stuff like

   #define AMD64MAGIC 0x8664
   [...]
   #define IMG_NT_OPTIONAL_HDR32_MAGIC 0x10b
   [...]
   #define IMG_SUBSYS_NATIVE 1

OK, my patch is attached.  I'm also attaching the program I used to
test it, based on the emacs code I sent in my first post.  (And I'm
able to build 64-bit emacs with this patch.)

It turned out that the most important thing I had to do was change
most occurrences of "unsigned long" to "uint32_t" to keep DWORDs
from becoming 64 bits wide on AMD64.

Ken

Hi Ken.  Thanks for the patch, but I guess you misunderstood me
concerning the names of the defines:

Yes, I did misunderstand.  Re-reading what you wrote, it was quite clear.

The rest of the patch looks good to me.  I'm just wondering what to
do with the mix of `unsigned {short,long}' and uint32_t.  Wouldn't
it be better if we replace all unsigned short with uint16_t and all
unsigned long with uintptr_t?

Yes, that's much better. I also changed a couple of occurrences of `short' (without `unsigned') that should have been unsigned to begin with.

A revised patch is attached.

Ken
--- a.out.h.orig        2013-03-11 05:25:59.339893700 -0400
+++ a.out.h     2013-03-11 15:05:56.968204200 -0400
@@ -1,6 +1,6 @@
 /* a.out.h
 
-   Copyright 1997, 1998, 1999, 2001 Red Hat, Inc.
+   Copyright 1997, 1998, 1999, 2001, 2013 Red Hat, Inc.
 
 This file is part of Cygwin.
 
@@ -14,22 +14,25 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
+
+#include <stdint.h>
+
 #define COFF_IMAGE_WITH_PE
 #define COFF_LONG_SECTION_NAMES
 
-/*** coff information for Intel 386/486.  */
+/*** coff information for Intel 386/486 and AMD64.  */
 
 
 /********************** FILE HEADER **********************/
 
 struct external_filehdr {
-  short f_magic;       /* magic number                 */
-  short f_nscns;       /* number of sections           */
-  unsigned long f_timdat;      /* time & date stamp            */
-  unsigned long f_symptr;      /* file pointer to symtab       */
-  unsigned long f_nsyms;       /* number of symtab entries     */
-  short f_opthdr;      /* sizeof(optional hdr)         */
-  short f_flags;       /* flags                        */
+  uint16_t f_magic;    /* magic number                 */
+  uint16_t f_nscns;    /* number of sections           */
+  uint32_t f_timdat;   /* time & date stamp            */
+  uint32_t f_symptr;   /* file pointer to symtab       */
+  uint32_t f_nsyms;    /* number of symtab entries     */
+  uint16_t f_opthdr;   /* sizeof(optional hdr)         */
+  uint16_t f_flags;    /* flags                        */
 };
 
 /* Bits for f_flags:
@@ -50,6 +53,16 @@
 #define        I386MAGIC       0x14c
 #define I386PTXMAGIC   0x154
 #define I386AIXMAGIC   0x175
+#define AMD64MAGIC     0x8664
+
+#define IMG_NT_OPTIONAL_HDR32_MAGIC 0x10b
+#define IMG_NT_OPTIONAL_HDR64_MAGIC 0x20b
+#define IMG_SIZEOF_STD_OPTIONAL_HEADER 28
+#define IMG_SIZEOF_NT_OPTIONAL32_HEADER 224
+#define IMG_SIZEOF_NT_OPTIONAL64_HEADER 240
+#define IMG_SUBSYSTEM_NATIVE 1
+#define IMG_SUBSYSTEM_WINDOWS_GUI 2
+#define IMG_SUBSYSTEM_WINDOWS_CUI 3
 
 /* This is Lynx's all-platform magic number for executables. */
 
@@ -70,14 +83,14 @@
 
 typedef struct
 {
-  unsigned short magic;                /* type of file                         
*/
-  unsigned short vstamp;       /* version stamp                        */
-  unsigned long        tsize;          /* text size in bytes, padded to FW 
bdry*/
-  unsigned long        dsize;          /* initialized data "  "                
*/
-  unsigned long        bsize;          /* uninitialized data "   "             
*/
-  unsigned long        entry;          /* entry pt.                            
*/
-  unsigned long text_start;    /* base of text used for this file */
-  unsigned long data_start;    /* base of data used for this file=
+  uint16_t magic;              /* type of file                         */
+  uint16_t vstamp;             /* version stamp                        */
+  uint32_t tsize;              /* text size in bytes, padded to FW bdry*/
+  uint32_t dsize;              /* initialized data "  "                */
+  uint32_t bsize;              /* uninitialized data "   "             */
+  uint32_t entry;              /* entry pt.                            */
+  uint32_t text_start;         /* base of text used for this file */
+  uint32_t data_start;         /* base of data used for this file=
  */
 }
 AOUTHDR;
@@ -103,16 +116,16 @@
 
 struct external_scnhdr {
   char         s_name[8];      /* section name                 */
-  unsigned long        s_paddr;        /* physical address, offset
+  uint32_t     s_paddr;        /* physical address, offset
                                   of last addr in scn */
-  unsigned long        s_vaddr;        /* virtual address              */
-  unsigned long        s_size;         /* section size                 */
-  unsigned long        s_scnptr;       /* file ptr to raw data for section */
-  unsigned long        s_relptr;       /* file ptr to relocation       */
-  unsigned long        s_lnnoptr;      /* file ptr to line numbers     */
-  unsigned short s_nreloc;     /* number of relocation entries */
-  unsigned short s_nlnno;      /* number of line number entries*/
-  unsigned long        s_flags;        /* flags                        */
+  uint32_t     s_vaddr;        /* virtual address              */
+  uint32_t     s_size;         /* section size                 */
+  uint32_t     s_scnptr;       /* file ptr to raw data for section */
+  uint32_t     s_relptr;       /* file ptr to relocation       */
+  uint32_t     s_lnnoptr;      /* file ptr to line numbers     */
+  uint16_t     s_nreloc;       /* number of relocation entries */
+  uint16_t     s_nlnno;        /* number of line number entries*/
+  uint32_t     s_flags;        /* flags                        */
 };
 
 #define        SCNHDR  struct external_scnhdr
@@ -136,10 +149,10 @@
  */
 struct external_lineno {
   union {
-    unsigned long l_symndx; /* function name symbol index, iff l_lnno 0 */
-    unsigned long l_paddr;     /* (physical) address of line number    */
+    uint32_t l_symndx;                 /* function name symbol index, iff 
l_lnno 0 */
+    uint32_t l_paddr;          /* (physical) address of line number    */
   } l_addr;
-  unsigned short l_lnno;       /* line number          */
+  uint16_t l_lnno;     /* line number          */
 };
 
 #define        LINENO  struct external_lineno
@@ -156,13 +169,13 @@
   union {
     char e_name[E_SYMNMLEN];
     struct {
-      unsigned long e_zeroes;
-      unsigned long e_offset;
+      uint32_t e_zeroes;
+      uint32_t e_offset;
     } e;
   } e;
-  unsigned long e_value;
-  unsigned short e_scnum;
-  unsigned short e_type;
+  uint32_t e_value;
+  uint16_t e_scnum;
+  uint16_t e_type;
   char e_sclass[1];
   char e_numaux[1];
 };
@@ -174,46 +187,46 @@
 
 union external_auxent {
   struct {
-    unsigned long x_tagndx;    /* str, un, or enum tag indx */
+    uint32_t x_tagndx; /* str, un, or enum tag indx */
     union {
       struct {
-       unsigned short  x_lnno; /* declaration line number */
-       unsigned short  x_size; /* str/union/array size */
+       uint16_t  x_lnno; /* declaration line number */
+       uint16_t  x_size; /* str/union/array size */
       } x_lnsz;
-      unsigned long x_fsize;   /* size of function */
+      uint32_t x_fsize;        /* size of function */
     } x_misc;
     union {
       struct {                 /* if ISFCN, tag, or .bb */
-       unsigned long x_lnnoptr;/* ptr to fcn line # */
-       unsigned long x_endndx; /* entry ndx past block end */
+       uint32_t x_lnnoptr;     /* ptr to fcn line # */
+       uint32_t x_endndx;      /* entry ndx past block end */
       } x_fcn;
       struct {                 /* if ISARY, up to 4 dimen. */
        char x_dimen[E_DIMNUM][2];
       } x_ary;
     } x_fcnary;
-    unsigned short x_tvndx;    /* tv index */
+    uint16_t x_tvndx;  /* tv index */
   } x_sym;
 
   union {
     char x_fname[E_FILNMLEN];
     struct {
-      unsigned long x_zeroes;
-      unsigned long x_offset;
+      uint32_t x_zeroes;
+      uint32_t x_offset;
     } x_n;
   } x_file;
 
   struct {
-    unsigned long x_scnlen;    /* section length */
-    unsigned short x_nreloc;   /* # relocation entries */
-    unsigned short x_nlinno;   /* # line numbers */
-    unsigned long x_checksum;  /* section COMDAT checksum */
-    unsigned short x_associated;/* COMDAT associated section index */
+    uint32_t x_scnlen;         /* section length */
+    uint16_t x_nreloc;         /* # relocation entries */
+    uint16_t x_nlinno;         /* # line numbers */
+    uint32_t x_checksum;       /* section COMDAT checksum */
+    uint16_t x_associated;     /* COMDAT associated section index */
     char x_comdat[1];          /* COMDAT selection number */
   } x_scn;
 
   struct {
-    unsigned long x_tvfill;    /* tv fill value */
-    unsigned short x_tvlen;    /* length of .tv */
+    uint32_t x_tvfill;         /* tv fill value */
+    uint16_t x_tvlen;          /* length of .tv */
     char x_tvran[2][2];                /* tv range */
   } x_tv;      /* info about .tv section (in auxent of symbol .tv)) */
 
@@ -320,43 +333,43 @@
 
 
 #ifdef COFF_IMAGE_WITH_PE
-/* The filehdr is only weired in images */
+/* The filehdr is only weird in images */
 
 #undef FILHDR
 struct external_PE_filehdr
 {
   /* DOS header fields */
-  unsigned short e_magic;      /* Magic number, 0x5a4d */
-  unsigned short e_cblp;       /* Bytes on last page of file, 0x90 */
-  unsigned short e_cp;         /* Pages in file, 0x3 */
-  unsigned short e_crlc;       /* Relocations, 0x0 */
-  unsigned short e_cparhdr;    /* Size of header in paragraphs, 0x4 */
-  unsigned short e_minalloc;   /* Minimum extra paragraphs needed, 0x0 */
-  unsigned short e_maxalloc;   /* Maximum extra paragraphs needed, 0xFFFF */
-  unsigned short e_ss;         /* Initial (relative) SS value, 0x0 */
-  unsigned short e_sp;         /* Initial SP value, 0xb8 */
-  unsigned short e_csum;       /* Checksum, 0x0 */
-  unsigned short e_ip;         /* Initial IP value, 0x0 */
-  unsigned short e_cs;         /* Initial (relative) CS value, 0x0 */
-  unsigned short e_lfarlc;     /* File address of relocation table, 0x40 */
-  unsigned short e_ovno;       /* Overlay number, 0x0 */
-  char e_res[4][2];            /* Reserved words, all 0x0 */
-  unsigned short e_oemid;      /* OEM identifier (for e_oeminfo), 0x0 */
-  unsigned short e_oeminfo;    /* OEM information; e_oemid specific, 0x0 */
-  char e_res2[10][2];          /* Reserved words, all 0x0 */
-  unsigned long e_lfanew;      /* File address of new exe header, 0x80 */
+  uint16_t e_magic;    /* Magic number, 0x5a4d */
+  uint16_t e_cblp;     /* Bytes on last page of file, 0x90 */
+  uint16_t e_cp;       /* Pages in file, 0x3 */
+  uint16_t e_crlc;     /* Relocations, 0x0 */
+  uint16_t e_cparhdr;  /* Size of header in paragraphs, 0x4 */
+  uint16_t e_minalloc; /* Minimum extra paragraphs needed, 0x0 */
+  uint16_t e_maxalloc; /* Maximum extra paragraphs needed, 0xFFFF */
+  uint16_t e_ss;       /* Initial (relative) SS value, 0x0 */
+  uint16_t e_sp;       /* Initial SP value, 0xb8 */
+  uint16_t e_csum;     /* Checksum, 0x0 */
+  uint16_t e_ip;       /* Initial IP value, 0x0 */
+  uint16_t e_cs;       /* Initial (relative) CS value, 0x0 */
+  uint16_t e_lfarlc;   /* File address of relocation table, 0x40 */
+  uint16_t e_ovno;     /* Overlay number, 0x0 */
+  char e_res[4][2];    /* Reserved words, all 0x0 */
+  uint16_t e_oemid;    /* OEM identifier (for e_oeminfo), 0x0 */
+  uint16_t e_oeminfo;  /* OEM information; e_oemid specific, 0x0 */
+  char e_res2[10][2];  /* Reserved words, all 0x0 */
+  uint32_t e_lfanew;   /* File address of new exe header, 0x80 */
   char dos_message[16][4];     /* other stuff, always follow DOS header */
-  unsigned int nt_signature;   /* required NT signature, 0x4550 */
+  uint32_t nt_signature;       /* required NT signature, 0x4550 */
 
   /* From standard header */
 
-  unsigned short f_magic;      /* magic number                 */
-  unsigned short f_nscns;      /* number of sections           */
-  unsigned long f_timdat;      /* time & date stamp            */
-  unsigned long f_symptr;      /* file pointer to symtab       */
-  unsigned long f_nsyms;       /* number of symtab entries     */
-  unsigned short f_opthdr;     /* sizeof(optional hdr)         */
-  unsigned short f_flags;      /* flags                        */
+  uint16_t f_magic;    /* magic number                 */
+  uint16_t f_nscns;    /* number of sections           */
+  uint32_t f_timdat;   /* time & date stamp            */
+  uint32_t f_symptr;   /* file pointer to symtab       */
+  uint32_t f_nsyms;    /* number of symtab entries     */
+  uint16_t f_opthdr;   /* sizeof(optional hdr)         */
+  uint16_t f_flags;    /* flags                        */
 };
 
 
@@ -368,37 +381,39 @@
 
 typedef struct
 {
-  unsigned short magic;                /* type of file                         
*/
-  unsigned short vstamp;       /* version stamp                        */
-  unsigned long        tsize;          /* text size in bytes, padded to FW 
bdry*/
-  unsigned long        dsize;          /* initialized data "  "                
*/
-  unsigned long        bsize;          /* uninitialized data "   "             
*/
-  unsigned long        entry;          /* entry pt.                            
*/
-  unsigned long text_start;    /* base of text used for this file */
-  unsigned long data_start;    /* base of all data used for this file */
+  uint16_t magic;              /* type of file                         */
+  uint16_t vstamp;             /* version stamp                        */
+  uint32_t     tsize;          /* text size in bytes, padded to FW bdry*/
+  uint32_t     dsize;          /* initialized data "  "                */
+  uint32_t     bsize;          /* uninitialized data "   "             */
+  uint32_t     entry;          /* entry pt.                            */
+  uint32_t     text_start;     /* base of text used for this file */
+#ifndef __x86_64__
+  uint32_t     data_start;     /* base of all data used for this file */
+#endif
 
   /* NT extra fields; see internal.h for descriptions */
-  unsigned long  ImageBase;
-  unsigned long  SectionAlignment;
-  unsigned long  FileAlignment;
-  unsigned short  MajorOperatingSystemVersion;
-  unsigned short  MinorOperatingSystemVersion;
-  unsigned short  MajorImageVersion;
-  unsigned short  MinorImageVersion;
-  unsigned short  MajorSubsystemVersion;
-  unsigned short  MinorSubsystemVersion;
+  uintptr_t  ImageBase;
+  uint32_t  SectionAlignment;
+  uint32_t  FileAlignment;
+  uint16_t  MajorOperatingSystemVersion;
+  uint16_t  MinorOperatingSystemVersion;
+  uint16_t  MajorImageVersion;
+  uint16_t  MinorImageVersion;
+  uint16_t  MajorSubsystemVersion;
+  uint16_t  MinorSubsystemVersion;
   char  Reserved1[4];
-  unsigned long  SizeOfImage;
-  unsigned long  SizeOfHeaders;
-  unsigned long  CheckSum;
-  unsigned short Subsystem;
-  unsigned short DllCharacteristics;
-  unsigned long  SizeOfStackReserve;
-  unsigned long  SizeOfStackCommit;
-  unsigned long  SizeOfHeapReserve;
-  unsigned long  SizeOfHeapCommit;
-  unsigned long  LoaderFlags;
-  unsigned long  NumberOfRvaAndSizes;
+  uint32_t  SizeOfImage;
+  uint32_t  SizeOfHeaders;
+  uint32_t  CheckSum;
+  uint16_t  Subsystem;
+  uint16_t  DllCharacteristics;
+  uintptr_t  SizeOfStackReserve;
+  uintptr_t  SizeOfStackCommit;
+  uintptr_t  SizeOfHeapReserve;
+  uintptr_t  SizeOfHeapCommit;
+  uint32_t  LoaderFlags;
+  uint32_t  NumberOfRvaAndSizes;
   /* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */
   char  DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars */
 
@@ -406,7 +421,11 @@
 
 
 #undef AOUTSZ
+#ifdef __x86_64__
+#define AOUTSZ (AOUTHDRSZ + 212)
+#else
 #define AOUTSZ (AOUTHDRSZ + 196)
+#endif
 
 #undef  E_FILNMLEN
 #define E_FILNMLEN     18      /* # characters in a file name          */

Reply via email to