poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[COMMITTED] pickles: elf: more work on ELF32


From: Jose E. Marchesi
Subject: [COMMITTED] pickles: elf: more work on ELF32
Date: Wed, 22 Dec 2021 17:14:23 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux)

2021-12-22  Jose E. Marchesi  <jemarch@gnu.org>

        * pickles/elf-common.pk (elf_pretty_print_section_flags): New
        function.
        (Elf_SegmentFlags): New type.
        (Elf_Ident): Likewise.
        * pickles/elf-64.pk (Elf64_SectionFlags): Use
        elf_pretty_print_section_flags.
        (Elf64_SegmentFlags): Remove.
        (elf64_Ehdr): Use Elf_Ident.
        * pickles/elf-32.pk (Elf32_SectionFlags): New type.
        (Elf32_Shdr): Likewise.
        (Elf32_Phdr): Likewise.
        (Elf32_Ehdr): Likewise.
        (Elf32_File): Likewise.
---
 ChangeLog             | 16 ++++++++++
 pickles/elf-32.pk     | 82 ++++++++++++++++++++++++++++++++++++++++++++++++
 pickles/elf-64.pk     | 87 +++++----------------------------------------------
 pickles/elf-common.pk | 81 +++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 187 insertions(+), 79 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ae53d74a..f558a9ed 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
 2021-12-22  Jose E. Marchesi  <jemarch@gnu.org>
 
+       * pickles/elf-common.pk (elf_pretty_print_section_flags): New
+       function.
+       (Elf_SegmentFlags): New type.
+       (Elf_Ident): Likewise.
+       * pickles/elf-64.pk (Elf64_SectionFlags): Use
+       elf_pretty_print_section_flags.
+       (Elf64_SegmentFlags): Remove.
+       (elf64_Ehdr): Use Elf_Ident.
+       * pickles/elf-32.pk (Elf32_SectionFlags): New type.
+       (Elf32_Shdr): Likewise.
+       (Elf32_Phdr): Likewise.
+       (Elf32_Ehdr): Likewise.
+       (Elf32_File): Likewise.
+
+2021-12-22  Jose E. Marchesi  <jemarch@gnu.org>
+
        * pickles/elf-common.pk (Elf_Note): New type.
        * pickles/elf-64.pk (Elf64_Note): Delete.
        * pickles/elf-32.pk (Elf32_Note): Likewise.
diff --git a/pickles/elf-32.pk b/pickles/elf-32.pk
index 690d780e..ca6bbc62 100644
--- a/pickles/elf-32.pk
+++ b/pickles/elf-32.pk
@@ -88,3 +88,85 @@ type Elf32_Chdr =
     offset<Elf_Word,B> ch_size;
     offset<Elf_Word,B> ch_addralign;
   };
+
+/* ELF32 section flags.  */
+
+type Elf32_SectionFlags =
+  struct
+  {
+    Elf_Word flags;
+
+    method _print = void:
+    {
+      elf_pretty_print_section_flags (flags);
+    }
+  };
+
+/* ELF32 section header table entry.  */
+
+type Elf32_Shdr =
+  struct
+  {
+    offset<Elf_Word,B> sh_name;
+    Elf_Word sh_type;
+    Elf32_SectionFlags sh_flags;
+    Elf32_Addr sh_addr;
+    Elf32_Off sh_offset;
+    offset<Elf_Word,B> sh_size;
+    Elf_Word sh_link;
+    Elf_Word sh_info;
+    Elf_Word sh_addralign;
+    offset<Elf_Word,b> sh_entsize;
+  };
+
+/* ELF32 program header table entry.  */
+
+type Elf32_Phdr =
+  struct
+  {
+    Elf_Word p_type;
+    Elf32_Off p_offset;
+    Elf32_Addr p_vaddr;
+    Elf32_Addr p_paddr;
+    offset<Elf_Word,B> p_filesz;
+    offset<Elf_Word,B> p_memsz;
+    Elf_SegmentFlags p_flags;
+    offset<Elf_Word,B> p_align;
+  };
+
+/* ELF32 file header.  */
+
+type Elf32_Ehdr =
+  struct
+  {
+    Elf_Ident e_ident;
+    Elf_Half e_type;
+    Elf_Half e_machine;
+    Elf_Word e_version = EV_CURRENT;
+
+    Elf32_Addr e_entry;
+    Elf32_Off e_phoff;
+    Elf32_Off e_shoff;
+
+    Elf_Word e_flags;
+    offset<Elf_Half,B> e_ehsize;
+    offset<Elf_Half,B> e_phentsize;
+    Elf_Half e_phnum;
+    offset<Elf_Half,B> e_shentsize;
+    Elf_Half e_shnum;
+    Elf_Half e_shstrndx : e_shnum == 0 || e_shstrndx < e_shnum;
+  };
+
+/* ELF32 file.  */
+
+type Elf32_File =
+  struct
+  {
+    Elf32_Ehdr ehdr;
+
+    Elf32_Shdr[ehdr.e_shnum] shdr @ ehdr.e_shoff
+      if ehdr.e_shnum > 0;
+
+    Elf32_Phdr[ehdr.e_phnum] phdr @ ehdr.e_phoff
+      if ehdr.e_phnum > 0;
+  };
diff --git a/pickles/elf-64.pk b/pickles/elf-64.pk
index 1ac05dd8..4bfe28e0 100644
--- a/pickles/elf-64.pk
+++ b/pickles/elf-64.pk
@@ -133,40 +133,9 @@ type Elf64_SectionFlags =
     Elf64_Xword flags;
 
     method _print = void:
