DLSYM导致分割故障

dlsym causing segmentation fault

本文关键字:故障 分割 DLSYM      更新时间:2023-10-16

所以我一直在尝试从本地迪利布获得符号,但是每当我尝试做任何事情时,我都会得到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;
}

来自官方POSIX dlclose参考:

一旦关闭了符号表句柄,应用程序应假定使用句柄可见的任何符号(函数标识符和数据对象标识符(不再可见。

这意味着,一旦您致电dlclose,您就无法再使用模块中的任何功能。

我也有一个类似的问题,事实证明我正在将返回的64位指针从dlopen截断为32位值,并试图将符号与该值链接起来。

例如: -

#define HANDLE int;
HANDLE library = (HANDLE)dlopen("libname.so");
HANDLE symbol = (HANDLE)dlsym(library, "symbol");