so ファイルにバージョン文字列を追加したい場合は、次を使用します。
echo "v1.01" >> aa.so
バージョンはaa.soの末尾に追加されます
しかし、この方法でsoファイルが壊れる可能性はあるのでしょうか? または、so ファイルの末尾に無限バイトを追加しても、その構造が壊れることはありませんか?
PS: aa.so は自分でビルドしたため、ファイルの署名を除きます。
so ファイルにバージョン文字列を追加したい場合は、次を使用します。
echo "v1.01" >> aa.so
バージョンはaa.soの末尾に追加されます
しかし、この方法でsoファイルが壊れる可能性はあるのでしょうか? または、so ファイルの末尾に無限バイトを追加しても、その構造が壊れることはありませんか?
PS: aa.so は自分でビルドしたため、ファイルの署名を除きます。
するとecho "v1.01" >> aa.so
、文字列v1.01
はシンボル テーブルの後に追加され、エントリとして次のようになります。
$ hexedit file.so
...
00000F40 6F 6E 5F 73 74 61 72 74 5F 5F 00 5F 4A 76 5F 52 on_start__._Jv_R
00000F50 65 67 69 73 74 65 72 43 6C 61 73 73 65 73 00 5F egisterClasses._
00000F60 66 69 6E 69 00 5F 5F 62 73 73 5F 73 74 61 72 74 fini.__bss_start
00000F70 00 5F 65 6E 64 00 70 75 74 73 40 40 47 4C 49 42 ._end.puts@@GLIB
00000F80 43 5F 32 2E 30 00 66 75 6E 63 74 69 6F 6E 00 5F C_2.0.function._
00000F90 65 64 61 74 61 00 5F 5F 63 78 61 5F 66 69 6E 61 edata.__cxa_fina
00000FA0 6C 69 7A 65 40 40 47 4C 49 42 43 5F 32 2E 31 2E lize@@GLIBC_2.1.
00000FB0 33 00 5F 69 6E 69 74 00 76 31 2E 30 31 0A 3._init.v1.01.
--- file.so --0xFB0/0xFBE-----------------------------------------------
$
ただし、その文字列へのインデックスや参照はありません。
$ readelf -s file.so
...
43: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
44: 00000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses
45: 00000498 0 FUNC GLOBAL DEFAULT 13 _fini
46: 000015c0 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
47: 000015c8 0 NOTYPE GLOBAL DEFAULT ABS _end
48: 00000000 0 FUNC GLOBAL DEFAULT UND puts@@GLIBC_2.0
49: 0000044c 19 FUNC GLOBAL DEFAULT 12 function
50: 000015c0 0 NOTYPE GLOBAL DEFAULT ABS _edata
51: 00000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@@GLIBC_2.1
52: 00000328 0 FUNC GLOBAL DEFAULT 10 _init
$
したがって、この場合は問題にはならず、ファイルが壊れることはありません。しかし、そうするのは正しくないと感じます。
通常、共有ライブラリには名前にバージョンが含まれています。
$ ls /lib | grep .so
ld-2.11.3.so
ld-linux.so.2
libacl.so.1
libacl.so.1.1.0
libanl-2.11.3.so
libanl.so.1
libatasmart.so.4
libatasmart.so.4.0.3
libattr.so.1
libattr.so.1.1.0
...
$
同じことを行って、バージョンを共有ライブラリに追加できます (例: aa.so.1.01
. あなたがこのライブラリの作成者である場合は、いくつかの関数をエクスポートしてライブラリのバージョンを取得することもできます:
const char *version(void) {
return "1.01";
}
3つのAPIを含むSOを使用して、My Ubuntu PCでそれ(echo "v1.01" >> aa.so)を試し、3つのAPIを1つずつ呼び出したところ、想定される結果が得られました。だから大丈夫だと思います。
はい、そのファイル署名は変更されていますが、それは私の API 呼び出しには影響しません。