[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [COMMITTED] pickles: elf: more work on ELF32,
Jose E. Marchesi <=