我有一份可以在Gas, NASM和YASM上运行的多平台Hello World代码,并且我希望将它们对应的可执行文件从76KB缩小到更合理的大小,因为一个基本的Hello World C程序会导致80KB的可执行文件,而汇编应该要小得多。我认为大部分可执行文件都是由于链接器选项中的垃圾填充而产生的。
如果我在LIBS中删除任何选项,则链接过程将失败,或者生成的可执行文件在运行时会引发Windows错误。因此,逻辑上应该用更简单的东西(如sys_write)替换puts调用,但我不知道如何在多平台上实现这一点。在线文档很少,说要使用int 0x80来调用内核,但这仅在Linux中有效,而在Windows中无效,我希望我的汇编代码是多平台的。
LIBS=c:/strawberry/c/i686-w64-mingw32/lib/crt2.o -Lc:/strawberry/c/i686-w64-mingw32/lib -lmingw32 -lmingwex -lmsvcrt
ld ld -o $(EXECUTABLE) hello.o $(LIBS)
hello.exe
Hello World!
代码:
.data
msg: .ascii "Hello World!\0"
.text
.global _main
_main:
pushl $msg
call _puts
leave
movl $0, %eax
ret
如果我在LIBS中删除任何选项,则链接过程将失败,或者生成的可执行文件在运行时会引发Windows错误。因此,逻辑上应该用更简单的东西(如sys_write)替换puts调用,但我不知道如何在多平台上实现这一点。在线文档很少,说要使用int 0x80来调用内核,但这仅在Linux中有效,而在Windows中无效,我希望我的汇编代码是多平台的。
int 80h
,而对于Windows,则可以使用Windows API调用(我不知道Windows API)。如果要创建真正小的ELF
可执行文件,一个有关在Linux上创建非常小的ELF可执行文件的旋风教程可能会很有趣(但在多平台汇编编程方面可能帮助不大)。 - nrzld ... -nostdlib
会导致可执行文件与之前完全相同的文件大小。而使用ld ... -nostartfiles
会导致在运行hello.exe时出现奇怪的错误:process_begin: CreateProcess(NULL, hello.exe, ...) failed.
。 - mcandre