1

我想从 Linux 中的 .a ELF 存档文件中提取二进制部分。

当我在存档文件上运行 objdump -h 时,它会列出它包含的目标文件以及每个部分的部分标题。但是,“文件偏移”列似乎与存档中的目标文件位置相关,否则它们将所有部分重叠。

我希望我可以使用 dd 从存档文件中提取二进制信息。(请参阅如何仅提取 ELF 部分的内容)。我如何使用存档来做到这一点?

我还应该提到我正在提取的部分是用这个命令添加的:

echo "hi" > commentFile
objcopy libmylib.a --add-section .mysection=commentFile libmylib.a
4

1 回答 1

2

文件偏移列似乎与存档中的目标文件位置相关

您从中获得的文件偏移量objdump是相对于单个目标文件的开头的。您可以将档案库视为书架,并将输出objdump -h视为每本书中的索引。您不会期望索引会根据书架上的其他书籍或您从书架上取书的时间而改变。同样,目标文件本身(以及 的输出objdump -h)在您放入库时不会改变,或者再次将其提取出来(您会得到位相同的副本)。

我希望我可以使用 dd 从存档文件中提取二进制信息

可以使用dd,但您必须首先找到存档中每个单独对象文件的位置。这并不太难:UNIX 归档文件的格式已记录在案。但是格式可能会根据您使用的 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

如果.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.$$
于 2012-10-13T15:43:10.980 回答