From abbc4d9ae2abdd550f6cfc254388d6a613464abc Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Fri, 27 Jun 2025 13:15:11 +0200 Subject: [PATCH] Reorganized elf sections --- src/elf/AddSections.go | 27 ++++++++++++++++----------- src/elf/Constants.go | 18 +++++++++++------- src/elf/ELF.go | 5 ++--- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/elf/AddSections.go b/src/elf/AddSections.go index 06fce5f..0881386 100644 --- a/src/elf/AddSections.go +++ b/src/elf/AddSections.go @@ -1,19 +1,15 @@ package elf -import "bytes" +import "strings" // AddSections adds section headers to the ELF file. func (elf *ELF) AddSections() { - elf.StringTable = []byte("\000.text\000.shstrtab\000") - stringTableStart := elf.DataHeader.Offset + elf.DataHeader.SizeInFile - sectionHeaderStart := stringTableStart + int64(len(elf.StringTable)) - elf.SectionHeaders = []SectionHeader{ { Type: SectionTypeNULL, }, { - NameIndex: int32(bytes.Index(elf.StringTable, []byte(".text\000"))), + NameIndex: int32(strings.Index(StringTable, ".text\000")), Type: SectionTypePROGBITS, Flags: SectionFlagsAllocate | SectionFlagsExecutable, VirtualAddress: elf.CodeHeader.VirtualAddress, @@ -22,16 +18,25 @@ func (elf *ELF) AddSections() { Align: elf.CodeHeader.Align, }, { - NameIndex: int32(bytes.Index(elf.StringTable, []byte(".shstrtab\000"))), + NameIndex: int32(strings.Index(StringTable, ".rodata\000")), + Type: SectionTypePROGBITS, + Flags: SectionFlagsAllocate, + VirtualAddress: elf.DataHeader.VirtualAddress, + Offset: elf.DataHeader.Offset, + SizeInFile: elf.DataHeader.SizeInFile, + Align: elf.DataHeader.Align, + }, + { + NameIndex: int32(strings.Index(StringTable, ".shstrtab\000")), Type: SectionTypeSTRTAB, - Offset: int64(stringTableStart), - SizeInFile: int64(len(elf.StringTable)), + Offset: int64(StringTableStart), + SizeInFile: int64(len(StringTable)), Align: 1, }, } elf.SectionHeaderEntrySize = SectionHeaderSize elf.SectionHeaderEntryCount = int16(len(elf.SectionHeaders)) - elf.SectionHeaderOffset = int64(sectionHeaderStart) - elf.SectionNameStringTableIndex = 2 + elf.SectionHeaderOffset = int64(SectionHeaderStart) + elf.SectionNameStringTableIndex = int16(len(elf.SectionHeaders) - 1) } \ No newline at end of file diff --git a/src/elf/Constants.go b/src/elf/Constants.go index f5002e8..da9c90f 100644 --- a/src/elf/Constants.go +++ b/src/elf/Constants.go @@ -1,11 +1,15 @@ package elf const ( - LittleEndian = 1 - TypeExecutable = 2 - TypeDynamic = 3 - ArchitectureAMD64 = 0x3E - ArchitectureARM64 = 0xB7 - ArchitectureRISCV = 0xF3 - HeaderEnd = HeaderSize + ProgramHeaderSize*2 + LittleEndian = 1 + TypeExecutable = 2 + TypeDynamic = 3 + ArchitectureAMD64 = 0x3E + ArchitectureARM64 = 0xB7 + ArchitectureRISCV = 0xF3 + StringTable = "\000.text\000.rodata\000.shstrtab\000" + StringTableStart = ProgramHeaderEnd + SectionHeaderStart = StringTableStart + len(StringTable) + ProgramHeaderEnd = HeaderSize + ProgramHeaderSize*2 + HeaderEnd = ProgramHeaderEnd + len(StringTable) + 4*SectionHeaderSize ) \ No newline at end of file diff --git a/src/elf/ELF.go b/src/elf/ELF.go index ed4db81..e65454b 100644 --- a/src/elf/ELF.go +++ b/src/elf/ELF.go @@ -14,7 +14,6 @@ type ELF struct { CodeHeader ProgramHeader DataHeader ProgramHeader SectionHeaders []SectionHeader - StringTable []byte } // Write writes the ELF64 format to the given writer. @@ -70,10 +69,10 @@ func Write(writer io.WriteSeeker, b *build.Build, codeBytes []byte, dataBytes [] binary.Write(writer, binary.LittleEndian, &elf.Header) binary.Write(writer, binary.LittleEndian, &elf.CodeHeader) binary.Write(writer, binary.LittleEndian, &elf.DataHeader) + writer.Write([]byte(StringTable)) + binary.Write(writer, binary.LittleEndian, &elf.SectionHeaders) writer.Seek(int64(code.Padding), io.SeekCurrent) writer.Write(code.Bytes) writer.Seek(int64(data.Padding), io.SeekCurrent) writer.Write(data.Bytes) - writer.Write(elf.StringTable) - binary.Write(writer, binary.LittleEndian, &elf.SectionHeaders) } \ No newline at end of file