编译SO指定soname库的短名
目的:
开发的时候经常碰到,如 APP 链接 libubox.so, 但 APP 运行时候却依赖 libubox.so.20210516,Why?这个就是库的 SONAME 字段导致。
- 查看库的 private 信息
objdump -p libubox.so
victor@55ce0fbe4b63:lib$ objdump -p libubox.so
libubox.so: file format elf32-little
Program Header:
LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**16
filesz 0x00008138 memsz 0x00008138 flags r-x
LOAD off 0x00008dd8 vaddr 0x00018dd8 paddr 0x00018dd8 align 2**16
filesz 0x00000260 memsz 0x00000580 flags rw-
DYNAMIC off 0x00008df0 vaddr 0x00018df0 paddr 0x00018df0 align 2**2
filesz 0x000000e0 memsz 0x000000e0 flags rw-
STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
filesz 0x00000000 memsz 0x00000000 flags rw-
RELRO off 0x00008dd8 vaddr 0x00018dd8 paddr 0x00018dd8 align 2**0
filesz 0x00000228 memsz 0x00000228 flags r--
Dynamic Section:
NEEDED libc.so
SONAME libubox.so.20210516
INIT 0x00001e20
FINI 0x00007ef8
INIT_ARRAY 0x00018dd8
INIT_ARRAYSZ 0x00000004
FINI_ARRAY 0x00018ddc
FINI_ARRAYSZ 0x00000004
HASH 0x000000d4
STRTAB 0x000011fc
SYMTAB 0x000005ec
STRSZ 0x00000981
SYMENT 0x00000010
PLTGOT 0x00018ed0
PLTRELSZ 0x00000200
PLTREL 0x00000011
JMPREL 0x00001c20
REL 0x00001b80
RELSZ 0x000000a0
RELENT 0x00000008
BIND_NOW 0x00000000
FLAGS_1 0x00000001
RELCOUNT 0x0000000c
SONAME --> 为 SO 库短名称,影响库的链接名称,如下
-
如何编译库的 SONAME 名称
arm-openwrt-linux-gcc -fPIC -shared -Wl,-soname,libtest.so.1 -o libtest.so.1.2 test_system.c
-
确认链接含有 SONAME 库
arm-openwrt-linux-gcc test_system.c -L./ -ltest