我有一個應用程序可以利用在運行時使用dlopen加載的插件。每個插件定義一個函數來檢索使用通用結構定義的插件信息。類似的東西:dlopen/dlsym儘可能少鏈接
struct plugin {
char *name;
char *app_version;
int app_verion_id;
char *plugin_version;
int plugin_version_id;
/* ... */
};
struct plugin p = { "sample plugin",APP_VERION,APP_VERSION_ID,"1.2.3",10203 };
struct plugin *get_plugin() {
return &p;
}
這很好,插件可以加載。現在我想構建一個小工具來讀取這些屬性,而無需鏈接整個應用程序。爲了做到這一點,我有這樣的代碼:
void *handle;
struct plugin *plugin;
struct plugin *(get_plugin*)();
handle = dlopen(filename, RTLD_LAZY);
if (!handle) { /*...return; ...*/ }
get_plugin = dlym(handle, "get_plugin");
if (!get_plugin) { /*...return; ...*/ }
plugin = get_plugin();
printf("Plugin: %s\n", plugin->name);
這對於簡單的插件很好。問題在於許多插件引用了來自應用程序的更多符號,即使設置了RTLD_LAZY,也可以解析這些符號。 (如應用程序中用於初始化插件全局事物的全局變量)因此,dlopen()調用失敗,並出現如fatal: relocation error: file sample_plugin.so: symbol application_some_symbol: referenced symbol not found
這樣的錯誤。因爲我只想訪問單個簡單結構,所以我想知道如何阻止鏈接器完成他的大部分工作。
構建插件時使用了哪些鏈接選項? – 2010-04-10 17:40:16