2016-05-04 21 views
0

私は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 

答えて

1

あなたのlibzにバージョン情報が含まれていても、その中のすべてのシンボルがバージョン管理されているわけではありません。私のlibz(バージョン1.2.3(実際には))では、外部シンボルのいくつかはバージョン管理されており、いくつかはバージョン番号readelfで確認できます。具体的には、あなたが尋ねたシンボルはすべて私のDSOによって定義されていますが、それらのどれもバージョン化されていません。

バージョン管理されていないシンボルとリンクする場合、バイナリ内の対応するシンボル参照にバージョン管理をする必要はありません。

+0

ありがとうございます。はい、正確ですね! inflate_fastに変更しました。inflate_fastはlibzシンボルテーブルのバージョン情報を持っています。バージョン情報がバイナリのシンボルテーブルに追加されます。また、バイナリの.gnu.version_rセクションにバージョン依存関係が追加されました。 – mgambhir

関連する問題