dlsym和参数检查

时间:2014-03-10 13:41:29

标签: c plugins arguments dlsym

我正在用C编写一个插件应用程序,我正在使用dlopen / dlsym来动态加载某些函数的“实现”。例如,我有一个指向函数的指针

struct cti_t* (*create)() = 0;

我使用以下代码加载实现:

plugin_handle = dlopen ("xxx.so", RTLD_NOW);
//error checking

create = dlsym(plugin_handle, "cti_create");
//error checking

//call create for the specific implenetation
struct cti_t *dev = create();

“插件”按以下方式定义cti_create

struct cti_t* cti_create(int i) {
   printf("Creating device lcl");
       //do somenthing with i
   return &lcl_cti;
}

因此它定义了一个整数参数,但一切都可以正常工作。问题是:当符号加载dlsym时,是否可以进行一些参数类型验证?如何强制加载的符号具有我期望的签名?

1 个答案:

答案 0 :(得分:1)

如果函数是C函数,则在使用dlsym加载时不能进行任何参数类型验证 - 图像中没有任何内容可以定义参数(或返回类型)。如果您正在使用C ++(并且未声明符号具有extern "C"链接),则类型检查将嵌入实际符号名称中。话虽如此,在调用dlsym()时,你必须传入受损的C ++名称,而不是“cti_create”。