1

so ファイルにバージョン文字列を追加したい場合は、次を使用します。

echo "v1.01" >> aa.so

バージョンはaa.soの末尾に追加されます

しかし、この方法でsoファイルが壊れる可能性はあるのでしょうか? または、so ファイルの末尾に無限バイトを追加しても、その構造が壊れることはありませんか?

PS: aa.so は自分でビルドしたため、ファイルの署名を除きます。

4

2 に答える 2

1

すると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";
}
于 2013-09-08T15:20:36.647 に答える
0

3つのAPIを含むSOを使用して、My Ubuntu PCでそれ(echo "v1.01" >> aa.so)を試し、3つのAPIを1つずつ呼び出したところ、想定される結果が得られました。だから大丈夫だと思います。

はい、そのファイル署名は変更されていますが、それは私の API 呼び出しには影響しません。

于 2013-09-08T14:03:13.237 に答える