C++ 按顺序排列的函数地址?
Linux是否有从共享对象按序号或索引检索函数地址的功能 我这样问是因为我正在编写OpenGL包装,我必须对所有300+函数执行以下操作:C++ 按顺序排列的函数地址?,c++,linux,C++,Linux,Linux是否有从共享对象按序号或索引检索函数地址的功能 我这样问是因为我正在编写OpenGL包装,我必须对所有300+函数执行以下操作: module->AddressOf(funcs[0],"glAccum"); module->AddressOf(funcs[1],"glAlphaFunc"); module->AddressOf(funcs[2],"glAreTexturesResident"); module->AddressOf(funcs[3],"glArr
module->AddressOf(funcs[0],"glAccum");
module->AddressOf(funcs[1],"glAlphaFunc");
module->AddressOf(funcs[2],"glAreTexturesResident");
module->AddressOf(funcs[3],"glArrayElement");
module->AddressOf(funcs[4],"glBegin");
module->AddressOf(funcs[5],"glBindTexture");
module->AddressOf(funcs[6],"glBitmap");
module->AddressOf(funcs[7],"glBlendFunc");
module->AddressOf(funcs[8],"glCallList");
module->AddressOf(funcs[9],"glCallLists");
module->AddressOf(funcs[10],"glClear");
module->AddressOf(funcs[11],"glClearAccum");
module->AddressOf(funcs[12],"glClearColor");
module->AddressOf(funcs[13],"glClearDepth");
module->AddressOf(funcs[14],"glClearIndex");
module->AddressOf(funcs[16],"glClearStencil");
module->AddressOf(funcs[17],"glClipPlane");
module->AddressOf(funcs[18],"glColor3b");
module->AddressOf(funcs[19],"glColor3bv");
module->AddressOf(funcs[20],"glColor3d");
诸如此类。。在windows上,我可以做到:
for (int i = 0; i < 385; ++i)
module->AddressOf(funcs[i], (const char*)i);
是的,我通过遍历func数组并查看其中是否有NULL
来检查错误
Windows上的序数值示例:
在Linux上,您可以使用和
dlsym
函数。链接主程序时,不要忘记传递-rdynamic
当然,要使用dlsym
请注意,您可以通过dlopen
-将其设置为NULL
害怕C++。使用extern“C”
将其禁用
顺便说一句,如果你是说
for (int i = 0; i < 385; ++i)
module->AddressOf(funcs[i], (const char*)i);
for(int i=0;i<385;++i)
模块->地址(funcs[i],(const char*)i);
(我猜您输入了一个错误:您的代码混合了I
和I
)我很惊讶它即使在Windows上也能可靠地工作:当I
为50时,(const char*)I
为(const char*)50
,这不太可能是有效的字符串。在Linux上肯定不是这样(因为地址空间的第一页没有映射,我想Windows上也是这样,我不知道)
但是,记录为处理
函数的序数值。如果此参数是序数值,则必须是低阶字;高阶字必须为零
我不知道函数的序数值是多少(在某些共享库中),AFAIK Linux也没有这样的概念。即使您的代码在Windows上运行,它如何知道funcs[5]
对应于glBindTexture
?你需要把这些信息提供给你的代码
在Linux上,如果要从函数的地址获取函数名,可以使用dladdr
如果需要获取OpenGL函数的地址,则需要处理每个函数的名称
也许您可以在某个数组中收集OpenGL函数的许多名称。您可以使用一些脚本(可能一些awk
脚本处理一些OpenGL头,或者使用自定义编译器)来收集它们
您可能会使用一些ELF阅读库,如libelf
,并扫描ELF符号表。你也许可以popen
像nm-dlibopengl这样的命令
阅读;它详细地解释了这一切 您没有解释Module->AddressOf
真正在做什么(即在Windows中使用GetProcAddress
做什么)。是否针对其故障进行测试?添加了一个实现AddressOf
。在windows中,我可以按数字/索引/序号或名称加载函数。我正在试图弄清楚如何在Linux中按数字/索引/序号而不是按名称加载。。键入385个函数名很麻烦。您的代码(即使在Windows上)如何知道索引12对应于glClearColor
?它将如何处理func[12]
?请编辑您的问题以解释.glAccum对应于Windows上的索引1。总是这样。我添加了一张显示它的图片。我已经在7台机器上测试了它,每台机器都有不同的驱动程序和AMD、NVidia和Intel GFX卡。我已经从XP测试到了8.1。Windows上的所有系统模块按名称导出函数,并且它们对应的序号值在操作系统版本之间似乎也不会改变。我接受这一点。Linux上似乎不存在序数。我想我必须写一个脚本才能把所有的名字放到一个数组或映射中。@Brandon:你说得对,Linux中没有序号。说实话,你也不应该在Windows中使用它们。序数的问题是,使其可靠工作的唯一方法是编写.def
文件,并为每个符号显式指定它们。现在没有人再这样做了,这都是\u dllspec(export)
,任何序数都只是一个隐式数字。任何新的DLL构建都可能破坏它。哦,关于德雷珀的那篇文章:你应该用适量的盐来享受它;Drepper在Linux社区中享有盛名,曾多次打破惯例。
for (int i = 0; i < 385; ++i)
module->AddressOf(funcs[i], (const char*)i);