我想将版本字符串添加到我的so文件中,然后使用:
echo "v1.01" >> aa.so
并且版本添加到aa.so的尾部
但是,我想知道如果这种方法有可能破坏so文件?或者我们可以在so文件的末尾添加无限字节,并且不会破坏它的结构?
PS:文件签名除外,因为aa.so是由我自己构建的。
答案 0 :(得分:0)
我在My Ubuntu PC上尝试了(echo“v1.01”>> aa.so),其中包含三个API的SO,并逐个调用三个API,然后它给出了假设的结果。所以我觉得没事。
是的,它的文件签名已更改,但这不会影响我的API调用。
答案 1 :(得分:0)
当您执行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";
}