我想将版本字符串添加到我的 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";
}
我在我的 Ubuntu PC 上尝试过(echo "v1.01" >> aa.so),使用包含三个 API 的 SO,并一一调用这三个 API,然后它给出了假设的结果。所以我认为没关系。
是的,它的文件签名已更改,但这不会影响我的 API 调用。