我目前正在尝试将 Rust 可执行文件与用 C++ 和 C 编写的共享库链接。共享库的动态加载在 amd64 架构上完美运行,但是当可执行文件尝试加载共享库时,我遇到了分段错误错误aarch64 linux 机器 [Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-1033-raspi2 aarch64)]。
我正在使用 Linaro aarch64 工具链(http://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu。 tar.xz)交叉编译共享库(C++ 和 C 代码的组合)。
在使用 file/readelf 检查时,生成的共享库具有 GNU/Linux ABI,这似乎是因为使用 g++ 在库中构建 C++ 代码,而 Rust 可执行文件的 ABI 是 SYSV(使用交叉编译为 aarch64 https://github.com/rust-embedded/cross项目)
我注意到手动编辑共享库的 .so 文件以将 ABI 标志从 GNU/Linux 更改为 SYSV 可以解决问题。
是否可以使可执行文件或库以特定 ABI 为目标?理想情况下,我想以某种方式构建 Rust 可执行文件,以便它可以链接到共享库,而与库的 ABI 无关。
为了提供简要概述,共享库是此头文件的实现: https ://github.com/Azure/iotedge/blob/master/edgelet/hsm-sys/azure-iot-hsm-c/inc/ hsm_client_data.h 我从链接存储库中保留了很多 C 实现代码,但修改了一些头文件的实现以使用 C++。
如果需要任何其他详细信息,请告诉我。
我尝试切换回旧版本的 g++ (4.9) 来构建 C 和 C++ 共享库,但它总是产生一个具有 GNU/Linux ABI 的工件。
这个问题被确定为这个问题的重复我可以从 Rust 代码中调用 C 或 C++ 函数吗?但是这些问题的答案并没有帮助解决我的问题,因为该帖子上的建议/答案表明可以通过传递 C '接口'来调用 C++,这正是我所拥有的。这个问题更多是针对特定目标架构(即 aarch64)的 ABI 不兼容问题。该问题不会在 amd64 目标架构上重现。
预期- Rust 可执行文件和使用 C 和 C++ 构建的动态共享库具有兼容 aarch64 的 ABI。
实际- Rust 可执行文件针对 SYSV ABI,而动态共享库针对 GNU/Linux ABI。