首页 > 解决方案 > 将 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

在研究这个时,我发现了以下问题:Linking partial static and partial 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 ()  

不太清楚如何解释这一点。有人有想法么?

标签: cgccstatic-librarieslibc

解决方案


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


推荐阅读