-      {
-        var s = "";
-
-        if (flags & SHF_WRITE)
-          s = s + "WRITE,";
-        if (flags & SHF_ALLOC)
-          s = s + "ALLOC,";
-        if (flags & SHF_EXECINSTR)
-          s = s + "EXECINSTR,";
-        if (flags & SHF_MERGE)
-          s = s + "MERGE,";
-        if (flags & SHF_STRINGS)
-          s = s + "STRINGS,";
-        if (flags & SHF_INFO_LINK)
-          s = s + "INFO_LINK,";
-        if (flags & SHF_LINK_ORDER)
-          s = s + "LINK_ORDER,";
-        if (flags & SHF_OS_NONCONFORMING)
-          s = s + "OS_NONCONFORMING,";
-        if (flags & SHF_GROUP)
-          s = s + "GROUP,";
-        if (flags & SHF_TLS)
-          s = s + "TLS,";
-        if (flags & SHF_COMPRESSED)
-          s = s + "COMPRESSED,";
-        if (flags & SHF_MASKOS)
-          /* XXX call os-specific printer in elf-OS.pk */
-          ;
-        if (flags & SHF_MASKPROC)
-          /* XXX call arch-specific printer in elf-ARCH.pk */
-          ;
-
-        print "#<" + rtrim (s, ",") + ">";
-      }
+    {
+      elf_pretty_print_section_flags (flags);
+    }
   };
 
 /* ELF64 section header table entry.
@@ -195,47 +164,19 @@ type Elf64_Shdr =
     offset<Elf64_Xword,b> sh_entsize;
   };
 
-/* ELF64 segment flags.  */
-
-type Elf64_SegmentFlags =
-  struct
-  {
-    Elf_Word flags;
-
-    method _print = void:
-      {
-        var s = "";
-
-        if (flags & PF_R)
-          s = s + "R,";
-        if (flags & PF_W)
-          s = s + "W,";
-        if (flags & PF_X)
-          s = s + "X,";
-        if (flags & PF_MASKOS)
-          /* XXX call os-specific printer in elf-OS.pk */
-          ;
-        if (flags & PF_MASKPROC)
-          /* XXX call arch-specific printer in elf-ARCH.pk */
-          ;
-
-        print "#<" + rtrim (s, ",") + ">";
-      }
-  };
-
 /* ELF64 program header table entry.  */
 
 type Elf64_Phdr =
   struct
   {
     Elf_Word p_type;
-    Elf64_SegmentFlags p_flags;
+    Elf_SegmentFlags p_flags;
     Elf64_Off p_offset;
     Elf64_Addr p_vaddr;
     Elf64_Addr p_paddr;
-    Elf64_Xword p_filesz;
-    Elf64_Xword p_memsz;
-    Elf64_Xword p_align;
+    offset<Elf64_Xword,B> p_filesz;
+    offset<Elf64_Xword,B> p_memsz;
+    offset<Elf64_Xword,B> p_align;
   };
 
 /* ELF64 file header.  */
