
fooコマンドを実行し、次のように使用する別のlibcを指定した場合:
LD_LIBRARY_PATH=$PATH_TO_MY_CUSTOM_LIBC foo
上記のコマンドを実行するためにグローバルに定義されたlibcが使用されますか?
状況に応じて、libcが物理的に存在し、コンピュータにアクセスできるが何らかの理由で使用できない状況を考えてみましょう。ログインしたシェルで特定のコマンドを実行するには、別のlibcを提供する必要があります。
inlineを指定すると、LD_LIBRARY_PATH
グローバルに定義されたlibcを呼び出さずにジョブlibcの場所に設定されます。
新しい環境変数をローカルで定義するためにグローバルに定義されたlibcを同じように呼び出しますか?
答え1
いいえ。ダイナミックリンクは/lib/libc.so.6
機能という点でlibcの一部ではありません/lib/ld.so
(どちらも長年にわたってファイル名とパスがいくつか変更されましたが、本質は同じです)。
はいld.so
、動的リンカーも共有ライブラリです。これをロードすることは、ほとんどのLinuxバイナリが関数をmain()
呼び出す前に実行する最初の作業です。
ld.so
libcとは異なるファイルですが、ソースコードとコンパイルされたバイナリ形式もgnu libcディストリビューションの一部です。
リンクは、ld.so
すべてのLinux ELFバイナリに対してgccが提供するハードコードされたコードブロックから来ます。そのパスもバイナリにハードコードされています。必要に応じて変更が可能であっても簡単に変更することはできません。
libc.so.6
代替設定で上書きすると、LD_LIBRARY_PATH
このライブラリは注文したlibcを独自のlibcに置き換えますが、まだ一般的なものですld.so
。
したがって、あなたの質問に対する答えは「はい、しかし…」です。
答え2
質問に与えられたコマンドを実行すると:
LD_LIBRARY_PATH=$PATH_TO_MY_CUSTOM_LIBC bash -c 'foo'
- 実行では、
bash
パスに提供されているlibcを使用します($PATH_TO_MY_CUSTOM_LIBC
パスにある場合)。その環境変数を尊重するのはリンカー/ローダーです。 - Bash内で実行されるコマンド(あなたが呼ぶように
foo
)は、リンカ/ローダ自体を介してシステムで定期的に見つかるlibcを使用します/etc/ld.so.cache
。