我需要构建一个带有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
。这些通常不能协同工作。