2012-03-13 9 views
11

Estoy leyendo this article on PLT (Process Linkage Table) and GOT (Global Offset Table). Si bien el objetivo de PLT es claro para mí, todavía estoy confundido acerca de GOT. Lo que he entendido del artículo es que GOT solo es necesario para las variables declaradas como extern en una biblioteca compartida. Para las variables globales declaradas como static en un código de biblioteca compartida, no es necesario.Tabla de vinculación del proceso y tabla de compensación global

Tengo razón, o me falta completamente el punto.

Respuesta

16

Quizás su confusión está en el significado de extern. Como el enlace predeterminado es extern, cualquier variable declarada fuera del alcance de la función sin la palabra clave static es extern.

El motivo por el que GOT es necesario se debe a que la dirección de las variables a las que accedió el código de la biblioteca compartida no se conoce en el momento en que se genera la biblioteca compartida. Depende de la dirección de carga en la que se carga la biblioteca (si la definición está en la biblioteca) o del código de terceros en el que está definida la variable (si la definición está en otro lugar). Entonces, en lugar de poner la dirección en línea en el código, el compilador genera código para leer el GOT de la biblioteca compartida y luego carga la dirección del GOT en el tiempo de ejecución.

Si la variable es conocido ser definidos dentro de la misma biblioteca compartida (ya sea porque es static o la hidden o protected visibilidad de atributo que se usa) a continuación, la dirección de en relación con el código de la biblioteca puede fijarse en el momento en que se genera el archivo de la biblioteca compartida. En este caso, en lugar de realizar una búsqueda a través de GOT, el compilador genera código para acceder a la variable con el direccionamiento relativo del contador de programa. Esto es menos costoso tanto en tiempo de ejecución como en tiempo de carga (porque el proceso completo de búsqueda y reubicación de símbolos se puede omitir en el momento de la carga).

+0

¿Alguna idea de cómo forzar a gcc a realizar búsquedas a través del GOT para variables estáticas? –

+0

No puedo pensar en una forma correcta; ¿Por qué lo necesitas? –

+0

Estoy intentando hacer que mi aplicación para un procesador ARM sea un ejecutable independiente de la posición y todo funciona bien, excepto las variables estáticas. El problema es que las secciones .text y .data/.bss tienen diferentes desplazamientos de reubicación, por lo que el acceso relativo a las variables estáticas no funciona, mientras que el acceso a través de GOT funciona bien. –

Cuestiones relacionadas