簡體   English   中英

我如何確保dlopen正常工作

[英]how can I be sure dlopen work properly

我正在嘗試使用dlopen將符號加載到內存中。

但是,我不確定是否可以正常工作。

我的代碼如下:

const char* lib_names[] = {"libudev.so.0.13.0"};
int lib = dlopen(lib_names[0], RTLD_NOLOAD | RTLD_LAZY | RTLD_GLOBAL);

這個lib可以為我判斷是否可以正確打開此共享庫嗎?

感謝您的任何反饋

dlopen()返回void *指針。 指針是傳遞給其他動態鏈接加載器函數的句柄。 因此,將您的返回類型更改為void *

void *lib = dlopen(...)

您可以檢查lib以查看庫是否正確打開。 如果lib為NULL,則該庫無法打開。 如果lib不為NULL,則庫成功打開。 使用dlerror()可獲得文本錯誤字符串,說明無法打開庫的原因。 例如:

void *lib = dlopen(...)
if (lib == NULL) {
    fprintf(stderr, "Shared library failed to open: %s\n", dlerror());
    exit(1);
}

請注意,設置了RTLD_NOLOAD標志后, dlopen()實際上不會打開該庫。 從手冊頁:

不要加載庫。 這可用於測試庫是否已駐留(如果不是,則dlopen()返回NULL;如果已駐留,則返回庫的句柄)。 此標志還可以用於在已經加載的庫上提升標志。 例如,以前使用RTLD_LOCAL加載的庫可以使用RTLD_NOLOAD | |重新打開。 RTLD_GLOBAL。 POSIX.1-2001中未指定此標志。

您可能需要刪除RTLD_NOLOAD才能獲得所需的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM