Articulo de referencia

Reubicación (informática)

En el desarrollo de software , la reubicación es el proceso de asignar direcciones de carga para el código y los datos de un programa que dependen de la posición y ajustar el có...

En el desarrollo de software , la reubicación es el proceso de asignar direcciones de carga para el código y los datos de un programa que dependen de la posición y ajustar el código y los datos para que reflejen las direcciones asignadas. [ 1 ] [ 2 ]

Un enlazador suele realizar la reubicación junto con la resolución de símbolos , que es el proceso de buscar archivos y bibliotecas para reemplazar las referencias simbólicas o los nombres de las bibliotecas con direcciones reales utilizables en la memoria antes de ejecutar un programa.

La reubicación la realiza normalmente el enlazador en tiempo de enlace , pero también puede realizarse en tiempo de carga mediante un cargador de reubicación , o en tiempo de ejecución por el propio programa en ejecución .

Segmentación

Los archivos objeto suelen estar segmentados en distintos segmentos de memoria o tipos de secciones. Algunos ejemplos de tipos de segmentos son el segmento de código (.text) , el segmento de datos inicializados (.data) , el segmento de datos no inicializados (.bss) u otros definidos 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 direcciones creada por un compilador o ensamblador y almacenada en el archivo objeto o ejecutable. Cada entrada de la tabla hace referencia a una dirección absoluta en el código objeto que debe modificarse cuando el cargador reubica el programa para que apunte a la ubicación correcta. Las entradas de la tabla de reubicación se conocen como correcciones y están diseñadas para facilitar la reubicación del programa como una unidad completa. En algunos casos, cada corrección de la tabla es relativa a una dirección base de cero, por lo que las propias correcciones deben modificarse a medida que el cargador recorre la tabla. [ 2 ]

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

DOS y Windows de 16 bits

Los punteros lejanos ( punteros de 32 bits con segmento :desplazamiento, utilizados para direccionar el espacio de memoria de 640 KB y 20 bits disponible para los programas de DOS ), que apuntan a código o datos dentro de un ejecutable de DOS ( EXE ), no tienen segmentos absolutos, porque la dirección real del código o los datos depende de dónde se carga 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 una vez que el ejecutable se ha cargado en la memoria. El cargador EXE utiliza una tabla de reubicación para encontrar los segmentos que necesitan ajustarse.

Windows

En 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 que se carga 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 vulnerabilidades introducida con Windows Vista , las tablas de reubicación vuelven a ser obligatorias debido a la posibilidad de que el binario se mueva dinámicamente antes de su ejecución, aunque sigan siendo lo primero que se carga en el espacio de direcciones virtuales.

Los ejecutables de Windows pueden marcarse como compatibles con ASLR. En Windows 8 y versiones posteriores, existe la posibilidad de habilitar ASLR incluso para aplicaciones que no estén marcadas como compatibles. [ 4 ] Para que se ejecuten correctamente en este entorno, el compilador no puede omitir las secciones de reubicación.

Sistemas tipo Unix

El formato de biblioteca compartida y ejecutable ELF ( Executable and Linkable Format ), utilizado por la mayoría de los sistemas tipo Unix, permite definir varios tipos de reubicación. [ 5 ] : 1–22

De forma similar a lo que ocurre en Windows, las bibliotecas deben ser reubicables (contener código independiente de la posición y las tablas correspondientes), mientras que los ejecutables pueden hacerse reubicables opcionalmente para ASLR. Los ejecutables reubicables también se conocen como ejecutables independientes de la posición .

procedimiento de reubicación

