Gentoo Logo

Introducción al Código Independiente de la Posición

1.  Introducción a PIC (Código Independiente de la Posición)

El código PIC se diferencia radicalmente del código convencional en la forma en que se llama a las funciones y se opera con variables de datos.
A estas funciones se accede a través de una tabla de indirecciones, la "Tabla Global de Desplazamientos" ("Global Offset Table" o GOT), se accede usando el nombre reservado "_GLOBAL_OFFSET_TABLE_" por una convención en el software.
El mecanismo exacto utilizado depende de la arquitectura hardware, pero normalmente se reserva un registro especial de la máquina para definir la localización de la GOT cuando se entra en una función.
La razón detrás de esta acceso indirecto a las direcciones, es generar código que pueda se accedido independientemente de la dirección cargada en ese momento.
En una librería PIC real sin relocalizaciones en el segmento de texto, únicamente los símbolos exportados a la "Tabla Global de Desplazamientos" necesitan ser actualizados en tiempo de ejecución en el espacio de direcciones del proceso que está corriendo dependiendo de la dirección de carga actual de las distintas librerías compartidas (shared).

Del mismo modo, las llamadas procedimentales a funciones definidas globalmente son redirigidas a través de la "Tabla de Enlazado de Procedimientos" ("Procedure Linkage Table" o PLT) que reside en el segmento de datos de la imagen principal. De nuevo, esto se hace para evitar modificaciones del segmento de texto en tiempo de ejecución.

El enlazador-editor crea la Tabla Global de Desplazamientos y la Tabla de Enlazado de Procedimientos cuando combina ficheros objeto PIC en una imagen apropiada para el mapeo en el espacio de direcciones del proceso. También recolecta todos los símbolos que se pueda necesitar el enlazador-editor en tiempo de ejecución y las almacena junto con los bits de texto y datos de la imagen. Otro símbolo reservado, _DYNAMIC se usa para indicar la presencia de las estructuras de enlazado en tiempo de ejecución. Cada vez que se relocaliza _DYNAMIC a 0, no hay necesidad de invocar el enlazador-editor en tiempo de ejecución. Si este símbolo es distinto de cero, apuntará a la estructura de datos desde la cual se puede derivar la localización de la información necesaria para la relocalización e información de los símbolos. Esto es usado notablemente por el módulo de inicio, crt0, crt1S y más recientemente por Scrt1. La estructura _DYNAMIC es localizada por convención al comienzo del segmento de datos de la imagen a la que pertenece.

En la mayoría de arquitecturas, cuando se compila el código fuente a código objeto, se necesitará especificar si el código objeto debe ser independiente de posición o no. En otras arquitecturas no se hace esta distinción, normalmente debido que todo el código objeto es independiente de la posición en virtud de la Interfaz Binaria de Aplicación ("Application Binary Interface" o ABI), o menos frecuentemente porque la dirección de carga del objeto se fija en tiempo de compilación, lo cual implica que las librerías compartidas no están soportadas en estas plataformas. Si un objeto se compila como independiente de la posición (PIC), entonces el sistema operativo puede cargar el objeto en cualquier dirección cuando lo prepara para su ejecución. Esto implica un tiempo extra para sustituir las referencias a direcciones directas por direcciones relativas generadas en tiempo de compilación. También implica un espacio extra para mantener información que ayude al cargador a rellenar las direcciones no resueltas en tiempo de ejecución. Consecuentemente, los objetos PIC son normalmente más grandes y lentos que los objetos que no son PIC. La ventaja de compartir código de librerías en disco y en memoria, compensa estos problemas ya que el código PIC en las librerías compartidas es reutilizado.

Se requiere que Los objetos que son parte de una librería compartida sean compilados usando PIC. Consecuentemente, libtool construye objetos PIC para el uso con librerías compartidas y objetos que no son PIC para el uso con librerías estáticas. Cada vez que libtool indica al compilador que genere un objeto PIC, también define el símbolo `PIC' del preprocesador de modo que el código ensamblador tenga en cuenta si reside en in objeto PIC o no.

Normalmente, cuando libtool compila los fuentes, generará un objeto `.lo' como PIC, y un objeto `.o' como no PIC, y entonces usará el adecuado cuando haya que enlazar ejecutables y librerías de varios tipos. En las arquitecturas en las que no hay distinción, el fichero `.lo' en simplemente un enlace simbólico al fichero `.o'.

En la práctica, se puede enlazar objetos PIC en un archivo estático para que haya poca penalización en la ejecución y en la velocidad de carga, y a menudo, se pueden enlazar de forma similar objetos que no sean PIC en archivos compartidos.

Cuando se utiliza código independiente de la posición, las referencias relocalizables se genera como una indirección que utiliza datos en el segmento de datos del objeto compartido. El código del segmento de texto no se puede modificar, y todas las actualizaciones de relocalización se aplican a las correspondientes entradas en el segmento de datos.

Si un objeto compartido se construye a partir de código que no es independiente de la posición, el segmento de texto normalmente requerirá un mayor número de relocalizaciones realizadas en tiempo de ejecución. Aunque el enlazador (en tiempo de ejecución) está preparado para realizar esto, la sobrecarga del sistema que crea esto puede causar una seria degradación de la rendimiento.

Puede identificar un objeto compartido que requiere relocalizaciones contra su segmento de texto usando herramientas como 'readelf -d foo' e inspeccionado la salida de cualquier entrada TEXTREL. El valor de la entrada TEXTREL es irrelevante. Su presencia en un objeto compartido, indica que existe una relocalización de texto.

Referencias:



Imprimir

Página actualizada 11 de octubre, 2005

Sumario: Lo que cualquier desarrollador debe saber sobre el Código Independiente de la Posición

solar
Autor

Alexander Gabert
Editor

José María Alonso
Traductor

Donate to support our development efforts.

Copyright 2001-2013 Gentoo Foundation, Inc. Questions, Comments? Contact us.