为什么相同的体系结构但不同的操作系统有不同的包?
Why are there different packages for the same architecture, but different OSes?
我的问题比较概念化。我注意到相同的体系结构有不同的包,比如 x86-64,但适用于不同的操作系统。例如,RPM 为相同的 x86-64 架构为 Fedora 和 OpenSUSE 提供了不同的包:http://www.rpmfind.net/linux/rpm2html/search.php?query=wget - 更不用说 YUM 和 APT(对于 Ubuntu)提供的不同包,所有包都为 x86-64 .
我的理解是,一个包包含适合给定 CPU 体系结构的二进制指令,因此只要 CPU 属于该体系结构,它就应该能够在本机执行这些指令。那么,为什么为相同架构构建的包会因不同的操作系统而有所不同呢?
这些包包含需要特定 Application Binary Interface (ABI) to run. The CPU architecture is only one part of the ABI. Different Linux distros have different ABIs and therefore the same binary may not be compatible across them. That's why there are different packages for the same architecture, but different OSes. The Linux Standard Base 项目的本机二进制文件,旨在标准化 Linux 发行版的 ABI,以便更容易构建可移植包。
考虑不同的 Linux 发行版:
除了针对不同的库版本进行编译(如 Hadi 所述),打包本身和默认配置文件可能不同。也许一个发行版想要 /etc/wget.conf
,而另一个发行版可能想要 /etc/default/wget.conf
,或者这些文件具有不同的内容。 (我忘记了 wget 是否专门有一个全局配置文件;有些软件包肯定有,而不仅仅是像 Exim 或 Apache 这样的服务器。)
或者不同的发行版可以启用/禁用不同的 compile-time 选项集。 (传统上在 make -j4 && make install
之前设置 ./configure --enable-foo --disable-bar
)。
对于 wget
,选择可能包括针对哪个 TLS 库进行编译(OpenSSL 与 gnutls),而不仅仅是哪个版本。
所以 ABI(库版本)很重要,但每个发行版都有自己的软件包还有其他原因。
完全不同OSes,比如Linux vs. Windows vs. OS X,有不同的可执行文件格式。 ELF vs. PE vs. Mach-O。这三种格式都包含 x86-64 机器码,但元数据不同。 (OS 差异意味着您希望机器代码执行不同的操作。
例如,在 Linux 或 OS X(或任何 POSIX OS)上打开文件可以用 int open(const char *pathname, int flags, mode_t mode);
system call. So the same source code works for both those platforms, although it can still compile to different machine code, or actually in this case very similar machine code to call a libc wrapper around the system call (OS X and Linux use the same function calling convention ), 但具有不同的符号名称。 OS X 将编译为对 _open
的调用,但 Linux 不会在符号名称前加上下划线,因此动态链接器符号名称将是 open
.
open
的模式常量可能不同。例如也许 OS X 将 O_RDWR
定义为 4
,但也许 Linux 将其定义为 2
。这将是 ABI 差异:相同的源代码编译为不同的机器代码,其中程序和库就什么意思达成一致。
但是 Windows 不是 POSIX 系统。用于打开文件的 WinAPI 函数是 HFILE WINAPI OpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle);
如果您想做任何比打开/关闭文件最近发明的事情,尤其是绘制 GUI,平台之间的事情更不相似,您将使用不同的库。 (或者跨平台 GUI 库将在不同平台上使用不同的 back-end)。
OS X 和 Linux 都继承了 Unix(真实的或作为克隆实现),因此 low-level 文件内容相似。
我的问题比较概念化。我注意到相同的体系结构有不同的包,比如 x86-64,但适用于不同的操作系统。例如,RPM 为相同的 x86-64 架构为 Fedora 和 OpenSUSE 提供了不同的包:http://www.rpmfind.net/linux/rpm2html/search.php?query=wget - 更不用说 YUM 和 APT(对于 Ubuntu)提供的不同包,所有包都为 x86-64 .
我的理解是,一个包包含适合给定 CPU 体系结构的二进制指令,因此只要 CPU 属于该体系结构,它就应该能够在本机执行这些指令。那么,为什么为相同架构构建的包会因不同的操作系统而有所不同呢?
这些包包含需要特定 Application Binary Interface (ABI) to run. The CPU architecture is only one part of the ABI. Different Linux distros have different ABIs and therefore the same binary may not be compatible across them. That's why there are different packages for the same architecture, but different OSes. The Linux Standard Base 项目的本机二进制文件,旨在标准化 Linux 发行版的 ABI,以便更容易构建可移植包。
考虑不同的 Linux 发行版:
除了针对不同的库版本进行编译(如 Hadi 所述),打包本身和默认配置文件可能不同。也许一个发行版想要 /etc/wget.conf
,而另一个发行版可能想要 /etc/default/wget.conf
,或者这些文件具有不同的内容。 (我忘记了 wget 是否专门有一个全局配置文件;有些软件包肯定有,而不仅仅是像 Exim 或 Apache 这样的服务器。)
或者不同的发行版可以启用/禁用不同的 compile-time 选项集。 (传统上在 make -j4 && make install
之前设置 ./configure --enable-foo --disable-bar
)。
对于 wget
,选择可能包括针对哪个 TLS 库进行编译(OpenSSL 与 gnutls),而不仅仅是哪个版本。
所以 ABI(库版本)很重要,但每个发行版都有自己的软件包还有其他原因。
完全不同OSes,比如Linux vs. Windows vs. OS X,有不同的可执行文件格式。 ELF vs. PE vs. Mach-O。这三种格式都包含 x86-64 机器码,但元数据不同。 (OS 差异意味着您希望机器代码执行不同的操作。
例如,在 Linux 或 OS X(或任何 POSIX OS)上打开文件可以用 int open(const char *pathname, int flags, mode_t mode);
system call. So the same source code works for both those platforms, although it can still compile to different machine code, or actually in this case very similar machine code to call a libc wrapper around the system call (OS X and Linux use the same function calling convention ), 但具有不同的符号名称。 OS X 将编译为对 _open
的调用,但 Linux 不会在符号名称前加上下划线,因此动态链接器符号名称将是 open
.
open
的模式常量可能不同。例如也许 OS X 将 O_RDWR
定义为 4
,但也许 Linux 将其定义为 2
。这将是 ABI 差异:相同的源代码编译为不同的机器代码,其中程序和库就什么意思达成一致。
但是 Windows 不是 POSIX 系统。用于打开文件的 WinAPI 函数是 HFILE WINAPI OpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle);
如果您想做任何比打开/关闭文件最近发明的事情,尤其是绘制 GUI,平台之间的事情更不相似,您将使用不同的库。 (或者跨平台 GUI 库将在不同平台上使用不同的 back-end)。
OS X 和 Linux 都继承了 Unix(真实的或作为克隆实现),因此 low-level 文件内容相似。