Android技术-修改SO导出符号

背景

经常在使用第三方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_v0+78)
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

解决方案

基于以上背景,可能存在一下几种解决方案

  1. 源代码重编译SO,添加动态依赖或者-fPIC等
  2. 使用dlopen等函数进行动态调用
  3. 修改导出符号表,将冲突的函数隐藏掉
  4. 修改导出符号表,将冲突的函数重命名

具体执行

  1. 如果没有源代码,这种方案就行不通
  2. 可行方案。如果动态库没有导出 C 接口,直接使用 dlopen 和 dlsym 调用 C++ 接口不现实。需要再封装一个动态库 lib_wapper.so,包装 C++ 方法调用,导出 C 接口。程序里使用 dlopen 和 dlsym 调用 lib_wapper.so 导出的 C 接口。
  3. 不可行。使用 ELFkickers 里的 rebind 工具更改符号表,将方法可见性从DEFAULT修改为HIDDEN,运行时仍然与系统库冲突。查阅资料发现,rebind 主要是用于修改 .o 目标文件。可以修改 .o 目标文件的绑定属性和符号可见性,修改 .so 无效
  4. 可行。使用Python的LIEF模块最为方便

实际案例

解决跟libc++_shared.so符号冲突的so重命名

import lief
import sysif __name__ == '__main__':cpp_shared_so_path = "libc++_shared.so"cpp_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导出函数名称

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/136213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF Expert for mac(苹果电脑专业pdf编辑器)兼容12系统

PDF Expert是macOS平台上的一款优秀的PDF阅读和编辑工具&#xff0c;由Readdle公司开发。它不仅拥有方便、易用的界面&#xff0c;还具备诸多功能&#xff0c;比如编辑PDF文件、添加批注、填写表格、签署文件、合并文档等。安装:PDF Expert for Mac(PDF编辑阅读转换器)v3.5.2中…

探讨m6调控因子与人类癌症之间的因果关系,纯生信也能轻松上5+

今天给同学们分享一篇生信文章“m6A Regulators Is Differently Expressed and Correlated With Immune Response of Esophageal Cancer”&#xff0c;这篇文章发表在Front Cell Dev Biol期刊上&#xff0c;影响因子为5.5。 结果解读&#xff1a; m6A调控因子在基因组中的异常与…

【 毕设项目源码推荐 javaweb 项目】 基于 springboot+vue 的图书个性化推荐系统的设计与实现(springboot003)

简介 :::warning 【 毕设项目源码推荐 javaweb 项目】 基于 springbootvue 的图书个性化推荐系统的设计与实现适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负…

TripleDES golang/python/ts 实现方式

