如何从当前可执行文件中获取函数地址? 我需要用C++来从Solaris 10中的当前可执行文件知道函数地址(我使用GNU G++4.92)。例如,我有一个函数,比如:void doSomething(const char*p),它可能在当前可执行文件中定义,也可能不定义。因此,我希望在当前可执行文件中搜索函数,如果存在,则调用该函数,否则执行一些默认操作。我该怎么做?dlsym会帮忙吗? 请帮助我了解语法和损坏的名称。

如何从当前可执行文件中获取函数地址? 我需要用C++来从Solaris 10中的当前可执行文件知道函数地址(我使用GNU G++4.92)。例如,我有一个函数,比如:void doSomething(const char*p),它可能在当前可执行文件中定义,也可能不定义。因此,我希望在当前可执行文件中搜索函数,如果存在,则调用该函数,否则执行一些默认操作。我该怎么做?dlsym会帮忙吗? 请帮助我了解语法和损坏的名称。,c++,dlopen,solaris-10,dlsym,function-address,C++,Dlopen,Solaris 10,Dlsym,Function Address,您可以通过运行nm exec获得可执行文件中的符号列表。或者,如果您试图从共享库中获取符号,您也可以nm使用符号库。挑一个你想要的,然后装上像 void* handle = dlopen(NULL, RTLD_LAZY); void* ptr = dlsym(handle, "mangled_name_you_got_from_nm"); 尽管您可能希望通过以下方式将其强制转换为正在加载的函数的函数指针类型(显然,更改为适当的函数指针类型) void*handle=dlopen(NULL,RT

您可以通过运行
nm exec
获得可执行文件中的符号列表。或者,如果您试图从共享库中获取符号,您也可以
nm
使用符号库。挑一个你想要的,然后装上像

void* handle = dlopen(NULL, RTLD_LAZY);
void* ptr = dlsym(handle, "mangled_name_you_got_from_nm");
尽管您可能希望通过以下方式将其强制转换为正在加载的函数的函数指针类型(显然,更改为适当的函数指针类型)

void*handle=dlopen(NULL,RTLD\u-LAZY);
自动ptr=重新解释铸造(dlsym(手柄,“损坏的名称”从nm获得);
在库中,“如果定义了,则调用
foo()
,如果未定义,则不执行任何操作”的需求非常常见

一个常见的例子是,如果程序与线程链接,则调用
pthread\u mutex\u lock
pthread\u mutex\u unlock
,否则不执行锁定

弱未解析符号是一个完美的解决方案

extern void foo() __attribute__((weak));

void MaybeCallFoo()
{
   if (&foo == NULL) { printf("foo is not defined\n"); return; }
   foo();  // It is defined, call it.
}

是的,这正是dlsym的目的。它将按(损坏的)名称返回函数的函数指针(即地址)。@Cameron请帮助我使用的参数(从当前可执行文件中搜索)和损坏的名称Solaris 10上是否有nm的等效项?这将有助于我获得损坏的名称您可以使用此答案,但它有两个缺陷:(1)名称损坏可能会在编译器之间更改,甚至在同一编译器的不同版本之间更改。(2) 除非主可执行文件与
-rdynamic
(或等效文件)链接,否则该函数将不会在动态符号表中导出,
dlsym
将为其返回
NULL
。@EmployedRussian Solaris 10不支持静态链接的可执行文件。请参阅:使用Solaris 10,您无法再构建静态可执行文件@AndrewHenle静态链接与答案或我的评论完全无关。
extern void foo() __attribute__((weak));

void MaybeCallFoo()
{
   if (&foo == NULL) { printf("foo is not defined\n"); return; }
   foo();  // It is defined, call it.
}