C++ 按顺序排列的函数地址?

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

Linux是否有从共享对象按序号或索引检索函数地址的功能

我这样问是因为我正在编写OpenGL包装,我必须对所有300+函数执行以下操作:

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);