クロスコンパイル時のGCCリンカー検索パス

クロスコンパイル時のGCCリンカー検索パス

特定のバージョンのコンパイラでコンパイルするために、Linuxシステムにはさまざまなツールチェーンディレクトリがあります。リンカー(ツールチェーンディレクトリにあります)がツールチェーン(/ toolchain / lib / ...)のライブラリファイルではなく、メインコンピュータ(/ libなど)からライブラリファイルを選択するという問題があります。これにより、次のようなさまざまなリンカーエラーが発生する可能性があります。

/opt/foo/cross_x86_64_v9b/lib/gcc/x86_64-linux/9.2.0/../../../../bin/x86_64-linux-ld: /lib/x86_64-linux-gnu/libxmlrpc_client.so.3: undefined reference to `curl_easy_getinfo@CURL_OPENSSL_4'

/opt/foo/cross_x86_64_v9b/lib64/libxmlrpc_client.so.3(ツールチェーンバージョン)の代わりに/lib/x86_64-linux-gnu/libxmlrpc_client.so.3(私のUbuntuのデフォルトファイル)に接続されているため、リンクは失敗します。

私が知る限り、検索パスは次のとおりです。

/opt/foo/cross_x86_64_v9b/bin/x86_64-linux-ld --verbose | grep SEARCH_DIR
SEARCH_DIR("/opt/foo/cross_x86_64_v9b/x86_64-linux/lib64"); SEARCH_DIR("/opt/foo/cross_x86_64_v9b/lib64"); SEARCH_DIR("/opt/foo/cross_x86_64_v9b/lib"); SEARCH_DIR("/opt/foo/cross_x86_64_v9b/x86_64-linux/lib");

/lib/x86_64-linux-gnu から libxml... ファイルを削除すると接続が成功するため、上記の SEARCH_DIR より前にそのパスが検索されます。リンクされているすべてのシステムライブラリは/opt/foo/cross_x86_64_v9bの下になければなりません。

私の環境では、LD_PATHとLD_LIBRARY_PATHは定義されていません。リンカーが/opt/foo/cross_x86_64_v9b/lib64/の前に/libを検索するのはなぜですか?この問題をどのように解決できますか?

答え1

考慮すべき2つの簡単なアイデア:

  1. 構成中に指定したlibパスがこのパスリストにbinutils追加されます。SEARCH_DIR順番にどこに配置されているかは正確にはわかりませんが、設定やインストール時にオプションを含めておくと簡単に確認できます。

    --with-lib-path=/opt/foo/cross_x86_64_v9b/lib64
    
  2. libc.soとで検索パスを手動で編集できますlibm.so。これは別のエラーを引き起こす可能性があるので注意してください。

    cp -uv /opt/foo/cross_x86_64_v9b/lib/libc.so{,.orig}
    cp -uv /opt/foo/cross_x86_64_v9b/lib/libm.so{,.orig}
    sed -e 's@/path1@/path2@g' /opt/foo/cross_x86_64_v9b/lib/libc.so.orig > /opt/foo/cross_x86_64_v9b/lib/libc.so
    sed -e 's@/path1@/path2@g' /opt/foo/cross_x86_64_v9b/lib/libm.so.orig > /opt/foo/cross_x86_64_v9b/lib/libm.so
    diff /opt/foo/cross_x86_64_v9b/lib/libc.so{,.orig}
    diff /opt/foo/cross_x86_64_v9b/lib/libm.so{,.orig}
    

関連情報