如何获取ELF存档文件中某个部分的实际位置?

时间:2012-10-04 09:43:25

标签: elf objdump objcopy carchive

我想在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

1 个答案:

答案 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}}