diff --git a/Compiler.exe b/Compiler.exe index 7ad8016..1586837 100644 Binary files a/Compiler.exe and b/Compiler.exe differ diff --git a/SelfWin32.cmd b/SelfWin32.cmd index b025688..ba41874 100644 --- a/SelfWin32.cmd +++ b/SelfWin32.cmd @@ -1,2 +1,2 @@ -Compiler.exe source\Compiler.ob07 win32con -out bin\Compiler32.exe -stk 2 +Compiler.exe source\Compiler.ob07 win32con -out bin\Compiler32.exe -stk 2 -fa 512 @pause diff --git a/SelfWin64.cmd b/SelfWin64.cmd index 8b4b0ef..71c2ea3 100644 --- a/SelfWin64.cmd +++ b/SelfWin64.cmd @@ -1,2 +1,2 @@ -Compiler.exe source\Compiler.ob07 win64con -out bin\Compiler.exe -stk 2 +Compiler.exe source\Compiler.ob07 win64con -out bin\Compiler.exe -stk 2 -fa 512 @pause diff --git a/compiler b/compiler index 48619cf..8808960 100755 Binary files a/compiler and b/compiler differ diff --git a/doc/x86.txt b/doc/x86.txt index e9f5730..76c454c 100644 --- a/doc/x86.txt +++ b/doc/x86.txt @@ -34,6 +34,8 @@ UTF-8 с BOM-сигнатурой. -def <имя> задать символ условной компиляции -ver версия программы (только для kosdll) -uses вывести список импортированных модулей + -fa выравнивание секций файла PE32 в байтах, возможные значения: + 512, 1024, 2048, 4096. По умолчанию - 512 параметр -nochk задается в виде строки из символов: "p" - указатели diff --git a/doc/x86_64.txt b/doc/x86_64.txt index a3e8e09..0f6385f 100644 --- a/doc/x86_64.txt +++ b/doc/x86_64.txt @@ -31,6 +31,8 @@ UTF-8 с BOM-сигнатурой. идентификаторов -def <имя> задать символ условной компиляции -uses вывести список импортированных модулей + -fa выравнивание секций файла PE32 в байтах, возможные значения: + 512, 1024, 2048, 4096. По умолчанию - 512 параметр -nochk задается в виде строки из символов: "p" - указатели diff --git a/source/AMD64.ob07 b/source/AMD64.ob07 index 9242cb1..b1cf0f7 100644 --- a/source/AMD64.ob07 +++ b/source/AMD64.ob07 @@ -2414,7 +2414,7 @@ BEGIN BIN.fixup(prog); IF TARGETS.OS = TARGETS.osWIN64 THEN - PE32.write(prog, outname, target = TARGETS.Win64C, target = TARGETS.Win64DLL, TRUE) + PE32.write(prog, outname, target = TARGETS.Win64C, target = TARGETS.Win64DLL, TRUE, options.PE32FileAlignment) ELSIF TARGETS.OS = TARGETS.osLINUX64 THEN ELF.write(prog, outname, sofinit, target = TARGETS.Linux64SO, TRUE) END diff --git a/source/Compiler.ob07 b/source/Compiler.ob07 index 7ea35d6..6ed5efd 100644 --- a/source/Compiler.ob07 +++ b/source/Compiler.ob07 @@ -66,6 +66,9 @@ BEGIN DEC(i) END + ELSIF param = "-fa" THEN + getVal(i, options.PE32FileAlignment) + ELSIF param = "-out" THEN INC(i); UTILS.GetArg(i, param); @@ -255,6 +258,7 @@ BEGIN C.StringLn(" -rom set size of ROM in bytes (MSP430) or Kbytes (STM32)"); C.Ln; C.StringLn(" -tab set width for tabs"); C.Ln; C.StringLn(" -uses list imported modules"); C.Ln; + C.StringLn(" -fa set PE32 file alignment {512 (def.), 1024, 2048, 4096}"); C.Ln; UTILS.Exit(0) END; diff --git a/source/PE32.ob07 b/source/PE32.ob07 index 30a4ed3..0d06f56 100644 --- a/source/PE32.ob07 +++ b/source/PE32.ob07 @@ -1,7 +1,7 @@ (* BSD 2-Clause License - Copyright (c) 2018-2020, Anton Krotov + Copyright (c) 2018-2020, 2023, Anton Krotov All rights reserved. *) @@ -32,7 +32,6 @@ CONST SHC_bss = 0C0000080H; SectionAlignment = 1000H; - FileAlignment = 200H; TYPE @@ -155,6 +154,7 @@ VAR SectionHeaders: ARRAY 16 OF IMAGE_SECTION_HEADER; libcnt: INTEGER; SizeOfWord: INTEGER; + FileAlignment: INTEGER; PROCEDURE Export (program: BIN.PROGRAM; name: INTEGER; VAR ExportDir: IMAGE_EXPORT_DIRECTORY): INTEGER; @@ -348,7 +348,7 @@ BEGIN END WriteFileHeader; -PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; console, dll, amd64: BOOLEAN); +PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; console, dll, amd64: BOOLEAN; fa: INTEGER); VAR i, n, temp: INTEGER; @@ -465,6 +465,12 @@ VAR BEGIN + IF (fa = 512) OR (fa = 1024) OR (fa = 2048) OR (fa = 4096) THEN + FileAlignment := fa + ELSE + FileAlignment := 512 + END; + SizeOfWord := SIZE_OF_DWORD * (ORD(amd64) + 1); Size.Code := CHL.Length(program.code); @@ -516,7 +522,7 @@ BEGIN OptionalHeader.MinorSubsystemVersion := 0X; OptionalHeader.Win32VersionValue := 0H; OptionalHeader.SizeOfImage := SectionAlignment; - OptionalHeader.SizeOfHeaders := 400H; + OptionalHeader.SizeOfHeaders := MAX(FileAlignment, 1024); OptionalHeader.CheckSum := 0; OptionalHeader.Subsystem := WCHR((2 + ORD(console)) * ORD(~dll)); OptionalHeader.DllCharacteristics := 0040X; diff --git a/source/PROG.ob07 b/source/PROG.ob07 index c1bfd45..ab9028d 100644 --- a/source/PROG.ob07 +++ b/source/PROG.ob07 @@ -73,7 +73,7 @@ TYPE OPTIONS* = RECORD - version*, stack*, ram*, rom*, tab*: INTEGER; + version*, stack*, ram*, rom*, tab*, PE32FileAlignment*: INTEGER; pic*, lower*, uses*: BOOLEAN; checking*: SET diff --git a/source/UTILS.ob07 b/source/UTILS.ob07 index eead29b..7ab8954 100644 --- a/source/UTILS.ob07 +++ b/source/UTILS.ob07 @@ -23,8 +23,8 @@ CONST max32* = 2147483647; vMajor* = 1; - vMinor* = 64; - Date* = "22-jan-2023"; + vMinor* = 65; + Date* = "04-feb-2023"; FILE_EXT* = ".ob07"; RTL_NAME* = "RTL"; diff --git a/source/X86.ob07 b/source/X86.ob07 index 45a4058..982943f 100644 --- a/source/X86.ob07 +++ b/source/X86.ob07 @@ -2486,7 +2486,7 @@ BEGIN BIN.fixup(program); IF TARGETS.OS = TARGETS.osWIN32 THEN - PE32.write(program, outname, target = TARGETS.Win32C, target = TARGETS.Win32DLL, FALSE) + PE32.write(program, outname, target = TARGETS.Win32C, target = TARGETS.Win32DLL, FALSE, opt.PE32FileAlignment) ELSIF target = TARGETS.KolibriOS THEN KOS.write(program, outname) ELSIF target = TARGETS.KolibriOSDLL THEN