c++ - C++程序如何从 ".a"文件中导入文件,而自己却无法反推 ".a"文件?

标签 c++

如果包含打包为“.a”的文件,则可以导入其中的文件并调用它们的方法。但是,据我所知,您无法从“.a”文件中检索源代码。程序知道并可以使用源代码,但没有程序以人类可读的形式生成源代码,这怎么可能呢?

最佳答案

好吧,即使对链接器进行了所有解释,您仍然感到困惑。

简单来说,CPU理解并执行的代码并不是你用C++写的代码。它做同样的事情,但又不一样。

汇编是介于C++(和其他高级语言)和机器码(CPU执行的代码)之间的一种语言,仍然可以被人眼理解,所以我在这里使用汇编。让我们使用两个 C++ 函数并查看它们的程序集(由启用优化的 clang 生成):

第一个函数:

auto foo(int a, int b, int c)
{
  if (a < b)
    return b;
  if (a > c)
    return c;
  return a;
}

以及生成的程序集:

foo(int, int, int):                              # @foo(int, int, int)
        cmpl    %edx, %edi
        cmovlel %edi, %edx
        cmpl    %esi, %edi
        cmovll  %esi, %edx
        movl    %edx, %eax
        retq

第二个:

auto clamp(int value, int interval_left, int interval_right)
{
  return std::max(interval_left, std::min(value, interval_right));
}

用它生成的程序集:

clamp(int, int, int):                            # @clamp(int, int, int)
        cmpl    %edi, %edx
        cmovlel %edx, %edi
        cmpl    %esi, %edi
        cmovll  %esi, %edi
        movl    %edi, %eax
        retq

我们可以观察到的:

  • 2 个 c++ 函数做完全相同的事情
  • 程序集丢失了很多信息:
    • 参数原名
    • 甚至连函数中有多少变量的信息都丢失了
    • 函数有什么样的指令流。
    • C++ 代码有什么样的指令
    • 第二个函数实际上调用了其他函数
    • 除非明确指定(-g),否则即使是函数名称也会在最终目标文件中丢失
    • 等等
  • 非常不同(在实现中)C++ 函数生成相同 assebly(好吧,几乎可以这么说,它只是测试进行的顺序不同)

因此您可以看到,没有可靠的方法可以从程序集中访问原始 C++ 代码(从目标文件中更是如此)。

关于c++ - C++程序如何从 ".a"文件中导入文件,而自己却无法反推 ".a"文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39288584/

相关文章:

c++ - C 头文件 (.h) 和 C++ 头文件 (.hpp) 有什么区别?

c++ - 使用模板参数的静态成员模板

c++ - 归档容器如何工作?

c++ - 随机数生成器未在设置的变量参数内生成

c++ - "Id returned 1 exit status"错误 C++

c++ - gtk_widget_add_tick_callback() 和 gtk_main_iteration()

c++ - wglGetProcAddress 返回 NULL

c++ - C++ 代码生成的宏替代方案

C++ - 使用模板公开返回 const 引用并私下返回非 const 引用

c++ - 派生类中 protected 成员函数地址不可访问