我正试图交叉编译一个用于arm-linux-musleabihf
的生锈项目,并在使用musl-cross-make
时遇到链接器错误。锈蚀项目依赖于libgit2
,而这正是导致问题的原因。
使用:
rustup
)arm-unknown-linux-musleabihf
目标musl-cross-make
和TARGET=arm-linux-musleabihf
TARGET_CC_linux_arm-unknown-linux-musleabihf
和CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABIHF_LINKER
指向/opt/musl-cross-make/output/bin/arm-linux-musleabihf-gcc
我在构建时遇到了一个错误:
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
我还编写了一个使用time
和stat
的小C程序,它构建在交叉编译器上的MUSL1.2.0上,没有任何问题。
这里发生了什么事?libgit2
的特别之处在于它找不到正确的__time64
符号?
发布于 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
等。因此链接失败。
现在你有两个选择:
使用Rust附带的libc而不是本地提供的版本的一般问题正在研究中,例如这里。
发布于 2020-06-01 15:02:15
您可以尝试time32中列出的说明
将
-Wl,--whole-archive -lcompat_time32 -Wl,--no-whole-archive
添加到链接命令行。如果libtool正在拦截和损坏命令行,则可能需要特殊的黑客攻击(比如将-Wl,
放在-lcompat_time32
之前)。
发布于 2021-11-19 16:22:28
我建议您尝试一下https://github.com/rust-embedded/cross:它设置了在docker中进行交叉编译的环境,并且可以无缝地工作,即使是在这里突出显示的情况下也是如此。
AFAICT,他们用正确的版本重新编译musl。
https://stackoverflow.com/questions/61934997
复制相似问题