Solution for gcc “x86_64-linux-gnu/crti.o: unrecognized relocation (0x2a) in section `.init'” on Ubuntu 16.04
先日Ubuntuを14.04から16.04に更新した。すると,gcc
でC言語のソースコードをコンパイルしようとすると以下のエラーがでるようになってしまった。
cat << EOF > hi.c
#include <stdio.h>
int main(void){
puts("HI");
return 0;
}
EOF
gcc -o hi.{exe,c}
/home/senooken/local/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o: unrecognized relocation (0x2a) in section `.init'
/home/senooken/local/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
原因を調べていると以下のページにたどり着いた。
この投稿でPascal Obryの回答を参考にすると,どうやらコンパイルに使ったgcc
とリンカld
のバージョンなどの整合性が取れていないことが原因のようだ。
実際に以下のコマンドでld
がどこにあるか確認した。
which ld
/home/senooken/local/bin/ld
どうやら,自分でローカル環境にインストールしていたld
を使っていたようだ。
確認してみると,ローカルでbinutils-2.25をインストールしていて,gccでのリンク時にこのldが使われていたのが原因だった。binutils-2.25をアンインストールしたら解決した。
gccはOSのシステムと密接になっているので,注意しよう。