El enlazador lee la información de los segmentos y las tablas de reubicación en los archivos objeto y realiza la reubicación mediante:

  • Fusionar todos los segmentos de un tipo común en un único segmento de ese tipo.
  • Asignar direcciones de ejecución no superpuestas a cada segmento y a cada símbolo, asignando a todo el código (funciones) y a los datos (variables globales) direcciones de ejecución únicas.
  • Consultar la tabla de reubicación para modificar las referencias de símbolos en los datos y el código objeto, de modo que apunten a las direcciones de ejecución asignadas.

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 variarán.

  • (A) El programa SUBR se compila para producir el archivo objeto (B), que se muestra tanto en código máquina como en lenguaje ensamblador. El compilador puede designar el inicio del código compilado en una ubicación arbitraria, generalmente la ubicación 1, como se muestra. La ubicación 13 contiene el código máquina para la instrucción de salto a la instrucción ST en la ubicación 5.
  • (C) Si SUBR se enlaza posteriormente con otro código, puede almacenarse en una ubicación distinta de 1. En este ejemplo, el enlazador lo coloca en la ubicación 120. La dirección en la instrucción de salto, que ahora está en la ubicación 133, debe reubicarse para que apunte a la nueva ubicación del código para la instrucción ST , ahora 125. [1 61 mostrado en la instrucción es la representación en código máquina MIX de 125].
  • (D) Cuando el programa se carga en la memoria para su ejecución, puede cargarse en una ubicación distinta a la asignada por el enlazador. Este ejemplo muestra SUBR ahora en la ubicación 300. La dirección en la instrucción de salto, ahora en 313, debe reubicarse nuevamente para que apunte a la ubicación actualizada de ST , 305. [4 49 es la representación de la máquina MIX de 305].

Alternativas

Algunas arquitecturas evitan por completo la reubicación al aplazar la asignación de direcciones hasta el tiempo de ejecución, como, por ejemplo, en las máquinas de pila con aritmética de direcciones cero o en algunas arquitecturas segmentadas donde cada unidad de compilación se carga en un segmento separado.

Véase 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 ) del original  el 11/01/2020 . Recuperado el 11/01/2020 . [ …] El código absoluto , y un módulo 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 objeto absoluto solo en la ubicación específica que el módulo debe ocupar. El código independiente de la posición (comúnmente denominado PIC) difiere del código absoluto en que el PIC se puede cargar en cualquier ubicación de memoria. La ventaja del PIC sobre el código absoluto es que el 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 lo llama y carga el PIC en los segmentos. Una restricción relativa a PIC es que, al igual que en el modelo de segmentación PL/M-86 COMPACT […], solo puede tener un segmento de código y un segmento de datos, en lugar de permitir que las direcciones base de estos segmentos, y por lo tanto los segmentos mismos, varíen dinámicamente. Esto significa que los programas PIC necesariamente tienen una longitud inferior a 64 KB. El código PIC se puede generar 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 a PIC en que se puede cargar en cualquier parte de la memoria. Sin embargo, al cargar código LTL, el cargador modifica la parte base de los punteros para que estos sean independientes del contenido inicial de los registros del microprocesador. Debido a esta corrección (ajuste de las direcciones base), el código LTL puede ser utilizado por 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 una longitud superior a 64 KB. FORTRAN 86 y Pascal 86 generan automáticamente código LTL, incluso para programas cortos. El código LTL se puede generar mediante el control BIND de LINK86. […]
  2. 1 2 Levine, John R. (2000) [octubre de 1999]. «Capítulo 1: Enlace y carga y Capítulo 3: Archivos objeto». Enlazadores y cargadores . La serie Morgan Kaufmann de ingeniería de software y programación (1.ª ed.). San Francisco, California, EE. UU.: Morgan Kaufmann . pág. 5. ISBN   1-55860-496-0. OCLC 42413382 . Consultado el 12 de enero de 2020 . {{cite book}}: CS1 maint: servicio de archivado obsoleto ( enlace ) Código:Errata:
  3. Borland (1999-09-01) [1998-07-02]. "Artículo de Borland n.° 15961: Cómo lidiar con los mensajes de 'Fixup Overflow'" . community.borland.com . Base de datos de información técnica - Producto: Borland C++ 3.1. TI961C.txt n.° 15961. Archivado del original el 7 de julio de 2008. Consultado el 15 de enero de 2007 .
  4. "Seis datos sobre la aleatorización del diseño del espacio de direcciones en Windows" . 17 de marzo de 2020. Consultado el 24 de julio de 2020 .
  5. "Formato ejecutable y enlazable (ELF)" (PDF) . skyfree.org . Especificación de formatos portátiles de Tool Interface Standards (TIS), versión 1.1. Archivado del original (PDF) el 24/12/2019 . Consultado el 01/10/2018 .

