原生可执行文件的哪一部分(特定)使其不可移植?

Edd*_*ett 6 assembly linker code-generation cpu-architecture

这听起来像是一个愚蠢的问题,但请耐心等待.

众所周知,一个CPU架构的二进制文件不会在其他CPU架构上运行.因此,例如,在sparc64芯片上运行(没有某种兼容层),x86二进制文件是不可能的.指令集是不同的,所以显然不起作用.

但是当二进制文件用于相同的CPU时,但对于不同的操作系统,代码的哪一部分可以防止执行.例如,在x86 Linux机器上运行x86 Solaris二进制文件.我假设有某种特定于平台的存根与运行时链接器或进程调度程序有关?

我很想知道.谢谢.

drx*_*zcl 12

有很多原因.以"与金属的距离"排序的主要产品是:

  1. 操作系统可以具有用于可执行文件的不同二进制格式.在这种情况下,您将无法首先加载二进制文件.
  2. 程序可以使用另一种方法来指示他们希望进行系统调用(例如INT21 vs INT80).
  3. 该程序可能依赖于其他操作系统中不存在的系统调用(例如dlopen())
  4. 该程序可能依赖于其他操作系统上不存在的标准库.
  5. 该程序可能依赖于其他操作系统上不可用的其他库.

当然,在意想不到的环境中运行的程序可能会有很多失败的方法.


cle*_*tus 5

有四个问题:

  1. 不同的操作系统以不同的方式打包它们的二进制可执行文件(例如Linux ELF与Windows格式);
  2. 不同CPU架构上的不同指令集;
  3. 不同的操作系统有不同的系统调用(例如Win32中的CreateProcess()和Linux/Unix中的fork());
  4. 路径,合法字符,目录分隔符等差异.

假设非系统库都出现在两者上,否则这是另一个区别.