【问题标题】:Completely static linking with clang使用 clang 完全静态链接
【发布时间】:2018-03-19 17:07:32
【问题描述】:

如何使用 clang 生成完全静态的二进制文件?我使用了以下命令:

clang -flto <source files> -o <executable output> -fuse-ld=lld -static-libgcc -lc -Bstatic -m32

然而,生成的输出依赖于某个.so 文件:

$ ldd <executable output file>
    linux-gate.so.1 =>  (0xf77dd000)
    libc.so.6 => /lib/libc.so.6 (0xf75f0000)
    /lib/ld-linux.so.2 (0x5663b000)

The following answer 试图回答问题,但没有直接解决问题。 是否有可能生成完全独立的二进制文件? 或者我应该求助于使用 libgcc 以外的其他不同的 C 库实现?

如果是,那么如果我有源代码,例如newlib,如何将其与clang 链接?

【问题讨论】:

  • linux-gate.so 是系统调用接口,ld-linux.so 是 ELF 二进制解释器(参见:stackoverflow.com/questions/19981862/…)。您可能可以获得libc 的静态链接版本,但其他版本需要在那里。这就引出了一个问题:“为什么?”和“最终目的是什么?”除非你正在做一个引导加载程序或类似的......
  • 如果你静态链接libc.so,你通常会得到一个less可移植的可执行文件。
  • 我正在尝试在我的编译器中进行一些分析,为此我需要完全独立的二进制文件。
  • 您是否尝试过 -static 选项?您可能会发现某些您想要的库不是以静态形式提供的。您也许可以找到静态版本,或从源代码构建它们。
  • 我正在尝试在我的编译器中进行一些分析,为此我需要完全独立的二进制文件所以这是XY problem. 什么问题在分析您的编译器时,您认为完全静态链接的二进制文件可以解决吗?

标签: c gcc linker clang llvm


【解决方案1】:

只需使用 clang 的 -static 标志编译它。

根据你的情况,试试:

clang -flto <source files> -o <executable output> -static -m32

我的测试程序显示的结果:

[root@interserver ogrerobot.com]# ldd ./CppUtilsSpikes  
not a dynamic executable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2010-09-07
    相关资源
    最近更新 更多