删除 Rust 中的默认链接器标志
Remove default linker flags in Rust
有没有办法删除 cargo build 命令中有问题的链接器标志?我正在尝试为 x86_64-unknown-linux-gnu
在 windows 上交叉编译二进制文件,但链接失败并显示消息:ld unrecognized option: --eh-frame-hdr
。有没有办法从链接阶段删除此参数,而不必为 linux 构建创建自定义目标规范?
我只在 config.toml
中找到了 rustflags
键,但据我所知,它只允许您添加额外的标志,而不能删除现有的标志。
首先确保您是 passing the right linker-flavor
。 rustc 可能错误地识别了您正在使用的链接器,并指定它可能会有所帮助。还要确保您使用的是正确的链接器。但是,如果您真的想删除该参数,则可以使用一些不稳定的功能。
没有删除单个链接器参数的通用方法。 eh_frame_header
目标属性指示链接器是否应插入 EH(异常处理)帧头。 Unstable rustc 确实支持更改单个目标选项,但它有点复杂并且只能处理某些平台上的 #![no_std]
二进制文件。您可能需要考虑手动调用链接器。
首先,dump the JSON target metadata(使用夜间编译器)为您正在编译的目标 到 ,将 [target]
替换为目标三元组,如 [=18] =]:
$ 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
。在不稳定的 Cargo 上,你可以使用 -Z build-std
这样做:
$ cargo +nightly run -Z build-std=core --target target.json
它会比平常花费更长的时间,因为它需要重新编译 core
标准库。并非所有平台都支持以这种方式编译更完整的 std
库,但如果您想尝试构建整个 std
标准库,则可以将 build-std=core
更改为仅 build-std
嗯。
有没有办法删除 cargo build 命令中有问题的链接器标志?我正在尝试为 x86_64-unknown-linux-gnu
在 windows 上交叉编译二进制文件,但链接失败并显示消息:ld unrecognized option: --eh-frame-hdr
。有没有办法从链接阶段删除此参数,而不必为 linux 构建创建自定义目标规范?
我只在 config.toml
中找到了 rustflags
键,但据我所知,它只允许您添加额外的标志,而不能删除现有的标志。
首先确保您是 passing the right linker-flavor
。 rustc 可能错误地识别了您正在使用的链接器,并指定它可能会有所帮助。还要确保您使用的是正确的链接器。但是,如果您真的想删除该参数,则可以使用一些不稳定的功能。
没有删除单个链接器参数的通用方法。 eh_frame_header
目标属性指示链接器是否应插入 EH(异常处理)帧头。 Unstable rustc 确实支持更改单个目标选项,但它有点复杂并且只能处理某些平台上的 #![no_std]
二进制文件。您可能需要考虑手动调用链接器。
首先,dump the JSON target metadata(使用夜间编译器)为您正在编译的目标 到 ,将 [target]
替换为目标三元组,如 [=18] =]:
$ 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
。在不稳定的 Cargo 上,你可以使用 -Z build-std
这样做:
$ cargo +nightly run -Z build-std=core --target target.json
它会比平常花费更长的时间,因为它需要重新编译 core
标准库。并非所有平台都支持以这种方式编译更完整的 std
库,但如果您想尝试构建整个 std
标准库,则可以将 build-std=core
更改为仅 build-std
嗯。