这个简单的测试用例:
#include <unistd.h>
void _start(void) {
_exit(0);
}
在 Debian 12.6 i386 上运行时崩溃。
用
gcc -lc -nostdlib -static -Os
编译。请注意,这是在 i386 版本的 Debian 上。
在 gdb 中:
0x804905b <_exit+59> call *%gs:0x10
$gs
为 0。
如果我删除对
_exit
的调用,它仍然会崩溃。
Debian i386 在没有 main 的情况下运行静态 exe 时会感到厌烦吗?我在 amd64 系统(带有 clang 的 FreeBSD 14.0 和 Fedora 39)上没有问题。当我有空的时候我会尝试一下 FreeBSD i386。
在退出手册页按照以下步骤:
直到 glibc 2.3,_exit() 包装函数调用内核 同名的系统调用。 从 glibc 2.3 开始,包装函数 调用 exit_group(2),以终止 a 中的所有线程 过程。
_exit函数需要调用2.3版本glibc的库函数。我认为 debian 12.6 使用 glibc 2.3,而你提到的其他系统使用之前的版本。但是,我不确定如果是这种情况,您如何能够静态编译它。