第六章 动态模块加载 / 6.3 数据结构

dso数据结定义在crypto/dso/dso.h中,如下所示:

       struct dso_st

       {

              DSO_METHOD *meth;

              STACK *meth_data;

              int references;

              int flags;

              CRYPTO_EX_DATA ex_data;

              DSO_NAME_CONVERTER_FUNC name_converter;

              DSO_MERGER_FUNC merger;

              char *filename;

              char *loaded_filename;

       };

meth:指出了操作系统相关的动态库操作函数。

       meth_data:堆栈中存放了加载动态库后的句柄。

       reference:引用计数,DSO_new的时候置1DSO_up_ref时加1,DSO_free时减1

       当调用DSO_free,只有当前的references1时才真正释放meth_data中存放的句柄。

       flag:与加载动态库时加载的文件名以及加载方式有关,用于DSO_ctrl函数。

       DSO_convert_filename:当加载动态库时会调用DSO_convert_filename函数来确定所加载的文件。而DSO_convert_filename函数会调用各个系统自己的convert函数来获取这个文件名。

       对于flag有三种种操作命令:设置、读取和或的关系,对应定义如下:

       #define DSO_CTRL_GET_FLAGS      1

       #define DSO_CTRL_SET_FLAGS       2

       #define DSO_CTRL_OR_FLAGS       3

       flag可以设置的值有如下定义:

       #define DSO_FLAG_NO_NAME_TRANSLATION            0x01

       #define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY      0x02

       #define DSO_FLAG_UPCASE_SYMBOL                         0x10

       #define DSO_FLAG_GLOBAL_SYMBOLS                       0x20

       意义说明如下:

       DSO_FLAG_NO_NAME_TRANSLATION

       加载的文件名与指定的文件名一致,不加后缀.dll(windows).so(linuxunix)

       DSO_FLAG_NAME_TRANSLATION_EXT_ONLY

       加载的文件名会加上lib串,比如用户加载eay32,真正加载时会加载libeay32(适用于linuxunix)

       DSO_FLAG_UPCASE_SYMBOL

       适用于OpenVMS

       DSO_FLAG_GLOBAL_SYMBOLS

       适用于unix,当在unix下调用加载函数dlopen,参数会被或上RTLD_GLOBAL

       ex_data:扩展数据,没有使用。

       name_converter::指明了具体系统需要调用的名字计算函数。

loaded_filename:指明了加载动态库的全名。