我对so库的name的理解:
libtest.so libtest.so.1 libtest.so.1.1
libtest.so 用在gcc的编译选项-ltest,在生成程序时会去寻找libtest.so
libtest.so.1 用在soname entris,版本兼容性控制,ldd app看到的就是这一个
libtest.so.1.1 so库的全名,包含major version and minor version
记录so库之间的依赖关系:
gcc:gcc (Ubuntu 4.9.1-16ubuntu6) 4.9.1
linux:3.16.0-23-generic #31-Ubuntu SMP Tue Oct 21 18:00:35 UTC 2014 i686 i686 i686 GNU/Linux
描述: town引用libfamily.so, libfamily.so引用libman.so, libwoman.so, libman.so依赖libdog.so, libwoman.so依赖libcat.so
问题:
1、makefile只执行了第一个target,其他未执行
恍然间想起make默认只执行第一个target,解决方法第一个target为
all: one two tree
或者
.PHONY: one two three
2、几个so文件编译ok,但是编译town使用,未引用family()?
readelf -d,查看dynamic section,发现几个so没有引用关系,在未使用-soname时,也不会有soname entries,经过加上soname,问题依旧。
gcc -L. -lfamily -o town town.c 改为 gcc -o town town.c -L. -lfamily,发现ok,根据此把makefile修改后,make sucess!
结果:
readelf -d town
Dynamic section at offset 0xf0c contains 25 entries:
标记 类型 名称/值
0x00000001 (NEEDED) 共享库:[libfamily.so]
0x00000001 (NEEDED) 共享库:[libc.so.6]
readelf -d libfamily.so
Dynamic section at offset 0xef4 contains 27 entries:
标记 类型 名称/值
0x00000001 (NEEDED) 共享库:[libman.so]
0x00000001 (NEEDED) 共享库:[libwoman.so]
0x00000001 (NEEDED) 共享库:[libc.so.6]
0x0000000e (SONAME) Library soname: [libfamily.so]
ldd town #查看app依赖的全部so库
linux-gate.so.1 => (0xb7789000)
libfamily.so => ./libfamily.so (0xb7783000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75c1000)
libman.so => ./libman.so (0xb75bd000)
libwoman.so => ./libwoman.so (0xb75ba000)
/lib/ld-linux.so.2 (0xb778c000)
libdog.so => ./libdog.so (0xb75b7000)
libcat.so => ./libcat.so (0xb75b4000)