XILINX SDKをアップデートしたらGLIBCのバージョン相違で動かない
最近、自宅のパソコンのHDDをSSDに入れ替えてクリーンインストールしたのですが、それに合わせてXILINXのSDKも最新のを入れることにしました。(といってもXSDKの最新版は2019.1のままなのですが)
その環境でCosmo-Zのプログラムを再コンパイルして、実行してみると、
root@cszmini:~# /cosmoz.elf
/cosmoz.elf: /lib/arm-linux-gnueabihf/libm.so.6: version `GLIBC_2.27' not found (required by /cosmoz.elf)
と、GLIBC_2.27を要求してきて、起動できなくなりました。
LinuxにインストールされているGLIBCのバージョンを確認するには、libc.so.6をそのまま実行してみればよいようです。Cosmo-Zの環境では/lib/arm-linux-gnueabihfにあります。
root@cszmini:~# /lib/arm-linux-gnueabihf/libc.so.6
GNU C Library (Ubuntu EGLIBC 2.19-0ubuntu6) stable release version 2.19, by Roland McGrath et al.
Cosmo-ZのLinuxはLinaroのUbuntu 14がベースなので古く、インストールされているGLIBCのバージョンは2.19なのかもしれません。
解決策としては、
- GLIBCをアップデートするか
- soのライブラリをスタティックリンクしてしまうか
です。
GLIBCをアップデートするのは影響が大きそうなので、やめたほうがいいでしょう。
残るはlibc.so.6をスタティックリンクしてしまう方法です。調べるとglibc-staticというパッケージを使う方法などが出てくるのですが、新たなパッケージをインストールしなければならないので互換性を考えると不可でしょう。
XSDKの設定でライブラリをスタティックにするには、プロジェクトのプロパティを出し、C/C++ Build > Settings > ARM v7 Linux g++ linker > Miscellaneous > Linker Flagsに-static と書けばよいようです。
これでGLIBCがスタティックリンクされ、出来上がった実行ファイルのサイズは増えますが動作するようになりました。
ただ、そもそもスタティックリンクするべきではないという話もあるので、スタティックリンクは避けたほうがよいのかもしれません。
Vivado 2018.3のXSDKとVivado 2019.1のXSDKで作られたファイルを比較してみます。lddコマンドでいけるようです。
まずは2018.3でコンパイルしたほう。
root@cszmini:~# ldd -v /home/share/cszmain-vivado2018_3.elf | grep libm
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6dfd000)
libm.so.6 (GLIBC_2.4) => /lib/arm-linux-gnueabihf/libm.so.6
libm.so.6 (GLIBC_2.4) => /lib/arm-linux-gnueabihf/libm.so.6
/lib/arm-linux-gnueabihf/libm.so.6:
次は2019.1でコンパイルしたほう。
root@cszmini:~# ldd -v /home/share/cszmain-vivado2019_1.elf | grep libm
/home/share/cszmain-vivado2019_1.elf: /lib/arm-linux-gnueabihf/libm.so.6: version `GLIBC_2.27' not found (required by /home/share/cszmain-vivado2019_1.elf)
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6ded000)
libm.so.6 (GLIBC_2.27) => not found
libm.so.6 (GLIBC_2.4) => /lib/arm-linux-gnueabihf/libm.so.6
libm.so.6 (GLIBC_2.4) => /lib/arm-linux-gnueabihf/libm.so.6
/lib/arm-linux-gnueabihf/libm.so.6
なんだかよくわかりませんが、GLIBC_2.27とセットになっているlibm.so.6が見つからなくて動かないのかもしれません。
それにしても、XSDK 2019.1にすると同じソースコードであってもlibmへの参照が1個増えるのはなんでだろう。しかも古いものを探しにいくという不可解な挙動です。
今回の肝である「libm.so.6: version `GLIBC_2.27' not found」についてググってみると世界中でいろんな人がこのエラーで動かない掲示板の書き込みがいろいろ出てくるのですが、いまひとつピンときません。
解決策としては、XSDK 2018.3に戻すというのが最善で、staticリンクにしてしまうが次点ではないかと思います。
| 固定リンク



コメント