Comment faire référence au début d’un segment défini par l’utilisateur dans un projet Visual Studio?

J’ai du mal à convertir un programme C lié à ld, de la chaîne d’outils gnu, pour le comstackr en tant que projet visual-studio (2005). Le programme place les symboles .data dans différents segments et pendant une phase d’initialisation, il copie les données entre les segments. Les pointeurs vers le début et la fin des segments sont définis dans le script ld linker.

Je comprends comment localiser les variables dans différents segments définis par l’utilisateur, mais j’ai été incapable de comprendre comment définir des constantes d’éditeur de liens telles que _start_of_my_segment ou s’il existe quelque chose de similaire à un script d’éditeur de liens dans Visual Studio.

Mon objective est de pouvoir comstackr le programme avec, de préférence, aucune modification du code source faisant référence aux symboles définis par l’éditeur de liens, mais avec ma propre présentation personnalisée des données dans le projet Visual Studio.

Vous trouverez ci-dessous un exemple de code C illustrant ce que je voudrais faire, ainsi qu’une version (simplifiée, éventuellement syntaxique incorrecte) du script de création utilisé lors de la liaison avec gcc / ld.

Toute allusion serait grandement appréciée!

#pragma data_seg( "MY_DATA_FOO" ) #pragma data_seg( "MY_DATA_BAR" ) #pragma comment(linker, "/section:MY_DATA_BAR,R") __declspec(allocate("MY_DATA_FOO")) int foo1; __declspec(allocate("MY_DATA_FOO")) int foo2; __declspec(allocate("MY_DATA_BAR")) int bar1 = 1; __declspec(allocate("MY_DATA_BAR")) int bar2 = 2; #pragma data_seg( ) void test() { foo1 = bar1; foo2 = bar2; // i would rather do this as //extern unsigned int __start_of_MY_DATA_FOO; //extern unsigned int __start_of_MY_DATA_BAR; //extern unsigned int __size_of_MY_DATA_BAR; //memcpy(__start_of_MY_DATA_FOO, _start_of_MY_DATA_BAR, _size_of_MY_DATA_BAR); } 

Pseudo link-script (quel serait l’équivalent pour Visual Studio

 MEMORY { foo: org=0x1000, len=0x100 bar: org=0x2000, len=0x100 } SECTIONS { GROUP: { MY_DATA_FOO : {} __start_of_MY_DATA_FOO = ADDR(MY_DATA_FOO); __end_of_MY_DATA_FOO = .; __size_of_MY_DATA_FOO = SIZEOF(MY_DATA_FOO); } > foo GROUP: { MY_DATA_BAR : {} __start_of_MY_DATA_BAR = ADDR(MY_DATA_BAR); __end_of_MY_DATA_BAR = .; __size_of_MY_DATA_BAR = SIZEOF(MY_DATA_BAR); } > bar } 

le rembourrage peut être supprimé par la fusion de segments

par exemple

 #pragma data_seg(".foo_begin") #pragma data_seg(".foo_data") #pragma data_seg(".foo_end") #pragma comment( linker, "/merge:.foo_begin=.foo" ) #pragma comment( linker, "/merge:.foo_data=.foo" ) #pragma comment( linker, "/merge:.foo_end=.foo" ) __declspec(allocate(".foo_begin")) int foo_begin_marker; __declspec(allocate(".foo_end")) int foo_end_marker; __declspec(allocate(".foo_data")) int foo_data; 

Créez des segments supplémentaires (ils sont placés dans la mémoire par ordre alphabétique):

 #pragma data_seg("MY_DATA_FOO__a") #pragma data_seg("MY_DATA_FOO__z") #pragma data_seg("MY_DATA_FOO__m") __declspec(allocate("MY_DATA_FOO__a")) int fooFirst; __declspec(allocate("MY_DATA_FOO__z")) int fooLast; __declspec(allocate("MY_DATA_FOO__m")) int foo1; __declspec(allocate("MY_DATA_FOO__m")) int foo2; 

Copiez ensuite tout ce qui se situe entre & fooFirst et & fooLast.