1

Wine/Darling やその他の互換性レイヤーについては知っていますが、(たとえば) 次の方法で可能かどうか疑問に思っていました:
1. OS X で単純な hello_world.c プログラムをビルドします
。マシン コードを Linux 実行可能ファイルにコピーし、OSX libc への呼び出しを glibc への呼び出しに置き換えます。他の OSX ライブラリに動的にリンクされた別の実行可能ファイルである場合は、ライブラリをコピーします。
3. プログラムが動作することを前提として、Linux でプログラムを実行します。
hello_world.c

#include <stdio.h>
int main(void) {
    printf("Hello World");
    return 0;
}
4

1 に答える 1

2
  1. まず、動的ライブラリは OS 固有の唯一の部分ではなく、起動コードは静的にリンクされ、OS X/Linux 固有です。
  2. OS X バイナリはマッチョで、Linux には ELF が必要です。
  3. それが ELF だったとしても、dyn ローダーがそれを考慮できるようにするためにパッチを適用する必要がある ELF 識別子があります。
  4. syscalls はインライン化されている可能性があります。(man 2 の使用法)、FD セット マクロおよび OS X libc ヘッダーの他の多くのマクロと同じです。
  5. 呼び出し規約は異なる場合があります (
    • 利用登録
    • スタック配置
    • レジスタ内の小さな構造体の受け渡し。

などなど。この場合、例えば OS X は AIX ABI と Linux SysV を使用します。)

一般に、POSIX はソース互換性の概念であり、バイナリーの概念ではありません。いいえ、これは不可能であるか、実行できない制約のある要件の下でのみ可能です。例外は、BSD システム上の Linuxator のようなものです。

于 2016-02-27T22:08:45.977 に答える