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

Sam*_*D20 2 c gcc libc static-libraries

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

gcc -o foo foo.c libc.a 
Run Code Online (Sandbox Code Playgroud)

这导致了以下问题:

/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
Run Code Online (Sandbox Code Playgroud)

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

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

gcc -o foo foo.c mystrcmp.c libc.a 
Run Code Online (Sandbox Code Playgroud)

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

(gdb) backtrace                                
#0  0x00000000004fe48e in generic_start_main ()
#1  0x00000000004fe891 in __libc_start_main () 
#2  0x0000000000406b56 in _start ()  
Run Code Online (Sandbox Code Playgroud)

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

R..*_*R.. 5

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