1

我想找到在 Rust 构建中使用的 libc.so 文件,以便我可以使用--version. (一些 libcs​​ 通过 C 宏公开他们的版本信息,因此他们的替代方法是cc在构建脚本中使用 crate。但像 musl 这样的其他人不这样做。)

可以弄清楚libstd-*.sorust 二进制文件或库将链接到哪个文件。当它libstd.so主机的 libc 链接时,在其上运行ldd会显示libc.so. 但是当主机系统使用 glibc 并且目标环境是 musl 时,这不起作用(“无效的 ELF 标头”)。代替,ldd我可以使用readelf -dobjdump -plibstd.so但是这些只显示它使用的文件的文件名libc.so而不是它的完整路径。这libc.so不在LD_LIBRARY_PATH. (我确实知道它在我自己的系统上的位置,但我正试图以编程方式在任意系统上找到它。)

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

如果有一个 rustc 相当于 gcc 和 clang 的-print-file-name=libc.so,那就太好了,这样我就可以做类似rustc --target=$TARGET --print-file-name=libc.so.

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

4

1 回答 1

2

您可以像这样传递链接器参数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
于 2020-04-25T15:23:51.403 回答