首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将libgcc链接到-nostdlib编译中

将libgcc链接到-nostdlib编译中
EN

Stack Overflow用户
提问于 2014-05-01 14:55:06
回答 1查看 3.4K关注 0票数 3

我试图在不依赖libc (或任何其他)的情况下生成一个可执行文件。首先,我这样做了:

代码语言:javascript
复制
// 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编译

代码语言:javascript
复制
hello

到目前一切尚好。后来,我尝试使用一些更“高级”的C,比如long long。在32位平台上(我的情况),这需要libgcc

代码语言:javascript
复制
// 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。下列情况必须成立:

代码语言:javascript
复制
$ ldd test
    not a dynamic executable

我正在编译64位Ubuntu 14.04与gcc 4.8.2 (没什么稀奇)。

EN

回答 1

Stack Overflow用户

发布于 2014-05-01 15:11:01

最终我自己找到了解决方案。看来gcc找不到图书馆,也没有抱怨过。我运行了以下命令:

代码语言:javascript
复制
$ 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交给编译器,而是将标志更改为:

代码语言:javascript
复制
gcc -m32 -nostdlib test.c -o test -L/usr/lib/gcc/x86_64-linux-gnu/4.8/32 -lgcc

它编译和运行都很好!

-L是多余的。下列措施也有效:

代码语言:javascript
复制
gcc -m32 -nostdlib test.c -o test -lgcc
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23410221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档