2012-09-13 159 views
43

是否有任何方法可以從g ++中取消demangled名稱中的錯位名稱。從demangled名稱獲取錯位名稱

例如,我的名稱爲func(char*, int),我應該怎麼做才能得到重名的名稱,例如_Z4funcPci

我的問題是g ++的具體問題。

+3

@ H2CO3:偉大的聯繫,但有什麼辦法知道它是否是最新的和權威的?該域名似乎是在溫尼伯大學的一個網站。 –

+0

@j_random_hacker美國技術大學有一個好習慣,不要把垃圾放在他們的官方網站上。 – 2012-09-13 05:55:33

+0

@ H2CO3:在頁面鏈接到的內容頁面上:「本文件於1999年8月27日生成」。另外,如果我記得溫尼伯是在加拿大:-P –

回答

37

您可以簡單地使用g ++編譯一個帶有您需要的簽名的空函數並從中提取名稱。例如:

echo "int f1(char *, int) {} " | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e 's/:$//' 

使輸出

_Z2f1Pci 

這是我覺得你所需要的。確保包含任何相關的頭文件,因爲它們會影響符號被破壞的方式。

+4

好方法。另一個方向使用'C++ filt'。 –

+4

這並不總是那麼容易。假設你有像'IFS :: Profiler :: create(IFS :: Handle hdl)'這樣的名字。 –

+2

恰恰「不那麼容易」。如果沒有聲明任何提到的數據結構,編譯將失敗。其中一些是在你的代碼中,其中一些來自頭文件。 – 18446744073709551615

3

什麼是最壞的,有時你不能 mangle一個名字,因爲你必須得到多個結果。

請參閱https://reverseengineering.stackexchange.com/q/4323/4398(在VFT中有多個析構函數,並且它們全部被解壓縮爲ClassName::~ClassName())。 (這同樣適用於構造函數,我已經看到了C0和C2的構造函數。)

另一方面,該答案引用指定了mangling的Itanium ABI:https://refspecs.linuxbase.org/cxxabi-1.75.html#mangling-type

安騰-ABI哈斯克爾包:它沒有爲我工作(2014年5月)

有一個Haskell包 http://hackage.haskell.org/package/itanium-abi 唯一可以保證demangling和忙玲,但我可以只運行demangling:

安裝在Ubuntu精確:

sudo aptitude install ghc 
sudo aptitude install cabal-install 
cabal update 
cabal install itanium-abi 

然後運行ghci和0後和import Data.Either你:

Prelude ABI.Itanium Data.Either> cxxNameToText $ head (rights [ demangleName "_ZTI13QSystemLocale" ]) 
"typeinfo for QSystemLocale" 

mangleName,但它需要一個DecodedName這是一個數據結構,而不是一個字符串,而該數據結構僅由demangleName生產的(除非我忽略的東西)。希望這將在未來的版本中變得更好。

鐺代碼

我沒有嘗試the clang code

11

基於對博揚尼科利奇的方法,這裏有一個更好的劇本:

撕裂。慶典:

IFS='::' read -a array <<< "$1" 

indexes=("${!array[@]}") 

prefix="" 
middle="" 
suffix="" 
rettype="" 
if [ -z "$2" ]; then 
    rettype="void" 
fi 


for index in "${indexes[@]}" 
do 
    #echo "$index ${array[index]}" 
    if [ $index == ${indexes[-1]} ]; then 
    #echo "last" 
    middle="$rettype ${array[index]};" 
    elif [ -n "${array[index]}" ]; then 
    #echo "not empty" 
    prefix="${prefix}struct ${array[index]}{" 
    suffix="${suffix}};" 
    fi 
done 

#echo "$prefix$middle$suffix $rettype $1{}" 
echo "$prefix$middle$suffix $rettype $1{}" | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e 's/:$//' 

用途:

$ ./mangle.bash "abc::def::ghi()" 
_ZN3abc3def3ghiEv 
$ ./mangle.bash "abc::def::ghi(int i, char c)" 
_ZN3abc3def3ghiEic 
$ ./mangle.bash "abc::def::def(int i, char c)" constr 
_ZN3abc3defC2Eic 
$ ./mangle.bash "abc::def::~def()" destr 
_ZN3abc3defD2Ev 

但對於構造函數和析構函數,記得有C0 C1 C2和D1 D0 D2的。

+0

凸輪你解釋你的腳本如何在第二個參數(constr/destr)?我可以在代碼中真正看到它(我只看到1美元)。另外,什麼是C0,C1和C2電流/電流轉換器? – einpoklum

+0

請原諒我的無知......爲什麼更好? – jww

+0

@jww嘗試使用原始腳本獲取'abc :: def :: ghi()'的名稱。 – 18446744073709551615