Что нужно сделать, чтобы при компиляции под x64_32 передать ссылку на функцию?

185
18 июня 2018, 19:40
void main_loop(const CMsg); //прототип функции
typedef void (*HPROC)(const CMsg); //тип-функция
bool MessageSubscribe(HPROC hCallback, uint32_t uEvent); //прототип функции, в которую нужно передать указатель функции.

При вызове MessageSubscribe в hCallback передаётся часть кода функции main_loop, а не указатель. Изменение HPROC на void* ничего не меняет. Использование амперсанда (&main_loop) вообще ни на что не влияет. Проблема возникает если main_loop в отдельном файле.

"Ход конём", описанный в В таблицу IDT вместо указателя вписывается часть кода. Где ошибка? применять нельзя.

Работу проверяю в VirtualBox со включенной отладкой. И в вызов call попадает не адрес функции, а начало кода функции.

Внутренний вывод, что в переменной подтверждает. Специально ввёл отладочные строки (kprint - это аналог printf без поддержки форматирования, второй параметр - перевод строки):

  kprint((HANDLE)*main_loop, true);
  kprint((HANDLE)main_loop, true);
  kprint((HANDLE)&main_loop, true);
  MessageSubscribe(&main_loop, EV_SYS);
  MessageSubscribe(&main_loop, EV_KBD);

Нормальные адреса кода в пределах 0x400000 ... 0x4FFFFF

Вывод as: kmain.o.S и main_loop.o.S

Answer 1

По умолчанию, при компиляции 64-битного кода (AMD64/EM64T) включен параметр PIE, то есть данные берутся относительно командного регистра RIP.

Когда происходит вызов функции, подставляется её адрес, а при передаче как данные, используется относительный указатель на данные, а не на функцию, поскольку данные не должны вызываться как функция.

Решение: указать параметр -fno-pie для компилятора.

READ ALSO
Можно ли хранить объекты разных классов (производных одного абстрактного класса) в одном массиве или списке?

Можно ли хранить объекты разных классов (производных одного абстрактного класса) в одном массиве или списке?

Допустим имеется один абстрактный класс: Word - от него производим два класса: Noun и VerbТут сталкиваемся с вопросом: как хранить объекты этих классов?...

200
Не создаётся QWidget без Qapplication

Не создаётся QWidget без Qapplication

Когда я скомпилировал мой qt проект , он показал такую ошибкуПочему ??

191
Что значит static class

Что значит static class

Что означает данная конструкция

255
std::future_error при пересоздании std::promise

std::future_error при пересоздании std::promise

Нужно синхронизировать два потока, пока один не запросит данные, другой их не отдает и ждет запроса на данные

230