[✔️] android so库的相关命令

简介: [✔️] android so库的相关命令

查看so是32/64、debug/release


  • 64位示例:


file libopenal.so
libopenal.so: 
    ELF 64-bit LSB shared object, 
    ARM aarch64, 
    version 1 (SYSV), 
    dynamically linked, 
    with debug_info, 
    not stripped


  • 32位示例:


file libopenal.so
libopenal.so: 
    ELF 32-bit LSB shared object, 
    ARM, 
    EABI5 version 1 (SYSV), 
    dynamically linked, 
    interpreter /system/bin/linker, 
    with debug_info, 
    not stripped


编码实现查看so的位数


QString AsssistPanel::getDllBit(const char* dllFullpath)
{
    QString ret = "";
    // 以只读方式打开文件
    HANDLE hFile = CreateFile(dllFullpath, GENERIC_READ, FILE_SHARE_READ, NULL,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        ret = "Failed to open file!";
        return ret;
    }
    // 获取文件的大小
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    if (dwFileSize == INVALID_FILE_SIZE) {
        CloseHandle(hFile);
        ret = "Failed to get file size!";
        return ret;
    }
    // 创建文件映射视图
    HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
    if (hMapping == NULL) {
        CloseHandle(hFile);
        ret = "Failed to create file mapping!";
        return ret;
    }
    LPVOID lpBaseAddress = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
    if (lpBaseAddress == NULL) {
        CloseHandle(hMapping);
        CloseHandle(hFile);
        ret = "Failed to map view of file!";
        return ret;
    }
    // 获取NT头指针
    PIMAGE_NT_HEADERS pNtHeader = ImageNtHeader(lpBaseAddress);
    if (pNtHeader == NULL) {
        UnmapViewOfFile(lpBaseAddress);
        CloseHandle(hMapping);
        CloseHandle(hFile);
        ret = "Failed to get NT header!";
        return ret;
    }
    // 获取文件头指针
    PIMAGE_FILE_HEADER pFileHeader = &pNtHeader->FileHeader;
    // 判断DLL文件的位数
    if (pFileHeader->Machine == IMAGE_FILE_MACHINE_I386)
        ret = "32-bit";
    else if (pFileHeader->Machine == IMAGE_FILE_MACHINE_AMD64)
        ret = "64-bit";
    else
        ret = "Unknown machine type.";
    // 释放资源
    UnmapViewOfFile(lpBaseAddress);
    CloseHandle(hMapping);
    CloseHandle(hFile);
    return ret;
}


查看so所使用的ndk版本


readelf是Linux/Unix系统下的一个命令行工具,用于查看ELF(Executable and Linkable Format)文件的信息。ELF是一种可执行文件和共享库的标准格式,是Linux系统下常见的二进制文件格式,它包含了程序的代码、数据、符号表、动态链接信息等。

readelf可以以多种不同的方式展示ELF文件的内容,例如显示文件头、节头、符号表、重定位表等等。使用readelf可以快速有效地了解一个ELF文件的内部结构和特征,同时也可以了解它的依赖关系和调试信息等。


下面是一些常用的readelf命令选项:


  • -h 显示ELF文件头信息。


  • -S 显示节头信息,包括各个节的类型、名称、大小、偏移地址等。


  • -s 显示符号表信息,包括函数、变量、定义和引用等。


  • -r 显示重定位表信息,包括重定位类型、符号、偏移等信息。


  • -d 显示动态节信息,包括动态链接器所需要的信息。


  • -A 显示文件属性,包括系统架构、字节序、OS版本等。


  • -V 显示版本信息。


  • -x <section> 显示指定节(section)的内容。


readelf命令非常有用,尤其是在调试和分析ELF文件时。正因为如此,它也是GNU Binutils工具包中的一个重要组成部分,被广泛应用于Linux和Unix系统中。


readelf -preadelf命令的一个选项,用于显示ELF文件中的某个特定段(program section)的数据内容。最常见的用法是使用readelf -p .rodata来查看只读数据段(read-only data section)的内容。


在ELF文件中,程序段是代码和数据的块,可以有多个段。每个段都有一个段头(section header),用于记录段的大小、偏移量、访问权限等信息。在.rodata这个只读数据段中,通常存储着程序中的常量、字符串和其他静态数据。


 readelf -p ".comment" libavcodec.so
 String dump of section '.comment':
  [     0]  Android (5220042 based on r346389c) clang version 8.0.7 
  (https://android.googlesource.com/toolchain/clang b55f2d4ebfd35bf643d27dbca1bb228957008617) 
  (https://android.googlesource.com/toolchain/llvm 3c393fe7a7e13b0fba4ac75a01aa683d7a5b11cd) 
  (based on LLVM 8.0.7svn)


这里查询到clang version 8.0.7,那么我们只需要看下ndk里面的,NDK历史版本


# toolchains/llvm/prebuilt/xxx/bin/clang
clang -v


每个ndk版本所携带的编译器版本都会发生变化,以下是我收集的ndk和clang的对应关系:


ndk version clang version .so case
r10c 3.4
r14b 3.8.275480
4.4.3 libcocos2dlua.so
4.6
4.8 libGCloudVoice.so
4.9 libBugly.so
r15c、r15 5.0.3
r16b 5.0.300080
r17c 6.0.2
r20b 8.0.7
21 9.0.8



目录
相关文章
|
5月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
26天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
22 1
|
30天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
82 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
1月前
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
3月前
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
310 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
3月前
|
监控 Java API
Android经典实战之OkDownload:一个经典强大的文件下载开源库,支持断点续传
本文介绍的 OkDownload 是一个专为 Android 设计的开源下载框架,支持多线程下载、断点续传和任务队列管理等功能,具备可靠性、灵活性和高性能特点。它提供了多种配置选项和监听器,便于开发者集成和扩展。尽管已多年未更新,但依然适用于大多数文件下载需求。
359 1
|
3月前
|
API Android开发
Android项目架构设计问题之选择和使用合适的UI库如何解决
Android项目架构设计问题之选择和使用合适的UI库如何解决
48 0
|
3月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
100 2
|
4月前
|
Java API 开发工具
一个专为Android平台设计的高度可定制的日历库
Calendar库是Android开发的工具,支持RecyclerView和Compose,提供高度定制的日历组件。功能包括:单选/多选/范围日期选择、周/月模式、禁用特定日期、设置边界、自定义视图、每周起始日、滚动方式、热力图、标题和脚注、滑动导航及兼容低版本API。示例应用和源码可在GitHub找到,通过Gradle集成,有详细文档指导。
81 16
|
4月前
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
70 4