somescope::SomeClass<false>::some_name<somescope::SomeClass<false>::other_name(uint,uint,uint)::{lambda(void *,bool)#2}>::SOMETHING
我真的对这种表示法感到困惑...特别是:
{lambda(void *,bool)#2}
是什么意思?它是lambda表达的指标吗?另外,#2
是什么?other_name(uint,uint,uint)
在一定范围内吗?如果是这种情况,可能会是什么?我对逆向工程还很陌生,我已经尝试用谷歌搜索了一个小时...如果有的话请提示我线索。
预先感谢!
#1 楼
关于第一个问题:what does ...lambda... mean
:是的,很明显,它指的是lambda函数。第一个问题的第二部分:
What is #2
:对lambda进行的一些实验表明,这就像是lambda的序列号在函数中。请注意,gcc和clang有不同的编码方式。
gcc
使用lambda()#2
表示法,而clang
使用$_1
表示法。您的第二个问题:
what is other_name
:我认为这将是定义lambda的函数。some_name
是将lambda作为模板参数传递的函数。lambda本身会传递作为包含值或指针的副本的结构,或者从c ++的角度来看:引用,由lambda定义的闭包。
对编译器如何处理lambda进行实验简单。
编写一些测试代码:
#include <stdio.h>
template<typename FN>
int test(FN f)
{
return f();
}
int main(int, char**)
{
int a, b;
auto f1 = [](int a, int b) { return a+b; };
int c = test([&a, b, &f1]() { return f1(a,b); });
auto f2 = [](int a, int b) { return a-b; };
int d = test([&a, b, &f2]() { return f2(a,b); });
printf("c=%d, d=%d\n", c, d);
return 0;
}
然后用最少的编译即可优化和调试符号:
g++ -O0 -g yourfile.cpp
并在
ida
中查看生成的二进制文件。