ara*_*ara 6 c linker symbols segment visual-c++
我正在努力转换与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);
}
Run Code Online (Sandbox Code Playgroud)
伪链接脚本(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
}
Run Code Online (Sandbox Code Playgroud)
创建额外的段(它们按字母顺序放置在内存中):
#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;
Run Code Online (Sandbox Code Playgroud)
然后复制 &fooFirst 和 &fooLast 之间的所有内容。
归档时间: |
|
查看次数: |
4146 次 |
最近记录: |