插入到加密框架中的用户级库应当提供 _fini() 函数。卸载用户级库时,装入器会调用 _fini() 函数。_fini() 函数是确保所有的清除操作都在恰当的时间正确完成所必需的。系统不假设那些使用 libpkcs11 的库调用 C_Finalize(),因为 libpkcs11 是共享库,有可能正由应用程序使用。
要提供 _fini() 函数,需要在可重定位对象的程序数据部分中创建一个 .fini 部分。.fini 部分提供运行时终止代码块。请参见《链接程序和库指南》。以下代码样例演示了如何设计 .fini 部分。
#pragma fini(pkcs11_fini) static void pkcs11_fini(); /* [... (other library code omitted)] */ static void pkcs11_fini() { (void) pthread_mutex_lock(&pkcs11mutex); /* If CRYPTOKI is not initialized, do not clean up */ if (!initialized) { (void) pthread_mutex_unlock(&pkcs11mutex); return; } (void) finalize_routine(NULL_PTR); (void) pthread_mutex_unlock(&pkcs11mutex); }