Solo uno --hash-style en Linux embebido. ¿Por qué?

Estoy tratando de construir e implementar un paquete de software en rootfs con Arago basado en OpenEmbedded. Desafortunadamente, el paquete de software incluye bibliotecas compartidas preconstruidas. Según tengo entendido, Arago construye toda la distribución de Linux con --hash-style=gnu, mientras que esas bibliotecas compartidas se han creado con --hash-style=sysv, Sospecho. Al menos, la compilación se detiene con el problema de control de calidad "No GNU_HASH en el binario ELF".

Entiendo para qué son los hashes. Pero supongo que no entiendo cómo se usan cuando el sistema está funcionando.

¿Por qué es necesario tener un estilo hash para todos los ELF del sistema? ¿Por qué el enlazador dinámico no puede determinar el estilo hash sobre la marcha y simplemente usarlo?

preguntado el 31 de julio de 12 a las 14:07

2 Respuestas

Yo tuve el mismo No GNU_HASH in the ELF binary problema con mi versión de Yocto Arago, pero resultó que mi aplicación Makefile no estaba usando $(LDFLAGS) que está establecido por la compilación Yocto y contiene -Wl,--hash-style=gnu entre otras cosas importantes.

Menciono esto porque esta pregunta es el principal resultado de búsqueda para ese mensaje de error, y esto podría ayudar a otras personas.

Respondido 25 Jul 16, 15:07

El enlazador dinámico puede y descubra el tipo de tabla hash ("sysv" o "gnu") presente en ELF y funcione en consecuencia.

Desafortunadamente, lo que ve es un caso en el que la compatibilidad con las secciones hash gnu NO se ha retrotraído a una versión anterior del enlazador dinámico en uso en su sistema.

Existe una situación similar en la que los binarios creados para RHEL5/FC6 NO funcionan en RHEL4/FC5.


¿Por qué .gnu.hash es incompatible con .hash(sysv)?

Generar un ELF con la sección hash gnu impone ciertas restricciones (reglas adicionales) en la construcción de la tabla de símbolos dinámicos.

Con el hash de GNU, la tabla de símbolos dinámicos se divide en dos partes. La primera parte recibe los símbolos que se pueden omitir de la tabla hash. El hash de GNU no impone ningún orden específico para los símbolos en esta parte de la tabla de símbolos dinámicos.

La segunda parte de la tabla de símbolos dinámicos recibe los símbolos a los que se puede acceder desde la tabla hash. Se requiere que estos símbolos se clasifiquen aumentando el valor (hash % nbuckets), utilizando la función hash GNU descrita anteriormente. El número de cubos de hash (nbuckets) se registra en la sección de hash de GNU, que se describe a continuación. Como resultado, los símbolos que se encontrarán en una sola cadena hash están adyacentes en la memoria, lo que conduce a un mejor rendimiento de la memoria caché.

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

Respondido el 20 de junio de 20 a las 10:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.