在开发Android客户端时, 遇到Android无法加载动态库. 动态库libusb存在soname为libusb-1.0.so.0. Android客户端编译时一直提示无法找到.
dlopen failed: could not load library "libusb-1.0.so.0" needed by "lib****.so"; caused by library "libusb-1.0.so.0" not found.
[from:"zhangjian5197@163.com"]
(注: 此处暂且不讨论Android调用是否存在问题. 有可能确实是Android调用引起的.)
通过readelf -d libusb-1.0.so, 查看信息.
Dynamic section at offset 0x1115c contains 23 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libc.so]
0x00000001 (NEEDED) Shared library: [libdl.so]
0x0000000e (SONAME) Library soname: [libusb-1.0.so.0]
0x00000010 (SYMBOLIC) 0x0
0x00000019 (INIT_ARRAY) 0x19000
0x0000001b (INIT_ARRAYSZ) 8 (bytes)
由于动态库编译与Android开发分属不同的人, 所以首先对动态库编译进行修改.
在开源源码中, vim libtool
# The coded name of the library, if different from the real name.
253 soname_spec="\${libname}\${release}\${shared_ext}\${major}"
删除此行中的 \${major}, 再次编译. 通过readelf -d libusb-1.0.so, 查看信息.
Dynamic section at offset 0x1115c contains 23 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libc.so]
0x00000001 (NEEDED) Shared library: [libdl.so]
0x0000000e (SONAME) Library soname: [libusb-1.0.so]
0x00000010 (SYMBOLIC) 0x0
0x00000019 (INIT_ARRAY) 0x19000
0x0000001b (INIT_ARRAYSZ) 8 (bytes)
发现soname已经修改为libusb-1.0.so, 问题在动态库处解决.
扩展: 某些编译参数应该都可以在libtool中进行修改, 而在其他地方修改有可能无效.