Estoy escribiendo un código que almacena algunas estructuras de datos en una sección binaria con un nombre especial. Estas son todas instancias de la misma estructura que están dispersas en muchos archivos C y no están dentro del alcance de la otra. Al colocarlos todos en la sección nombrada, puedo iterar sobre todos ellos.¿Cómo obtener un puntero a una sección binaria en MSVC?
En GCC, utilizo _ atributo _ ((sección (...)), además de algunos indicadores extern con nombres especiales que se llenan en mágicamente por el enlazador Aquí está un ejemplo trivial:.
#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;
}
Estoy intentando averiguar cómo hacer esto en MSVC, pero estoy dibujando un espacio en blanco. Veo en la documentación del compilador que puedo declarar la sección usando __pragma (sección (...)) y declaro que los datos están en ese sección con __declspec (asignar (...)) pero no puedo ver cómo puedo obtener un puntero al inicio y al final de la sección en tiempo de ejecución.
He visto algunos ejemplos en la web relacionados con hacer _ atributo _ ((constructor)) en MSVC, pero parece una piratería específica de CRT y no una forma general de obtener un puntero al principio/final de un sección. ¿Alguien tiene alguna idea?
¿Puedo preguntar por qué quieres controlar la nomenclatura de la sección binaria en primer lugar? – Reinderien
Es para un marco de instrumentación de alto rendimiento. Imagine una invocación printf (formato, args ...), donde todas las cadenas de formato se almacenan en la sección binaria, y lo único que se registra son los argumentos más un valor de búsqueda. La sustitución de argumentos tiene lugar en el postprocesamiento. –
Un mejor ejemplo de esto es un programa que le permite agregar módulos volviendo a vincular en lugar de recompilar (y posiblemente regenerar algún código). Si puede tratar toda la sección como una matriz de alguna estructura, puede iterar sobre ella y realizar alguna acción en/para cada entrada, como llamar a 'cur_entry [i] -> init (& cur_entry)'. También puede utilizar conocimientos especiales sobre patrones de uso de memoria para optimizar la localización y la ubicación del caché haciendo esto. No suele estar relacionado con Windows (que yo sepa) pero esto también puede ser necesario para los procesadores de arquitectura de Harvard. – nategoose