読者です 読者をやめる 読者になる 読者になる

into the void

ソフトウェアに関する雑多な調査日記

gccのかわりにclangを使ってみる

clangの場合、ライブラリ系がどうな感じになるか気になったので調べてみた。

ubuntu環境にclangをインストールする。

sudo apt-get install clang

標準Cライブラリを使うようなCプログラムをgccとclangでコンパイルしてみる。

#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]){
	const char *hello = "hello";

	char buff[128];
	
	memset(buff, 0, sizeof(buff));
	sprintf(buff, "%s,%s.", hello, argv[1]);
	printf("%s\n", buff);
	return 0;
}

コンパイル

$ gcc -o hello_by_gcc hello.c
$ clang -o hello_by_clang hello.c

サイズを比べてみる。ちょっとだけちがう。

$ ls -al hello_*
-rwxrwxr-x 1 8647 Apr  1 00:50 hello_by_clang
-rwxrwxr-x 1 8871 Apr  1 00:47 hello_by_gcc

リンクされている標準ライブラリを見てみる。どちらも同じ。glibc。clang独自で標準Cライブラリを持っているわけではないらしい。

$ ldd hello_by_gcc
	linux-vdso.so.1 =>  (0x00007fff40b3e000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5c5c0e2000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f5c5c4b1000)

$ ldd hello_by_clang 
	linux-vdso.so.1 =>  (0x00007fff1cbff000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0bafa33000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f0bafe02000)

C++でも試したみたが、参照する標準C++ライブラリも一緒。

#include <iostream>
using namespace std;

int main(int argc, char* argv[]) {
	cout << "Hello, " << argv[1] << endl;
	return 0;
}
$ g++ -o hello_cpp_by_g++ ./hello.cpp 
$ clang++ -o hello_cpp_by_clang++ ./hello.cpp 
$ ldd ./hello_cpp_by_g++
	linux-vdso.so.1 =>  (0x00007fff4a7ff000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8b56237000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b55e77000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8b55b7a000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f8b56549000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8b55964000)
$ ldd ./hello_cpp_by_clang++
	linux-vdso.so.1 =>  (0x00007fff9892e000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f82ec798000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f82ec3d8000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f82ec0db000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f82ecaaa000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f82ebec5000)