2012-10-19 41 views
1

什麼是生產不SUBSECTIONS_VIA_SYMBOLS標誌設置,一個的Mach-O目標文件最簡單的方法,使得連接器(帶-dead_strip)以後不會嘗試剪切的文本部分成片,並猜測哪些作品是用過的?如何創建一個不能被dead_stripped的對象文件?

我可以使用llvm/gcc(4.2.1)的命令行選項來阻止它首先發出.subsections_via_symbols,或者使用命令行工具從現有對象文件中刪除該標誌。 (根據Mach-O規範自己寫一個這樣的工具是一種選擇,但如果可能的話,我寧願不要重新發明那個難度大的輪子)。

平臺: iOS,從OSX與XCode 4.5交叉編譯。


背景:我們提供其他公司建設成一個應用程序的靜態庫。當我們的圖書館遇到問題時,它會生成帶有堆棧跟蹤的崩潰報告以及其他關鍵信息(如果幸運的話),我們將在稍後分析。通常,已部署的應用程序已被剝離調試信息,因此解釋堆棧跟蹤是一個問題。如果我們自己製作應用程序,我們只會在剝離之前保存DWARF調試數據,並使用它來解碼傳入崩潰報告中的地址。但我們不能依賴應用程序製造商向我們提供這些鏈接步驟中的數據。

我們正在做的是讓崩潰報告包含所選函數的運行時地址;從中我們可以推斷出我們的鏈接器地圖中的地址與崩潰報告中的地址之間的偏移量。在我們將它整合到.a中之前,我們將整個庫逐步鏈接到一個.o;因爲它只做了一件大事,當應用程序最終被鏈接時,從它中刪除未使用的功能並沒有太大的節省。不幸的是,庫中有一些代碼片段有時不被使用(主要功能的替代API入口點,解釋我們的錯誤代碼的小型幫助器函數等),以及如果應用開發者鏈接到-dead_strip,它會干擾崩潰報告的地址重構,即最終應用中的相對偏移與鏈接器映射與增量鏈接操作不同。

我們不能切實要求所有的應用程序開發人員在他們的構建過程中禁用死代碼剝離,所以如果我們可以將我們的.o標記爲「不可死的剝離」並擁有最終應用程序聯繫方面。

回答

1

我解決了它。

如果輸入對象設置了全部,則增量鏈接操作的輸出僅設置了MH_SUBSECTIONS_VIA_SYMBOLS。如果有明確的指令集,彙編程序輸入生成的目標文件只有設置它。所以人們可以通過鏈接彙編器輸入刪除標誌:

echo > empty.s 
$(CC) $(CFLAGS) input.o empty.s -nostdlib -Wl,r -o output.o 
相關問題