musl libc ldso notas de investigación de carga dinámica: orden de carga dinámica de la biblioteca y orden de inicialización

prefacio

  • ¿En qué orden también deben cargarse las bibliotecas compartidas de aplicaciones vinculadas dinámicamente? Si hay dependencias entre bibliotecas compartidas, ¿cómo maneja musl ldso qué biblioteca compartida se inicializa primero?

  • El código de musl ldso se puede encontrar en el código oficial de musl: ldso\dlstart.cy ldso\dynlink.c, donde la parte de carga dinámica de la biblioteca se implementa principalmente en la función ldso\dynlink.cen load_library.

Orden de carga de biblioteca dinámica

  • El orden de carga actual de musl ldso readelf -d xx.soes consistente con el que se muestra en la lista de bibliotecas dinámicas dependientes. Este orden de carga es el orden de las bibliotecas dependientes al vincular. Si desea ajustar este orden, simplemente ajuste el orden de cada biblioteca dependiente al vincular

inserte la descripción de la imagen aquí

  • El orden de carga de la biblioteca dinámica es cargar la biblioteca dinámica dependiente en la memoria en orden, y este orden no es importante en la mayoría de los casos.

  • Si es necesario cargar dos bibliotecas compartidas sin dependencias, la inicialización de la biblioteca dinámica tiene una relación de secuencia. Se recomienda ajustar la secuencia de la biblioteca dinámica al vincular, de modo que la biblioteca dinámica que debe inicializarse primero se coloque en frente (izquierda).

  • Orden de inicialización de la biblioteca dependiente: esto es importante, las dependientes se inicializan primero y el diseño de musl ldso cumple con este requisito, como A->B->C, luego el orden de inicialización de la biblioteca dinámica es: C->B-> A.

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Secuencia de inicialización de la biblioteca

  • Si existe una relación de dependencia entre dos bibliotecas dinámicas se refleja en la lista de dependencias de la biblioteca.

inserte la descripción de la imagen aquí

  • Para múltiples dependencias de biblioteca, inicialice la biblioteca dependiente del último extremo, como A->B->C, el orden de inicialización es: C->B->A

  • Si las dos bibliotecas no tienen dependencias, el orden de inicialización se inicializa de acuerdo con el orden de la lista de las bibliotecas dependientes de la aplicación.

  • Puede ajustar el orden de vinculación de la biblioteca y ajustar el orden de inicialización de dos (dos grupos) bibliotecas que no dependen entre sí.

inserte la descripción de la imagen aquí

  • Ajuste el orden de las bibliotecas dinámicas al vincular y coloque lib1 al frente, luego lib3, del que depende lib1, se inicializará primero. Por lo tanto, el orden de inicialización se puede ajustar ajustando la posición de la biblioteca dinámica al vincular.

inserte la descripción de la imagen aquí

resumen

  • Para verificar la carga dinámica de la biblioteca de musl ldso, puede usar gdb para depurar y aumentar la forma de impresión de LOG

  • Aunque la carga dinámica actual de la biblioteca de musl ldso está integrada en musl libc.so, las funciones aún están completas y completas.

  • Puede familiarizarse con el proceso y el método de implementación de la carga dinámica de ldso viendo el código de musl.

Supongo que te gusta

Origin blog.csdn.net/tcjy1000/article/details/132460404
Recomendado
Clasificación