Bibliotecas compartidas ELF: motivación para el PLT


11

¿Se podría usar el código de modificación automática para acelerar la llamada de funciones en bibliotecas vinculadas dinámicamente?

Por lo que yo entiendo, las bibliotecas compartidas ELF usan una especie de tabla de salto indirecta (la tabla de vinculación de procedimientos, o PLT) para permitir la unión diferida de las funciones de la biblioteca. El propósito parece ser evitar tener que modificar la tabla en el segmento de código mientras se habilita la resolución diferida de las posiciones de función en la primera llamada.

¿No sería más rápido crear dinámicamente el código para esa tabla en el momento de la carga, o posiblemente incluso en la primera llamada a la función?

¿Es para permitir compartir el segmento de código entre procesos tanto como sea posible (una tabla dinámica sería privada para un proceso)? ¿Es por razones de seguridad (el código editable no debe ser ejecutable , pero los JIT lo hacen todo el tiempo y el cargador puede agregar y eliminar el permiso de escritura antes de iniciar realmente el programa)?

¿O es una combinación de esos, y la pequeña ganancia de rendimiento por llamada de función simplemente no valdría la pena?

Respuestas:


8

Supongo que estamos hablando de arquitectura x86.

No puede tener el código de modificación automática en modo protegido , que es utilizado por la mayoría de los sistemas operativos basados ​​en UNIX (y no solo) que conozco, porque los segmentos de código son siempre de solo lectura. Un cargador no controla eso, es algo que está manejando el subsistema de gestión de memoria del núcleo.

Pero incluso si pudiera "crear el código para esa tabla en el momento de la carga" como usted dice, desafiaría todo el propósito de las bibliotecas compartidas. De esta manera, cada proceso tendría una copia "privada" de las funciones de la biblioteca en su espacio de direcciones, incrementando efectivamente su huella de memoria, una de las razones por las que se crearon las bibliotecas compartidas fue para abordar este problema.

Todo el proceso que usted describe es bastante complejo, y costaría más ciclos de procesamiento que el método PLT que se usa hoy en día, y probablemente introduciría más, nuevos e interesantes problemas de seguridad.


2
Puede usar la llamada al sistema mprotect (2) para hacer que las páginas del segmento .text se puedan escribir y ejecutar.
Bruce Ediger

1
Eso es correcto, señor. Probablemente funcionaría decentemente en el sistema promedio basado en UNIX, pero todo el proceso de vinculación se rompería tan pronto como alguien intentara endurecer el sistema con, por ejemplo, PaX, que impone restricciones en mprotect (2).
dkaragasidis

(Parece que no mencioné a @BruceEdiger en mi comentario anterior)
dkaragasidis

1

Los DSO de ELF pueden usar un indicador (DF_TEXREL) para anunciar que requieren reasignaciones mediante la modificación de su sección de texto (que normalmente es de solo lectura). Sin embargo, el enfoque de la tabla de salto junto con el código independiente de posición PIE debería ser más óptimo.

(Encontré eso en http://www.akkadia.org/drepper/dsohowto.pdf , pero otros recursos también lo mencionan).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.