当我编译(Rust 源代码)一个共享对象(一个
.so
文件,由其他二进制文件用作共享库)时,如何确定共享对象有哪些具体要求?更具体地说,我如何确定 Rust 程序中向后兼容 C 标准库所需的最低版本(在构建之前,基于构建系统的知识)或是什么(在构建之后,基于发出的内容)只依赖于标准库(Rust 和/或 C)?
例如,当我从一个仅向标准输出写入问候语的简单 Rust 程序构建二进制文件时,共享对象可能需要也可能不需要 GLIBC v2.33,具体取决于我是在 Debian 11 还是在 Debian 11 上构建二进制文件12. 我确实理解对某些特定 GLIBC 版本的要求来自于共享对象引用其所构建的系统上的特定内容,但我不知道如何确定给定共享对象的最小值所需的 GLIBC 版本例如2.33,如果是这样的话。
构建共享对象,引用当前系统上的版本化内容:
rustc --crate-type=dylib src/lib.rs
src/lib.rs
:
pub fn greet_to_stdout() {
println!("Hello world");
}
检查构建的共享对象的链接问题:
ldd liblib.so
我们将系统定义如下:
rust@sha256:4ddb21b979def540e0c7d686ec92fd271e44200f1273551b0b248032e573377a
rust@sha256:3aee2d2979c2ddb4de910a38f1e91ca162475a67754fb07e2bb74661fd859efe
如果我在 Debian 11 上构建共享对象,则在 Debian 11 和 Debian 12 上都不会出现链接问题。如果我在 Debian 12 上构建它(发出
bookworm.so
),则在 Debian 12 上不会出现链接问题,但在 Debian 11 上则不会出现链接问题会出现GLIBC不兼容的问题:
./bookworm.so: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by ./bookworm.so)
./bookworm.so: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./bookworm.so)
./bookworm.so: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./bookworm.so)
我尝试过的:
ldd
版本以预测发出的共享对象所需的最低 GLIBC 版本。这并不能回答问题,因为 ldd
版本似乎与共享对象所需的不匹配。例如,在 Debian 12 上,有 ldd (Debian GLIBC 2.36-9+deb12u3) 2.36
,但共享对象由于某种原因依赖于 2.32、2.33 和 2.34,如上所示,在 Debian 11 上有 ldd (Debian GLIBC 2.31-13+deb11u7) 2.31
,我不知道 GLIBC 是什么版本我的共享对象需要在那里构建!您可以使用
readelf --version-info foo
查看已编译的可执行文件使用的版本。
另请参阅:https://johannst.github.io/notes/development/symbolver.html