8

我正在努力转换与 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
}
4

2 回答 2

3

可以通过段合并删除填充

例如

#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;
于 2011-08-06T21:35:57.440 回答
1

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

#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 之间的所有内容。

于 2010-07-07T08:40:35.277 回答