1. tats-u

    Posted

    tats-u
Changes in title
+CentOS6.xでGCC5.2をOS標準の4.4.7と共存できるようにソースビルドした(ある程度成功)
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,112 @@
+あくまでもやってみたらこうだったよという記録です。
+
+#GCCのダウンロード
+```
+wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-5.2.0/gcc-5.2.0.tar.gz
+```
+※bz2でもOKです。
+
+#解凍・移動
+```bash
+tar xf gcc-5.2.0.tar.gz
+cd gcc-5.2.0
+```
+
+#必要なパッケージのダウンロード
+```
+contrib/download_prerequisites
+```
+
+#ビルド用ディレクトリ作成・移動
+```bash
+mkdir ../gccbuild
+cd ../gccbuild
+```
+
+#configure
+```
+../gcc-5.2.0/configure --program-suffix=5 --disable-multilib --enable-language=c,c++ --host=x86_64-redhat-linux --build=x86_64-redhat-linux --target=x86_64-redhat-linux
+```
+元のGCC 4.4.7と共存させるためにsuffixをつけました。また、64bit専用にするつもりで`--disable-multilib`をつけました。bootstrapは有効にしてあります。
+
+#ビルド
+```
+make -j8 BOOT_CFLAGS='-march=core2 -O3'
+```
+当方デスクトップ版i5なので`-j8`にしました。かなり時間がかかりました。
+
+#インストール
+porgをインストールしているので次のコマンドでインストールしました。**(GCCは`make uninstall`に対応していません)**
+
+```
+sudo porg -lp gcc-5.2.0 'make install'
+```
+
+#コンパイル
+まずC言語をコンパイルしてみました。
+
+```
+tatsu@localhostF ~/gcctest> cat hello.c
+#include <stdio.h>
+#include <math.h>
+
+int main(void) {
+ puts("Hello, world!");
+ double inmu = M_E * (pow((M_E + M_PI) * (M_E + M_E + M_PI),M_E) + 1.0 / ((pow(M_PI,M_E) - M_E) * (M_E + pow(M_E,M_PI) - pow(M_PI, M_E))));
+ printf("Inmu number: %f\n",inmu);
+}
+tatsu@localhostF ~/gcctest> gcc5 hello.c -o hello
+tatsu@localhostF ~/gcctest> ./hello
+Hello, world!
+Inmu number: 114514.191981
+```
+
+次にC++をコンパイルしてみました。
+
+```
+tatsu@localhostF ~/gcctest> cat cpptest.cpp
+#include <iostream>
+
+using namespace std;
+
+int main() {
+ cout << "(。╹ω╹。)ㄘんㄘんㄟ⁰ㄋㄟ⁰ㄋㄜㄝㄋ" << endl;
+ int inmu = 0b11011111101010010;
+ cout << "2進数11011111101010010を10進数に直すと " << inmu << endl;
+ return 0;
+}
+tatsu@localhostF ~/gcctest> g++5 cpptest.cpp -o cpptest
+tatsu@localhostF ~/gcctest> ./cpptest
+(。╹ω╹。)ㄘんㄘんㄟ⁰ㄋㄟ⁰ㄋㄜㄝㄋ
+2進数11011111101010010を10進数に直すと 114514
+```
+
+ちゃんと2進リテラルも正しくコンパイルされています。
+
+#リンクしているライブラリを確かめる
+
+一見大成功に見えますがちゃんとライブラリとリンクしているか確かめてみました。
+
+```
+tatsu@localhostF ~/gcctest> ldd hello
+ linux-vdso.so.1 => (0x00007ffd5d99d000)
+ libc.so.6 => /lib64/libc.so.6 (0x00000039f5200000)
+ /lib64/ld-linux-x86-64.so.2 (0x00000039f4e00000)
+```
+
+OS付属の古いライブラリとリンクしています。C++の方も確認してみました。
+
+```
+tatsu@localhostF ~/gcctest> ldd cpptest
+ linux-vdso.so.1 => (0x00007ffd971cb000)
+ libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007f0121577000)
+ libm.so.6 => /lib64/libm.so.6 (0x00000039f6200000)
+ libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007f0121360000)
+ libc.so.6 => /lib64/libc.so.6 (0x00000039f5200000)
+ /lib64/ld-linux-x86-64.so.2 (0x00000039f4e00000)
+```
+
+こちらは一部独自ビルドしたライブラリとリンクしているようです。
+
+#まとめ
+一応GCC5.2はCentOS6で動くということがわかりました。ただし、リンカ(ld)が古いライブラリとリンクしてしまう問題が発覚したので対処しなければならないということが新たにわかりました。また、C言語では古いライブラリとリンクしたので`gets_s`など、新しいCの関数でリンクエラーになるかどうかは今後調べていかなければなりません。