Cómo distinguir entre símbolos reubicables y no reubicables dentro de la sección .data.rel

Estoy tratando de crear un enlazador simple para una aplicación ARM barebone. Actualmente, el cargador, que carga el módulo, simplemente agregará el desplazamiento a todos los registros dentro del .got y .data.rel secciones. Esto funciona bien en .got, y para todos los símbolos que necesitan reubicación dentro .data.rel. Sin embargo, se interrumpirá para todos los datos no reubicables, ya que también obtendrán este desplazamiento.

Ejemplo:

void some_function() { return; }

struct a {
    void* fptr;
    int number;
};

static struct a = {
   .fptr = some_function,
   .number = 0x1000,
};

Aquí a.fptr abordará correctamente la ubicación real de la función, pero a.number se sostendrá incorrectamente 0x1000 + offset, en lugar de solo 0x1000.

¿Cómo debo distinguir entre los dos? ¿Es suficiente que verifique el .symtab y solo reubicar las direcciones que se encuentran allí? Pero, ¿y si un símbolo está realmente en la ubicación? 0x1000? ¿O el enlazador aborda este problema (por lo que no pondrá una función en la dirección 0x1000)? Lo hace .symtabs contiene todos los símbolos que se pueden encontrar dentro .got y .data.rel?

preguntado el 09 de marzo de 12 a las 14:03

Escribí un cargador ELF básico hace un tiempo y recuerdo que solo agrega compensaciones a las entradas de reubicación marcadas como "R_ARM_ABS32". Puedes encontrar el código aquí github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c -

y ¿cómo agregar entradas de reubicación al archivo elf? readelf dice que no está allí, pero uso -r -fpic para compilar/enlazar. (por cierto, deberías agregar esto como respuesta para que pueda votarlo) -

1 Respuestas

Escribí un cargador ELF básico hace un tiempo y recuerdo que solo agrega compensaciones a las entradas de reubicación marcadas como "R_ARM_ABS32".

Puedes encontrar el código aquí https://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c

Simplemente vinculé mis archivos ELF con --emit-relocs activado. De esa manera, el enlazador hace toda la vinculación, solo me dice lo que hizo para que pueda corregir las compensaciones durante el tiempo de carga.

respondido 11 mar '12, 06:03

El problema real fue que usé gcc, así que tuve que usar "-Xlinker --emit-relocs" en la línea de comando. Con las reubicaciones habilitadas, la tarea se volvió fácil. - SztupY

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