Как правильно использовать недокументированный #pragma extern_absolute MSVC с функциями?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как правильно использовать недокументированный #pragma extern_absolute MSVC с функциями?

Сообщение Anonymous »

Мне нужна информация о следующем утверждении:

Код: Выделить всё

#include 

class Base {
public:
void Test();
};

int main() {
Base b;
b.Test();
return 0;
}

#pragma extern_absolute("?Test@Base@@QAEXXZ", "0x12345678")
(нет смысла связывать репродукцию Compiler Explorer, поскольку она не выполняет связывание)
По сути, это должно вынести некоторый символ в абсолютное местоположение, однако в документах Google или MS буквально нет информации. Пока это компилируется, мы не можем заставить его работать, так как возникает ошибка:

Код: Выделить всё

LNK2016 absolute symbol '?Test@Base@@QAEXXZ' used as target of REL32 relocation in section 0x6
LNK1165 link failed because of fixup errors
Я не понимаю, почему цепочка инструментов пытается вызвать его с помощью мнемоники CALL rel32 ( код операции). В нашем случае мы должны вызывать этот адрес напрямую, без каких-либо перемещений и т. д., поэтому имеет смысл использовать CALL r/m32 ( код операции), который вызывает абсолютный адрес (в конце концов, это extern_absolute, а не extern_relative) и заранее передает адрес в EAX (согласно вики, EAX является нестабильным, поэтому его использование для вызова будет работать, и это доказано в моем проекте).
Есть ли способ правильно вызвать такой символ?>

Подробнее здесь: https://stackoverflow.com/questions/797 ... -functions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»