已解决
Python 解压静态库 .a 和 .lib 文件
来自网友在路上 170870提问 提问时间:2023-11-06 02:43:49阅读次数: 70
最佳答案 问答题库708位专家为你答疑解惑
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++ 重新实现
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"Python 解压静态库 .a 和 .lib 文件":http://eshow365.cn/6-33232-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: ubuntu挂载共享目录的方法
- 下一篇: 【项目源码】反编译Java字节码生成源码