![交叉编译时GCC链接器搜索路径](https://linux22.com/image/215290/%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91%E6%97%B6GCC%E9%93%BE%E6%8E%A5%E5%99%A8%E6%90%9C%E7%B4%A2%E8%B7%AF%E5%BE%84.png)
我的 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
两个简单的想法供您考虑:
您在配置期间指定的 lib 路径
binutils
将添加到此SEARCH_DIR
路径列表中。我不确定它到底按顺序放置在哪里,但在配置和安装时包含该选项后,您可以轻松验证这一点。--with-lib-path=/opt/foo/cross_x86_64_v9b/lib64
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}