2017-01-19 189 views
0

我在ELF二进制文件中遇到了这个有用的功能 - Build ID"It ... is (normally) the SHA1 hash over all code sections in the ELF image."人们可以用GNU工具阅读:ELF,Build-ID,有重新计算它的实用程序吗?

$ readelf -n /bin/bash 
... 
Displaying notes found at file offset 0x00000274 with length 0x00000024: 
    Owner     Data size Description 
    GNU     0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring) 
    Build ID: 54967822da027467f21e65a1eac7576dec7dd821 

而且我不知道是否有重新计算自己构建标识一个简单的方法?检查它是否没有被破坏等。

回答

1

所以,我收到了Mark的回答。由于它是最新的信息,我在这里发布。但基本上你们是对的。事实上,没有用于计算Build-ID的工具,并且Build-ID的意图不是(1)文件内容的标识,甚至不(2)标识可执行文件(代码)的一部分,但它用于(3)捕捉构建的“语义含义”,这是形式化的难点。 (数字是自我参考。)从电子邮件

报价:

- “有用户工具重新计算从文件本身的集结号,以 检查,如果它不以某种方式损坏/妥协等?“ 如果你有时间,也许你可以在那里发布答案?

对不起,我没有一个计算器帐户。 但答案是:不,没有这样的工具,因为没有指定计算build-id的确切方式。它只是普遍 独特。即使build-id的精确长度未被指定。有 是使用不同的哈希算法的各种方式,build-id可能是 计算得到一个普遍唯一的值。即使您知道最初创建的 ,但并非ELF文件中的所有数据都可以重新计算(仍然是) 。

显然,构建-ID的意图改变 因为the Fedora Feature page是写 它。 人们的意见与现在的分歧。 也许在你的回答中,你可以包括Build-ID的状态以及它现在是什么样的 ?

我觉得事情并不是很精确的。如果工具更改创建ELF文件的 版本,以使其不再是“语义上 相同”的二进制文件,则应该得到新的(重新计算的) 构建标识。但是,如果某个工具改变了文件的某些内容,但仍然会导致“语义相同”的二进制文件,则构建标识保持为 。

没有精确定义的是“语义相同的二进制” 的含义。其目的是捕获构建的所有内容,包括 。因此,如果用于生成二进制文件的源文件是 不同,那么即使生成的二进制代码 可能碰巧是相同的,您也期望生成不同的生成ID。

这就是为什么通过散列 算法计算文件的集结号,当您使用不只是(分配)的代码段,同时也是 debuginfo软的部分(其中将包含在源文件 名称的引用) 。但是,如果你然后例如剥离出debuginfo(并将其放入 单独文件中),那么它不会更改构建标识(该文件仍然是从相同构建创建的 )。

这也是为什么,即使您知道用于计算构建标识的精确哈希算法,您可能无法重新计算构建标识 。因为您可能会遗漏一些用于计算构建标识的散列算法中使用的原始数据 。

随时与他人分享这个答案。

干杯,

马克

此外,对于有意debuginfo人(?Linux性能&跟踪,任何人),他提到了几个项目来管理他们在Fedora:

2

构建ID不是程序的散列,而是构建的唯一标识符,并被认为只是一个“独特的blob” - 至少在某些情况下指向它曾经被定义为时间戳和绝对文件路径的散列,但这也不能保证稳定性。

+0

好的,但似乎他们在某些时候改变了它。 [在此电子邮件中](http://cygwin.com/ml/binutils/2008-11/msg00214.html)Roland McGrath说:“构建ID的目的是唯一标识由构建创建的二进制文件,以便其构建ID只匹配一个语义相同的二进制文件,“ - 所以它不只是一个随机blob。不知道今天的情况如何。 [Fedora的特性页面](https://fedoraproject.org/wiki/Releases/FeatureBuildId)是2007年的.. – xealits

2

我想知道是否有一种简单的方法来自己重新计算Build ID?

不,没有,按设计

您链接到自身的页面链接到build-id的原始description以及它可用于的内容。这页说:

But I'd like to specify it explicitly as being a unique identifier good 
only for matching, not any kind of checksum that can be verified against 
the contents. 

(There are external general means for content verification, and I don't 
think debuginfo association needs to do that.) 

其他并发症有:连接can take any of

--build-id 
--build-id=sha1 
--build-id=md5 
--build-id=0xhexstring 

所以版本ID是不一定的SHA1和开始。

+0

,但Fedora页面是“最近更新:2007-10-04”,我参考的文章是从2016年开始的。另外在[2008年的这个主题](https://cygwin.com/ml/binutils/2008-11/msg00197.html)中,Fedora人员[提及他们的工具](https://cygwin.com/ ml/binutils/2008-11/msg00211.html)重新计算build-id。 看起来完整的build-id计算和它的意图[由Roland McGrath在这里描述](https://cygwin.com/ml/binutils/2008-11/msg00214.html)。我不知道现在是什么状态 - 任何指针都是受欢迎的。 一个有意义的ID对于一个二进制文件是一件好事,并且是一个非常有用的功能。 – xealits