从demangled的名字得到重名的名字

有没有办法从g ++中取回demangled的名字。

例如,我有demangled名称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 

但是对于构造函数和析构函数,请记住C0 C1 C2和D0 D1 D2。

最糟糕的是,有时你不能打破一个名字,因为你必须得到不止一个结果。

请参阅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 ,它承诺去除和修改,但是我只能运行demangling:

在Ubuntu上安装精确:

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

然后你运行ghci ,然后import ABI.Itaniumimport Data.Either你可以得到:

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

mangleName ,但它需要一个DecodedName这是一个数据结构,而不是一个string,并且该数据结构只由demangleName (除非我忽略了某些东西)产生。 希望这个版本在未来的版本中会变得更好。

铛代码

我没有尝试铛代码 。