質問

私の母国のGCCは、その三重項が次のと言っています。

> gcc -dumpmachine
x86_64-suse-linux

CPU-Vendor-OSはそれに応じてx86_64、Suse、Linuxです。後者は、Glibsが使用されていることを意味します(?)。 BusyBuxベースのシステムをクロスコンパイルするとき、コンパイラトリプレットはAVR32-LINUX-UCLIBCのようなもので、OSは「Linux-clibc」です。つまり、UCLIBCが使用されます。

「Linux-Glibc」と「Linux-clibc」の違いは、collect2の動作とlibgcc.aコンテンツの(afaiu)です。 GLIBCまたはUCLIBSのいずれかは、ターゲットバイナリに静かにリンクされています。

質問は、Linuxカーネルが同じコンパイラによってどのように編集されているかということです。カーネルが裸のメタルで動作するとすぐに、あらゆる種類のユーザースペースLIBCとリンクしてはなりません。

役に立ちましたか?

解決

GCCには、その仕組みを制御するためのあらゆる種類のオプションがあります。ここに関連するいくつかのものがあります:

  • -nostdlib 標準ライブラリとスタートアップコードへのリンクを省略するには
  • -nostdinc 標準の場所でヘッダーファイルの検索を省略します。
  • -ffreestanding 自立型環境(カーネルなど)にコンパイルする

また、リンクにGCCを使用する必要はありません。リンカーを直接呼び出して、独自のリンカーマップ、起動オブジェクトコード、その他必要なものを提供できます。

Linuxカーネルビルドは、任意の理由で使用しないようです -ffreestanding しかし、リンク段階を制御し、ユーザースペースコードを引き付けることなくカーネルがリンクされるようにします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top