1. ホーム
  2. linux

古いバージョンの libc とリンクすることで、より大きなアプリケーションカバレッジを提供します。

2023-12-20 13:26:46

質問

Linux のバイナリは通常、コアシステムライブラリ (libc) に動的にリンクされています。これによりバイナリのメモリフットプリントは非常に小さく保たれますが、最新のライブラリに依存するバイナリは古いシステム上では動作しません。逆に、古いライブラリにリンクされたバイナリは、最新のシステムで問題なく動作します。

したがって、配布中にアプリケーションが良好なカバレッジを持つことを確実にするために、サポートできる最も古い libc を把握し、それに対してバイナリをリンクする必要があります。

どのようにリンクできる最も古いバージョンの libc を決定すればよいのでしょうか。

どのように解決するのですか?

実行ファイル内のどのシンボルが、望ましくないバージョンの glibc への依存を作り出しているかを調べてください。

$ objdump -p myprog
...
Version References:
  required from libc.so.6:
    0x09691972 0x00 05 GLIBC_2.3
    0x09691a75 0x00 03 GLIBC_2.2.5

$ objdump -T myprog | fgrep GLIBC_2.3
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.3   realpath

古いバージョンにリンクできるシンボルがあるかどうか、dependent-upon ライブラリ内を調べてください。

$ objdump -T /lib/libc.so.6 | grep -w realpath
0000000000105d90 g    DF .text  0000000000000021 (GLIBC_2.2.5) realpath
000000000003e7b0 g    DF .text  00000000000004bf  GLIBC_2.3   realpath

運がいい!

からバージョンを要求する。 GLIBC_2.2.5 をコードに追加してください。

#include <limits.h>
#include <stdlib.h>

__asm__(".symver realpath,realpath@GLIBC_2.2.5");

int main () {
    realpath ("foo", "bar");
}

GLIBC_2.3 はもはや必要ないことに注意してください。

$ objdump -p myprog
...
Version References:
  required from libc.so.6:
    0x09691a75 0x00 02 GLIBC_2.2.5

$ objdump -T myprog | grep realpath
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 realpath

さらに詳しい情報は http://web.archive.org/web/20160107032111/http://www.trevorpounds.com/blog/?p=103 .