パンダボードでUbuntu 12.10(ARMHF)ディストリビューションを使用しています。 ARMEL用にコンパイルされたアプリケーションを実行したい。ダイナミックローダーの場所が変更されたため、不可能でした( https://wiki.linaro.org/OfficeofCTO/HardFloat/LinkerPathCallApr2012 )
次のシンボリックリンク/lib/ld-linux.so.3-> /lib/ld-linuxarmhf.so.3を作成することに成功しました
代わりにポータビリティパッケージをインストールする方法はありますか?これがディストリビューションによって行われない理由はありますか?
前もって感謝します
動的リンカーはコンパイル時に焼き付けられます。使用されている動的リンカーを確認するには、実行します。 readelf -l /usr/bin/foo | grep Request
これを変更する唯一の方法は、gccスペックファイルを調整することです。 gcc -dumpspecs | grep ld-linux
を参照してください。または、ビルド時にgcc -Wl,--dynamic-linker,/lib/ld-linux.so.3 foo.c
のようなもので--dynamic-linkerフラグをリンカーに渡すことにより
ただし、ツールチェーンが正しくセットアップされている場合は、これらのいずれも必要ありません。本当に理由がない限り、ツールチェーンを混乱させるべきではありません。
手短に言えば、おそらくあなたのソリューションが最良のソリューションですが、可能であればarmhfパッケージを見つけて使用するか、パッケージを再構築します。
おそらく、そのような互換性パッケージは存在しません(新しい標準ではなく/lib/ld-linux.so.3
を期待する古いサードパーティ製armhfバイナリを実行するために、/lib/ld-linuxarmhf.so.3
に同意しましたか?)インストールされている場合)は、あらゆるarmelバイナリに適合する「偽りの約束」を与えます。しかし、私がこれを正しく理解している場合、ABIには互換性がないため、armhf動的リンカはarmelバイナリを壊す必要があります。 (この場合、正しい解決策は、少数の特別な非標準armhfバイナリをラップして、動的リンカの予想される場所がシステムに適合するようにすることです。または、バイナリでこの値を書き換えます。これが可能な場合。そうすれば、実際のarmelバイナリを実行しようとしても問題は発生しません。)
一方、armhfシステムで実際のarmelバイナリを実行する場合は、単純に "multiarch" に進む必要があります(したがって、シンボリックリンクの代わりに実際のarmel動的リンカーを使用してください!) :armelバイナリのarmel前提条件をインストールします。前提条件のうち、libc6:armel
など(間違っている場合はpkg名を修正してください)には、必要な/lib/ld-linux.so.3
が必ず含まれます。
(ABIの非互換性について:私が理解できるように、armhfでは、浮動小数点引数は浮動小数点レジスターに直接渡されますが、armelでは、整数レジスターに渡されます。この間接指定は、ARM浮動小数点をサポートしているため、armhfは最新のARMに適しています。)