当前位置: 首页 > news >正文

Python 解压静态库 .a 和 .lib 文件

Python 解压静态库 .a 和 .lib 文件

2023-11-05 19:31:36
ChrisZZ

1.目的

解压 Windows 上的静态库文件 xxx.lib, 解压 linux aarch64 上的静态库文件 xxx.a。

使用 Python 是为了跨平台:

  • 不管 host 是什么系统, 都能执行解压
  • 不管被解压的静态库是 .a 还是 .lib, 在当前系统上都能解压

2. 方案调研

如果不限定为 Python, 那么用 7z 解压是最佳选择: 支持超多格式, 跨平台支持良好。

但目前没找到 7z 的 Python 封装, 找到的基本功能不全。希望用 7zz 这个命令行解压 .a/.lib 的意思是, 解压一个 archive, 而不是解压一个 .7z 类型的压缩包。因此:

  • pylzma: API 提供的过于 lowlevel, 文档里例子并不实用
  • py7zr: 只能处理 .7z 文件
  • zipfile: 这是 Python 内置模块,但只能处理 .zip 文件
  • patool (https://github.com/wummel/patool): 功能挺全的,一般用也够的,但它仅仅是命令行套壳,因此如果要在 Windows 系统上解压 Linux/macOSX 上生成的 .a 文件, 应该是做不到的
  • https://github.com/s3rvac/ar-cpp 这是用 CPP 实现的 ar 格式解析,但是作者弃坑了,说支持可能不太全不太对
  • https://en.wikipedia.org/wiki/Ar_(Unix) 这是 AR 格式的维基百科,按照上面说的,理论上可以自行实现 AR 格式解析

https://github.com/vidstige/ar 这个实现是纯 Python 的因此是跨平台的。不过没有支持 macOSX 上的 .a 文件, 我提交了 PR (https://github.com/vidstige/ar/pull/2),能否被 merge 就随缘了, 至少目前我的实际使用场景不需要支持 mac。

3. 使用 ar 模块

安装

pip install ar

准备静态库

libhello_d.a: 略。基于 CMake 自行生成即可。

使用 ar 模块

列出里面的 .o 文件(有时候还有 txt 文件), 保存所有entry为文件:

import ar
with open('file.a', "rb") as f:archive = ar.Archive(f)for entry in archive:fout = open(entry.name, "wb")fin = open(filepath, "rb")fin.seek(entry.offset)buffer = fin.read(entry.size)fout.write(buffer)fout.close()

验证一致性

使用 7zz x xxx.a 解压, 和 python 解压结果比对二进制:

# test locallyimport sys
sys.path.insert(0, "/Users/chris/work/github/ar")
import ar
import osfilepath = "libhello_d.a"save_dir = "by_py"
def extract_by_py():os.makedirs(save_dir, exist_ok=True)with open(filepath, "rb") as f:archive = ar.Archive(f)for entry in archive:print(entry.name, entry.offset, entry.size)fout = open(save_dir + "/" + entry.name, "wb")fin = open(filepath, "rb")fin.seek(entry.offset)buffer = fin.read(entry.size)fout.write(buffer)fout.close()save_dir2 = "by_7zz"
def extract_by_7zz():cmd = "7zz x " + filepath + " -o" + save_dir2os.system(cmd)def compare_binary():for item in os.listdir(save_dir):if item == "__.SYMDEF SORTED":continuecmd = "diff " + save_dir + "/" + item + " " + save_dir2 + "/" + itemprint(cmd)os.system(cmd)if __name__ == "__main__":#extract_by_py()#extract_by_7zz()compare_binary()

4. 总结

  • 使用 pip install ar 提供的 API,可以完成跨平台的 .a/.lib 静态库的解压
  • ar 模块的官方文档很简略,也没有支持 BSD(macOSX)上的静态库的支持, 结合 Wikipedia 尝试了修复,提交了 PR
  • 如果有人封装了 7z 命令行的完整功能, 那么事情就无比简单了, 这位好心人还没出现
  • 后续使用, 根据解压的速度, 考虑是否基于 C/C++ 重新实现

相关文章:

  • 【蓝桥杯】2023省赛H题
  • springboot前后端时间类型传输
  • Ansible的role
  • 0基础学习PyFlink——使用datagen生成流式数据
  • 【架构图解】API架构图解:如何以图表形式展现复杂系统
  • XPATH 注入漏洞
  • 数据可视化:动态柱状图
  • 关于SNAP的Biophysical Processor模块的计算准确率以及大厂10月种植情况
  • 网络安全进阶学习第二十一课——XXE
  • Docker数据卷使用过程中想到的几个问题
  • linux下使用vscode对C++项目进行编译
  • vue的rules验证失效,部分可以部分又失效的原因
  • Linux之管道
  • 下载安装各种版本的Vscode以及解决VScode官网下载慢的问题
  • MySQL 为什么在 8.0 版本中移除了查询缓存功能?
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Codepen 每日精选(2018-3-25)
  • exif信息对照
  • Git初体验
  • JS函数式编程 数组部分风格 ES6版
  • JS基础之数据类型、对象、原型、原型链、继承
  • laravel with 查询列表限制条数
  • Less 日常用法
  • Lucene解析 - 基本概念
  • Mysql优化
  • Python进阶细节
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 成为一名优秀的Developer的书单
  • 深度学习入门:10门免费线上课程推荐
  • 小李飞刀:SQL题目刷起来!
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​VRRP 虚拟路由冗余协议(华为)
  • #if和#ifdef区别
  • (java)关于Thread的挂起和恢复
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (二)linux使用docker容器运行mysql
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (九)One-Wire总线-DS18B20
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net(C#)中String.Format如何使用
  • .net反混淆脱壳工具de4dot的使用
  • // an array of int
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @Transaction注解失效的几种场景(附有示例代码)
  • [1204 寻找子串位置] 解题报告
  • [Android 13]Input系列--获取触摸窗口
  • [Android Studio] 开发Java 程序
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)