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
По умолчанию, при компиляции 64-битного кода (AMD64/EM64T) включен параметр PIE, то есть данные берутся относительно командного регистра RIP.
Когда происходит вызов функции, подставляется её адрес, а при передаче как данные, используется относительный указатель на данные, а не на функцию, поскольку данные не должны вызываться как функция.
Решение: указать параметр -fno-pie для компилятора.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Допустим имеется один абстрактный класс: Word - от него производим два класса: Noun и VerbТут сталкиваемся с вопросом: как хранить объекты этих классов?...
Когда я скомпилировал мой qt проект , он показал такую ошибкуПочему ??
Нужно синхронизировать два потока, пока один не запросит данные, другой их не отдает и ждет запроса на данные