gpt4 book ai didi

c - 用C编译后生成的可执行文件是否可以在任何不同的操作系统(UNIX)上复制和运行?

转载 作者:行者123 更新时间:2023-12-02 22:32:58 26 4
gpt4 key购买 nike

我是一名 Java 程序员,但我用 C 语言做的事情很少。所以,我从一个简单的例子开始,如下所示。如果我已经编译它并生成一个可执行文件 (hello),我可以在没有原始文件 (hello.c) 的情况下在任何 unix 平台上运行可执行文件 (hello) 吗?还有一种方法是从可执行文件中读取数据,将可执行文件反编译为原始文件(hello.c)?

[oracle@oracleapps test]$ cat hello.c
#include <stdio.h>
int main(){
int i,data =0;
for(i=1;i<=64;i+=1){
data = i*2;
printf("data=%d\n",data);
}
return 0;
}

编译

gcc -Wall -W -Werror hello.c -o hello

最佳答案

您可以在与您为其编译可执行文件的平台 ABI 兼容的平台上运行生成的可执行文件。 ABI 兼容性基本上意味着在两个(可能不同的)操作系统上使用相同的物理处理器架构和操作系统接口(interface)(加上调用约定)。例如,您可以在 FreeBSD 系统(具有相同处理器类型)上运行为 Linux 编译的二进制文件,因为 FreeBSD 包括 Linux ABI 兼容性。但是,可能无法在所有其他类型的 Unice 上运行二进制文件,除非进行一些黑客攻击。例如,您不能在 Linux 上运行 Mac OS X 应用程序,但是 this guy has a solution通过它可以在 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;
}

但这将是一个相当高级的反编译器,例如this one.

关于c - 用C编译后生成的可执行文件是否可以在任何不同的操作系统(UNIX)上复制和运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11924153/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com