32位模式下NASM与GCC
C文件依然没变:
1 | #include <stdio.h> |
test.asm 如下:
1 | ; test2.asm |
注意do_something前的“_”,本来没有加,然后就报错了(undefined reference to `do_something'
)。
在谷歌上看到这么一句话:
C编译器通常会在所有外部作用域程序标识符前面加下划线,以避免与运行时语言支持的影响相冲突。 此外,当C / C ++编译器需要在外部链接中引入名称作为翻译过程的一部分时,这些名称通常以多个前导或尾部下划线的组合来区分。这种做法后来被编纂为C和C ++语言标准的一部分,其中使用领先的下划线被保留用于执行。
使用NASM:
1 | $ nasm -f win32 -o test.obj test.asm |
MINGW32-w32-GCC
1 | $ w32gcc test.c test.obj -o test.exe |
再加上IDA Pro上的反编译结果吧:
1 | int __cdecl main(int argc, const char **argv, const char **envp) |