将libgcc链接到-nostdlib编译

时间:2014-05-01 14:55:07

标签: c gcc libgcc

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

到目前为止一切顺利。后来我尝试使用更像long long的“高级”C语言。在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编译(没什么特别的。)

1 个答案:

答案 0 :(得分: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