Как разрешить нынешний процесс символы в MCJIT кода LLVM JIT-компилятором на основе?
Я создаю простой MCJIT на основе JIT (реализация калейдоскоп учебник в Rust , чтобы быть более точным). Я использую SectionMemoryManager:: getSymbolAddress для разрешения символов. Он видит символы из библиотек (например, функцию sin), но не может разрешить функции из моей программы (глобальные, видимые с nm, отмеченные там T). Является ли это ожидаемым поведением? Или это какая-то ошибка в моем коде?
Если это ожидаемое поведение, как я должен правильно разрешать символы из текущий процесс? Теперь я добавляю символы из процесса с LLVMAddSymbol, поэтому разрешение начинает работать. Является ли это правильным решением?
Для тех, кто прочтет мой код. Проблема с символами не связана с искажением имени, так как когда я пытался заставить SectionMemoryManager::getSymbolAddress работать, я использовал директиву no_mangle, поэтому они были названы правильно.
1 ответ:
Благодаря Лэнгу Хеймсу, он ответил на мой вопрос в другом месте. Я привожу здесь ответ на случай, если кто-то будет смотреть на ту же проблему, что и я:
В ответ на ваш вопрос:
SectionMemoryManager::getSymbolAddressв конечном итоге (через базовый классRTDyldMemoryManager) делает вызовllvm::sys::DynamicLibrary::SearchForAddressOfSymbol, который ищет символ во всех ранее загруженных динамических библиотеках. Вы можете вызватьllvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr)в рамках инициализации JIT (перед любыми вызовамиgetSymbolAddress), чтобы импортировать символы программы в таблицы символовDynamicLibrary.Если вы действительно хотите, чтобы открыть все функции в вашей программе для JIT'D кода это хороший способ пойти. Если вы хотите предоставить только ограниченный набор функций среды выполнения, вы можете поместить их в общую библиотеку и просто загрузить ее.
Comments