【问题标题】:How to find a pointer to a function by string如何通过字符串查找指向函数的指针
【发布时间】:2014-09-20 17:12:46
【问题描述】:

我有一个文本文件中的函数列表,我想在运行时向 LLVM 公开它的执行引擎,我想知道是否有可能在运行时找到指向函数的指针而不是硬代码所有的 GlobalMappings 都是手动的,因为我以后可能想添加更多。例如:

    // 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 使用了我所要求的内容。当您使用 glade 并提供信号处理程序时,您在 c 中构建的程序将自动在 glade 文件中提供的字符串引用的可执行文件中找到该函数。如果获得结果需要我研究这个 Gtk 事情,我会非常乐意,但我不知道 api 的哪些功能或部分处理这个问题 - 我已经尝试查找它。我很想听听建议或建议。

【问题讨论】:

  • 所以,基本上,你有一些基本的运行时,你想连接到一些 JITed 代码?

标签: c++ c llvm function-pointers jit


【解决方案1】:

是的,您可以这样做。查看dlopen()dlsym() 的手册页:这些函数在*nix 系统上是标准的,可以让您按名称查找符号(函数或变量)。有一个重要的问题,那就是 C++ 函数名称通常被“修改”以编码类型信息。解决此问题的典型方法是在 extern "C" {} 块中定义一组包装函数:这些将是非成员的 C 样式函数,然后可以调用您的 C++ 代码。他们的名字不会被破坏,因此使用dlsym() 可以轻松查找。

这是一些插件架构工作的非常标准的方式。或者至少在每个人都开始使用解释型语言之前曾经工作过!

【讨论】:

  • 对于其他一些不太流行的系统,请尝试LoadLibraryGetProcAddress
  • 所以,我找到了一种通过使用 llvm ir 输出来获取 C++ 错误名称的方法。但我有一个问题,因为 dlsym 只找到我的 1 个函数,返回一个非空地址,但没有其他任何地址。我想知道这是为什么。
  • 实际上,我想通了……几分钟前我就想到了。 Dlsym 没有找到其他函数,因为它们都是内联的。但是它正在找到一个内联函数,所以我想知道 dlsym 是否可以找到对函数的引用?或者如果内联函数是由于被调用而创建的?
  • 内联函数在某些情况下也会被外联发出,包括它们的地址是否被占用。它们可能仍然在某些呼叫站点内联。
猜你喜欢
  • 2011-06-05
  • 2012-11-13
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
  • 2022-01-04
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多