2023-11-05 19:31:36
ChrisZZ
解压 Windows 上的静态库文件 xxx.lib, 解压 linux aarch64 上的静态库文件 xxx.a。
使用 Python 是为了跨平台:
如果不限定为 Python, 那么用 7z 解压是最佳选择: 支持超多格式, 跨平台支持良好。
但目前没找到 7z 的 Python 封装, 找到的基本功能不全。希望用 7zz 这个命令行解压 .a/.lib 的意思是, 解压一个 archive, 而不是解压一个 .7z 类型的压缩包。因此:
https://github.com/vidstige/ar 这个实现是纯 Python 的因此是跨平台的。不过没有支持 macOSX 上的 .a 文件, 我提交了 PR (https://github.com/vidstige/ar/pull/2),能否被 merge 就随缘了, 至少目前我的实际使用场景不需要支持 mac。
pip install ar
libhello_d.a: 略。基于 CMake 自行生成即可。
列出里面的 .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 locally
import sys
sys.path.insert(0, "/Users/chris/work/github/ar")
import ar
import os
filepath = "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_dir2
os.system(cmd)
def compare_binary():
for item in os.listdir(save_dir):
if item == "__.SYMDEF SORTED":
continue
cmd = "diff " + save_dir + "/" + item + " " + save_dir2 + "/" + item
print(cmd)
os.system(cmd)
if __name__ == "__main__":
#extract_by_py()
#extract_by_7zz()
compare_binary()
pip install ar
提供的 API,可以完成跨平台的 .a/.lib 静态库的解压