私はlibzを使った小さな簡単なテストプログラムを書いた。私はここで、次のコマンドシンボルテーブルに共有ライブラリのバージョン情報を追加するには
$ readelf -s test | grep inflate
を実行したかlibzを関数は、私のシンボルテーブルに追加されている確認するには
$gcc -o test test.c -lz
を使用して、それをコンパイルし、私が使用しています出力
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND inflateEnd
8: 0000000000000000 0 FUNC GLOBAL DEFAULT UND inflate
13: 0000000000000000 0 FUNC GLOBAL DEFAULT UND inflateInit_
51: 0000000000000000 0 FUNC GLOBAL DEFAULT UND inflateEnd
62: 0000000000000000 0 FUNC GLOBAL DEFAULT UND inflate
73: 0000000000000000 0 FUNC GLOBAL DEFAULT UND inflateInit_
libzをあります.gnu.version_dセクションは次のように定義されています。
Version definition section '.gnu.version_d' contains 7 entries:
Addr: 0x0000003175e014c0 Offset: 0x0014c0 Link: 4 (.dynstr)
000000: Rev: 1 Flags: BASE Index: 1 Cnt: 1 Name: libz.so.1
0x001c: Rev: 1 Flags: none Index: 2 Cnt: 1 Name: ZLIB_1.2.0
0x0038: Rev: 1 Flags: none Index: 3 Cnt: 2 Name: ZLIB_1.2.0.2
0x0054: Parent 1: ZLIB_1.2.0
0x005c: Rev: 1 Flags: none Index: 4 Cnt: 2 Name: ZLIB_1.2.0.8
0x0078: Parent 1: ZLIB_1.2.0.2
0x0080: Rev: 1 Flags: none Index: 5 Cnt: 2 Name: ZLIB_1.2.2
0x009c: Parent 1: ZLIB_1.2.0.8
0x00a4: Rev: 1 Flags: none Index: 6 Cnt: 2 Name: ZLIB_1.2.2.3
0x00c0: Parent 1: ZLIB_1.2.2
0x00c8: Rev: 1 Flags: none Index: 7 Cnt: 2 Name: ZLIB_1.2.2.4
0x00e4: Parent 1: ZLIB_1.2.2.3
なぜ、libzのバージョンは、シンボルテーブルのlibz関数シンボルの一部ではないのですか?
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND [email protected]@ZLIB_1.2.0
...
また、私のバイナリの.gnu.version_rセクションには、libzバージョンが必要条件としてリストされていません。ここでlibzのバージョン依存性を追加するにはどうしたらいいですか?
$readelf -V test
...
Version needs section '.gnu.version_r' contains 1 entries:
Addr: 0x0000000000400618 Offset: 0x000618 Link: 6 (.dynstr)
000000: Version: 1 File: libc.so.6 Cnt: 1
0x0010: Name: GLIBC_2.2.5 Flags: none Version: 2
ありがとうございます。はい、正確ですね! inflate_fastに変更しました。inflate_fastはlibzシンボルテーブルのバージョン情報を持っています。バージョン情報がバイナリのシンボルテーブルに追加されます。また、バイナリの.gnu.version_rセクションにバージョン依存関係が追加されました。 – mgambhir