ZHCADC4A September 2011 – March 2014
System V ABI 指定用于可执行文件和共享对象的初始化序列,通过该序列,可在调用 main 之前调用诸如全局对象构造函数的函数。类似地,有一种机制可定义在 main 返回之后调用的函数。这些机制使用由 DT_INIT* 和 DT_FINI* 动态标签标记的函数指针表。
GC++ ABI 的第 3.3.5 节扩充了终止机制,使得 C++ 程序能够正确寄存析构函数,以便在使用共享对象的程序终止之前卸载共享对象时调用该析构函数。该机制使用了 C++ 编译器支持库中名为 _ _cxa_atexit 的 API 函数,其调用如下:
__cxa_atexit(dtor, obj, &__dso_handle);
(其中,dtor 是指向析构函数的指针,obj 是指向对象的指针。)
第三个实参 _ _dso_handle 是标识共享对象的唯一地址。C6000 ABI 将其值定义为模块 near DP 区段的地址。
另一个函数 _ _cxa_finalize 在卸载共享对象时实现对寄存函数的调用。该函数调用如下:
__cxa_finalize(&__dso_handle);
链接器必须安排该调用作为第一个终止操作发生,通常通过 DT_FINI* 表实现。由于 _ _cxa_finalize 带一个实参,调用的 DT_FINI 函数不带实参,因此链接器必须为该调用生成空的包装器函数。
如要总结该约定的要求,静态链接器需负责:
生成包含对 _ _cxa_atexit 的调用的任何可执行文件或共享对象时,应遵循这些要求。