2. 实现方式 2.1. react-ts function encrypt(text){import CryptoJS from crypto-jsconst key "saxbj%2xas"const text "liyuan"const iv "01234567"const result CryptoJS.TripleDES.encrypt(text, CryptoJS.enc.Utf8.parse(key), {mode:…

css怎样进行预处理

CSS的预处理原理是在原有CSS的语法基础上&#xff0c;添加了额外的特性&#xff0c;如变量、嵌套规则、mixin等&#xff0c;可以更方便地编写和维护样式表。常用的CSS预处理器包括Less、Sass和Stylus&#xff0c;以下是它们的使用方法&#xff1a; Less 安装Less&#xff1a;…

【测开求职】面试题:计算机网络 精简版整理

本篇文章整理的是在秋招过程中遇到的计算机网络高频面试题,应付部分中小厂的测试开发工程师面试完全没有问题,如果时间充足的话,建议再看一下笔者的另外一篇文章:【测开求职】面试题:计算机网络 详细版整理,会让你对整个计算机网络有足够全面深刻的理解,亲测应付各个大厂…

QTcpServer 封装

来一段自封装&#xff0c;在用的QTcpserver,不用去找boost,或是poco,libevent……&#xff0c;也不用去从底层winsocket封装开始&#xff0c;真不用去那么折腾&#xff0c;放着QT自带的不用&#xff0c;那不仅是可惜&#xff0c;是辜负了QT团队的一片苦心…… #pragma once #i…

react:封装组件

封装 /components/Pagination.tsx import React from react import { Pagination } from antdconst PaginationWarp ({ total, paramsInfo, setParamsInfo }) > {return (<Paginationtotal{total}current{paramsInfo.page}showSizeChangershowQuickJumperdefaultPageSi…

15.数组逆置【不是为啥我第四行不太对呢?】

#include<stdio.h>int fun(int a[4][4]){int i,j;int b[4][3];} int main(){int i,j;int a[3][4], b[4][3];for (i0;i<3;i)for(j0;j<4;j)scanf("%d",&a[i][j]);for (i0;i<3;i)for(j0;j<4;j)b[j][i]a[i][j];printf("逆置后&#xff1a;\n&…

Vite和Webpack区别

Vite和Webpack区别 Vite和Webpack都是现代前端项目的构建工具&#xff0c;它们存在一定的差异: 打包方式的不同 Vite采用Native ES Module的方式服务源码。它不会将代码打包&#xff0c;而是利用浏览器原生支持ES module的方式&#xff0c;实现按需加载。 Webpack需要先打包…

【Linux】文件重定向以及一切皆文件

文章目录 前言一、重定向二、系统调用dup2三、重定向的使用四、一切皆文件 前言 Linux进程默认情况下会有3个缺省打开的文件描述符&#xff0c;分别是标准输入0&#xff0c; 标准输出1&#xff0c; 标准错误2&#xff0c; 0,1,2对应的物理设备一般是&#xff1a;键盘&#xff…

本地数据库迁移到云端服务器

工具迁移xtrabackup 创建云服务器——通过云服务器提供的公网地址远程连接XShell——利用迁移工具将数据库从本地迁移到云服务器 &#xff08;1&#xff09;创建云服务器 &#xff08;2&#xff09;远程连接XShell &#xff08;3&#xff09;yum安装mysql &#xff08;4&…

梳理自动驾驶中的各类坐标系

目录 自动驾驶中的坐标系定义 关于坐标系的定义 几大常用坐标系 世界坐标系 自车坐标系 传感器坐标系 激光雷达坐标系 相机坐标系 如何理解坐标转换 机器人基础中的坐标转换概念 左乘右乘的概念 对左乘右乘的理解 再谈自动驾驶中的坐标转换 本节参考文献 自动驾驶…

数据结构:Map和Set(2):相关OJ题目

目录 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 771. 宝石与石头 - 力扣&#xff08;LeetCode&#xff09; 旧键盘 (20)__牛客网 (nowcoder.com) 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 692. 前K个高频单词 - 力扣&#xff08…

【Qt绘制小猪】以建造者模式绘制小猪

效果 学以致用&#xff0c;使用设计模式之建造者模式绘制小猪。 代码 接口&#xff1a;申明绘制的步骤 PigBuilder.h #ifndef PIGBUILDER_H #define PIGBUILDER_H#include <QObject> #include <QPainter>class PigBuilder : public QObject {Q_OBJECT public:ex…

你知道css中的object-fit的用法吗?

object-fit用法 object-fit 是一个用于控制 HTML <img> 元素和 <video> 元素等内联媒体元素的 CSS 属性。它用于控制内联媒体元素在其包含容器内的大小和位置&#xff0c;以确保其适应容器的规定尺寸。 object-fit 属性可以取的值有&#xff1a; fill&#xff1a…

Vue3 学习笔记

vue3 官网&#xff1a;简介 | Vue.js (vuejs.org) 1. 环境搭建与启动 npm create vuelatest 这一指令将会安装并执行 create-vue&#xff0c;它是 Vue 官方的项目脚手架工具 之后&#xff0c;你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示&#xff1a; ✔ …

AI 绘画 | Stable Diffusion 高清修复、细节优化

前言 在 Stable Diffusion 想要生成高清分辨率的图片。在文生图的功能里&#xff0c;需要设置更大的宽度和高度。在图生图的功能里&#xff0c;需要设置更大的重绘尺寸或者重绘尺寸。但是设置完更大的图像分辨率&#xff0c;需要更大显存&#xff0c;1024*1024的至少要电脑的空…

介绍两个好用又好玩的大模型工具

先让数字人跟大家打个招呼吧。 我的AI数字人会手语了 发现没&#xff0c;我的数字人本周又学了一个新技能&#xff1a;手语。 这些数字人都是通过AI生成的。 但数字人不是今天的主题&#xff0c;今天要跟大家聊聊大模型。 自从大模型出现后&#xff0c;很多人&#xff08;包…

Java面试题01

1.JDK和JRE的区别 JDK&#xff08;Java Development Kit&#xff09;是Java开发工具包&#xff0c;用于开发和编译Java程序。它包含了编 译器、调试器等开发工具&#xff0c;还有Java类库。JRE&#xff08;Java Runtime Environment&#xff09;是Java运行时环 境&#xff0c;用…