使用clang进行完全静态链接

5
我该如何使用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)
以下回答 尝试回答这个问题,但并未直接解决问题。 是否可能生成完全独立的二进制文件? 或者我应该使用除libgcc之外的其他不同C库实现来解决问题吗?
如果可以,那么如果我拥有例如newlib的源代码,我该如何将其与clang链接?

1
linux-gate.so 是系统调用接口,而 ld-linux.so 则是 ELF 二进制解释器(参见:https://dev59.com/dmIj5IYBdhLWcg3wsnGn)。你可能能够获得一个静态链接版本的 libc,但其他文件必须存在。这引出了一个问题:“为什么?”和“最终目的是什么?”除非你正在做一个引导加载程序或类似的东西... - Craig Estey
如果你静态链接 libc.so,通常会得到一个不太可移植的可执行文件。 - Andrew Henle
我正在尝试在我的编译器中进行一些分析,我需要完全独立的二进制文件来实现这一点。 - soham
你尝试过使用"-static"选项吗?你可能会发现一些你需要的库没有静态形式可用。你可以尝试寻找已编译的静态版本或者从源代码构建它们。 - Gem Taylor
1
我正在尝试对我的编译器进行一些分析,我需要一个完全独立的二进制文件来完成这个过程。因此,这是一个XY问题。您认为使用完全静态链接的二进制文件能够解决您在分析编译器方面遇到的哪个问题呢? - Andrew Henle
为了在编译器基础设施中分析C标准库函数,我需要获取这些函数。因此,我想使用Clang构建一个C标准库,以便进行分析。 - soham
2个回答

5

只需使用clang的静态标志进行编译即可。

在您的情况下,尝试:

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

我的测试程序结果显示:
[root@interserver ogrerobot.com]# ldd ./CppUtilsSpikes  
not a dynamic executable

1

如果你和我一样,希望达尔文在某种程度上像Linux一样表现,不幸的是,情况并非如此。

苹果完全支持静态库;如果你想创建一个,只需从适当的Xcode项目或目标模板开始。

苹果不支持在Mac OS X上使用静态链接的二进制文件。静态链接的二进制文件假设在内核系统调用接口上存在二进制兼容性,而我们对此没有任何保证。相反,我们努力确保每个动态链接系统库和框架的二进制兼容性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接