gpt4 book ai didi

rust - 如何找到 `rustc --target=$TARGET`链接到哪个libc.so?

转载 作者:行者123 更新时间:2023-12-03 11:35:40 27 4
gpt4 key购买 nike

我想找到在Rust构建中使用的libc.so文件,以便我可以使用--version进行查询。 (一些libcs​​通过C宏公开其版本信息,因此,它们的另一种选择是在构建脚本中使用cc条板箱。但其他诸如musl则不这样做。)

我可以弄清楚一个使用rust 的二进制文件或库将链接到哪个libstd-*.so文件。当将此libstd.so与主机的libc链接时,在其上运行ldd将显示libc.so。但是,当主机系统使用glibc且目标环境是musl时,这将不起作用(“无效的ELF header ”)。除了ldd之外,我还可以在readelf -d上使用objdump -plibstd.so。但是这些仅显示其使用的libc.so文件的文件名,而不显示其完整路径。而且libc.so不在LD_LIBRARY_PATH中的任何目录中。 (我确实知道它在我自己的系统上的位置,但是我试图以编程方式在任意系统上找到它。)

运行ldconfig -p仅为我提供有关主机系统的libc的信息。

如果有一个与gcc和clang的-print-file-name=libc.so等效的rustc,那就太好了,这样我就可以做类似rustc --target=$TARGET --print-file-name=libc.so的事情。

关于如何获取此信息的其他想法?

最佳答案

您可以像这样将pass linker arguments转换为rustc:

rustc -C link-args=...

为了找出使用了哪种 libc.so,我相信以下命令就足够了:
rustc -C link-args=-Wl,-t ...

man ld:
  -t
--trace
Print the names of the input files as ld processes them. ...

更新:

这是行不通的: rustc“吃掉了”链接器的输出。

我能够间接获得所需的输出:
echo 'fn main() { println!("")}' | rustc -C link-args=-Wl,-Map=map.out -o foo -
grep 'libc\.so' map.out
libc.so.6                     /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-f25e49a311b0f577.rlib(std-f25e49a311b0f577.std.cy8lhng1-cgu.2.rcgu.o) (setuid@@GLIBC_2.2.5)
LOAD /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libc.so
LOAD /lib/x86_64-linux-gnu/libc.so.6

关于rust - 如何找到 `rustc --target=$TARGET`链接到哪个libc.so?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61423973/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com