首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在MUSL1.2.0上交叉编译锈病项目时“对`__stat_time64的未定义引用”

在MUSL1.2.0上交叉编译锈病项目时“对`__stat_time64的未定义引用”
EN

Stack Overflow用户
提问于 2020-05-21 12:54:58
回答 3查看 1.4K关注 0票数 9

我正试图交叉编译一个用于arm-linux-musleabihf的生锈项目,并在使用musl-cross-make时遇到链接器错误。锈蚀项目依赖于libgit2,而这正是导致问题的原因。

使用:

  • 最新的锈病(1.43.1通过rustup)
  • arm-unknown-linux-musleabihf目标
  • 最新的musl-cross-makeTARGET=arm-linux-musleabihf
  • TARGET_CC_linux_arm-unknown-linux-musleabihfCARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABIHF_LINKER指向/opt/musl-cross-make/output/bin/arm-linux-musleabihf-gcc

我在构建时遇到了一个错误:

代码语言:javascript
运行
复制
error: linking with `/opt/musl-cross-make/output/bin/arm-linux-musleabihf-gcc` failed: exit code: 1
...
  = note: /opt/musl-cross-make/output/bin/../lib/gcc/arm-linux-musleabihf/9.2.0/../../../../arm-linux-musleabihf/bin/ld: /tmp/rustcvSvGAJ/liblibgit2_sys-e56c2f9bd024a0a9.rlib(odb.o): in function `git_odb__add_default_backends':
          odb.c:(.text.git_odb__add_default_backends+0x24): undefined reference to `__stat_time64'
          /opt/musl-cross-make/output/bin/../lib/gcc/arm-linux-musleabihf/9.2.0/../../../../arm-linux-musleabihf/bin/ld: /tmp/rustcvSvGAJ/liblibgit2_sys-e56c2f9bd024a0a9.rlib(config.o): in function `git_config_add_file_ondisk':
          config.c:(.text.git_config_add_file_ondisk+0x34): undefined reference to `__stat_time64'
          /opt/musl-cross-make/output/bin/../lib/gcc/arm-linux-musleabihf/9.2.0/../../../../arm-linux-musleabihf/bin/ld: /tmp/rustcvSvGAJ/liblibgit2_sys-e56c2f9bd024a0a9.rlib(config_file.o): in function `config_file_read':
          config_file.c:(.text.config_file_read+0x48): undefined reference to `__stat_time64'
...etc...

看起来链接器在解析特定于musl的time64符号时遇到了困难,目前还不清楚原因。

如果:

  • 我在铁锈和x86_64-linux-musl上都使用了musl-cross-make目标
  • 我用musl-cross-make构建MUSL_VER=1.1.24

我还编写了一个使用timestat的小C程序,它构建在交叉编译器上的MUSL1.2.0上,没有任何问题。

这里发生了什么事?libgit2的特别之处在于它找不到正确的__time64符号?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-23 19:54:44

问题是,Rust版本最多包含1.44的MUSL libc是基于MUSL 1.1.X的,而不是1.2.0。

当Rust构建时,libgit2也需要构建libgit2-sys,这是C代码。在构建libgit2-sys时,它使用您构建的MUSL版本,并使用musl交叉生成安装自己。默认情况下,这是1.2.0,它已经重新处理了time_t 32/64位支持,它依赖于__stat_time64和其他各种类似命名的方法(例如__time64)。

但是,当Rust链接您的最终应用程序时,它使用的是Rust附带的MUSL版本,用于x86_64-linux-musl目标,这不包括新的time_t支持,并且没有__stat_time64__time64等。因此链接失败。

现在你有两个选择:

  • 使用musl-cross-make构建1.1.24的MUSL库。我不是100%的版本包含在锈菌1.44。它可能是1.1.22,尽管从我自己的测试中我发现1.1.24工作得很好(和您一样)。
  • 使用自己版本的MUSL构建自己版本的Rust和/或目标liblibc.rlib。我自己从未成功地做到这一点,尽管如果您想尝试这一点,可能是一个很好的起点。

使用Rust附带的libc而不是本地提供的版本的一般问题正在研究中,例如这里

票数 7
EN

Stack Overflow用户

发布于 2020-06-01 15:02:15

您可以尝试time32中列出的说明

-Wl,--whole-archive -lcompat_time32 -Wl,--no-whole-archive添加到链接命令行。如果libtool正在拦截和损坏命令行,则可能需要特殊的黑客攻击(比如将-Wl,放在-lcompat_time32之前)。

票数 3
EN

Stack Overflow用户

发布于 2021-11-19 16:22:28

我建议您尝试一下https://github.com/rust-embedded/cross:它设置了在docker中进行交叉编译的环境,并且可以无缝地工作,即使是在这里突出显示的情况下也是如此。

AFAICT,他们用正确的版本重新编译musl。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61934997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档