Lecturas adicionales

  • Johnson, Glenn (1975-12-21) [1975-11-13]. 11/34 Prueba de lógica básica de gestión de memoria . Digital Equipment Corporation (DEC). MAINDEC-11-DFKTA-AD . Recuperado el 19 de agosto de 2017 .
  • Formaniak, Peter G.; Leitch, David (julio de 1977). "Propuesta de estándar de software para microprocesadores" . BYTE - la revista de sistemas pequeños . Foro técnico. Vol.  2, n.º  7. Peterborough, New Hampshire, EE. UU.: Byte Publications, Inc. págs.  34, 62–63 . ark:/13960/t32245485 . Consultado el 6 de diciembre de 2021 .(3 páginas) (Nota: Describe un formato hexadecimal reubicable de Mostek ).
  • Ogdin, Carol Anne; Colvin, Neil; Pittman, Tom; Tubb, Philip (noviembre de 1977). "Formatos de código objeto reubicables" . BYTE - la revista de sistemas pequeños . Foro técnico. Vol.  2, n.º  11. Peterborough, New Hampshire, EE. UU.: Byte Publications, Inc. págs. 198–205 . ark:/13960/t59c88b4h, ark:/13960/t3kw76j24 . Consultado el 6 de diciembre de 2021 . (8 páginas) (Nota: Describe un formato hexadecimal reubicable mediante TDL ).
  • Kildall, Gary Arlen (febrero de 1978) [1976]. «Una técnica sencilla para la reubicación estática de código máquina absoluto» . Dr. Dobb's Journal of Computer Calisthenics & Orthodontia . 3 (2). People's Computer Company : 10–13 (66–69). ISBN 0-8104-5490-4. #22 ark:/13960/t8hf1g21p . Recuperado el 19-08-2017 .. Presentado originalmente en: Kildall, Gary Arlen (1977) [22–24 de noviembre de 1976]. "Una técnica simple para la reubicación estática de código máquina absoluto". Escrito en la Escuela Naval de Posgrado , Monterey, California, EE. UU. En Titus, Harold A. (ed.). Actas de la conferencia: Décima Conferencia Anual de Asilomar sobre Circuitos, Sistemas y Computadoras: Artículos presentados del 22 al 24 de noviembre de 1976. Conferencia de Asilomar sobre Señales, Sistemas y Computadoras . Hotel y Recinto de Conferencias de Asilomar, Pacific Grove, California, EE. UU.: Western Periodicals Company. págs. 420–424 . ISSN 1058-6393 . Recuperado el 6 de diciembre de 2021 .  (609 páginas). (Este método de "redimensionamiento", denominado reubicación de límites de página , podía aplicarse estáticamente a una imagen de disco CP/M-80 mediante MOVCPM para maximizar el TPA disponible para la ejecución de programas. También era utilizado dinámicamente por la herramienta de depuración dinámica (DDT) del depurador CP/M para reubicarse en memoria superior. Bruce H. Van Natta, de IMS Associates, desarrolló independientemente el mismo enfoque para generar código PL/M reubicable . Como reubicación de límites de párrafo , otra variante de este método fue utilizada posteriormente por las TSR autorreubicables con HMA dinámica , como KEYB , SHARE y NLSFUNC, en DR DOS 6.0 y versiones posteriores. Matthias R. Paul y Axel C. Frinke concibieron e implementaron independientemente un método mucho más sofisticado y granular a nivel de byte, basado en un enfoque similar, para la eliminación dinámica de código muerto , con el fin de minimizar dinámicamente el espacio de ejecución de los controladores residentes y las TSR (como FreeKEYB).)
  • Mossip, Richard H. (septiembre-octubre de 1980). Escrito en Bloomingdale, Nueva Jersey, EE. UU. "Código reubicable" (PDF) . Microsistemas S-100 . Vol.  1, n.º  5. Mountainside y Springfield, Nueva Jersey, EE. UU.: Libes, Inc. págs. 54-55 . ISSN 0199-7955 . ark:/13960/s2cfgkmxcwg. ark:/13960/s2qdm1t01nr. Archivado (PDF) del original el 27-11-2023 . Recuperado el 27-11-2023 .  (2 páginas) (Nota: Describe la reubicación de los límites de página y la reubicación de los ensambladores).
  • Huitt, Robert; Eubanks, Gordon ; Rolander, Thomas "Tom" Alan ; Laws, David; Michel, Howard E.; Halla, Brian; Wharton, John Harrison ; Berg, Brian; Su, Weilian; Kildall, Scott ; Kampe, Bill (25-04-2014). Laws, David (ed.). "Legacy of Gary Kildall: The CP/M IEEE Milestone Dedication" (PDF) (transcripción de video). Pacific Grove, California, EE. UU.: Computer History Museum . Número de referencia CHM: X7170.2014. Archivado (PDF) del original el 27-12-2014 . Recuperado el 19-01-2020 . […] Laws: […] "reubicación dinámica" del SO. ¿Puedes decirnos qué es eso y por qué fue importante? […] Eubanks : […] lo que hizo Gary […] fue […] asombroso. […] Recuerdo el día en la escuela que entró al laboratorio dando saltos y dijo: «He descubierto cómo reubicar». Aprovechó el hecho de que el único byte siempre iba a ser el byte de orden superior . Y así creó un mapa de bits . […] No importaba cuánta memoria tuviera la computadora, el sistema operativo siempre podía moverse a la memoria alta. Por lo tanto, se podía comercializar […] en máquinas con diferentes cantidades de memoria. […] No se podía vender un CP/M de 64K y un CP/M de 47K. Sería ridículo tener una compilación dura en las direcciones. Así que Gary descubrió esto una noche, probablemente en medio de la noche pensando en algo de programación, y esto realmente hizo posible la comercialización de CP/M. Realmente creo que sin esa reubicación habría sido un problema muy difícil. Para que la gente lo comprara, les parecería complicado, y si se añadía más memoria, habría que buscar un sistema operativo diferente. […] Intel […] tenía los bytes invertidos , ¿verdad?, para las direcciones de memoria. Pero siempre estaban en el mismo lugar, así que se podía reubicar en un límite de 256 bytes , para ser precisos. Por lo tanto, siempre se podía reubicar con solo un mapa de bits de dónde estaban esos […] Leyes: Sin duda, la explicación más elocuente que he tenido sobre la reubicación dinámica […](33 páginas)
  • Guzis, Charles "Chuck" P. (29/07/2015). "Re: ¿Cómo funciona MOVCPM.COM?" . Foro de Computadoras Vintage . Género: CP/M y MP/M. Archivado del original el 01/02/2020 . Recuperado el 01/02/2020 . […] MOVCPM utiliza un tipo antiguo de formato PRL. Básicamente, CP/M se ensambla dos veces; la segunda vez es un desplazamiento de 100H bytes. Los dos binarios se comparan y se construye un mapa de bits . Un bit activado implica que el byte de orden superior de una dirección debe ajustarse. Los bytes de dirección de orden inferior no se ven afectados; de ahí el nombre "archivo reubicable de página". Cada byte en el mapa de bits corresponde a 8 bytes en los datos binarios. […] Por lo tanto, todo lo que se mueve en MOVCPM forma parte de la imagen y su mapa de bits de reubicación. […]
  • Guzis, Charles "Chuck" P. (2016-11-08). "Re: ¿Es seguro usar RST 28h en programas ensambladores de CP/M?" . Vintage Computer Forum . Género: CP/M y MP/M. Archivado del original el 2020-02-01 . Recuperado el 2020-02-01 . […] He hecho referencia a los archivos PRL y cómo comenzaron originalmente con MOVCPM , pero se convirtieron en una parte integral de MP/M y CP/M 3.0 . Pero los archivos PRL usan un mapa de bits en el que cada bit corresponde a una ubicación de memoria; los bits uno indican que se debe agregar un desplazamiento de reubicación de página a la ubicación de memoria correspondiente. Si tiene muy pocas referencias de memoria absolutas (en contraposición a las relativas), puede que desee emplear una lista de punteros (2 bytes por referencia) en lugar de un mapa de bits. Esto es improbable en el código 8080 que no tiene saltos relativos, pero puede ser una consideración para el código Z80 . El truco para descubrirlo rápidamente consiste en compilar el programa dos veces; la segunda vez con un desfase de 100H, y luego comparar los dos binarios. La ventaja de la reubicación en tiempo de ejecución es que no hay que penalizar el código que intenta eludir el problema de la reubicación; no hay que recurrir a "trucos"; simplemente se escribe código directo. […]
  • Roth, Richard L. (febrero de 1978) [1977]. "La reubicación no es solo mover programas" . Dr. Dobb's Journal of Computer Calisthenics & Orthodontia . 3 (2). Ridgefield, California, EE. UU.: People's Computer Company : 14–20 (70–76). ISBN 0-8104-5490-4. #22. Archivado del original el 20/04/2019 . Consultado el 19/04/2019 .
  • Calingaert, Peter (1979) [5 de noviembre de 1978]. "8.2.2 Reubicación del cargador". Escrito en la Universidad de Carolina del Norte en Chapel Hill . En Horowitz, Ellis (ed.). Ensambladores, compiladores y traducción de programas . Serie de ingeniería de software (1.ª impresión, 1.ª  ed.). Potomac, Maryland, EE. UU.: Computer Science Press, Inc. págs. 237-241 . ISBN  0-914894-23-4ISSN 0888-2088 . LCCN 78-21905 . Consultado el 20 de marzo de 2020 .  (2+xiv+270+6 páginas)
  • Formato de archivo OBJ de Microsoft . Microsoft , Servicios de soporte de productos. Nota de aplicación SS0288 . Consultado el 21 de agosto de 2017 .{{cite book}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  • Tanenbaum, Andrew Stuart ; Bos, Herbert (2015). Sistemas operativos modernos (4.ª  ed.). Pearson Education Inc. ISBN 978-0-13359162-0.
  • Elliott, John C. (5 de junio de 2012) [2 de enero de 2000]. "Formato REL de Microsoft" . seasip.info . Archivado del original el 26 de enero de 2020. Recuperado el 26 de enero de 2020. […] El formato REL es generado por M80 de Microsoft y RMAC de Digital Research . […]
  • Brothers, Hardin (abril de 1983). "Understanding Relocatable Code" . 80 Micro . The Next Step (39). 1001001, Inc .: 38 , 40, 42, 45. ISSN 0744-7868 . Recuperado el 6 de febrero de 2020 . 
  • Brothers, Hardin (abril de 1985). "Programas reubicables: los vagabundos de la microcomputación" . 80 Micro . El siguiente paso (63). CW Communications/Peterborough, Inc .: 98 , 100, 102–103 . ISSN 0744-7868 . Consultado el 6 de febrero de 2020 . 
  • Ganssle, Jack (febrero de 1992). "Escribiendo código reubicable: algunos códigos embebidos deben ejecutarse en más de una dirección" . Embedded Systems Programming . The Ganssle Group - Perfeccionando el arte de construir sistemas embebidos / TGG. Archivado del original el 18 de julio de 2019. Consultado el 20 de febrero de 2020 .