2012-10-04 23 views
1

我想在Linux中提取一个。ELF存档文件中的二进制部分。如何获取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 

回答

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 

如果.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.$$ 
+0

ar p libmylib.a | grep'\ .o $'不会在我的系统(Fedora)上打印任何东西,但是objdump -h libmylib.a | grep -o'[^] * \。o'的作品。 – ACyclic

+0

@NYCBrit应该是'ar t',而不是'ar p'。对于那个很抱歉。 –

相关问题