2010-02-12 44 views
2

我在Linux中有兩個共享庫,它們在構建時在所有方面都是相同的,只是每個公開的函數具有不同的接口(需要一些第三方數組類型和其他需要字符串)。我可以構建兩個共享庫版本,並且我想知道是否有一種方法可以將元信息插入共享庫本身(很像您如何在構建時將註釋/公司名稱/ etc插入到DLL中,然後可以在運行時查詢)。要嵌入到Linux共享庫中的信息

我不想以不同的方式命名這兩種風格的.so文件,因爲它們實際上是相同的東西,它們是更大系統的可互換部分。我需要我的代碼在庫上做一個dlopen和dlsym來知道它是什麼味道,以便它具有正確的接口。

我目前正在完成這項工作的方式是在其中一箇中添加一個名爲「Flavor_A」的非操作函數,在另一箇中添加一個「Flavor_A」。然後,我使用Flavor_A或Flavor_B來驗證我正在處理的共享庫。如果我得到一個NULL,我知道Flavor_X不存在,在這種情況下,它必定是另一種味道。

我覺得應該有更好的辦法。所以,這就是我來這裏的原因。

任何人都有如何建立一些運行時查詢信息到.so二進制本身的建議嗎?

謝謝。

回答

5

而不是有兩個不同的符號,我建議有一個符號總是在那裏,可以返回正確的信息。

FLAVOR getFlavor() 
{ 
#ifdef FLAVOR_A 
    return Flavor_A; 
#else 
    return Flavor_B; 
#endif 
} 

你也可以直接導出一個具有正確風味的變量;

extern FLAVOR flavor = 
#ifdef FLAVOR_A 
    Flavor_A; 
#else 
    Flavor_B; 
#endif 

對於後者,你就可以訪問變量是這樣的:

*(FLAVOR *)dlsym(lib, "flavor") 
0

這是最好的方法。沒有一種標準的方法可以將某些東西放入.so中,而不是符號。

1

爲什麼不添加GetFlavor/GetVersion方法,它可以讓你知道它是哪種味道/版本?

1

您可以添加任意的註釋部分等,到ELF二進制有鏈接腳本。鏈接器在運行時不會使用它們,但可以包含構建數據等信息。 GCC在默認情況下會提供一些信息來說明使用的是什麼版本(如.gnu.version)。

使用objdump來檢查或轉儲它們。