交叉编译时GCC链接器搜索路径

交叉编译时GCC链接器搜索路径

我的 Linux 机器上有各种工具链目录,用于在特定编译器版本下进行编译。我遇到一个问题,链接器(在工具链目录中)从本机机器(例如 /lib)中选择一个库文件,而不是工具链中的库文件(/toolchain/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'

该链接失败,因为它链接的是 /lib/x86_64-linux-gnu/libxmlrpc_client.so.3 (我的 Ubuntu 上的本机文件)而不是 /opt/foo/cross_x86_64_v9b/lib64/libxmlrpc_client.so.3 (工具链版本) 。

据我所知,这是搜索路径:

/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

两个简单的想法供您考虑:

  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}
    

相关内容