Как обратиться к запуску - пользовательского сегмента в проекте Visual Studio?

Я изо всех сил пытаюсь преобразовать C-программу, связанную с ld набора инструментальных средств гну, чтобы заставить его скомпилировать как Visual Studio (2005) проект. Программа помещает .data-символы в различные сегменты, и во время фазы инициализации она копирует данные между сегментами. Указатели на запуск и конец сегментов определяются в ld сценарии компоновщика.

Я понимаю, как определить местоположение переменных в различные, пользовательские сегменты, но я не смог выяснить, как определить константы компоновщика, такие как _start_of_my_segment или если существует что-то подобное сценарию компоновщика в Visual Studio.

Моя цель состоит в том, чтобы смочь скомпилировать программу с, предпочтительно никакие модификации к исходному коду, который относится к определенным компоновщиками символам, но с моим собственным расположением данных в проекте Visual Studio.

Ниже некоторый C-код в качестве примера, который иллюстрирует то, что я хотел бы сделать и (упрощенный, возможно неправильный синтаксисом) версия делать-сценария, используемого при соединении с 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
}
6
задан ara 7 July 2010 в 07:59
поделиться

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.

0
ответ дан 17 December 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: