我想在Linux中从.a ELF存档文件中提取二进制文件。
当我在存档文件上运行objdump -h时,它会列出它包含的目标文件,以及每个部分的节标题。但是,“文件偏移”列似乎与归档中的目标文件位置相关,否则它们将会重叠所有部分。
我希望我可以使用dd从存档文件中提取二进制信息。 (见How do you extract only the contents of an ELF section)。如何使用存档执行此操作?
我还应该提到我正在解压缩的部分添加了这个命令:
echo "hi" > commentFile
objcopy libmylib.a --add-section .mysection=commentFile libmylib.a
答案 0 :(得分:2)
“文件偏移”列显示为相对于存档
中的目标文件位置
从objdump
获得的文件偏移量是相对于单个目标文件的开头的。您可以将存档库视为书架,并将objdump -h
的输出视为每本书中的索引。您不希望索引根据书架上的其他书籍或从书架上取书而改变。类似地,当您放入库中时,目标文件本身(以及objdump -h
的输出)不会改变,或者再次将其解压缩(您获得与位相同的副本)。
我希望我可以使用dd从存档文件中提取二进制信息
您可以使用dd
,但您必须先找到档案中每个目标文件的位置。这并不太难:UNIX归档文件的格式为documented。但是格式可能会根据您使用的UNIX变体而改变,并且对于您要执行的任务而言,它并不是必需的。
如何使用存档执行此操作?
如果您知道.mysection
libmylib.a
中的所有目标文件中的objcopy --add-section
具有相同的内容(就像您提供的firstobj=$(ar t libmylib.a | grep '\.o$' | head -1)
ar x libmylib.a $firstobj
# use objdump -h and dd to extract section context.
# or use "readelf -p .mysection $firstobj
rm -f $firstobj
命令的情况一样),那么提取 one < / em> object,从存档中,然后提取部分:
.mysection
如果mkdir tmp.$$ && cd tmp.$$ && ar x ../libmylib.a
for obj in $(find . -type f); do
# extract .mysection from $obj
done
cd .. && rm -rf tmp.$$
的内容在不同的目标文件中可能不同,请将它们提取到临时目录:
{{1}}