2012-01-09 89 views
3

我一直在尋找ABI交叉檢查工具。現在我遇到的其他問題,如對這些問題的一些工具提示:ABI兼容性頭/庫交叉檢查

How to test binary compatibility automatically?

Static analysis tool to detect ABI breaks in C++

現在,這不正是我想要做的事 - 因爲這些跟蹤ABI版本之間的變化。

我想知道給定項目源文件+庫頭文件和庫.so文件,以及編譯器版本(用於編譯庫和項目),是否可以交叉檢查ABI的輸出與編譯的庫匹配嗎?

所以,它適用的情況是,如果一個上游庫運送libfoo.so和libfood.so。在哪裏食物是一個稍微不同的ABI,(比如說雙打而不是浮點數),但是到目前爲止它不會編譯。

  • 是否有可能拿出一個測試(可能不是bulletproof),說明編譯的可執行文件已經鏈接到正確的lib?
  • 是否有工具可以做到這一點?

回答

1

如果你認爲你只有C編碼的libfoo.so(沒有它的頭文件,你應該也有),沒有辦法知道例如因爲共享對象的符號表不包含任何輸入信息(例如,除了傳統智慧以外,沒有其他任何東西可以阻止庫函數包含增加兩個整數並返回其總和的函數,而不是像往常一樣堆分配)。

因此,libfoo.so可以被濫用。但是,在某些共享庫中,通常有與符號相關的版本(並且如果您使用庫,則可以通過編程方式查詢該文件,如果是dlvsym則爲dlvsym)。有一些方法可以生成版本。

如果庫是純C++,那麼符號是mangled,因此它們的編碼包含它們的簽名。

最好的做法是在庫中有一些函數返回庫的版本。看看glib version information函數就是一個很好的例子。