gpt4 book ai didi

c - 将 libc 静态链接到我的二进制文件会导致出现段错误

转载 作者:行者123 更新时间:2023-12-02 03:04:45 27 4
gpt4 key购买 nike

我需要构建一个静态链接 libc 的二进制文件。我在与源代码相同的目录中提供了 libc.a 。为了编译,我尝试了以下操作:

gcc -o foo foo.c libc.a 

这导致了以下问题:

/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `libc.a(strcmp.o)' can not be used when making an executable

在研究这个问题时,我发现了以下问题:Linking partially static and partially dynamic in GCC

按照顶部答案中的解决方案,我在 my_strcmp.c 中创建了自己的字符串比较函数,并尝试了以下编译:

gcc -o foo foo.c mystrcmp.c libc.a 

它确实有效,但是二进制文件现在很早就出现了段错误。如果没有静态链接 libc,这种情况就不会发生。这是 GDB 跟踪:

(gdb) backtrace                                
#0 0x00000000004fe48e in generic_start_main ()
#1 0x00000000004fe891 in __libc_start_main ()
#2 0x0000000000406b56 in _start ()

不太确定如何解释这一点。有人有主意吗?

最佳答案

如果您想生成静态链接的二进制文件,只需将 -static 添加到命令行即可。您根本不需要 libc.a 。您正在做的事情,添加不带 -staticlibc.a ,会生成一个动态链接的二进制文件,但会引入一些函数/文件(无论您引用什么,以及这些函数/文件)从 libc.a 递归引用),并且仍然有共享的 libc.so 参与您的程序。这些通常无法一起工作。

关于c - 将 libc 静态链接到我的二进制文件会导致出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59295473/

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