reubicación de ELF en tiempo de carga
linux loader (2)
Estoy escribiendo un simple cargador ELF de espacio de usuario bajo Linux (¿por qué? Para ''diversión''). Mi cargador en este momento es bastante simple y está diseñado para cargar solo archivos ELF enlazados estáticamente que contienen código independiente de la posición.
Normalmente, cuando el cargador de ELF del kernel carga un programa, se carga en su propio espacio de direcciones. Como tal, el segmento de datos y el segmento de código se pueden cargar en la dirección virtual correcta como se especifica en los segmentos de ELF.
En mi caso, sin embargo, estoy solicitando direcciones del kernel a través de mmap
, y puedo o no obtener las direcciones solicitadas en los segmentos ELF. Esto no es un problema para el segmento de código, ya que es independiente de la posición. Sin embargo, si el segmento de datos no se carga en la dirección esperada, el código no podrá hacer referencia a nada almacenado en el segmento de datos.
De hecho, mi cargador parece funcionar bien con un ejecutable de ensamblaje simple que no contiene ningún dato. Pero tan pronto como agrego un segmento de datos y me refiero a él, el ejecutable no se ejecuta correctamente o SEGFAULTs.
¿Cómo, si es posible, puedo corregir cualquier referencia al segmento de datos para que apunte al lugar correcto? ¿Hay una sección de reubicación almacenada en el archivo ELF (estático) para este propósito?
No veo ninguna forma de hacerlo, a menos que emule completamente el espacio de direcciones virtuales provisto por el kernel y ejecute el código dentro de ese espacio virtual. Cuando coloca en el mapa la sección de datos del archivo, la está reubicando intrínsecamente en una dirección desconocida del espacio de direcciones virtuales de su intérprete de ELF, y su código no podrá hacer referencia a ella de ninguna manera.
Me alegro de haber demostrado estar equivocado. Hay algo muy bueno para aprender aquí.
Si modifica las direcciones absolutas disponibles en la sección .got, su programa (tabla de compensación global) debería funcionar. Asegúrese de modificar el cálculo de la dirección absoluta para satisfacer la nueva distancia entre .text y .data. Me temo que necesita averiguar de dónde proviene esta información para su arquitectura.
Vea esto: Tabla de compensación global (específica del procesador)
Buena suerte.