我当时正在研究使用ida pro 6.9为aarch64编译的C ++程序,并遇到了一些很奇怪的东西:

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中查看生成的二进制文件。