共有オブジェクトを一切使わないようコンパイルする

Linuxで共有ライブラリを一切使わないようなバイナリファイルをビルドするための環境準備について。

今回作成したサンプルコード(a.c)

#include <stdio.h>

int main(void) {
    printf("OK\n");
    return 0;
}

普通にビルドするとこうなる。

gcc -o a.out a.c

ldd a.out

実行結果↓

        linux-vdso.so.1 =>  (0x00007ffcea0a0000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f66d5264000)
        /lib64/ld-linux-x86-64.so.2 (0x00005640b6b5b000)

いろいろ見るとgccでリンクする際に-staticをつければいいとあるが…

gcc -o a.out -static a.c

-lcが見つからないとエラー。

/usr/bin/ld: -lc が見つかりません
collect2: エラー: ld はステータス 1 で終了しました

なかなか見つからなかったが、glibc-staticという静的ライブラリ版glibcがあり、これをインストールしておく必要があった。
https://stackoverflow.com/questions/16024978/usr-bin-ld-cannot-find-lc-while-compiling-with-makefile
なので、yumでこれをインストールすれば-staticで作成できた。

sudo yum install glibc-static

gcc -o a.out -static a.c
ldd a.c

実行結果↓

        動的実行ファイルではありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です