Completely static linking with clang
Asked Answered
U

2

7

How can I generate completely static binaries with clang? I have used the following command:

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

And yet, the generated output depends on a certain .so file:

$ 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 tries to answer the question but doesn't directly address the problem. Is it even possible, to generate completely independent binaries? Or should I have resort to using other different C library implementations other than libgcc?

If yes, then how do I link it with clang if I have the source code, of for example newlib?

Umbrian answered 19/3, 2018 at 17:7 Comment(6)
linux-gate.so is the syscall interface and ld-linux.so is the ELF binary interpreter (See: #19982362). You might be able to get a statically linked version of libc but the others need to be there. This begs the question: "Why?" and "What is the ultimate purpose?" Unless you're doing a boot loader or some such ...Gemeinschaft
If you statically link libc.so, you usually get an executable that is less portable.Schadenfreude
I am trying to make some analysis in my compiler, and I need completely independent binary for that.Umbrian
Have you tried the -static option? You may find that some of the libraries you want are not available in a static form. You may be able to find static versions, or build them from source.Thickness
I am trying to make some analysis in my compiler, and I need completely independent binary for that So this is an XY problem. What problem in analyzing your compiler do you think a completely statically-linked binary solves?Schadenfreude
It would be giving me the C standard library functions to my analysis in the compiler infrastructure. That is why I want to build a C standard library with Clang, so that I can analyse them.Umbrian
B
6

Just compile it using the clang's -static flag.

On your case, try:

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

The results on my test program show:

[root@interserver ogrerobot.com]# ldd ./CppUtilsSpikes  
not a dynamic executable
Biegel answered 4/1, 2019 at 0:57 Comment(0)
T
2

If you, like me, got here expecting Darwin would behave somewhat similarly to Linux, that unfortunately isn't the case

Apple fully supports static libraries; if you want to create one, just start with the appropriate Xcode project or target template.

Apple does not support statically linked binaries on Mac OS X. A statically linked binary assumes binary compatibility at the kernel system call interface, and we do not make any guarantees on that front. Rather, we strive to ensure binary compatibility in each dynamically linked system library and framework.

Tahr answered 11/7, 2023 at 2:34 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.