A questão é específica (mas não limitada a) um código Risc-V bare-metal, estou tentando entender o que seria necessário para compilar um binário de firmware independente de posição. Tentei compilar um código simples com -fpie
passado para gcc
e -static-pie
passado para o vinculador, e parece que o binário produzido é um executável independente de posição autocontido, contendo seções , e referências aparentemente onlu .got
-relativas no código. A documentação é bastante obscura, e a opção específica raramente é mencionada. A maior parte da documentação / discute realocações dinâmicas . Estou correto que com esta opção o binário produzido é um verdadeiro executável independente de posição, que não requer nenhuma lógica de realocação especial do carregador (ou de qualquer carregador, assumindo que ele esteja de alguma forma abrindo caminho para a memória executável, é claro). Ou estou esquecendo de algo?.got.plt
pc
-static-pie
pie
pic
Início
/
user-4253229
Eugene Sh.'s questions
Eugene Sh.
Asked:
2024-09-12 00:00:25 +0800 CST
Atualmente, implementar uma macro personalizada derive
não requer Trait
que um real exista. Tudo o que ele faz é anexar um bloco de código arbitrário após o item anotado e, aparentemente, remover os "atributos auxiliares" dele. Ou seja, podemos fazer algo como o seguinte:
#[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()
}
E então podemos usar essa macro em uma struct
via
#[derive(FakeTrait)]
struct MyStruct {...}
e funcionará alegremente anexando o impl MyStruct
a ele, independentemente da existência de FakeTrait
.
Minha pergunta é se é um caso de uso aceitável para derive
macros? Há alguma desvantagem e pode acontecer de quebrar no futuro?