是否有任何方法可以从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 –