echo命令是否有可能破坏so文件?

时间:2013-09-08 13:45:09

标签: linux shared-libraries

我想将版本字符串添加到我的so文件中,然后使用:

echo "v1.01" >> aa.so

并且版本添加到aa.so的尾部

但是,我想知道如果这种方法有可能破坏so文件?或者我们可以在so文件的末尾添加无限字节,并且不会破坏它的结构?

PS:文件签名除外,因为aa.so是由我自己构建的。

2 个答案:

答案 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";
}
相关问题