我正在努力转换与 gnu 工具链的 ld 链接的 C 程序,以使其编译为 visual-studio (2005) 项目。该程序将 .data-symbols 放在不同的段中,并在初始化阶段在段之间复制数据。指向段开始和结束的指针在 ld 链接描述文件中定义。
我了解如何将变量定位到不同的用户定义段中,但我无法弄清楚如何定义链接器常量,例如 _start_of_my_segment 或者是否有类似于 Visual Studio 中的链接器脚本的东西。
我的目标是能够编译程序,最好不修改引用链接器定义的符号的源代码,但在 Visual Studio 项目中使用我自己的数据自定义布局。
下面是一些示例 C 代码,说明了我想要做什么以及与 gcc/ld 链接时使用的 make-script 的(精简,可能语法不正确)版本。
任何提示将不胜感激!
#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
}