Android readelf 工具查找函数符号

2024-01-09 06:44

本文主要是介绍Android readelf 工具查找函数符号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ELF(Executable and Linkable Format)是一种执行文件和可链接文件的格式。它是一种通用的二进制文件格式,用于在各种操作系统中存储可执行程序、共享库和内核模块。

Android 开发当中的 so 库本质上就是一种特殊类型的 ELF 文件,但在用途上它更专注于共享库的功能

so 库通常被设计为在程序运行时动态加载和链接,以提供代码、函数和数据等共享资源给其他程序使用。而可执行程序的 ELF 文件则是一个独立的程序,可以直接运行。因此,在使用方式和加载方式上有所不同,但它们都可以使用相同的 ELF 文件格式进行存储和组织。

readelf 是一个用于显示 ELF 文件的信息的工具,它可以显示 ELF 文件的各个部分的详细信息,例如头部信息、节(section)表、符号表、动态重定位表等。通过使用 readelf,开发者可以查看和分析 ELF 文件的结构和内容,以便了解和调试程序的执行过程。比如在进行 Native Hook 时,需要查看一个 so 库中的函数符号表,就可以使用这个工具进行查看。


在 Android 开发中,NDK 包中就已经包含了 readelf 工具了:

/AndroidSDK/ndk/21.0.6113669/toolchains/aarch64-linux-android-4.9/prebuilt/windows-x86_64/bin/aarch64-linux-android-readelf.exe

这是我电脑中 readelf 的路径,但我发现在 /toolchains/ 中有很多地方都有 readelf 文件且都能正常使用,把 readelf 配置一下环境变量就能正常使用了

使用命令来查看 so 库的节头表信息:

readelf -sW libxxx.so

libxxx.so 需要自行替换想要查看的 so库。但是把所有信息都输出到命令行实在是太多且难以查看,所以最好是输出到一个文件中方便我们来查找需要的信息:

readelf -sW libxxx.so > output.txt

这里我是把信息都输出到一个 txt 文件上了,然后在 txt 文件上直接搜索函数名就会出来对应的函数符号(因为函数符号是包含函数名的


举个例子:

在 C++ 文件中创建一个函数 readelf_native_funtion:

通过一些列操作编译成 so 库(gradle 配置 + Cmake 配置 + mergeReleaseNativeLibs)

然后在 build/intermediates/merged_native_libs/ 找到自己编译好的 so 库,运行 readelf 后打开 txt 文件:

就可以查询到函数 readelf_native_funtion 对应的函数符号是 _Z22readelf_native_funtionv

这篇关于Android readelf 工具查找函数符号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/586239

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

sqlite3 命令行工具使用指南

《sqlite3命令行工具使用指南》本文系统介绍sqlite3CLI的启动、数据库操作、元数据查询、数据导入导出及输出格式化命令,涵盖文件管理、备份恢复、性能统计等实用功能,并说明命令分类、SQL语... 目录一、启动与退出二、数据库与文件操作三、元数据查询四、数据操作与导入导出五、查询输出格式化六、实用功

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级