2011-03-21 13 views
6

¿Cómo se implementan las funciones virtuales en el código de posición independiente?Código independiente de posición y tabla variable

Sé que si mi clase tiene funciones virtuales, el compilador generalmente genera un vtable para él que contiene las direcciones de todas las funciones virtuales, y almacena un puntero al vtable en cada objeto de mi clase.

Ahora, si mi código es independiente de la posición, el compilador no puede conocer las direcciones de las funciones virtuales (o cualquier función, para el caso). Entonces ¿Qué es lo que hace?

Me gustaría saber qué hacen los compiladores reales (no lo que es teóricamente posible); Me interesan principalmente las plataformas Linux de 32 bits, pero otras plataformas también son un poco interesantes.

+0

El vinculador sabe que no tendrá problemas para arreglar los desplazamientos, siempre que no crucen los límites del módulo. Encontrar uno que realmente haga esto sería el problema más difícil. –

Respuesta

7

Hay dos opciones:

  1. acepta que su vtable no va a ser la posición independiente, y tratar de alejarlo de la sección de código, por lo que todo el código que necesita fixups enlazado dinámico vive al lado unos a otros para reducir el número de páginas no compartibles. gcc hace esto.
  2. usan saltos relativos en el vtable. No conozco ninguna implementación que haga esto, y solo funciona mientras el vtable viva en un desplazamiento fijo de las implementaciones del método y estos no pueden anularse en el tiempo de carga (que pueden estar en sistemas ELF típicos).
-1

Le sugiero que escriba algunos programas de ejemplo y los examine usted mismo con, por ejemplo, IDA Pro. Descargue freeware version o demo version.

-1

Básicamente, un vtable se implementa en todas partes como una tabla de indicadores de función.

Cuestiones relacionadas