51

g++でデマングルされた名前からマングルされた名前を取り戻す方法はありますか?

たとえば、私はデマングルされた名前を持っていますが、マングルされた名前func(char*, int)を取り戻すにはどうすればよい_Z4funcPciですか?

私の質問はg++固有です。

4

3 に答える 3

41

g ++を使用するだけで、必要な署名を使用して空の関数をコンパイルし、そこから名前を抽出できます。例えば:

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

出力を与える

_Z2f1Pci

それはあなたが必要としているものだと思います。シンボルのマングル方法に影響を与えるため、関連するヘッダーファイルを必ずインクルードしてください。

于 2012-09-13T12:48:42.470 に答える
13

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のものがあることに注意してください。

于 2014-06-09T08:02:33.237 に答える
4

最悪の場合、複数の結果を取得する必要があるため、名前を壊すことができない場合があります。

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"

ありますがmangleNameDecodedName文字列ではなくデータ構造であるaが必要であり、そのデータ構造はdemangleName(何かを見落とした場合を除いて)によってのみ生成されます。うまくいけば、これは将来のリリースで改善されるでしょう。

clangコード

私はclangコードを試しませんでした。

于 2014-05-13T12:04:53.473 に答える