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。