2012-11-19 58 views
3

我正在做一個檢查elf文件的腳本,並且在某些時候需要檢查它的鏈接類型。
那麼,
有什麼工具在Linux或穩定的方式,我可以用來檢查輸出文件是完全靜態鏈接或動態鏈接?如何判斷一個精靈文件的鏈接類型?

'ld.so --verify'可以檢查文件是否是動態鏈接的,但是它也檢查這個鏈接器是否可以手動處理,所以我不能使用結果作爲鏈接類型的判斷。

'nm','file'等其他工具會檢查輸出文件並提供一些關於按打印信息鏈接類型的信息,這使得使用..e.g不是很可靠。如果我寫腳本grep單詞'動態鏈接''靜態鏈接'從'文件$文件名'的標準輸出作爲驗證鏈接類型不覺得可靠..

所以,有沒有任何簡單的方法或檢查鏈接類型的小工具?或爲什麼它不可能?

回答

1

您可以在一個二進制使用ldd,如果它的動態鏈接它打印共享庫,並返回0,如果它是靜態鏈接返回1

+0

謝謝。但我已經檢查了ldd的源代碼,不要認爲ldd只有在它不是動態鏈接時纔會返回1,也可能是其他原因,所以我不能使用該結果。 – user1836141

+0

@ user1836141 true,如果該文件不存在或不是精靈,則可以在使用ldd之前進行檢查,同時注意其他任何命令都會有相同的問題。 – iabdalkader

+0

有一個名爲'readelf -d'的命令,它檢查elf文件的動態部分,但不幸的是,即使沒有動態部分,它也會返回0。否則它可能是解決方案。另一個可能的解決方案是使用'readelf -h'來列出精靈標題部分,然後grep輸出...這又一次......不是很漂亮,但可能比其他人更可靠......我不知道......希望我能得到一些更好的解決方案。 – user1836141

0

我不知道一個實用程序,它明確你是什麼樣的尋找 - 如前所述,ldd可以用(ab-)來確定它。 file也可能有用。但信息是在ELF頭部,只需要正確解析,所以編寫一個簡單的程序來做到這一點不應該很難......

+0

我該如何使用ldd來做到這一點?我猜如果沒有現有的工具,那麼我需要解析精靈標題。 – user1836141

+0

我想這可能取決於你的'ldd'版本 - 我有一個報告'不是靜態鏈接的二進制文件的動態可執行文件',並且退出時使用'1'退出代碼,其中使用動態二進制文件,它列出了依賴關係和用'0'退出...... – twalberg

+0

是的,但是Mux已經在樓上回答了,我認爲ldd不僅返回錯誤1,而且當它不是dynamica鏈接時,也可能是其他錯誤。所以...... – user1836141

相關問題