Ho bisogno di chiamare una funzione in C solo conoscendo l'indirizzo, e nessuna informazione su di esso prototipo (non posso lanciarlo su un puntatore di funzione C).Chiamare l'indirizzo C come funzione senza prototipo
Le informazioni che ho su questa funzione sono l'indirizzo.
Conosco anche i parametri che desidero passare ad esso (grazie a un puntatore del vuoto) e la dimensione dell'array di argomenti (accessibile tramite il puntatore del vuoto).
Voglio anche rispettare la convenzione di chiamata C. Per la versione x86, ho più o meno sapere come farlo (allocare lo spazio sullo stack, copiare i parametri su quello spazio e infine chiamare la funzione).
Il problema è con la convenzione x64 (Linux per ora) dove i parametri sono passati attraverso i registri. Non ho idea della dimensione di ciascun parametro per riempire registri in modo appropriato, conosco solo la dimensione della serie di parametri.
Inoltre, non voglio dipendere da gcc, quindi non posso usare __builtin_apply che sembra essere lo standard e anche essere piuttosto scuro.
Voglio scrivere la mia parte di codice per supportare il multi-compilatore e anche per imparare cose interessanti.
Quindi, in pratica, la funzione Voglio scrivere come lo stesso prototipo di __builtin_apply quali è:
void *call_ptr(void (*fun)(), void *params, size_t size);
voglio anche il codice per scrivere in C (grazie a asm inline) o asm x64 puro .
Quindi esiste un modo per farlo correttamente e nel rispetto della convenzione chiamata ? O è impossibile con la convenzione x64 senza conoscere esattamente il prototipo della funzione?
Dai un'occhiata a [libffi] (http://sourceware.org/libffi/). – tangrs
Questa potrebbe essere un'ottima alternativa, ma il problema con libffi è che è necessario conoscere il tipo di ciascun parametro e il tipo di ritorno della funzione. Voglio evitare di raccogliere queste informazioni per evitare perdite di tempo se possibile. Quindi è possibile con l'architettura x64? – Zerkan
@Zerkan no non lo è, hai bisogno dei tipi di parametri, non c'è magia che possa posizionare i parametri nei registri appropriati o impilare lo spazio quando si chiama una funzione senza conoscere gli argomenti – nos