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



我需要构建一个带有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

在研究这个问题时,我发现了以下问题:在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。你正在做的,添加libc.a而不-static,产生一个动态链接的二进制文件,但从libc.a中提取一些函数/文件(无论你引用什么,以及这些引用的所有内容,递归(,并且仍然有参与你的程序的共享libc.so。这些通常不能协同工作。

最新更新