这个问题特定于(但不限于)裸机 Risc-V 代码,我试图了解编译位置无关的固件二进制文件需要什么。我尝试编译一些简单的代码,并传递-fpie
给链接器,看起来生成的二进制文件是一个独立的位置无关的可执行文件,包含、部分,以及代码中看似 onlu的相对引用。文档相当晦涩,很少提到具体选项。大多数/文档都在讨论动态重定位。我是否正确地认为,使用这个选项,生成的二进制文件是一个真正的位置无关的可执行文件,它不需要加载程序(或者根本不需要任何加载程序,假设它以某种方式进入可执行内存)的任何特殊重定位逻辑。还是我遗漏了什么?gcc
-static-pie
.got
.got.plt
pc
-static-pie
pie
pic
主页
/
user-4253229
Eugene Sh.'s questions
Eugene Sh.
Asked:
2024-09-12 00:00:25 +0800 CST
目前,实现自定义derive
宏根本不需要实际Trait
存在。它所做的只是在注释项后附加任意代码块,并且显然从中删除“辅助属性”。也就是说,我们可以做类似以下的事情:
#[proc_macro_derive(FakeTrait)]
pub fn custom_derive(input: TokenStream) -> TokenStream {
let name = ... // Get the ident name from input
....
quote! {
impl #name {
fn custom_function(...) {
...
}
}
}.into()
}
然后我们可以通过这个struct
宏
#[derive(FakeTrait)]
struct MyStruct {...}
并且它会很乐意地工作,通过附加impl MyStruct
到它,无论是否存在FakeTrait
。
我的问题是,这是否是宏的可接受用例derive
?它有什么缺点吗?将来可能会出现故障吗?