因此,我一直试图从本地dylib获取符号,但是每当我尝试做任何事情时,我都会遇到一个seg错误,我不知道为什么会发生这种情况。我在其他程序中见过这样的工作,它们运行得很好,所以我知道它能工作,但我似乎做不到。任何帮助都是非常感谢的。干杯
typedef void (*func_t)();
func_t testFunction;
template<class type>
type findSymbol(string dylib, string symbol)
{
void* handle = dlopen(dylib.c_str(), RTLD_NOW);
if(!handle)
{
debug(dlerror());
return nullptr;
}
// Reset errors
dlerror();
type sym = (type)dlsym(handle, symbol.c_str());
const char* dlsym_error = dlerror();
if(dlsym_error)
{
debug(dlsym_error);
dlclose(handle);
return nullptr;
}
sym(); <--- Executes fine
dlclose(handle);
return sym;
}
int main()
{
// Example 1
testFunction = findSymbol<func_t>("./test.dylib", "hello"); <--- Seg fault
// Example 2
func_t f = findSymbol<func_t>("./test.dylib", "hello"); <--- Fine
f(); <--- Seg fault
return EXIT_SUCCESS;
}发布于 2018-04-04 08:03:49
来自 reference
一旦符号表句柄关闭,应用程序应假定使用句柄显示的符号(函数标识符和数据对象标识符)不再适用于该进程。
这意味着,一旦调用了dlclose,就不能再使用模块中的任何函数了。
发布于 2020-03-23 08:46:50
我也遇到了类似的问题,结果是我将返回的64位指针从dlopen截断为32位值,并试图将符号与该值链接。
例如:-
#define HANDLE int;
HANDLE library = (HANDLE)dlopen("libname.so");
HANDLE symbol = (HANDLE)dlsym(library, "symbol");https://stackoverflow.com/questions/49645677
复制相似问题