-static option for gcc?

87,887

Solution 1

The -static option links a program statically, in other words it does not require a dependency on dynamic libraries at runtime in order to run.

To achieve static linking requires that the archive (.a) versions of your libraries exist on the system. so /usr/lib/libc.a /usr/lib/crt1.o etc...

On modern linux systems (as you are using red hat): when a binary links together it 1) either puts the code into the executable via .o and .a files, or 2) puts in references to dynamic libraries (.so) files that is resolved by /lib/ld-linux.so (or /lib64/ld-linux=x86-64.so) which is always at a well known place.

For your particular system, if a program is specifically looking to create a static version of itself then you need to install the static versions of your devel tools. You need, at the minimum, glibc-static package. You may also need libstdc++-static package as well.

Solution 2

The -static flag forces the linker to accept only static libraries and not any shared libraries.

If you want to use -static, you have to ensure that you have a static version of the C library installed, which might be tricky to find (most systems do not have a static C library any more). Or you have to cancel the effect of -static. However, in the example, that would defeat the purpose of -static since the only library linked is (implicitly) the C library.

Share:
87,887
sj755
Author by

sj755

Updated on May 11, 2020

Comments

  • sj755
    sj755 about 4 years

    I'm wondering what the -static option on gcc does. I need this option when compiling a certain application, however when I do I get the following error:

    gcc -static -O3 -o prog prog.c
    /usr/bin/ld: cannot find -lc
    collect2: ld returned 1 exit status
    

    What needs installation?

    GCC version:

    [user@localhost dir]$ gcc -v
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.6.1/lto-wrapper
    Target: x86_64-redhat-linux
    Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
    Thread model: posix
    gcc version 4.6.1 20110908 (Red Hat 4.6.1-9) (GCC)