Added a linker
All checks were successful
/ test (push) Successful in 15s

This commit is contained in:
Eduard Urbach 2025-06-23 16:19:16 +02:00
parent 3ae47f93eb
commit cc2e98ca49
Signed by: akyoto
GPG key ID: 49226B848C78F6C8
26 changed files with 541 additions and 11 deletions

View file

@ -0,0 +1,50 @@
package linker
import (
"encoding/binary"
"os"
"git.urbach.dev/cli/q/src/arm"
"git.urbach.dev/cli/q/src/build"
"git.urbach.dev/cli/q/src/core"
"git.urbach.dev/cli/q/src/elf"
"git.urbach.dev/cli/q/src/x86"
)
// WriteExecutable writes an executable file to disk.
func WriteExecutable(b *build.Build, result *core.Environment) error {
executable := b.Executable()
file, err := os.Create(executable)
if err != nil {
return err
}
code := []byte{}
data := []byte{}
switch b.Arch {
case build.ARM:
code = arm.MoveRegisterNumber(code, arm.X8, 93)
code = arm.MoveRegisterNumber(code, arm.X0, 0)
code = binary.LittleEndian.AppendUint32(code, arm.Syscall())
case build.X86:
code = x86.MoveRegisterNumber(code, x86.R0, 60)
code = x86.MoveRegisterNumber(code, x86.R7, 0)
code = x86.Syscall(code)
}
switch b.OS {
case build.Linux:
elf.Write(file, b, code, data)
}
err = file.Close()
if err != nil {
return err
}
return os.Chmod(executable, 0755)
}