6

我正在尝试使用基于 OpenEmbedded 的 Arago构建并部署到 rootfs 中的软件包。不幸的是,该软件包包括预建的共享库。据我了解,Arago 使用 构建整个 Linux 发行版,而我怀疑--hash-style=gnu那些共享库是使用 构建的。--hash-style=sysv至少构建因“ELF 二进制文件中没有 GNU_HASH”质量检查问题而停止。

我了解哈希的用途。但我想我不明白系统运行时它们是如何使用的。

为什么必须为系统中的所有 ELF 设置一种哈希样式?为什么动态链接器不能即时确定哈希样式并直接使用它?

4

2 回答 2

4

动态链接器可以并且确实找出 ELF 中存在的哈希表类型(“sysv”或“gnu”)并相应地工作。

不幸的是,您看到的情况是,对 gnu 哈希部分的支持没有被反向移植到您系统上使用的旧版本的动态链接器。

存在类似的情况,其中为 RHEL5/FC6 构建的二进制文件在 RHEL4/FC5 上不起作用


为什么 .gnu.hash 与 .hash(sysv) 不兼容?

使用 gnu 哈希部分生成 ELF 会对动态符号表的构造施加某些限制(附加规则)。

使用 GNU 哈希,动态符号表分为两部分。第一部分接收可以从哈希表中省略的符号。GNU hash 没有对动态符号表的这一部分中的符号施加任何特定的顺序。

动态符号表的第二部分接收可从哈希表访问的符号。这些符号需要使用上述 GNU 散列函数通过增加 (hash % nbuckets) 值进行排序。哈希桶 (nbuckets) 的数量记录在 GNU 哈希部分中,如下所述。结果,将在单个哈希链中找到的符号在内存中是相邻的,从而导致更好的缓存性能。

参考:blogs.oracle.com/ali/entry/gnu_hash_elf_sections

于 2013-07-02T07:29:20.257 回答
3

我的 Yocto Arago 构建遇到了同样的No GNU_HASH in the ELF binary问题,但事实证明我的应用程序Makefile没有使用$(LDFLAGS)Yocto 构建设置的并包含-Wl,--hash-style=gnu其他重要内容。

我之所以提到这一点,是因为此问题是该错误消息的热门搜索结果,这可能对其他人有所帮助。

于 2016-07-19T15:20:05.267 回答