Improved performance of the address resolver

This commit is contained in:
Eduard Urbach 2025-01-31 11:14:04 +01:00
parent dd6d1cc16c
commit be1b8723f4
Signed by: akyoto
GPG Key ID: C874F672B1AF20C0

View File

@ -26,10 +26,21 @@ func (a Assembler) Finalize(dlls dll.List) ([]byte, []byte) {
dataLabels map[string]Address dataLabels map[string]Address
codePointers []*Pointer codePointers []*Pointer
dataPointers []*Pointer dataPointers []*Pointer
funcPointers []*Pointer
dllPointers []*Pointer dllPointers []*Pointer
headerEnd = Address(0)
) )
switch config.TargetOS {
case "linux":
headerEnd = elf.HeaderEnd
case "macos":
headerEnd = macho.HeaderEnd
case "windows":
headerEnd = pe.HeaderEnd
}
codeStart, _ := fs.Align(headerEnd, config.Align)
for _, x := range a.Instructions { for _, x := range a.Instructions {
switch x.Mnemonic { switch x.Mnemonic {
case ADD: case ADD:
@ -241,7 +252,7 @@ func (a Assembler) Finalize(dlls dll.List) ([]byte, []byte) {
}, },
}) })
} else { } else {
funcPointers = append(funcPointers, &Pointer{ codePointers = append(codePointers, &Pointer{
Position: Address(len(code) - size), Position: Address(len(code) - size),
OpSize: uint8(opSize), OpSize: uint8(opSize),
Size: uint8(size), Size: uint8(size),
@ -252,7 +263,7 @@ func (a Assembler) Finalize(dlls dll.List) ([]byte, []byte) {
panic("unknown label") panic("unknown label")
} }
return Address(destination) return config.BaseAddress + codeStart + destination
}, },
}) })
} }
@ -320,7 +331,7 @@ func (a Assembler) Finalize(dlls dll.List) ([]byte, []byte) {
opSize := len(code) - size - start opSize := len(code) - size - start
memLabel := x.Data.(*MemoryLabel) memLabel := x.Data.(*MemoryLabel)
funcPointers = append(funcPointers, &Pointer{ codePointers = append(codePointers, &Pointer{
Position: Address(len(code) - size), Position: Address(len(code) - size),
OpSize: uint8(opSize), OpSize: uint8(opSize),
Size: uint8(size), Size: uint8(size),
@ -331,7 +342,7 @@ func (a Assembler) Finalize(dlls dll.List) ([]byte, []byte) {
panic("unknown label") panic("unknown label")
} }
return Address(destination) return config.BaseAddress + codeStart + destination
}, },
}) })
case *MemoryRegister: case *MemoryRegister:
@ -423,27 +434,9 @@ restart:
} }
} }
headerEnd := Address(0)
switch config.TargetOS {
case "linux":
headerEnd = elf.HeaderEnd
case "macos":
headerEnd = macho.HeaderEnd
case "windows":
headerEnd = pe.HeaderEnd
}
codeStart, _ := fs.Align(headerEnd, config.Align)
dataStart, _ := fs.Align(codeStart+Address(len(code)), config.Align) dataStart, _ := fs.Align(codeStart+Address(len(code)), config.Align)
data, dataLabels = a.Data.Finalize() data, dataLabels = a.Data.Finalize()
for _, pointer := range funcPointers {
address := config.BaseAddress + Address(codeStart) + pointer.Resolve()
slice := code[pointer.Position : pointer.Position+4]
binary.LittleEndian.PutUint32(slice, uint32(address))
}
for _, pointer := range dataPointers { for _, pointer := range dataPointers {
address := config.BaseAddress + Address(dataStart) + pointer.Resolve() address := config.BaseAddress + Address(dataStart) + pointer.Resolve()
slice := code[pointer.Position : pointer.Position+4] slice := code[pointer.Position : pointer.Position+4]