From 85cea5cbee196799d0c785d45e516c189ba40816 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Thu, 3 Jul 2025 17:24:42 +0200 Subject: [PATCH] Simplified build struct --- src/asm/Assembler.go | 2 +- src/build/Arch.go | 16 +--------------- src/build/Build.go | 12 +++++------- src/build/FileAlign.go | 6 ++++++ src/build/MemoryAlign.go | 11 +++++++++++ src/build/New.go | 4 ++-- src/cli/build.go | 4 ++-- src/elf/ELF.go | 6 +++--- src/elf/ELF_test.go | 6 +++--- src/linker/WriteFile_test.go | 4 ++-- src/macho/MachO.go | 2 +- src/macho/MachO_test.go | 6 +++--- src/pe/EXE.go | 8 ++++---- src/pe/EXE_test.go | 6 +++--- src/ssa2asm/Compiler_test.go | 2 +- 15 files changed, 48 insertions(+), 47 deletions(-) create mode 100644 src/build/FileAlign.go create mode 100644 src/build/MemoryAlign.go diff --git a/src/asm/Assembler.go b/src/asm/Assembler.go index 7c24823..4140208 100644 --- a/src/asm/Assembler.go +++ b/src/asm/Assembler.go @@ -59,7 +59,7 @@ func (a *Assembler) Compile(b *build.Build) (code []byte, data []byte, libs dll. } } - x := exe.New(elf.HeaderEnd, b.FileAlign, b.MemoryAlign) + x := exe.New(elf.HeaderEnd, b.FileAlign(), b.MemoryAlign()) x.InitSections(c.code, c.data, nil) dataSectionOffset := x.Sections[1].MemoryOffset - x.Sections[0].MemoryOffset diff --git a/src/build/Arch.go b/src/build/Arch.go index e5a934b..b9e3b84 100644 --- a/src/build/Arch.go +++ b/src/build/Arch.go @@ -7,18 +7,4 @@ const ( UnknownArch Arch = iota ARM X86 -) - -// SetArch sets the architecture which also influences the default alignment. -func (build *Build) SetArch(arch Arch) { - build.Arch = arch - - switch arch { - case ARM: - build.MemoryAlign = 0x4000 - default: - build.MemoryAlign = 0x1000 - } - - build.FileAlign = build.MemoryAlign -} \ No newline at end of file +) \ No newline at end of file diff --git a/src/build/Build.go b/src/build/Build.go index a5d00f5..002c738 100644 --- a/src/build/Build.go +++ b/src/build/Build.go @@ -2,11 +2,9 @@ package build // Build describes the parameters for the "build" command. type Build struct { - Files []string - Arch Arch - OS OS - FileAlign int - MemoryAlign int - Dry bool - ShowSSA bool + Files []string + Arch Arch + OS OS + Dry bool + ShowSSA bool } \ No newline at end of file diff --git a/src/build/FileAlign.go b/src/build/FileAlign.go new file mode 100644 index 0000000..ca9954b --- /dev/null +++ b/src/build/FileAlign.go @@ -0,0 +1,6 @@ +package build + +// FileAlign returns the file alignment. +func (build *Build) FileAlign() int { + return build.MemoryAlign() +} \ No newline at end of file diff --git a/src/build/MemoryAlign.go b/src/build/MemoryAlign.go new file mode 100644 index 0000000..ae5b90a --- /dev/null +++ b/src/build/MemoryAlign.go @@ -0,0 +1,11 @@ +package build + +// MemoryAlign returns the memory alignment. +func (build *Build) MemoryAlign() int { + switch build.Arch { + case ARM: + return 0x4000 + default: + return 0x1000 + } +} \ No newline at end of file diff --git a/src/build/New.go b/src/build/New.go index aa286e4..d7ed351 100644 --- a/src/build/New.go +++ b/src/build/New.go @@ -12,9 +12,9 @@ func New(files ...string) *Build { switch global.Arch { case "amd64": - b.SetArch(X86) + b.Arch = X86 case "arm64": - b.SetArch(ARM) + b.Arch = ARM } switch global.OS { diff --git a/src/cli/build.go b/src/cli/build.go index d58e60c..6edd1f6 100644 --- a/src/cli/build.go +++ b/src/cli/build.go @@ -46,9 +46,9 @@ func newBuildFromArgs(args []string) (*build.Build, error) { switch args[i] { case "arm": - b.SetArch(build.ARM) + b.Arch = build.ARM case "x86": - b.SetArch(build.X86) + b.Arch = build.X86 default: return b, &invalidValueError{Value: args[i], Parameter: "arch"} } diff --git a/src/elf/ELF.go b/src/elf/ELF.go index e65454b..87b485f 100644 --- a/src/elf/ELF.go +++ b/src/elf/ELF.go @@ -18,7 +18,7 @@ type ELF struct { // Write writes the ELF64 format to the given writer. func Write(writer io.WriteSeeker, b *build.Build, codeBytes []byte, dataBytes []byte) { - x := exe.New(HeaderEnd, b.FileAlign, b.MemoryAlign) + x := exe.New(HeaderEnd, b.FileAlign(), b.MemoryAlign()) x.InitSections(codeBytes, dataBytes) code := x.Sections[0] data := x.Sections[1] @@ -52,7 +52,7 @@ func Write(writer io.WriteSeeker, b *build.Build, codeBytes []byte, dataBytes [] VirtualAddress: int64(code.MemoryOffset), SizeInFile: int64(len(code.Bytes)), SizeInMemory: int64(len(code.Bytes)), - Align: int64(b.MemoryAlign), + Align: int64(b.MemoryAlign()), }, DataHeader: ProgramHeader{ Type: ProgramTypeLOAD, @@ -61,7 +61,7 @@ func Write(writer io.WriteSeeker, b *build.Build, codeBytes []byte, dataBytes [] VirtualAddress: int64(data.MemoryOffset), SizeInFile: int64(len(data.Bytes)), SizeInMemory: int64(len(data.Bytes)), - Align: int64(b.MemoryAlign), + Align: int64(b.MemoryAlign()), }, } diff --git a/src/elf/ELF_test.go b/src/elf/ELF_test.go index b7708a6..e706556 100644 --- a/src/elf/ELF_test.go +++ b/src/elf/ELF_test.go @@ -9,7 +9,7 @@ import ( ) func TestWrite(t *testing.T) { - elf.Write(&exe.Discard{}, &build.Build{Arch: build.ARM, FileAlign: 0x4000, MemoryAlign: 0x4000}, nil, nil) - elf.Write(&exe.Discard{}, &build.Build{Arch: build.X86, FileAlign: 0x1000, MemoryAlign: 0x1000}, nil, nil) - elf.Write(&exe.Discard{}, &build.Build{Arch: build.UnknownArch, FileAlign: 0x1000, MemoryAlign: 0x1000}, nil, nil) + elf.Write(&exe.Discard{}, &build.Build{Arch: build.ARM}, nil, nil) + elf.Write(&exe.Discard{}, &build.Build{Arch: build.X86}, nil, nil) + elf.Write(&exe.Discard{}, &build.Build{Arch: build.UnknownArch}, nil, nil) } \ No newline at end of file diff --git a/src/linker/WriteFile_test.go b/src/linker/WriteFile_test.go index df0b8a4..73f4578 100644 --- a/src/linker/WriteFile_test.go +++ b/src/linker/WriteFile_test.go @@ -28,11 +28,11 @@ func TestWriteFile(t *testing.T) { env, err := compiler.Compile(b) assert.Nil(t, err) - b.SetArch(build.ARM) + b.Arch = build.ARM err = linker.WriteFile(b.Executable(), b, env) assert.Nil(t, err) - b.SetArch(build.X86) + b.Arch = build.X86 err = linker.WriteFile(b.Executable(), b, env) assert.Nil(t, err) } \ No newline at end of file diff --git a/src/macho/MachO.go b/src/macho/MachO.go index eadde8f..31b2524 100644 --- a/src/macho/MachO.go +++ b/src/macho/MachO.go @@ -19,7 +19,7 @@ type MachO struct { // Write writes the Mach-O format to the given writer. func Write(writer io.WriteSeeker, b *build.Build, codeBytes []byte, dataBytes []byte) { - x := exe.New(HeaderEnd, b.FileAlign, b.MemoryAlign) + x := exe.New(HeaderEnd, b.FileAlign(), b.MemoryAlign()) x.InitSections(codeBytes, dataBytes) code := x.Sections[0] data := x.Sections[1] diff --git a/src/macho/MachO_test.go b/src/macho/MachO_test.go index 4d26a54..f46855d 100644 --- a/src/macho/MachO_test.go +++ b/src/macho/MachO_test.go @@ -9,7 +9,7 @@ import ( ) func TestWrite(t *testing.T) { - macho.Write(&exe.Discard{}, &build.Build{Arch: build.ARM, FileAlign: 0x4000, MemoryAlign: 0x4000}, nil, nil) - macho.Write(&exe.Discard{}, &build.Build{Arch: build.X86, FileAlign: 0x1000, MemoryAlign: 0x1000}, nil, nil) - macho.Write(&exe.Discard{}, &build.Build{Arch: build.UnknownArch, FileAlign: 0x1000, MemoryAlign: 0x1000}, nil, nil) + macho.Write(&exe.Discard{}, &build.Build{Arch: build.ARM}, nil, nil) + macho.Write(&exe.Discard{}, &build.Build{Arch: build.X86}, nil, nil) + macho.Write(&exe.Discard{}, &build.Build{Arch: build.UnknownArch}, nil, nil) } \ No newline at end of file diff --git a/src/pe/EXE.go b/src/pe/EXE.go index 1a520b9..9baf3f1 100644 --- a/src/pe/EXE.go +++ b/src/pe/EXE.go @@ -20,7 +20,7 @@ type EXE struct { // Write writes the EXE file to the given writer. func Write(writer io.WriteSeeker, b *build.Build, codeBytes []byte, dataBytes []byte, libs dll.List) { - x := exe.New(HeaderEnd, b.FileAlign, b.MemoryAlign) + x := exe.New(HeaderEnd, b.FileAlign(), b.MemoryAlign()) x.InitSections(codeBytes, dataBytes, nil) code := x.Sections[0] data := x.Sections[1] @@ -36,7 +36,7 @@ func Write(writer io.WriteSeeker, b *build.Build, codeBytes []byte, dataBytes [] imports.Bytes = buffer.Bytes() importDirectoryStart := dllDataStart + len(dllData) importDirectorySize := DLLImportSize * len(dllImports) - imageSize := exe.Align(imports.MemoryOffset+len(imports.Bytes), b.MemoryAlign) + imageSize := exe.Align(imports.MemoryOffset+len(imports.Bytes), b.MemoryAlign()) if libs.Contains("user32") { subSystem = IMAGE_SUBSYSTEM_WINDOWS_GUI @@ -67,8 +67,8 @@ func Write(writer io.WriteSeeker, b *build.Build, codeBytes []byte, dataBytes [] AddressOfEntryPoint: uint32(code.MemoryOffset), BaseOfCode: uint32(code.MemoryOffset), ImageBase: BaseAddress, - SectionAlignment: uint32(b.MemoryAlign), // power of 2, must be greater than or equal to FileAlignment - FileAlignment: uint32(b.FileAlign), // power of 2 + SectionAlignment: uint32(b.MemoryAlign()), // power of 2, must be greater than or equal to FileAlignment + FileAlignment: uint32(b.FileAlign()), // power of 2 MajorOperatingSystemVersion: 0x06, MinorOperatingSystemVersion: 0, MajorImageVersion: 0, diff --git a/src/pe/EXE_test.go b/src/pe/EXE_test.go index b9e7c7e..46aa5c1 100644 --- a/src/pe/EXE_test.go +++ b/src/pe/EXE_test.go @@ -9,7 +9,7 @@ import ( ) func TestWrite(t *testing.T) { - pe.Write(&exe.Discard{}, &build.Build{Arch: build.ARM, FileAlign: 0x4000, MemoryAlign: 0x4000}, nil, nil, nil) - pe.Write(&exe.Discard{}, &build.Build{Arch: build.X86, FileAlign: 0x1000, MemoryAlign: 0x1000}, nil, nil, nil) - pe.Write(&exe.Discard{}, &build.Build{Arch: build.UnknownArch, FileAlign: 0x1000, MemoryAlign: 0x1000}, nil, nil, nil) + pe.Write(&exe.Discard{}, &build.Build{Arch: build.ARM}, nil, nil, nil) + pe.Write(&exe.Discard{}, &build.Build{Arch: build.X86}, nil, nil, nil) + pe.Write(&exe.Discard{}, &build.Build{Arch: build.UnknownArch}, nil, nil, nil) } \ No newline at end of file diff --git a/src/ssa2asm/Compiler_test.go b/src/ssa2asm/Compiler_test.go index 45271c5..d8b5f50 100644 --- a/src/ssa2asm/Compiler_test.go +++ b/src/ssa2asm/Compiler_test.go @@ -17,7 +17,7 @@ func TestHelloExample(t *testing.T) { b.OS = os for _, arch := range architectures { - b.SetArch(arch) + b.Arch = arch _, err := compiler.Compile(b) assert.Nil(t, err) }