您可以在与您为其编译可执行文件的平台兼容 ABI 的平台上运行生成的可执行文件。ABI 兼容性基本上意味着在两个(可能不同的)操作系统上使用相同的物理处理器架构和操作系统接口(加上调用约定)。例如,您可以在 FreeBSD 系统(具有相同的处理器类型)上运行为 Linux 编译的二进制文件,因为 FreeBSD 包含 Linux ABI 兼容性。但是,可能无法在所有其他类型的 Unices 上运行二进制文件,除非进行了一些骇客操作。例如,你不能在 Linux 上运行 Mac OS X 应用程序,但是这个人有一个解决方案,可以在 Linux 上使用一些 OS X 命令行工具(包括 GCC 编译器本身)。
逆向工程:确实有反编译器旨在从机器代码生成 C 代码,但它们(还)不是很强大。原因是它们天生就很难写。必须识别机器代码模式,即使那样你也无法收集所有原始信息。例如,循环类型、注释和非静态局部变量名称以及大多数类型在编译过程中都消失了。例如,如果您有这样的 C 源文件:
int main(int argc, char **argv)
{
int i;
for (i = 0; i < 10; i++)
{
printf("I is: %d\n", i); /* Write the value of I */
}
return 0;
}
C 反编译器可能能够重建以下代码:
int main(int _var1, void *_var2)
{
int _var3 = 0;
while (_var3 < 10)
{
printf("I is: %d\n", _var3);
_var3 = _var3 + 1;
}
return 0;
}
但这将是一个相当先进的反编译器,例如这个。