@@ -243,19 +184,7 @@ type Elf64_Phdr =
 type Elf64_Ehdr =
   struct
   {
-    struct
-    {
-      byte[4] ei_mag == [0x7fUB, 'E', 'L', 'F'];
-      byte ei_class;
-      byte ei_data :
-        (ei_data == ELFDATA2LSB) ? set_endian (ENDIAN_LITTLE) : set_endian 
(ENDIAN_BIG);
-      byte ei_version;
-      byte ei_osabi;
-      byte ei_abiversion;
-      byte[6] ei_pad;
-      offset<byte,B> ei_nident;
-    } e_ident;
-
+    Elf_Ident e_ident;
     Elf_Half e_type;
     Elf_Half e_machine;
     Elf_Word e_version = EV_CURRENT;
diff --git a/pickles/elf-common.pk b/pickles/elf-common.pk
index 57043ad3..58334d88 100644
--- a/pickles/elf-common.pk
+++ b/pickles/elf-common.pk
@@ -304,6 +304,42 @@ var SHF_WRITE = 0x1,
     SHF_MASKOS = 0x0ff0_0000,
     SHF_MASKPROC = 0xf000_0000;
 
+fun elf_pretty_print_section_flags = (uint<64> flags) void:
+{
+  var s = "";
+
+  if (flags & SHF_WRITE)
+    s = s + "WRITE,";
+  if (flags & SHF_ALLOC)
+    s = s + "ALLOC,";
+  if (flags & SHF_EXECINSTR)
+    s = s + "EXECINSTR,";
+  if (flags & SHF_MERGE)
+    s = s + "MERGE,";
+  if (flags & SHF_STRINGS)
+    s = s + "STRINGS,";
+  if (flags & SHF_INFO_LINK)
+    s = s + "INFO_LINK,";
+  if (flags & SHF_LINK_ORDER)
+    s = s + "LINK_ORDER,";
+  if (flags & SHF_OS_NONCONFORMING)
+    s = s + "OS_NONCONFORMING,";
+  if (flags & SHF_GROUP)
+    s = s + "GROUP,";
+  if (flags & SHF_TLS)
+    s = s + "TLS,";
+  if (flags & SHF_COMPRESSED)
+    s = s + "COMPRESSED,";
+  if (flags & SHF_MASKOS)
+   /* XXX call os-specific printer in elf-OS.pk */
+    ;
+  if (flags & SHF_MASKPROC)
+   /* XXX call arch-specific printer in elf-ARCH.pk */
+    ;
+
+  print "#<" + rtrim (s, ",") + ">";
+}
+
 /* Segment types.  */
 
 var PT_NULL = 0,
@@ -327,6 +363,32 @@ var PF_X = 0x1,
     PF_MASKOS = 0x0ff0_0000,
     PF_MASKPROC = 0xf000_0000;
 
+type Elf_SegmentFlags =
+  struct
+  {
+    Elf_Word flags;
+
+    method _print = void:
+      {
+        var s = "";
+
+        if (flags & PF_R)
+          s = s + "R,";
+        if (flags & PF_W)
+          s = s + "W,";
+        if (flags & PF_X)
+          s = s + "X,";
+        if (flags & PF_MASKOS)
+          /* XXX call os-specific printer in elf-OS.pk */
+          ;
+        if (flags & PF_MASKPROC)
+          /* XXX call arch-specific printer in elf-ARCH.pk */
+          ;
+
+        print "#<" + rtrim (s, ",") + ">";
+      }
+  };
+
 /* Encoding of the ELF file.  */
 
 var ELFDATANONE = 0,
@@ -374,3 +436,22 @@ type Elf_Note =
     byte[descsz] desc;
     byte[alignto (OFFSET, 4#B)];
 };
+
+/* ELF identification struct.
+
+   This is the first component in the ELF header for both ELF32 and
+   ELF64.  */
+
+type Elf_Ident =
+  struct
+  {
+    byte[4] ei_mag == [0x7fUB, 'E', 'L', 'F'];
+    byte ei_class;
+    byte ei_data :
+        (ei_data == ELFDATA2LSB) ? set_endian (ENDIAN_LITTLE) : set_endian 
(ENDIAN_BIG);
+    byte ei_version;
+    byte ei_osabi;
+    byte ei_abiversion;
+    byte[6] ei_pad;
+    offset<byte,B> ei_nident;
+  };
-- 
2.11.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]