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

我在我的 Ubuntu PC 上尝试过(echo "v1.01" >> aa.so),使用包含三个 API 的 SO,并一一调用这三个 API,然后它给出了假设的结果。所以我认为没关系。

是的,它的文件签名已更改,但这不会影响我的 API 调用。

于 2013-09-08T14:03:13.237 回答