gpt4 book ai didi

c - 尝试链接静态 C 标准库时出错

转载 作者:太空狗 更新时间:2023-10-29 15:25:51 25 4
gpt4 key购买 nike

我的操作系统是 ubuntu 14.04 32bit,我的源程序 test.c 是:

#include <stdio.h>
int main(int argc, char *argv[])
{
printf("test.");
return;
}

我用命令编译它:

gcc -S test.c

输出为test.s文件。我用命令组装它:

as -o test.o test.s

然后我想把它和c标准库静态链接起来。我搜索了 libc.a 文件,它位于 /usr/lib/i386-linux-gnu/libc.a。所以我尝试将它与命令链接:

ld test.o /usr/lib/i386-linux-gnu/libc.a

但是出现了很多错误信息:

ld: warning: cannot find entry symbol _start; defaulting to 0000000008048210
/usr/lib/i386-linux-gnu/libc.a(backtrace.o): In function `backtrace_helper':
(.text+0x20): undefined reference to `_Unwind_GetIP'
/usr/lib/i386-linux-gnu/libc.a(backtrace.o): In function `backtrace_helper':
(.text+0x45): undefined reference to `_Unwind_GetGR'
/usr/lib/i386-linux-gnu/libc.a(backtrace.o): In function `backtrace_helper':
(.text+0x50): undefined reference to `_Unwind_GetCFA'
/usr/lib/i386-linux-gnu/libc.a(backtrace.o): In function `__backtrace':
(.text+0xb1): undefined reference to `_Unwind_Backtrace'
/usr/lib/i386-linux-gnu/libc.a(iofclose.o): In function `_IO_new_fclose':
(.text+0x1b1): undefined reference to `_Unwind_Resume'
/usr/lib/i386-linux-gnu/libc.a(iofclose.o):(.eh_frame+0x167): undefined reference to `__gcc_personality_v0'
/usr/lib/i386-linux-gnu/libc.a(iofflush.o): In function `_IO_fflush':
(.text+0xd7): undefined reference to `_Unwind_Resume'
/usr/lib/i386-linux-gnu/libc.a(iofflush.o):(.eh_frame+0xdf): undefined reference to `__gcc_personality_v0'
/usr/lib/i386-linux-gnu/libc.a(iofputs.o): In function `_IO_fputs':
(.text+0xf9): undefined reference to `_Unwind_Resume'
/usr/lib/i386-linux-gnu/libc.a(iofputs.o):(.eh_frame+0xdf): undefined reference to `__gcc_personality_v0'
/usr/lib/i386-linux-gnu/libc.a(iofwrite.o): In function `_IO_fwrite':
(.text+0x139): undefined reference to `_Unwind_Resume'
/usr/lib/i386-linux-gnu/libc.a(iofwrite.o):(.eh_frame+0xdf): undefined reference to `__gcc_personality_v0'
/usr/lib/i386-linux-gnu/libc.a(iogetdelim.o): In function `_IO_getdelim':
(.text+0x285): undefined reference to `_Unwind_Resume'
/usr/lib/i386-linux-gnu/libc.a(iogetdelim.o):(.eh_frame+0xdf): undefined reference to `__gcc_personality_v0'
/usr/lib/i386-linux-gnu/libc.a(wfileops.o): In function `_IO_wfile_underflow':
(.text+0x5fc): undefined reference to `_Unwind_Resume'
/usr/lib/i386-linux-gnu/libc.a(wfileops.o):(.eh_frame+0x137): undefined reference to `__gcc_personality_v0'
/usr/lib/i386-linux-gnu/libc.a(fileops.o): In function `_IO_new_file_underflow':
(.text+0x40b): undefined reference to `_Unwind_Resume'
/usr/lib/i386-linux-gnu/libc.a(fileops.o):(.eh_frame+0x1b3): undefined reference to `__gcc_personality_v0'
/usr/lib/i386-linux-gnu/libc.a(strtof_l.o): In function `____strtof_l_internal':
(.text+0xbc6): undefined reference to `__divdi3'
/usr/lib/i386-linux-gnu/libc.a(strtof_l.o): In function `____strtof_l_internal':
(.text+0xc08): undefined reference to `__moddi3'
/usr/lib/i386-linux-gnu/libc.a(strtof_l.o): In function `____strtof_l_internal':
(.text+0x249d): undefined reference to `__divdi3'
/usr/lib/i386-linux-gnu/libc.a(strtod_l.o): In function `____strtod_l_internal':
(.text+0xcc9): undefined reference to `__divdi3'
/usr/lib/i386-linux-gnu/libc.a(strtod_l.o): In function `____strtod_l_internal':
(.text+0xd0b): undefined reference to `__moddi3'
...
...

我的问题是,为什么会出现这些错误消息?我正在尝试了解编译系统是如何工作的,所以与其知道如何解决这个问题,我更想知道它是如何以这种方式出现的。静态 C 库似乎依赖于其他库,为什么以及那些库是什么?

编辑:我这样做是因为我想知道事情是如何工作的,所以我宁愿避免使用 gcc 脚本。

最佳答案

您还需要 crt0启动目标文件(除了静态 libc.a),特别是定义 _start 入口点(在您的 ELF 可执行文件中)并包含 ABI调用 main 的特定(序言和结尾)代码(最后处理 atexit(3) 注册的处理程序和 stdio 刷新)。低级libgcc也是需要的。细节很复杂并且特定于实现。要理解它们,请将您的测试代码编译为

gcc -v -static test.c -o mytest

(避免调用可执行文件 test,因为它会与 /usr/bin/test 或您的 shell 的内置函数发生冲突)

在实践中,最好至少链接到 gcc

如果你很好奇,利用 Linux 主要是 free software并研究源代码(例如 GCC 的,C standard library 的,binutils 的,等等...)。你可能会发现 musl-libc有趣。

I'd rather avoid the gcc script

从技术上讲,gcc 不是一个脚本,而是一个驱动程序(请参阅 gcc/gcc.c 的源代码中的 GCC)。但它会运行 ld 确实会运行一些 linker scripts .实际编译由 cc1 完成它由 gcc 程序启动。

关于c - 尝试链接静态 C 标准库时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40397209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com