2012-02-06 93 views
1

我正在尋找一種便攜式(POSIX)的方式來確定打開一個庫的路徑dlopen()。諸如dl_iterate_phdr()dladdr()之類的功能是不便攜的。便攜式的方式來確定路徑動態庫打開與dlopen

一些man頁詳細dlopen()所採取的路徑找到庫打開(ld.so.cacheLD_LIBRARY_PATH,/ lib目錄,/ usr/lib目錄,...),所以檢查所有這些目錄的可能是可能的,但不便攜。例如,在Linux下,我需要一種方法來解析ld.so.cache,但在Mac OS X下,沒有這種概念。

請參閱爲什麼我想這樣做對細節previous question,因爲使用dlopen是在一般情況下是不明智的。

回答

3

真的沒有辦法做到你想要的可移植性。真的,在沒有絕對路徑的情況下使用dlopen可能是一個糟糕的主意,也是一個壞主意,除了用於加載dlopen的模塊之外,還可以將它用於任何其他目的(由您自己的項目本身創建並分發給您的應用程序使用)。如果將其與系統庫搜索路徑和庫中的「已存在」系統庫一起使用,則會出現加載錯誤版本或甚至是具有相同名稱的錯誤庫的嚴重風險。只要你總是通過一個絕對路徑到dlopen,你可以確定你確切地知道哪個文件被加載(或者更好的是,確切地知道在加載之前哪個文件將被加載)。

如果這個答案沒有幫助,也許你可以更好地解釋你想達到什麼..

+0

聽起來絕對路徑是要走的路,但必須確保絕對路徑是正確的,因爲'dlopen'會在其他搜索路徑下開始。請參閱http://stackoverflow.com/questions/9038303/programatically-determine-shared-libraries-in-use-by-running-application關於我想完成的明確細節。 – greg 2012-02-06 16:31:42

+1

好的,'LD_LIBRARY_PATH'不適合你在那裏做什麼。相反,您應該將學生的共享庫文件的完整路徑名傳遞給您的程序,然後它可以使用完整路徑名加載它。 – 2012-02-06 16:33:51

+1

@greg:如果給定的名稱不包含「/」字符,則dlopen僅搜索庫路徑。如果它包含「/」,則將其視爲文件路徑(直接傳遞給打開的文件),如果該文件未退出,則不會在其他任何位置查看。 – 2012-02-06 17:33:28

2

簡單的答案是沒有一個。這是Windows在Unix之前的一個地方。