【问题标题】:Statically linking libc into my binary causes it to segfault将 libc 静态链接到我的二进制文件会导致它出现段错误
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多