stringtranslate.com

Reubicación (informática)

La reubicación es el proceso de asignar direcciones de carga para códigos y datos dependientes de la posición de un programa y ajustar el código y los datos para reflejar las direcciones asignadas. [1] [2] Antes de la llegada de los sistemas multiproceso, y todavía en muchos sistemas integrados, las direcciones de los objetos eran absolutas y comenzaban en una ubicación conocida, a menudo cero. Dado que los sistemas multiprocesamiento se vinculan y cambian dinámicamente entre programas, se hizo necesario poder reubicar objetos utilizando código independiente de la posición . Un vinculador generalmente realiza la reubicación junto con la resolución de símbolos , el proceso de buscar archivos y bibliotecas para reemplazar referencias simbólicas o nombres de bibliotecas con direcciones reales utilizables en la memoria antes de ejecutar un programa.

La reubicación normalmente la realiza el vinculador en el momento del enlace , pero también puede realizarse en el momento de la carga mediante un cargador de reubicación , o en tiempo de ejecución mediante el propio programa en ejecución . Algunas arquitecturas evitan por completo la reubicación al diferir la asignación de direcciones al tiempo de ejecución; como, por ejemplo, en máquinas de pila con aritmética de dirección cero o en algunas arquitecturas segmentadas donde cada unidad de compilación se carga en un segmento separado.

Segmentación

Los archivos objeto se dividen en varios tipos de segmentos o secciones de memoria. Los tipos de segmentos de ejemplo incluyen segmento de código (.text) , segmento de datos inicializados (.data) , segmento de datos no inicializados (.bss) u otros según lo establecido por el programador, como segmentos comunes o segmentos estáticos con nombre.

tabla de reubicación

La tabla de reubicación es una lista de punteros creados por el traductor (un compilador o ensamblador ) y almacenados en el objeto o archivo ejecutable. Cada entrada en la tabla, o "reparación", es un puntero a una dirección absoluta en el código objeto que debe cambiarse cuando el cargador reubica el programa para que haga referencia a la ubicación correcta. Las reparaciones están diseñadas para respaldar la reubicación del programa como una unidad completa. En algunos casos, cada corrección en la tabla es en sí misma relativa a una dirección base de cero, por lo que las correcciones en sí deben cambiarse a medida que el cargador se mueve a través de la tabla. [2]

En algunas arquitecturas, una corrección que cruza ciertos límites (como el límite de un segmento) o que no está alineada en el límite de una palabra es ilegal y el vinculador la marca como un error. [3]

DOS y Windows de 16 bits

Los punteros lejanos ( punteros de 32 bits con segmento :offset, utilizados para direccionar el espacio de memoria de 20 bits y 640 KB disponible para programas de DOS ), que apuntan a código o datos dentro de un ejecutable de DOS ( EXE ), no tienen segmentos absolutos, porque el La dirección real del código/datos depende de dónde está cargado el programa en la memoria y esto no se sabe hasta que se carga el programa.

En cambio, los segmentos son valores relativos en el archivo EXE de DOS. Estos segmentos deben corregirse cuando el ejecutable se haya cargado en la memoria. El cargador EXE utiliza una tabla de reubicación para encontrar los segmentos que deben ajustarse.

Ventanas de 32 bits

Con los sistemas operativos Windows de 32 bits, no es obligatorio proporcionar tablas de reubicación para los archivos EXE, ya que son la primera imagen cargada en el espacio de direcciones virtuales y, por lo tanto, se cargarán en su dirección base preferida.

Tanto para las DLL como para los EXE que optan por la aleatorización del diseño del espacio de direcciones (ASLR), una técnica de mitigación de exploits introducida con Windows Vista , las tablas de reubicación una vez más se vuelven obligatorias debido a la posibilidad de que el binario se pueda mover dinámicamente antes de ejecutarse, a pesar de que siguen siendo lo primero que se carga en el espacio de direcciones virtuales.

Ventanas de 64 bits

Cuando se ejecutan archivos binarios nativos de 64 bits en Windows Vista y superiores, ASLR es obligatorio [ cita necesaria ] y, por lo tanto, el compilador no puede omitir las secciones de reubicación.

