佛山高明建网站,wordpress setup-config.php空白,做网站公司logo,汽车网址都有哪些背景
经常在使用第三方SDK的时候会莫名其妙报错#xff0c;其中最常见的一种就是SO符号冲突#xff0c;比如libA.so静态链接了libC.a,而libB.so动态链接了libC.so。这样便会导致符号冲突。又或者在使用不同版本的动态库#xff0c;也会造成符号冲突。
报错案例
案例1 DEB…背景
经常在使用第三方SDK的时候会莫名其妙报错其中最常见的一种就是SO符号冲突比如libA.so静态链接了libC.a,而libB.so动态链接了libC.so。这样便会导致符号冲突。又或者在使用不同版本的动态库也会造成符号冲突。
报错案例
案例1 DEBUG : Abort message: terminating with unexpected exception of type std::bad_cast: std::bad_cast案例2
A/DEBUG: Softversion: PD1911C_A_1.9.7
A/DEBUG: Time: 2020-06-12 15:30:46
A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
A/DEBUG: Build fingerprint: vivo/PD1911/PD1911:9/PKQ1.181030.001/compiler02261735:user/release-keys
A/DEBUG: Revision: 0
A/DEBUG: ABI: arm
A/DEBUG: pid: 18115, tid: 19792, name: Thread-158 com.renderer.app
A/DEBUG: signal 11 (SIGSEGV), code 0 (SI_USER), fault addr --------
A/DEBUG: r0 c3f7e350 r1 ffffffff r2 c3f7e31c r3 00000014
A/DEBUG: r4 c3f7e25c r5 c3f7e308 r6 f2deed8c r7 c3f7e250
A/DEBUG: r8 c3f7e350 r9 c204a028 r10 00000000 r11 00000001
A/DEBUG: ip d1011f04 sp c3f7e248 lr d0ff766f pc d0ff7856
A/DEBUG: backtrace:
A/DEBUG: #00 pc 0006e856 /data/app/com.renderer.app-Ibeyey3dw8tSdgPla9iLpg/lib/arm/libc_shared.so
A/DEBUG: #01 pc 0006e66b /data/app/com.renderer.app-Ibeyey3dw8tSdgPla9iLpg/lib/arm/libc_shared.so
A/DEBUG: #02 pc 0006bffd /data/app/com.renderer.app-Ibeyey3dw8tSdgPla9iLpg/lib/arm/libc_shared.so
A/DEBUG: #03 pc 0006beaf /data/app/com.renderer.app-Ibeyey3dw8tSdgPla9iLpg/lib/arm/libc_shared.so (__gxx_personality_v078)
A/DEBUG: #04 pc 000e4bfc /data/app/com.renderer.app-Ibeyey3dw8tSdgPla9iLpg/lib/arm/libpg_sdk.so
A/DEBUG: #05 pc 000e5740 /data/app/com.renderer.app-Ibeyey3dw8tSdgPla9iLpg/lib/arm/libpg_sdk.so解决方案
基于以上背景可能存在一下几种解决方案
源代码重编译SO,添加动态依赖或者-fPIC等使用dlopen等函数进行动态调用修改导出符号表将冲突的函数隐藏掉修改导出符号表将冲突的函数重命名
具体执行
如果没有源代码这种方案就行不通可行方案。如果动态库没有导出 C 接口直接使用 dlopen 和 dlsym 调用 C 接口不现实。需要再封装一个动态库 lib_wapper.so包装 C 方法调用导出 C 接口。程序里使用 dlopen 和 dlsym 调用 lib_wapper.so 导出的 C 接口。不可行。使用 ELFkickers 里的 rebind 工具更改符号表将方法可见性从DEFAULT修改为HIDDEN运行时仍然与系统库冲突。查阅资料发现rebind 主要是用于修改 .o 目标文件。可以修改 .o 目标文件的绑定属性和符号可见性修改 .so 无效可行。使用Python的LIEF模块最为方便
实际案例
解决跟libc_shared.so符号冲突的so重命名
import lief
import sysif __name__ __main__:cpp_shared_so_path libc_shared.socpp_shared_so lief.parse(cpp_shared_so_path)cpp_shared_so_exported_symbols cpp_shared_so.exported_symbolscpp_shared_so_exported_symbols_list [sym.name for sym in cpp_shared_so_exported_symbols]targetElf sys.argv[1]elf lief.parse(targetElf)exported_symbols elf.exported_symbols #dynamic_symbolsfor symbol in exported_symbols:if symbol.name in cpp_shared_so_exported_symbols_list:sym_export elf.get_symbol(symbol.name)sym_export.name symbol.name.replace(_Z,_M)elf.write(targetElf.replace(.so,_out.so))参考
- 安卓符号冲突解决方案修改动态库函数符号表 - 修改so导出函数名称