1. tats-u

    No comment

    tats-u
Changes in body
Source | HTML | Preview

あくまでもやってみたらこうだったよという記録です。

GCCのダウンロード

wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-5.2.0/gcc-5.2.0.tar.gz

※bz2でもOKです。

解凍・移動

tar xf gcc-5.2.0.tar.gz
cd gcc-5.2.0

必要なパッケージのダウンロード

contrib/download_prerequisites 

ビルド用ディレクトリ作成・移動

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)

こちらは一部独自ビルドしたライブラリとリンクしているようです。

追記: gets_s(C11にて追加)を含むC言語ソースをビルドした結果

gets_sが暗黙の宣言だというGCCの警告・gets_sというラベルがないというリンクエラーをいただきました。めでたしめでたし。-I/usr/local/include/c++/5.2.0/-L/usr/local/lib64-L/usr/local/include/c++/5.2.0/-Wl,-rpath -Wl,/usr/local/lib64をつけても結果は変わらず。GCCはgets_sの実装をサボっているみたいです。(Fedora RawhideのGCC5.1.1で確認)別の関数で試してみます。

まとめ

一応GCC5.2はCentOS6で動くということがわかりました。ただし、リンカ(ld)が古いライブラリとリンクしてしまう問題が発覚したので対処しなければならないということが新たにわかりました。GCC4.4.7で利用できない関数は使用を控えるしかありません。