当我编译共享对象时,如何确定共享对象的具体要求?

问题描述 投票:0回答:1

当我编译(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

我们将系统定义如下:

  • Debian 11 = Docker 镜像
    rust@sha256:4ddb21b979def540e0c7d686ec92fd271e44200f1273551b0b248032e573377a
  • Debian 12 = Docker 镜像
    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 是什么版本我的共享对象需要在那里构建!
  • 将共享对象解析为 ELF 并 grep 查找任何提及的 GLIBC:这样我至少得到一些线索,表明 2.33 在 Debian 12 上构建的东西上被引用,但在 Debian 11 上构建的东西上没有引用。但我仍然不知道我不知道如何可靠地确定我的共享对象的最低要求,或者如何以符合人体工程学和可预测的方式控制它们。在操作系统之间切换直到吐出兼容的二进制文件肯定感觉不太好。
linux rust debian
1个回答
0
投票

您可以使用

readelf --version-info foo
查看已编译的可执行文件使用的版本。

另请参阅:https://johannst.github.io/notes/development/symbolver.html

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.