【发布时间】:2012-09-20 20:42:10
【问题描述】:
我在 Gas、NASM 和 YASM 中有工作的多平台 Hello World 代码,我想将它们对应的可执行文件从 76KB 缩小到对于 Hello World 汇编程序更合理的东西,看到因为一个基本的 Hello World C 程序导致一个 80KB 的可执行文件,并且程序集应该小得多。我相信大部分可执行文件都充满了来自链接器选项的垃圾。
追踪:
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 错误。所以合乎逻辑的做法是将puts 调用替换为更简单的调用,例如 sys_write,但我不知道如何实现这个多平台。网上的小文档说要使用int 0x80 来调用内核,但这仅适用于Linux,不适用于Windows,我希望我的汇编代码是多平台的。
【问题讨论】:
-
您可以使用条件汇编,例如。在 NASM 中,这样使用例如。
int 80h适用于 Linux,对于 Windows,您可以使用 Windows API 调用(我不了解 Windows API)。对于创建非常小的ELF可执行文件,A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux 可能很有趣(但在多平台汇编编程中可能没有多大帮助)。 -
C 语言中的 Hello World 程序通常占用 80K 的原因是由于 C 运行时库,而不是代码大小。如果你不在 CRT 中链接,你的 EXE 应该是 5-10K。
-
@BitBank,谢谢!你能帮我重写代码,让它不依赖于 C 运行时吗?
-
@nrz,Teensy 是正确的想法,但你是对的,这还不够。
ld ... -nostdlib导致可执行文件的文件大小与以前完全相同。ld ... -nostartfiles会导致一个可执行文件在运行 hello.exe 时显示一个奇怪的错误:process_begin: CreateProcess(NULL, hello.exe, ...) failed.。
标签: optimization assembly filesize