我正在尝试生成一个不依赖于 libc (或任何其他)的可执行文件。首先我做了这个:
// test.c
void _start()
{
// write(1, "hello!\n", 7);
asm ("int $0x80"::"a"(4), "b"(1), "c"("hello!\n"), "d"(7));
// exit(0);
asm ("int $0x80"::"a"(1), "b"(0));
}
编译gcc -m32 -nostdlib test.c -o test
:
hello
到目前为止,一切都很好。后来我尝试使用一些更“高级”的 C 语言,例如long long
. 在 32 位平台(我的情况)上,这需要libgcc
:
// test.c
void _start()
{
volatile long long int a = 10;
volatile long long int b = 5;
volatile int c = a/b; // Implemented as a call to '__divdi3'
}
这会导致编译失败undefined reference to '__divdi3'
。似乎正确,因为我实际上并没有告诉它链接。但是添加标志-static-libgcc
并不能解决问题!为什么?
请注意,我无法动态链接到 libgcc。以下必须成立:
$ ldd test
not a dynamic executable
我正在使用 gcc 4.8.2(没什么花哨的)从 64 位 Ubuntu 14.04 编译。