4

Cプログラムをコンパイルしてリンクするときは、次のようにリンクすることを知っています

  1. C ライブラリ
  2. C ランタイム スタートアップ コード

プログラムを (新しい言語で、またはこのコードにリンクせずに C だけで) 作成し、それを C コードの共有ライブラリ (zlib、gsl、fftw など) に直接リンクし、C ライブラリと C のスタートアップを省略しているかどうか疑問に思います。コード(私のプログラムがその魔法を使用して外部ライブラリ自体をロードすると仮定)、これは「うまくいく」でしょうか?

CRT スタートアップに初期化コードがあることはわかっているので、アプリケーション自体を C ライブラリに依存させずに、必要な関数を呼び出すにはどうすればよいのでしょうか。そのため、外部 C ライブラリをロードすると、その時点で必要な初期化コードが呼び出されます (それ以外の場合は、OS ライブラリ/インターフェイスをロードするだけです。

私が尋ねる理由は、C ライブラリの上に構築されるほとんどの C++ 実装とは異なり、OS API に直接フックする標準ライブラリを使用して言語を書きたいからです。

4

2 に答える 2

1

私は他の多くの言語のC共有ライブラリを使用しました。共有ライブラリを明示的に初期化する必要があるかどうかは、ライブラリによって異なります。通常、ロード時に暗黙的に初期化されますが、一部のライブラリでは追加の初期化が必要です。ドキュメントを読んでください。

もちろん、私のプログラム(Cまたは他の言語)のコードも初期化する必要がありますが、デフォルトでスタートアップコードにリンクすることで、コンパイラー/リンカーが通常処理します。

于 2012-06-07T11:23:46.730 に答える
1

こちらをご覧ください https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free
したがって、libc に含まれるライブラリに依存せずにプログラムを起動でき、後で必要に応じてライブラリをロードして使用できます。

于 2012-06-07T17:48:55.097 に答える