【发布时间】:2019-12-11 23:06:46
【问题描述】:
我需要使用静态链接的 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? -
@R...利基问题)。我不确定如何使用
-static,但我假设我的方法达到了同样的效果,不是吗? -
不,它没有达到同样的效果。
-
可能要尝试的一件事是使用
-static参数和-v一起运行gcc,这样你就可以看到GNU 会做什么来构建它,这样你就可以定制命令适合您的独特情况。 -
这个
libc.a来自哪里?
标签: c gcc static-libraries libc