実行ファイルはどのようにPOSIXを使用して異なるUNIXシステム間の互換性を維持しますか?

実行ファイルはどのようにPOSIXを使用して異なるUNIXシステム間の互換性を維持しますか?

私が理解するように、POSIXはオペレーティングシステムが提供する必要があるAPIセットのみを指定し、実装の詳細、特にアセンブリレベルの互換性は指定しません。たとえば、x86では、POSIX APIを取得するにはシステムコールを使用する必要があります。

1. set `eax` to the syscall number
2. set syscall arguments
3. call int 0x80

ただし、プロセスは次のように大きく異なります。

  1. UNIXオペレーティングシステム:オペレーティングシステムごとに、システムコール番号からPOSIX APIへのマッピングが異なる場合があります。
  2. アーキテクチャ:X86 / armには他のコマンド呼び出しがあります。int 0x80

だから私は、POSIXがさまざまなオペレーティングシステムでPOSIXライブラリのAPI変換を保存することによって私の役割を果たしていると思います。例えばglibc.so:

POSIX API は glibc シンボル形式で提供されます。実行可能ファイルがPOSIX APIを呼び出すたびに、すべてのオペレーティングシステムでこのシンボルが見つかり、実行可能ファイルglibc.soからint 0x80を直接呼び出す必要はありません。

だから私の質問は次のようになります

  1. 私の理解は正しいですか?
  2. これ以外にも同様に動作しますが、他のUNIXオペレーティングシステムでglibc.so動作する他のライブラリはありますか?glibc.so

答え1

POSIXバイナリインターフェイスが指定されていないため、「POSIX」バイナリをビルドして他のPOSIXスタイルのオペレーティングシステムで実行することはできません。 POSIXはシステムコールにも気にしません。関数を定義し、その関数が最終的にどこに実装されるかは重要ではありません。

実際に述べたように、Linuxや他のPOSIXスタイルのシステムでは、これらの機能は「Cライブラリ」で実装されています。しかし、バイナリがこれらの関数を呼び出すPOSIXを定義する方法さえありません。 Cプログラム用のPOSIXは最も関連性がありますが、プログラムを作成してコンパイルし、ランタイムシステムインターフェースの動作を考慮するときにはあまり重要ではありません。どのようにこれらのインターフェイスにアクセスします。c99コマンド実行するコンパイラを指定するため、POSIXにはCソースコードを取得してそれをバイナリに変換する機能が必要ですが、そのバイナリの詳細はシステムによって異なります。 (Linuxのバイナリインタフェースは次のとおりです。システムV ABI、さまざまなアーキテクチャ固有の拡張機能が含まれています。 )

他のCライブラリもあります。各プラットフォームは独自の機能を提供し、一部のプラットフォームには2つ以上のプラットフォームがあります。 LinuxではGNU Cライブラリしかし、またマスラー

また、CライブラリはCプログラムでのみ使用されるものではありません。 POSIXスタイルのシステムでは、ほとんどのコンパイラとインタプリタがそれを使用します。 (注目すべき例外には、独自のカーネルユーザースペースAPIインターフェースを実装するGoバイナリが含まれます。)

関連情報