soham
soham

Reputation: 1676

Completely static linking with clang

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?

Upvotes: 8

Views: 20008

Answers (2)

Caique
Caique

Reputation: 188

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.

Upvotes: 2

zertyz
zertyz

Reputation: 705

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

Upvotes: 7

Related Questions