g++でデマングルされた名前からマングルされた名前を取り戻す方法はありますか?
たとえば、私はデマングルされた名前を持っていますが、マングルされた名前func(char*, int)
を取り戻すにはどうすればよい_Z4funcPci
ですか?
私の質問はg++固有です。
g++でデマングルされた名前からマングルされた名前を取り戻す方法はありますか?
たとえば、私はデマングルされた名前を持っていますが、マングルされた名前func(char*, int)
を取り戻すにはどうすればよい_Z4funcPci
ですか?
私の質問はg++固有です。
g ++を使用するだけで、必要な署名を使用して空の関数をコンパイルし、そこから名前を抽出できます。例えば:
echo "int f1(char *, int) {} " | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e 's/:$//'
出力を与える
_Z2f1Pci
それはあなたが必要としているものだと思います。シンボルのマングル方法に影響を与えるため、関連するヘッダーファイルを必ずインクルードしてください。
Bojan Nikolicのアプローチに基づいて、より良いスクリプトを次に示します。
mangle.bash:
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
ただし、コンストラクタとデストラクタに関しては、C0C1C2とD0D1D2のものがあることに注意してください。
最悪の場合、複数の結果を取得する必要があるため、名前を壊すことができない場合があります。
https://reverseengineering.stackexchange.com/q/4323/4398を参照してください(VFTには複数のデストラクタがあり、それらはすべて次のようにデストラクタされていますClassName::~ClassName()
)。(同じことがコンストラクターにも当てはまります。C0およびC2コンストラクターを見てきました。)
一方、その回答はItanium ABIを参照しています:https ://refspecs.linuxbase.org/cxxabi-1.75.html#mangling-typeここでmanglingが指定されています。
itanium-abi Haskellパッケージ:私には機能しませんでした(2014年5月)
デマングリングとマングリングの両方を約束するHaskellパッケージ http://hackage.haskell.org/package/itanium-abiがありますが、私はデマングリングしか実行できませんでした。
Ubuntu Preciseへのインストール:
sudo aptitude install ghc
sudo aptitude install cabal-install
cabal update
cabal install itanium-abi
次に、実行するghci
と、次のようにimport ABI.Itanium
なりimport Data.Either
ます。
Prelude ABI.Itanium Data.Either> cxxNameToText $ head (rights [ demangleName "_ZTI13QSystemLocale" ])
"typeinfo for QSystemLocale"
ありますがmangleName
、DecodedName
文字列ではなくデータ構造であるaが必要であり、そのデータ構造はdemangleName
(何かを見落とした場合を除いて)によってのみ生成されます。うまくいけば、これは将来のリリースで改善されるでしょう。
clangコード
私はclangコードを試しませんでした。