使用ld:使用“--version-script”参数;
使用gcc:使用“-Xlinker”参数加“--version-script”;
符号版本脚本文件为“lib.ver”,编译源代码“lib.c”:
gcc -shared -fPIC lib.c -Xlinker --version-script lib.ver -o lib.so
lib.ver内容如下:
VERS_1.2 {
};
将main.c编译并且连接到当前版本的lib.so:
gcc main.c ./lib.so -o main
objdump -T lib.so
DYNAMIC SYMBOL TABLE:
00000000 w D *UND* 00000000 __gmon_start__
00000000 w D *UND* 00000000 _Jv_RegisterClasses
00000000 DF *UND* 00000000 GLIBC_2.0 printf
00000000 w DF *UND* 00000000 GLIBC_2.1.3 __cxa_finalize
00000000 g DO *ABS* 00000000 S_1.2 S_1.2
000003cc g DF .text 00000026 S_1.2 test0
objdump -T main
DYNAMIC SYMBOL TABLE:
00000000 w D *UND* 00000000 __gmon_start__
00000000 w D *UND* 00000000 _Jv_RegisterClasses
00000000 DF *UND* 00000000 GLIBC_2.0 __libc_start_main
00000000 DF *UND* 00000000 S_1.2 test0
00000000 DF *UND* 00000000 GLIBC_2.0 puts
0804850c g DO .rodata 00000004 Base _IO_stdin_used
如果你不加-Xlinker
gcc -shared -fPIC lib.c -o lib.so
objdump -T lib.so
DYNAMIC SYMBOL TABLE:
DYNAMIC SYMBOL TABLE:
00000000 w D *UND* 00000000 __gmon_start__
00000000 w D *UND* 00000000 _Jv_RegisterClasses
00000000 DF *UND* 00000000 GLIBC_2.0 printf
00000000 w DF *UND* 00000000 GLIBC_2.1.3 __cxa_finalize
000015c4 g D *ABS* 00000000 Base _end
000015bc g D *ABS* 00000000 Base _edata
000015bc g D *ABS* 00000000 Base __bss_start
000002e4 g DF .init 00000000 Base _init
0000041c g DF .text 00000026 Base test0
00000488 g DF .fini 00000000 Base _fini
objdump -T main
DYNAMIC SYMBOL TABLE:
00000000 w D *UND* 00000000 __gmon_start__
00000000 w D *UND* 00000000 _Jv_RegisterClasses
00000000 DF *UND* 00000000 test0
00000000 DF *UND* 00000000 GLIBC_2.0 __libc_start_main
00000000 DF *UND* 00000000 GLIBC_2.0 puts
080496bc g D *ABS* 00000000 Base _end
080496b4 g D *ABS* 00000000 Base _edata
0804858c g DO .rodata 00000004 Base _IO_stdin_used
080496b4 g D *ABS* 00000000 Base __bss_start
0804837c g DF .init 00000000 Base _init
0804856c g DF .fini 00000000 Base _fini
很明显你可以看到test0的那个版本号就没有了。所以说是GCC通过xlink --version-script 把版本号已经传给了库,库再传给main elf。(main elf 里面说这个test0你到libtest0.so去找,而且版本应该为S 1.2)
在运行加载的时候会对elf和搜索到库版本的符号进行比较。如果不对的话就会报错。
./main: /lib/libtest0.so: version `S_1.2' not found (required by ./main)
相关链接:
http://blog.sina.com.cn/s/blog_76fbd24d010142ob.html
http://www.360doc.com/content/12/0107/21/8093902_177973304.shtml