より広いアプリケーションカバレッジを提供するために、libc の古いバージョンにリンクする 質問する

より広いアプリケーションカバレッジを提供するために、libc の古いバージョンにリンクする 質問する

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

したがって、配布中にアプリケーションが適切にカバーされるようにするには、サポートできる最も古い libc を見つけて、それに対してバイナリをリンクする必要があります。

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

ベストアンサー1

実行可能ファイル内のどのシンボルが、望ましくないバージョンの 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

依存するライブラリ内を調べて、リンクできる古いバージョンのシンボルがあるかどうかを確認します。

$ 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

おすすめ記事