2008-12-06 13 views
10

Estamos desarrollando un puerto del Ensamblador GNU para una arquitectura de cliente. Ahora el problema es que:Símbolos reubicables en formato ELF (lenguaje ensamblador)

Si un operando inmediato a una instrucción es una expresión que involucra más de un símbolo reubicable, ¿cómo se maneja en el archivo de salida en formato elf. ¿Cuál será la información de reubicación producida en tal caso?

Por ejemplo:

j label1 + label2 

donde label1 y label2 se definen en las secciones reubicables, podrían ser las mismas secciones o diferentes secciones reubicables.

Respuesta

7

ELF doesn' t saber acerca de las instrucciones, per se. Conoce las codificaciones particulares de los desplazamientos de símbolos dentro de las instrucciones. En el ensamblador, necesitaría generar dos registros de reubicación, cada uno con el triplete [dirección, tipo, símbolo] correspondiente para corregir adecuadamente esa parte de la instrucción. El vinculador ni siquiera sabría necesariamente que estos dos registros apuntan a la misma instrucción.

Los tipos de reubicación ELF son completamente dependientes de la CPU (o, para ser más precisos, dependientes de ISA), por lo que es libre de definir las reubicaciones que necesite para una nueva arquitectura.

Es difícil ser más específico sin detalles de la codificación de la instrucción.

0

sé jack sobre ELF y sólo un poco más acerca de la vinculación, pero ...

Yo esperaría que cada operando se maneja de la misma manera que lo sería si sólo había una.

OTOH ¿Podría ser que el formato para j se modifique dependiendo de dónde están las etiquetas? Si es así, yo creo estás hundido como enlazadores no son lo suficientemente inteligente como para hacer ese tipo de cosas (IIRC sistema de construcción ADA podría ser más inteligente que la mayoría de lo que es posible mirarlo.)

0

Esperaré una entrada por dirección para cada instrucción que necesite reubicación.

Objdump podría ser capaz de mostrar la tabla de reubicación de un archivo ejecutable u objeto, pero no sé las banderas de forma directa.

Mi sugerencia es tratar de desenterrar una instrucción x86 (u otra CISC) que haga algo similar a lo que hace su arco de cliente, y ver qué relocaciones se generan cuando lo ensambla/vincula.

Cuestiones relacionadas