¿Qué llamada al sistema se usa para cargar bibliotecas en Linux?

En strace salidas de línea, las routes a las bibliotecas que los ejecutables llaman están en llamadas a open() . ¿Es esta la llamada al sistema utilizada por los ejecutables que están vinculados dinámicamente? ¿Qué hay de dlopen() ? open() no es una llamada que hubiera supuesto que desempeñaría un papel en la ejecución de progtwigs.

dlopen no es una llamada al sistema, es una function de biblioteca en la biblioteca libdl . Solo las llamadas al sistema se muestran de forma strace .

En Linux y en muchas otras plataforms (especialmente las que usan el formatting ELF para ejecutables), dlopen se implementa abriendo la biblioteca de destino con open() y asignándola a la memory con mmap() . mmap() es realmente la parte crítica aquí, es lo que incorpora la biblioteca en el espacio de direcciones del process, por lo que la CPU puede ejecutar su código. ¡Pero tiene que open() el file antes de que pueda mmap() !

Hoy, la mayoría de los sistemas operativos usan el método para bibliotecas compartidas introducido a finales de 1987 por SunOS-4.0. Este método se basa en la memory de mapeo a través de mmap ().

Dado el hecho de que a principios de la década de 1990, Sun incluso donó el código antiguo basado en a (basado en Solaris en ese momento ya estaba basado en ELF) a la gente de FreeBSD y que este código luego se entregó a muchos otros sistemas (incluido Linux) , puede comprender por qué no hay una gran diferencia entre las plataforms.

dlopen no tiene nada que ver con las bibliotecas compartidas cuando piensas en ellas. Hay dos methods para cargar un object compartido:

  1. Le dice al vinculador en time de compilation (ld, aunque generalmente se lo llama a través del comstackdor) que desea usar las funciones de una biblioteca compartida en particular. Con este enfoque, debe saber cuál será el nombre de la biblioteca cuando se ejecute el linker en time de compilation, pero puede llamar a las funciones de la biblioteca como si estuvieran vinculadas estáticamente en su progtwig. Cuando se ejecuta la aplicación, se llamará al vinculador dynamic en time de ejecución (ld.so) justo antes de que se llame a la function main , y configurará el espacio de process de la aplicación para que la aplicación encuentre las funciones de la biblioteca. Esto implica open() ing lubrary, y luego mmap() ing it, seguido de la configuration de algunas tablas de búsqueda.
  2. Usted le dice al linker de time de compilation que desea vincular con libdl , desde el cual puede (llamando al primer método) llamar a las dlopen() y dlsym() . Con dlopen obtienes un control para la biblioteca, que luego puedes utilizar con dlsym para recibir un puntero a una function en particular. Este método es mucho más complicado para el progtwigdor que el primer método (ya que tienes que hacer la configuration manualmente, en lugar de hacer que el linker lo haga automáticamente), y también es más frágil (ya que no obtienes la compilation) -time comtesting que está llamando funciones con los types de arguments correctos como obtiene en el primer método), pero la ventaja es que puede decidir qué object compartido cargar en el time de ejecución (o incluso si cargarlo en absoluto), lo que hace esta es una interfaz destinada a la funcionalidad de tipo de complemento. Finalmente, la interfaz dlopen también es less portátil que la otra, ya que su mecánica depende de la implementación exacta del linker dynamic (por lo tanto, libltdl de libtool, que intenta abstraer estas diferencias).

informes strace sobre llamadas al sistema (es decir, funciones implementadas directamente por el kernel). Las bibliotecas dinámicas no son una function del kernel; dlopen es parte de la biblioteca C, no del kernel. La implementación de dlopen llamará a open (que es una llamada al sistema) para abrir el file de la biblioteca para que pueda leerse.