如果包含打包为“.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/