2015-05-18 54 views
0

我需要從大型C++項目中刪除未使用的函數。閱讀了一段時間後,我用這個鏈接:How can I know which parts in the code are never used?解決方法名稱無需C++ filt

我使用makefiles在RedHat上編譯。我加入到編譯器標誌:
-Wall -Wconversion -ffunction截面-fdata截面
和鏈接標誌:
-Wl,-rpath,--demangle, - GC -sections, - print -gc-sections
對於一些令人討厭的原因,我收到後的輸出,即使在使用--demangle選項後。例如:

/usr/bin/ld: Removing unused section '.text._ZN8TRACABLED0Ev' in file 'CMakeFiles/oded.dir/oded.cpp.o' /usr/bin/ld: Removing unused section '.text._ZN8TRACABLED1Ev' in file 'CMakeFiles/oded.dir/oded.cpp.o'

所以我有6000函數名,我需要unmangle,我不能用extern C

我可以編寫一個腳本來解析它並使用C++ filt,但是我正在尋找一種解決方案,它將使鏈接器自行取消功能!

任何人都知道這樣的解決方案是否存在?

回答

1

對於一些討厭的原因,我收到輸出重整即使使用--demangle選項

man ld之後:

--demangle[=style] 
--no-demangle 

These options control whether to demangle symbol names in 
error messages and other output. 

但這些消息:

Removing unused section '.text._ZN8TRACABLED0Ev' in file 

而不是關於符號名稱。他們約部分名稱,這恰好發生在有時包括符號名稱。所以這是按照記錄工作。

現在,如果您真的想要做些什麼,您可以開發一個鏈接器補丁來同時對部分名稱進行解壓縮,並將其發送給GNU binutils維護人員。

但是更簡單的選擇可能是簡單地通過c++filt將您想要消除的消息管道化。例如:

echo "Removing unused section '.text._ZN8TRACABLED0Ev' in file" | 
    sed -e 's/_ZN/ _ZN/' | c++filt 

生產:

Removing unused section '.text. TRACABLE::~TRACABLE()' in file 
+0

謝謝!似乎我會去一個腳本(: – kurdt