[patch] test12-pre3 include/linux/elf.h

2000-11-29 Thread Keith Owens

Linus, please apply.

The kernel incorrectly defines Elf64_Word and Elf64_Sword as 8 bytes,
they should be 4 bytes, Elf64_Xword and Elf64_Sxword are the 8 byte
versions.  The type mismatch between kernel and user space causes field
misalignments if you copy a user space definition into the kernel or
vice versa.  This patch corrects Elf64_[S]Word to 4 bytes and adds the
correct Elf64_[S]Xword where it really needs 8 bytes.  It also replaces
several other incorrect types in elf.h, they now match user space and
the ELF standards.

The structures sizes and offsets have not changed, it is just a type
cleanup.  Patch tested on IA64.  It was sent to various 64 bit mailing
lists for review, nobody has complained.

Index: 0-test12-pre3.1/include/linux/elf.h
--- 0-test12-pre3.1/include/linux/elf.h Tue, 31 Oct 2000 08:28:16 +1100 kaos 
(linux-2.4/Y/0_elf.h 1.4 644)
+++ 0-test12-pre3.1(w)/include/linux/elf.h Thu, 30 Nov 2000 10:00:55 +1100 kaos 
+(linux-2.4/Y/0_elf.h 1.4 644)
@@ -16,8 +16,10 @@ typedef __u64Elf64_Addr;
 typedef __u16  Elf64_Half;
 typedef __s16  Elf64_SHalf;
 typedef __u64  Elf64_Off;
-typedef __s64  Elf64_Sword;
+typedef __s32  Elf64_Sword;
-typedef __u64  Elf64_Word;
+typedef __u32  Elf64_Word;
+typedef __u64  Elf64_Xword;
+typedef __s64  Elf64_Sxword;
 
 /* These constants are for the segment types stored in the image headers */
 #define PT_NULL0
@@ -176,10 +178,10 @@ typedef struct dynamic{
 } Elf32_Dyn;
 
 typedef struct {
-  Elf64_Word d_tag;/* entry tag value */
+  Elf64_Sxword d_tag;  /* entry tag value */
   union {
-Elf64_Word d_val;
+Elf64_Xword d_val;
-Elf64_Word d_ptr;
+Elf64_Addr d_ptr;
   } d_un;
 } Elf64_Dyn;
 
