Я изо всех сил пытаюсь преобразовать C-программу, связанную с ld, из цепочки инструментов gnu, чтобы она скомпилировалась как проект visual-studio (2005). Программа помещает символы .data в разные сегменты и на этапе инициализации копирует данные между сегментами. Указатели на начало и конец сегментов определены в сценарии компоновщика ld.
Я понимаю, как размещать переменные в разных определяемых пользователем сегментах, но я не смог понять, как определить константы компоновщика, такие как _start_of_my_segment, или есть ли что-то похожее на скрипт компоновщика в Visual Studio.
Моя цель состоит в том, чтобы иметь возможность скомпилировать программу, желательно без модификаций исходного кода, который ссылается на определенные компоновщиком символы, но с моей собственной компоновкой данных в проекте Visual Studio.
Ниже приведен пример C-кода, который иллюстрирует то, что я хотел бы сделать, и (урезанная, возможно, синтаксически неправильная) версия make-script, используемая при компоновке с gcc/ld.
Любые подсказки будут очень признательны!
#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
}