是否有任何方法可以從g ++中取消demangled名稱中的錯位名稱。從demangled名稱獲取錯位名稱
例如,我的名稱爲func(char*, int)
,我應該怎麼做才能得到重名的名稱,例如_Z4funcPci
?
我的問題是g ++的具體問題。
是否有任何方法可以從g ++中取消demangled名稱中的錯位名稱。從demangled名稱獲取錯位名稱
例如,我的名稱爲func(char*, int)
,我應該怎麼做才能得到重名的名稱,例如_Z4funcPci
?
我的問題是g ++的具體問題。
您可以簡單地使用g ++編譯一個帶有您需要的簽名的空函數並從中提取名稱。例如:
echo "int f1(char *, int) {} " | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e 's/:$//'
使輸出
_Z2f1Pci
這是我覺得你所需要的。確保包含任何相關的頭文件,因爲它們會影響符號被破壞的方式。
好方法。另一個方向使用'C++ filt'。 –
這並不總是那麼容易。假設你有像'IFS :: Profiler :: create(IFS :: Handle hdl)'這樣的名字。 –
恰恰「不那麼容易」。如果沒有聲明任何提到的數據結構,編譯將失敗。其中一些是在你的代碼中,其中一些來自頭文件。 – 18446744073709551615
什麼是最壞的,有時你不能 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。
基於對博揚尼科利奇的方法,這裏有一個更好的劇本:
撕裂。慶典:
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的。
凸輪你解釋你的腳本如何在第二個參數(constr/destr)?我可以在代碼中真正看到它(我只看到1美元)。另外,什麼是C0,C1和C2電流/電流轉換器? – einpoklum
請原諒我的無知......爲什麼更好? – jww
@jww嘗試使用原始腳本獲取'abc :: def :: ghi()'的名稱。 – 18446744073709551615
@ H2CO3:偉大的聯繫,但有什麼辦法知道它是否是最新的和權威的?該域名似乎是在溫尼伯大學的一個網站。 –
@j_random_hacker美國技術大學有一個好習慣,不要把垃圾放在他們的官方網站上。 – 2012-09-13 05:55:33
@ H2CO3:在頁面鏈接到的內容頁面上:「本文件於1999年8月27日生成」。另外,如果我記得溫尼伯是在加拿大:-P –