Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Only one --hash-style in embedded Linux. Why?

I am trying to get a software package built and deployed into rootfs with OpenEmbedded-based Arago. Unfortunately the software package includes prebuilt shared libs. As far as I understand, Arago builds the entire Linux distro with --hash-style=gnu, while those shared libs have been built with --hash-style=sysv, I suspect. At least the build stops with "No GNU_HASH in the ELF binary" QA issue.

I understand what hashes are for. But I guess I do not understand how they are being used when the system is running.

Why is it necessary to have one hash style for all ELFs in the system? Why can't the dynamic linker determine the hash style on the fly and just use it?

like image 237
Igor S.K. Avatar asked Jul 31 '12 13:07

Igor S.K.


2 Answers

The dynamic linker can and does figure out the kind of hash table ("sysv" or "gnu") present in the ELF and works accordingly.

Unfortunately what you see is a case where support for gnu hash sections has NOT been back-ported to older version of the dynamic linker in use on your system.

A similar situation exists wherein binaries built for RHEL5/FC6 do NOT work on RHEL4/FC5.


Why .gnu.hash is incompatible with .hash(sysv)?

Generating an ELF with the gnu hash section imposes certain restrictions(additional rules) on the construction of the dynamic symbol table.

With GNU hash, the dynamic symbol table is divided into two parts. The first part receives the symbols that can be omitted from the hash table. GNU hash does not impose any specific order for the symbols in this part of the dynamic symbol table.

The second part of the dynamic symbol table receives the symbols that are accessible from the hash table. These symbols are required to be sorted by increasing (hash % nbuckets) value, using the GNU hash function described above. The number of hash buckets (nbuckets) is recorded in the GNU hash section, described below. As a result, symbols which will be found in a single hash chain are adjacent in memory, leading to better cache performance.

Reference: blogs.oracle.com/ali/entry/gnu_hash_elf_sections

like image 173
TheCodeArtist Avatar answered Oct 31 '22 23:10

TheCodeArtist


I had the same No GNU_HASH in the ELF binary issue with my Yocto Arago build, but it turned out that my application's Makefile wasn't using $(LDFLAGS) which is set by the Yocto build and contains -Wl,--hash-style=gnu among other important things.

I'm mentioning this because this question is the top search result for that error message, and this might help other people.

like image 42
Brad Grissom Avatar answered Oct 31 '22 23:10

Brad Grissom