2011-07-13 33 views

Respuesta

33

Esta llamada se utiliza en el código de posición independiente en x86. Carga la posición del código en el registro %ebx, que permite acceder a los objetos globales (que tienen un desplazamiento fijo desde el código) como un desplazamiento desde ese registro.

Código de posición independiente es el código que se puede cargar y ejecutar, sin modificar, en diferentes direcciones. Es importante que el código se vincule a las bibliotecas compartidas, ya que se pueden asignar a una dirección diferente en diferentes procesos.

Tenga en cuenta que una llamada es equivalente no requerida en x86-64, debido a que la arquitectura tiene modos de direccionamiento IP-relativos (es decir, se puede abordar directamente las posiciones de memoria como un desplazamiento desde el lugar de la instrucción en curso).

+2

Estoy de acuerdo, ¿hay algún buen enlace para obtener más información sobre la misma? – Thangaraj

3

La adición de más a la información por ejemplo:

Supongamos que después de hacer disass en GDB en el interior de inicio función, entonces usted va a encontrar algo como esto:

0x012c17a3 <startup+7>:  call 0x12b2ce7 <__i686.get_pc_thunk.bx> 
0x012c17a8 <startup+12>:  add $0x10d6518,%ebx 

A continuación, después de haber llamado __i686.get_pc_thunk .bx, register ebx se completará con el valor 0x012c17a8, que es la dirección de la siguiente instrucción.

Puede leer la función como get_pc (contador de programa).

He encontrado este artículo muy agradable para una mejor comprensión:

https://www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html