如何捕捉符号查找错误

how to catch symbol lookup error

本文关键字:错误 查找 符号 何捕捉      更新时间:2023-10-16

如何在代码中发现符号查找错误,从而导致程序崩溃?

void main()
{
  try {
    dlopen("shared.so", RTLD_LAZY);
    /** 
      now running a function in this shared object and 
      this function calls a undefined reference
      and then it crashes but i want to go in the catch block
    */
  } catch(...) {
  }
}

dlopenC函数。它不抛出任何exception

void *dlopen(const char *filename, int flag);

来自man dlopen

如果dlopen()由于任何原因失败,它将返回NULL。

因此,请检查NULL的返回值。

因此,为了进行检查,该符号存在,您应该使用

void *dlsym(void *handle, const char *symbol);

如果在指定的库或任何库中找不到符号加载该库时由dlopen()自动加载的,dlsym()返回NULL。(dlsym()执行的搜索在这些库的依赖树中是广度优先的。)由于符号的值实际上可能是NULL(因此从dlsym()返回NULL不需要指示错误),测试错误的正确方法是调用dlerr()清除任何旧的错误条件,然后调用dlsym(),然后再次调用dlerr(),将其返回值保存到变量中,并检查此保存的值不是NULL