2012-09-13 162 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