Sto scrivendo del codice che memorizza alcune strutture dati in una sezione binaria con un nome speciale. Si tratta di tutte le istanze della stessa struttura che sono disseminate in molti file C e non si trovano nell'ambito dell'altra. Inserendoli tutti nella sezione denominata, riesco a scorrere su tutti loro.Come ottenere un puntatore a una sezione binaria in MSVC?
In GCC, io uso _ attributo _ ((sezione (...)) più alcune indicazioni esternato appositamente nominati, che sono magicamente riempiti a cura del linker Ecco un esempio banale:.
#include <stdio.h>
extern int __start___mysection[];
extern int __stop___mysection[];
static int x __attribute__((section("__mysection"))) = 4;
static int y __attribute__((section("__mysection"))) = 10;
static int z __attribute__((section("__mysection"))) = 22;
#define SECTION_SIZE(sect) \
((size_t)((__stop_##sect - __start_##sect)))
int main(void)
{
size_t sz = SECTION_SIZE(__mysection);
int i;
printf("Section size is %u\n", sz);
for (i=0; i < sz; i++) {
printf("%d\n", __start___mysection[i]);
}
return 0;
}
Sto cercando di capire come farlo in MSVC, ma sto disegnando uno spazio vuoto.Vedo dalla documentazione del compilatore che posso dichiarare la sezione usando __pragma (section (...)) e dichiarare i dati in questo sezione con __declspec (allocate (...)) ma non riesco a vedere come posso ottenere un puntatore all'inizio e alla fine della sezione in fase di esecuzione
Ho visto alcuni esempi sul web relativi all'effetto _ attributo _ ((costruttore)) in MSVC, ma sembra un hacking specifico per CRT e non un modo generale per ottenere un puntatore all'inizio/fine di un sezione. Qualcuno ha qualche idea?
Posso chiedere perché si desidera controllare la denominazione delle sezioni binarie in primo luogo? – Reinderien
È per un framework di strumentazione ad alte prestazioni. Immagina un'invocazione di printf (format, args ...), in cui tutte le stringhe di formato sono state memorizzate nella sezione binaria e l'unica cosa che viene registrata sono gli argomenti più un valore di ricerca. La sostituzione argomento ha luogo in post-elaborazione. –
Un esempio migliore di questo è un programma che consente di aggiungere moduli ricollegando anziché ricompilando (e possibilmente rigenerando del codice). Se puoi trattare l'intera sezione come una matrice di qualche struct, puoi eseguirne l'iterazione ed eseguire un'azione su/per ogni voce, come ad esempio call 'cur_entry [i] -> init (& cur_entry)'. È inoltre possibile utilizzare conoscenze speciali sui modelli di utilizzo della memoria per ottimizzare il paging e la localizzazione della cache. Di solito non è legato a Windows (che io sappia), ma può anche essere richiesto per i processori di architettura di Harvard. – nategoose