dlsym导致分段错误

时间:2018-04-04 07:57:54

标签: c++

所以我一直试图从当地的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;
}

2 个答案:

答案 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");