2012-09-04 59 views
1

C++損壞符號名稱。這些名稱可以在調試時使用 - 但只有在二進制文件未被刪除的情況下才能使用。其他使用場景是共享庫 - 符號名稱可以導出並在庫中可見。C++中的符號 - 它們是否在非調試版本中導出?

但是在兩者中:

a。剝離構建,

b。 AND normal,non-shared library build

在二進制文件中應該沒有可用的符號?例如,字符串工具不會輸出任何符號?

+1

這篇論文是關於圖書館的,但是它對控制符號的輸出付出了很大的努力。你可能想看看它http://www.akkadia.org/drepper/dsohowto.pdf –

+1

和字符串不是一個工具來看二進制符號。它將輸出它在二進制文件中找到的任何字符串(導出的符號將在二進制文件中有它們的名稱)。您可能需要使用nm或readelf。 –

回答

1

a。剝離構建

b。非共享庫版本

您不清楚您是否在詢問構建是否滿足A)和B)或A)和B)方案。

對於兩個 - 非共享,剝離構建 - 是的,符號應該都沒有了。

僅適用於A),否:如果您使用的是共享庫,則符號將(默認情況下)從其中導出,並且strip不會將其刪除。如果您使用ELF,則可以通過例如限制符號的可見性來限制符號的可見性。 __attribute__((visibility("hidden")))或等同的機制。

對於B) - 非剝離,非共享構建,符號一般會出現在符號表中,因此strings將顯示它們。爲了擺脫它們,使用strip(將其變成A)和B)組合)。

1

strip命令從圖像中刪除調試符號。在共享對象中導出的符號不是調試符號,並且不會被strip刪除。這些符號可用於定位函數/數據,但它們不會將代碼與源相關聯。

1

在不是共享庫的剝離版本(a)中,沒有符號可用。 (b)中,函數名稱的符號被保留,但所有其他的調試符號都不是。在「正常」編譯中(既不調試也不去除)(b),函數名稱的符號被保留,但所有其他調試符號都不被保留。在調試器中,您將能夠捕獲帶有函數名稱的堆棧跟蹤,但不會檢查其參數或打印堆棧變量的值。

相關問題