victor
发布于

编译SO指定soname库的短名

目的:
开发的时候经常碰到,如 APP 链接 libubox.so, 但 APP 运行时候却依赖 libubox.so.20210516,Why?这个就是库的 SONAME 字段导致。

  1. 查看库的 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 库短名称,影响库的链接名称,如下

  1. 如何编译库的 SONAME 名称
    arm-openwrt-linux-gcc -fPIC -shared -Wl,-soname,libtest.so.1 -o libtest.so.1.2 test_system.c

  2. 确认链接含有 SONAME 库
    arm-openwrt-linux-gcc test_system.c -L./ -ltest

浏览 (289) 点赞 (1) 收藏 分享
评论