как разместить код в определенном разделе для программы C ++, разработанной в MS VC ++ - PullRequest
2 голосов
/ 11 января 2012

Я пытаюсь использовать этот код для выделения фрагмента кода в независимом разделе:

#ifdef _MSC_VER
#pragma section(".evil",execute)
#pragma code_seg(".evil")
#endif


#ifdef __GNUC__
static __attribute__((section (".evil")))
#elif defined _MSC_VER
static __declspec(allocate(".evil"))
#endif
void __invoke__start()
{//...

Но это не работает, и компилятор говорит

Синтаксис __declspec (allocate ()) можно использовать только для статических данных.

Я делаю это, потому что мне нужно написать некоторый код в новый файл, и этот файл является исполняемым файлом.

На самом деле я не могу найти способ получить точный адрес функции в памяти при запуске программы, если программа скомпилирована с режимом отладки MS VC ++. Для полного примера, пожалуйста, смотрите этот код: полный пример

Теперь, вышеупомянутая проблема была решена, но я все еще хочу прояснить, что, если возможно, поместить некоторый код в независимый раздел. В конце концов, для моей работы есть и другое преимущество.

Когда я связываю два объектных файла (формат COFF), как я могу убедиться, что разные коды из разных файлов obj будут в разных разделах? Или есть другой способ сделать это?

Мне очень жаль мой плохой английский.

Ответы [ 2 ]

2 голосов
/ 11 января 2012

вы можете найти адрес памяти начала функции с помощью встроенного ассемблера, а затем вызвать функцию для использования адреса памяти, например:

void foo(){

    __asm{
        CALL 0h          \\Put current address on top of stack
        CALL myFunction  \\Actually make a funciton call
    }

...


}

int myFunction( int addrFromASM){
    \\do something with addrFromASM+4, which will be where the rest of foo starts.
}
1 голос
/ 11 января 2012

Помимо того, что в вашем коде есть хороший UB (вы предполагаете, что компилятор всегда будет размещать функции в указанном вами порядке), то, что вы хотите сделать с разделами, можно сделать, выделив новыйВ разделе PE-заголовка, который вы пишете и помещаете туда свой код (см. параграф The Section Table, найдено здесь ), вам также необходимо установить BaseOfCode для этого раздела и настроить NumberOfSections соответственно.

С точки зрения забавного адреса для функций, это из-за того, что Edit & Continue включен при компиляции в режиме отладки, просто отключите его в опциях проекта, и ваши адреса будут правильными.

...