У меня есть список функций в текстовом файле, который я хотел бы предоставить LLVM для своего механизма выполнения во время выполнения, мне интересно, можно ли найти указатели на функции во время выполнения, а не на жесткий код во всех глобальных сопоставлениях от руки, как я бы хотел добавить позже. Например:
// File: InternalFunctions.txt
PushScreen
PopScreen
TopScreen
// File: ExposeEngine.cpp
// Somehow figure out the address of the function specified in a string
void* addy = magicAddress("PushScreen");
jit->addGlobalMapping(llvmfunction, addy);
Если это возможно, мне нравится знать, как это сделать, поскольку я пытаюсь написать свой игровой движок jit-ing c++. Я смог создать некоторые результаты раньше, но мне пришлось жестко кодировать в отображениях. Я заметил, что Gtk использует что-то в соответствии с тем, что я прошу. Когда вы используете поляну и предоставляете обработчик сигнала, программа, которую вы создаете на c, автоматически найдет функцию в вашем исполняемом файле, на которую ссылается строка, предоставленная в файле glade. Если получение результатов требует от меня взглянуть на эту вещь Gtk, я был бы более чем счастлив, но я не знаю, с чем связана эта особенность или часть api - я уже пытался ее найти. Я хотел бы услышать предложения или советы.
Да, ты можешь это сделать. Посмотрите на страницы man для dlopen()
и dlsym()
: эти функции являются стандартными для * nix-систем и позволяют вам искать символы (функции или переменные) по имени. Существует одна существенная проблема, которая заключается в том, что имена функций C++ обычно "искажены" для кодирования информации о типе. Типичным способом этого является определение набора функций- extern "C" {}
блоке extern "C" {}
: это будут нечлены, функции стиля C, которые затем могут вызвать ваш код C++. Их имена не будут искалечены, что упростит их поиск с помощью dlsym()
.
Это довольно стандартный способ работы некоторых платформ. Или, по крайней мере, привыкнуть, прежде чем все начнут использовать интерпретируемые языки!
LoadLibrary
и GetProcAddress
.