如何在Visual Studio项目中引用用户定义的段的开头?

我正在努力转换与gnu工具链的ld链接的C程序,以使其作为visual-studio(2005)项目进行编译。 该程序将.data-symbols放在不同的段中,在初始化阶段,它在段之间复制数据。 指向段开头和结尾的指针在ld链接描述文件中定义。

我理解如何将变量定位到不同的,用户定义的段中,但我还没有弄清楚如何定义链接器常量,如_start_of_my_segment,或者是否有类似于Visual Studio中的链接描述文件。

我的目标是能够编译程序,最好不要修改引用链接器定义的符号的源代码,而是使用我自己的Visual Studio项目中的数据自定义布局。

下面是一些示例C代码,用于说明我想要做什么以及与gcc / ld链接时使用的make脚本的(精简,可能是语法错误)版本。

任何提示将不胜感激!

#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); } 

伪链接脚本(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 } 

可以通过合并段删除填充

例如

 #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; 

创建其他段(它们按字母顺序放在内存中):

 #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; 

然后复制&fooFirst和&fooLast之间的所有内容。