有没有办法删除货物构建命令中有问题的链接器标志?我试图在windows上为x86_64-unknown-linux-gnu
交叉编译一个二进制文件,但链接失败,并显示消息:ld unrecognized option: --eh-frame-hdr
。有没有一种方法可以从链接阶段删除这个参数,而不必为linux构建创建自定义目标规范?
我只在config.toml
中找到了rustflags
密钥,但据我所知,它只允许添加额外的标志,而不允许剥离现有的标志。
首先确保您传递了正确的linker-flavor
。rustc可能错误地识别了您正在使用的链接器,指定它可能会有所帮助。还要确保使用正确的链接器。但是,如果你真的想删除这个论点,可能会使用一些不稳定的功能。
没有一种通用的方法可以删除单个链接器参数。eh_frame_header
目标属性指示链接器是否应插入EH(异常处理(帧标头。不稳定的rustc确实支持更改单个目标选项,但它有点复杂,只能在某些平台上处理#![no_std]
二进制文件。您可能需要考虑手动调用链接器。
首先,转储要编译到的目标的JSON目标元数据(使用夜间编译器(,将[target]
替换为类似thumbv7neon-unknown-linux-musleabihf
:的目标三元组
$ rustc -Z unstable-options --print target-spec-json --target [target] > target.json
target.json
现在具有特定于目标的编译信息。在某些目标(如WASM(上,默认情况下禁用EH帧头。如果你在target.json
中看到这样一行,那么你已经完成了(而且不应该得到那个错误(:
"eh-frame-header": false,
如果你看不到这行,那么在打开大括号后立即将其添加到target.json
中,就像一样
{
"eh-frame-header": false,
...
现在,您可以在目标三元组通常所在的位置指定target.json
的路径。但是,现在需要使用新的目标信息重新编译标准库(如core
和std
(。否则,编译器将告诉您the `target-17676080659170949227` target may not be installed
。在不稳定的货物上,您可以使用-Z build-std
这样做:
$ cargo +nightly run -Z build-std=core --target target.json
由于需要重新编译core
标准库,因此它将比正常情况下花费更长的时间。并非所有平台都支持以这种方式编译更完整的std
库,但如果您也想构建整个std
标准库,则可以将build-std=core
更改为仅build-std
。