gcc符号分辨率遮蔽

时间:2017-08-18 14:10:19

标签: gcc linker libc crt atexit

我正在尝试将一些自定义代码添加到与atexit处理相关的内部libc中。

在我们的libc中,我们定义了这个,因为我们链接到自定义CRT文件,并且不使用定义它的GCC。

void *__dso_handle __attribute__((__visibility__("hidden"),__weak__)) = &__dso_handle;

GCC还会在链接时将其添加到二进制文件中。

在libc中只是调用

的函数atexit
int atexit(void (*func)(void))
{
    return __cxa_atexit((void (*)(void*))func, NULL, __dso_handle);
}

我面临的问题是,当我想让它从运行时调用atexit()的模块中动态获取一个时,所使用的_dso_handle值是来自libc的本地值,以便正确注册dso使用atexit功能。

我检查了属性,但我发现没有什么可以帮助那里。

请注意,与glibc不同,atexit保留在libc的动态版本中,以保持与旧二进制文件的向后兼容性。

1 个答案:

答案 0 :(得分:0)

  

我面临的问题是,当我想让它从运行时调用atexit()的模块中动态获取一个时,所使用的_dso_handle值是来自libc的本地值

您的模块可以拨打__cxa_atexit,然后传入您想要的dso_handle