将libgcc链接到- nostlib编译中



我正在尝试生成一个不依赖于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

我是从64位Ubuntu 14.04编译gcc 4.8.2(没什么花哨的)

最终我自己找到了解决方案。似乎gcc找不到这个库,也懒得抱怨。我执行了如下命令:

$ locate libgcc.a
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc.a
/usr/lib/gcc/x86_64-linux-gnu/4.8/32/libgcc.a
/usr/lib/gcc/x86_64-linux-gnu/4.8/x32/libgcc.a

然后,而不是给-static-libgcc编译器,我改变了标志如下:

gcc -m32 -nostdlib test.c -o test -L/usr/lib/gcc/x86_64-linux-gnu/4.8/32 -lgcc

它编译和运行得很好!


-L是多余的。

gcc -m32 -nostdlib test.c -o test -lgcc

相关内容

  • 没有找到相关文章

最新更新