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

原因を調べていると以下のページにたどり着いた。

GNAT GPL 2015 and Ubuntu 16.04 => ld: /usr/lib/x86_64-linux-gnu/crti.o: unrecognized relocation – Google グループ

この投稿でPascal Obryの回答を参考にすると,どうやらコンパイルに使ったgccとリンカldのバージョンなどの整合性が取れていないことが原因のようだ。

実際に以下のコマンドでldがどこにあるか確認した。

which ld/home/senooken/local/bin/ld

どうやら,自分でローカル環境にインストールしていたldを使っていたようだ。

確認してみると,ローカルでbinutils-2.25をインストールしていて,gccでのリンク時にこのldが使われていたのが原因だった。binutils-2.25をアンインストールしたら解決した。

gccはOSのシステムと密接になっているので,注意しよう。

コメントを残す

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