1,4 → 1,4 |
(* |
(* |
BSD 2-Clause License |
|
Copyright (c) 2018-2019, Anton Krotov |
7,7 → 7,7 |
|
MODULE PE32; |
|
IMPORT BIN, LISTS, UTILS, WR := WRITER, mConst := CONSTANTS, CHL := CHUNKLISTS; |
IMPORT BIN, LISTS, UTILS, WR := WRITER, CHL := CHUNKLISTS; |
|
|
CONST |
165,13 → 165,9 |
Relocations: LISTS.LIST; |
bit64: BOOLEAN; |
libcnt: INTEGER; |
SizeOfWord: INTEGER; |
|
|
PROCEDURE SIZE (): INTEGER; |
RETURN SIZE_OF_DWORD * (ORD(bit64) + 1) |
END SIZE; |
|
|
PROCEDURE Export (program: BIN.PROGRAM; DataRVA: INTEGER; VAR ExportDir: IMAGE_EXPORT_DIRECTORY): INTEGER; |
BEGIN |
|
258,7 → 254,7 |
import := import.next(BIN.IMPRT) |
END |
|
RETURN (libcnt + 1) * 5 * SIZE_OF_DWORD + (proccnt + libcnt) * 2 * SIZE() |
RETURN (libcnt + 1) * 5 * SIZE_OF_DWORD + (proccnt + libcnt) * 2 * SizeOfWord |
END GetImportSize; |
|
|
266,33 → 262,34 |
VAR |
reloc: BIN.RELOC; |
iproc: BIN.IMPRT; |
L: INTEGER; |
delta: INTEGER; |
AdrImp: INTEGER; |
code: CHL.BYTELIST; |
L, delta, delta0, AdrImp: INTEGER; |
|
BEGIN |
AdrImp := Address.Import + (libcnt + 1) * 5 * SIZE_OF_DWORD; |
code := program.code; |
reloc := program.rel_list.first(BIN.RELOC); |
delta0 := 3 - 7 * ORD(bit64); |
|
reloc := program.rel_list.first(BIN.RELOC); |
WHILE reloc # NIL DO |
|
L := BIN.get32le(program.code, reloc.offset); |
delta := 3 - reloc.offset - Address.Code - 7 * ORD(bit64); |
L := BIN.get32le(code, reloc.offset); |
delta := delta0 - reloc.offset - Address.Code; |
|
CASE reloc.opcode OF |
|
|BIN.PICDATA: |
BIN.put32le(program.code, reloc.offset, L + Address.Data + delta) |
BIN.put32le(code, reloc.offset, L + Address.Data + delta) |
|
|BIN.PICCODE: |
BIN.put32le(program.code, reloc.offset, BIN.GetLabel(program, L) + Address.Code + delta) |
BIN.put32le(code, reloc.offset, BIN.GetLabel(program, L) + Address.Code + delta) |
|
|BIN.PICBSS: |
BIN.put32le(program.code, reloc.offset, L + Address.Bss + delta) |
BIN.put32le(code, reloc.offset, L + Address.Bss + delta) |
|
|BIN.PICIMP: |
iproc := BIN.GetIProc(program, L); |
BIN.put32le(program.code, reloc.offset, iproc.FirstThunk * SIZE() + AdrImp + delta) |
BIN.put32le(code, reloc.offset, iproc.FirstThunk * SizeOfWord + AdrImp + delta) |
|
END; |
|
418,7 → 415,6 |
i: INTEGER; |
|
BEGIN |
|
WriteWord(file, h.Magic); |
|
WR.WriteByte(file, h.MajorLinkerVersion); |
499,6 → 495,7 |
|
BEGIN |
bit64 := amd64; |
SizeOfWord := SIZE_OF_DWORD * (ORD(bit64) + 1); |
Relocations := LISTS.create(NIL); |
|
Size.Code := CHL.Length(program.code); |
532,8 → 529,8 |
PEHeader.FileHeader.Characteristics := WCHR(010EH + (20H - 100H) * ORD(amd64) + 2000H * ORD(dll)); |
|
PEHeader.OptionalHeader.Magic := WCHR(010BH + 100H * ORD(amd64)); |
PEHeader.OptionalHeader.MajorLinkerVersion := mConst.vMajor; |
PEHeader.OptionalHeader.MinorLinkerVersion := mConst.vMinor; |
PEHeader.OptionalHeader.MajorLinkerVersion := UTILS.vMajor; |
PEHeader.OptionalHeader.MinorLinkerVersion := UTILS.vMinor; |
PEHeader.OptionalHeader.SizeOfCode := align(Size.Code, FileAlignment); |
PEHeader.OptionalHeader.SizeOfInitializedData := 0; |
PEHeader.OptionalHeader.SizeOfUninitializedData := 0; |
658,7 → 655,7 |
n := (libcnt + 1) * 5; |
ImportTable := CHL.CreateIntList(); |
|
FOR i := 0 TO (Size.Import - n * SIZE_OF_DWORD) DIV SIZE() + n - 1 DO |
FOR i := 0 TO (Size.Import - n * SIZE_OF_DWORD) DIV SizeOfWord + n - 1 DO |
CHL.PushInt(ImportTable, 0) |
END; |
|
666,11 → 663,11 |
import := program.imp_list.first(BIN.IMPRT); |
WHILE import # NIL DO |
IF import.label = 0 THEN |
CHL.SetInt(ImportTable, i + 0, import.OriginalFirstThunk * SIZE() + SectionHeaders[3].VirtualAddress + n * SIZE_OF_DWORD); |
CHL.SetInt(ImportTable, i + 0, import.OriginalFirstThunk * SizeOfWord + SectionHeaders[3].VirtualAddress + n * SIZE_OF_DWORD); |
CHL.SetInt(ImportTable, i + 1, 0); |
CHL.SetInt(ImportTable, i + 2, 0); |
CHL.SetInt(ImportTable, i + 3, import.nameoffs + Size.Import + SectionHeaders[3].VirtualAddress); |
CHL.SetInt(ImportTable, i + 4, import.FirstThunk * SIZE() + SectionHeaders[3].VirtualAddress + n * SIZE_OF_DWORD); |
CHL.SetInt(ImportTable, i + 4, import.FirstThunk * SizeOfWord + SectionHeaders[3].VirtualAddress + n * SIZE_OF_DWORD); |
i := i + 5 |
END; |
import := import.next(BIN.IMPRT) |