@@ -370,7 +372,7 @@ typedef struct elf32_rel {
 
 typedef struct elf64_rel {
   Elf64_Addr r_offset; /* Location at which to apply the action */
-  Elf64_Word r_info;   /* index and type of relocation */
+  Elf64_Xword r_info;  /* index and type of relocation */
 } Elf64_Rel;
 
 typedef struct elf32_rela{
@@ -381,8 +383,8 @@ typedef struct elf32_rela{
 
 typedef struct elf64_rela {
   Elf64_Addr r_offset; /* Location at which to apply the action */
-  Elf64_Word r_info;   /* index and type of relocation */
+  Elf64_Xword r_info;  /* index and type of relocation */
-  Elf64_Word r_addend; /* Constant addend used to compute value */
+  Elf64_Sxword r_addend;   /* Constant addend used to compute value */
 } Elf64_Rela;
 
 typedef struct elf32_sym{
@@ -395,12 +397,12 @@ typedef struct elf32_sym{
 } Elf32_Sym;
 
 typedef struct elf64_sym {
-  Elf32_Word st_name;  /* Symbol name, index in string tbl (yes, Elf32) */
+  Elf64_Word st_name;  /* Symbol name, index in string tbl */
   unsigned charst_info;/* Type and binding attributes */
   unsigned charst_other;   /* No defined meaning, 0 */
   Elf64_Half st_shndx; /* Associated section index */
   Elf64_Addr st_value; /* Value of the symbol */
-  Elf64_Word st_size;  /* Associated symbol size */
+  Elf64_Xword st_size; /* Associated symbol size */
 } Elf64_Sym;
 
 
@@ -425,19 +427,19 @@ typedef struct elf32_hdr{
 
 typedef struct elf64_hdr {
   unsigned chare_ident[16];/* ELF "magic number" */
-  Elf64_SHalf e_type;
+  Elf64_Half e_type;
   Elf64_Half e_machine;
-  __s32 e_version;
+  Elf64_Word e_version;
   Elf64_Addr e_entry;  /* Entry point virtual address */
   Elf64_Off e_phoff;   /* Program header table file offset */
   Elf64_Off e_shoff;   /* Section header table file offset */
-  __s32 e_flags;
+  Elf64_Word e_flags;
-  Elf64_SHalf e_ehsize;
+  Elf64_Half e_ehsize;
-  Elf64_SHalf e_phentsize;
+  Elf64_Half e_phentsize;
-  Elf64_SHalf e_phnum;
+  Elf64_Half e_phnum;
-  Elf64_SHalf e_shentsize;
+  Elf64_Half e_shentsize;
-  Elf64_SHalf e_shnum;
+  Elf64_Half e_shnum;
-  Elf64_SHalf e_shstrndx;
+  Elf64_Half e_shstrndx;
 } Elf64_Ehdr;
 
 /* These constants define the permissions on sections in the program
@@ -458,14 +460,14 @@ typedef struct elf32_phdr{
 } Elf32_Phdr;
 
 typedef struct elf64_phdr {
-  __s32 p_type;
+  Elf64_Word p_type;
-  __s32 p_flags;
+  Elf64_Word p_flags;
   Elf64_Off p_offset;  /* Segment file offset */
   Elf64_Addr p_vaddr;  /* Segment virtual address */
   Elf64_Addr p_paddr;  /* Segment physical address */
-  Elf64_Word p_filesz; /* Segment size in file */
+  Elf64_Xword p_filesz;/* Segment size in file */
-  Elf64_Word p_memsz;  /* Segment size in memory */
+  Elf64_Xword p_memsz; /* Segment size in memory */
-  Elf64_Word p_align;  /* Segment alignment, file & memory */
+  Elf64_Xword p_align; /* Segment alignment, file & memory */
 } Elf64_Phdr;
 
 /* sh_type */
@@ -522,16 +524,16 @@ typedef struct {
 } Elf32_Shdr;
 
 typedef struct elf64_shdr {
-  Elf32_Word sh_name;  /* Section name, index in string tbl (yes Elf32) */
+  Elf64_Word sh_name;  

[patch] test12-pre3 include/linux/elf.h

2000-11-29 Thread Keith Owens

Linus, please apply.

The kernel incorrectly defines Elf64_Word and Elf64_Sword as 8 bytes,
they should be 4 bytes, Elf64_Xword and Elf64_Sxword are the 8 byte
versions.  The type mismatch between kernel and user space causes field
misalignments if you copy a user space definition into the kernel or
vice versa.  This patch corrects Elf64_[S]Word to 4 bytes and adds the
correct Elf64_[S]Xword where it really needs 8 bytes.  It also replaces
several other incorrect types in elf.h, they now match user space and
the ELF standards.

The structures sizes and offsets have not changed, it is just a type
cleanup.  Patch tested on IA64.  It was sent to various 64 bit mailing
lists for review, nobody has complained.

Index: 0-test12-pre3.1/include/linux/elf.h
--- 0-test12-pre3.1/include/linux/elf.h Tue, 31 Oct 2000 08:28:16 +1100 kaos 
(linux-2.4/Y/0_elf.h 1.4 644)
+++ 0-test12-pre3.1(w)/include/linux/elf.h Thu, 30 Nov 2000 10:00:55 +1100 kaos 
+(linux-2.4/Y/0_elf.h 1.4 644)
@@ -16,8 +16,10 @@ typedef __u64Elf64_Addr;
 typedef __u16  Elf64_Half;
 typedef __s16  Elf64_SHalf;
 typedef __u64  Elf64_Off;
-typedef __s64  Elf64_Sword;
+typedef __s32  Elf64_Sword;
-typedef __u64  Elf64_Word;
+typedef __u32  Elf64_Word;
+typedef __u64  Elf64_Xword;
+typedef __s64  Elf64_Sxword;
 
 /* These constants are for the segment types stored in the image headers */
 #define PT_NULL0
@@ -176,10 +178,10 @@ typedef struct dynamic{
 } Elf32_Dyn;
 
 typedef struct {
-  Elf64_Word d_tag;/* entry tag value */
+  Elf64_Sxword d_tag;  /* entry tag value */
   union {
-Elf64_Word d_val;
+Elf64_Xword d_val;
-Elf64_Word d_ptr;
+Elf64_Addr d_ptr;
   } d_un;
 } Elf64_Dyn;
 
@@ -370,7 +372,7 @@ typedef struct elf32_rel {
 
 typedef struct elf64_rel {
   Elf64_Addr r_offset; /* Location at which to apply the action */
-  Elf64_Word r_info;   /* index and type of relocation */
+  Elf64_Xword r_info;  /* index and type of relocation */
 } Elf64_Rel;
 
 typedef struct elf32_rela{
@@ -381,8 +383,8 @@ typedef struct elf32_rela{
 
 typedef struct elf64_rela {
   Elf64_Addr r_offset; /* Location at which to apply the action */
-  Elf64_Word r_info;   /* index and type of relocation */
+  Elf64_Xword r_info;  /* index and type of relocation */
-  Elf64_Word r_addend; /* Constant addend used to compute value */
+  Elf64_Sxword r_addend;   /* Constant addend used to compute value */
 } Elf64_Rela;
 
 typedef struct elf32_sym{
@@ -395,12 +397,12 @@ typedef struct elf32_sym{
 } Elf32_Sym;
 
 typedef struct elf64_sym {
-  Elf32_Word st_name;  /* Symbol name, index in string tbl (yes, Elf32) */
+  Elf64_Word st_name;  /* Symbol name, index in string tbl */
   unsigned charst_info;/* Type and binding attributes */
   unsigned charst_other;   /* No defined meaning, 0 */
   Elf64_Half st_shndx; /* Associated section index */
   Elf64_Addr st_value; /* Value of the symbol */
-  Elf64_Word st_size;  /* Associated symbol size */
+  Elf64_Xword st_size; /* Associated symbol size */
 } Elf64_Sym;
 
 
@@ -425,19 +427,19 @@ typedef struct elf32_hdr{
 
 typedef struct elf64_hdr {
   unsigned chare_ident[16];/* ELF "magic number" */
-  Elf64_SHalf e_type;
+  Elf64_Half e_type;
   Elf64_Half e_machine;
-  __s32 e_version;
+  Elf64_Word e_version;
   Elf64_Addr e_entry;  /* Entry point virtual address */
   Elf64_Off e_phoff;   /* Program header table file offset */
   Elf64_Off e_shoff;   /* Section header table file offset */
-  __s32 e_flags;
+  Elf64_Word e_flags;
-  Elf64_SHalf e_ehsize;
+  Elf64_Half e_ehsize;
-  Elf64_SHalf e_phentsize;
+  Elf64_Half e_phentsize;
-  Elf64_SHalf e_phnum;
+  Elf64_Half e_phnum;
-  Elf64_SHalf e_shentsize;
+  Elf64_Half e_shentsize;
-  Elf64_SHalf e_shnum;
+  Elf64_Half e_shnum;
-  Elf64_SHalf e_shstrndx;
+  Elf64_Half e_shstrndx;
 } Elf64_Ehdr;
 
 /* These constants define the permissions on sections in the program
@@ -458,14 +460,14 @@ typedef struct elf32_phdr{
 } Elf32_Phdr;
 
 typedef struct elf64_phdr {
-  __s32 p_type;
+  Elf64_Word p_type;
-  __s32 p_flags;
+  Elf64_Word p_flags;
   Elf64_Off p_offset;  /* Segment file offset */
   Elf64_Addr p_vaddr;  /* Segment virtual address */
   Elf64_Addr p_paddr;  /* Segment physical address */
-  Elf64_Word p_filesz; /* Segment size in file */
+  Elf64_Xword p_filesz;/* Segment size in file */
-  Elf64_Word p_memsz;  /* Segment size in memory */
+  Elf64_Xword p_memsz; /* Segment size in memory */
-  Elf64_Word p_align;  /* Segment alignment, file  memory */
+  Elf64_Xword p_align; /* Segment alignment, file  memory */
 } Elf64_Phdr;
 
 /* sh_type */
@@ -522,16 +524,16 @@ typedef struct {
 } Elf32_Shdr;
 
 typedef struct elf64_shdr {
-  Elf32_Word sh_name;  /* Section name, index in string tbl (yes Elf32) */
+  Elf64_Word sh_name;