Как найти указатель на функцию по строке

0

У меня есть список функций в текстовом файле, который я хотел бы предоставить 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 - я уже пытался ее найти. Я хотел бы услышать предложения или советы.

  • 0
    Итак, у вас есть базовая среда выполнения, которую вы хотите подключить к некоторому JIT-коду?
  • 0
    @Mats Матс Петерсон Да
Теги:
function-pointers
llvm
jit

1 ответ

4
Лучший ответ

Да, ты можешь это сделать. Посмотрите на страницы man для dlopen() и dlsym(): эти функции являются стандартными для * nix-систем и позволяют вам искать символы (функции или переменные) по имени. Существует одна существенная проблема, которая заключается в том, что имена функций C++ обычно "искажены" для кодирования информации о типе. Типичным способом этого является определение набора функций- extern "C" {} блоке extern "C" {}: это будут нечлены, функции стиля C, которые затем могут вызвать ваш код C++. Их имена не будут искалечены, что упростит их поиск с помощью dlsym().

Это довольно стандартный способ работы некоторых платформ. Или, по крайней мере, привыкнуть, прежде чем все начнут использовать интерпретируемые языки!

  • 3
    Для некоторых других незначительно популярных систем попробуйте LoadLibrary и GetProcAddress .
  • 0
    Итак, я нашел способ получить искаженные имена в C ++ с помощью вывода llvm ir. У меня проблема с этим, потому что dlsym находит только 1 из моих функций, возвращает ненулевой адрес, но не любой другой. Интересно, почему это так?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню