C++ 如何通过字符串查找指向函数的指针

C++ 如何通过字符串查找指向函数的指针,c++,c,llvm,function-pointers,jit,C++,C,Llvm,Function Pointers,Jit,我有一个文本文件中的函数列表,我想在运行时向LLVM公开它的执行引擎,我想知道是否有可能在运行时找到指向函数的指针,而不是手动在所有GlobalMappings中找到硬代码,因为我可能会在以后添加更多。例如: // File: InternalFunctions.txt PushScreen PopScreen TopScreen // File: ExposeEngine.cpp // Somehow figure out the addres

我有一个文本文件中的函数列表,我想在运行时向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);

如果这是可能的,我喜欢知道怎么做,因为我正试图通过C++编写我的游戏引擎。我可以早些时候创建一些结果,但我必须在映射中硬编码。我注意到Gtk使用了一些与我要求的内容类似的东西。当您使用glade并提供一个信号处理程序时,您在c中构建的程序将自动在glade文件中提供的字符串所引用的可执行文件中找到该函数。如果要获得结果需要我研究Gtk,我会非常乐意,但我不知道api的哪些特性或部分可以解决这个问题——我已经尝试过了。我很想听听你的建议。

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


这是一些插件架构工作的标准方式。或者至少在每个人都开始使用解释语言之前,已经习惯于工作了

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


这是一些插件架构工作的标准方式。或者至少在每个人都开始使用解释语言之前,已经习惯于工作了

所以,基本上,你有一些基本的运行时,你想连接到一些JIT代码?那么,基本上,你有一些基本的运行时,你想连接到一些JIT代码?对于一些其他稍微流行的系统,请尝试
LoadLibrary
GetProcAddress
,我找到了一种方法,通过使用LLVM IR输出来获取C++的名称。但我有一个问题,因为dlsym只找到我的一个函数,返回一个非空地址,但不返回任何其他函数。我不知道为什么。事实上,我发现。。。就在几分钟前,它击中了我。Dlsym找不到其他函数,因为它们都是内联函数。然而,它正在查找一个内联函数,所以我想知道dlsym是否可以找到一个函数的引用?或者如果内联函数是由于被调用而创建的?内联函数也会在某些情况下发出,包括它们的地址是否被占用。它们可能会在一些调用站点上被内联。对于一些其他流行的系统,尝试<代码> LoadLibrary < /C>和<代码> GeCopTeals< /Cord>。因此,我找到了一种通过使用LLVM IR输出来获得C++被忽略的名称的方法。但我有一个问题,因为dlsym只找到我的一个函数,返回一个非空地址,但不返回任何其他函数。我不知道为什么。事实上,我发现。。。就在几分钟前,它击中了我。Dlsym找不到其他函数,因为它们都是内联函数。然而,它正在查找一个内联函数,所以我想知道dlsym是否可以找到一个函数的引用?或者如果内联函数是由于被调用而创建的?内联函数也会在某些情况下发出,包括它们的地址是否被占用。它们可能仍在某些呼叫站点进行内联。