Sistemas tipo Unix

El formato ejecutable Executable and Linkable Format (ELF) y el formato de biblioteca compartida utilizado por la mayoría de los sistemas tipo Unix permiten definir varios tipos de reubicación. [4]

Procedimiento de reubicación

El vinculador lee información de segmentos y tablas de reubicación en los archivos de objetos y realiza la reubicación mediante:

Ejemplo

El siguiente ejemplo utiliza la arquitectura MIX de Donald Knuth y el lenguaje ensamblador MIXAL. Los principios son los mismos para cualquier arquitectura, aunque los detalles cambiarán.

Ver también

Referencias

  1. ^ "Tipos de código objeto". Manual de referencia del cargador de aplicaciones iRMX 86 (PDF) . Intel . págs. 1-2–1-3. Archivado (PDF) desde el original el 11 de enero de 2020 . Consultado el 11 de enero de 2020 . […] El código absoluto , y un módulo de objeto absoluto, es código que ha sido procesado por LOC86 para ejecutarse solo en una ubicación específica de la memoria. El cargador carga un módulo de objeto absoluto solo en la ubicación específica que debe ocupar el módulo. El código independiente de la posición (comúnmente conocido como PIC) se diferencia del código absoluto en que el PIC se puede cargar en cualquier ubicación de la memoria. La ventaja de PIC sobre el código absoluto es que PIC no requiere que usted reserve un bloque de memoria específico. Cuando el cargador carga PIC, obtiene segmentos de memoria iRMX 86 del grupo del trabajo de la tarea que realiza la llamada y carga el PIC en los segmentos. Una restricción relativa al PIC es que, como en el modelo de segmentación COMPACT PL/M-86 […], sólo puede tener un segmento de código y un segmento de datos, en lugar de dejar que las direcciones base de estos segmentos y, por tanto, los segmentos mismos , varían dinámicamente. Esto significa que los programas PIC tienen necesariamente menos de 64 Kbytes de longitud. El código PIC se puede producir mediante el control BIND de LINK86. El código localizable en tiempo de carga (comúnmente conocido como código LTL) es la tercera forma de código objeto. El código LTL es similar al PIC en que el código LTL se puede cargar en cualquier lugar de la memoria. Sin embargo, al cargar código LTL, el cargador cambia la parte base de los punteros para que sean independientes del contenido inicial de los registros en el microprocesador. Debido a esta corrección (ajuste de direcciones base), el código LTL puede usarse en tareas que tengan más de un segmento de código o más de un segmento de datos. Esto significa que los programas LTL pueden tener más de 64 KB de longitud. FORTRAN 86 y Pascal 86 producen automáticamente código LTL, incluso para programas cortos. El código LTL se puede producir mediante el control BIND de LINK86. […]
  2. ^ ab Levine, John R. (2000) [octubre de 1999]. "Capítulo 1: Vinculación y carga y Capítulo 3: Archivos objeto". Enlazadores y cargadores. La serie Morgan Kaufmann sobre programación e ingeniería de software (1 ed.). San Francisco, California, Estados Unidos: Morgan Kaufmann . pag. 5.ISBN 1-55860-496-0. OCLC  42413382. Archivado desde el original el 5 de diciembre de 2012 . Consultado el 12 de enero de 2020 .Código: [1][2] Fe de erratas: [3]
  3. ^ Borland (1 de septiembre de 1999) [2 de julio de 1998]. "Artículo de Borland n.º 15961: Cómo afrontar los mensajes de 'Reparación de desbordamiento'". comunidad.borland.com . Base de datos de información técnica - Producto: Borland C++ 3.1. TI961C.txt #15961. Archivado desde el original el 7 de julio de 2008 . Consultado el 15 de enero de 2007 .
  4. ^ "Formato ejecutable y vinculable (ELF)" (PDF) . skyfree.org . Especificación de formatos portátiles de estándares de interfaz de herramientas (TIS), versión 1.1. Archivado (PDF) desde el original el 24 de diciembre de 2019 . Consultado el 1 de octubre de 2018 .

Otras lecturas