所以我一直试图从当地的dylib获取符号,但每当我尝试做任何事情时,我都会遇到一个段错误,我不确定为什么会发生这种情况。我已经在其他程序中看到了这一点并且它们工作正常,所以我知道它有效,但我似乎无法做到:(。任何帮助都表示赞赏。 干杯
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;
}
答案 0 :(得分:1)
来自the official POSIX dlclose
reference:
一旦符号表句柄被关闭,应用程序应该假定使用句柄可见的任何符号(函数标识符和数据对象标识符)不再可用于该进程。
这意味着,一旦您调用dlclose
,您就无法再使用模块中的任何功能。
答案 1 :(得分:0)
我遇到了类似的问题,结果是我将从dlopen返回的64位指针截断为32位值,并尝试将符号与该值链接。
例如:-
#define HANDLE int;
HANDLE library = (HANDLE)dlopen("libname.so");
HANDLE symbol = (HANDLE)dlsym(library, "symbol");