2015-09-05 50 views
3

我正在創建一個簡單的基於MCJIT的JIT(實現更精確的Kaleidoscope tutorial in Rust)。我正在使用SectionMemoryManager :: getSymbolAddress來進行符號解析。它看到來自庫的符號(例如sin函數),但未能解析我的程序中的函數(全局的,可見的nm,用T標記)。這是預期的行爲?或者它應該是我的代碼中的一些錯誤?如何在基於LLVM MCJIT的JIT中解析當前進程符號?

如果這是預期的行爲,應該如何正確解析當前進程中的符號?我現在使用LLVMAddSymbol從流程中添加符號,因此解析開始工作。這是正確的解決方案嗎?

對於那些會閱讀我的代碼的人。符號問題與名稱無關,因爲當我嘗試使SectionMemoryManager :: getSymbolAddress工作時,我使用了no_mangle指令,因此它們被正確命名。

回答

1

感謝Lang Hames,他在其他地方回答了我的問題。我在這裏舉了答案的情況下,如果有人會看同樣的問題,因爲我:

在回答你的問題:SectionMemoryManager::getSymbolAddress最終(通過RTDyldMemoryManager基類)使得以llvm::sys::DynamicLibrary::SearchForAddressOfSymbol呼籲,其中搜索所有以前加載動態符號庫。您可以致電llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr)作爲JIT初始化的一部分(在致電getSymbolAddress之前)將程序符號導入DynamicLibrary的符號表中。

如果你真的想將程序中的所有函數都暴露給JIT代碼,這是一個很好的方法。如果您只想公開一組有限的運行時函數,則可以將它們放入共享庫中並加載該函數。

+0

啊,那很好。我認爲可能有一個論壇或IRC會議室會有更多的背景細節 - 你永遠不知道未來的搜索者在解決類似問題時可能想知道什麼^ _ ^。 – Shepmaster