IDA pro 6.9,类型符号中的“lambda”在 C++ 反向代码中是什么意思

逆向工程 艾达 C++
2021-06-26 10:46:17

我正在研究使用 ida pro 6.9 为 aarch64 编译的 C++ 程序,并遇到了一些非常奇怪的事情:

somescope::SomeClass<false>::some_name<somescope::SomeClass<false>::other_name(uint,uint,uint)::{lambda(void *,bool)#2}>::SOMETHING

我真的被这个符号搞糊涂了……具体来说:

  1. 什么{lambda(void *,bool)#2}意思?它是 lambda 表达式的指标吗?另外,什么是#2

  2. other_name(uint,uint,uint)有点范围?other_name如果是这种情况,可能是什么情况?

我对逆向工程相当陌生,我已经尝试在谷歌上搜索了一个小时......如果你有线索,请提示我。

提前致谢!

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.