GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo se puede vincular dinámicamente el propio enlazador/cargador dinámico según lo informado por `archivo`?

  1. Sí, se vincula solo cuando se inicializa. Técnicamente, el enlazador dinámico no necesita la resolución y reubicación de objetos por sí mismo, ya que se resuelve completamente tal cual, pero define símbolos y tiene que cuidarlos al resolver el binario que está "interpretando", y esos símbolos se actualizan para señalar sus implementaciones en las bibliotecas cargadas. En particular, esto afecta a malloc — el enlazador tiene una versión mínima incorporada, con el símbolo correspondiente, pero se reemplaza por la versión de la biblioteca C una vez que se carga y se reubica (o incluso por una versión interpuesta si hay una), con cierto cuidado para garantizar que esto no ocurra. no sucederá en un punto en el que podría romper el enlazador.

    Los detalles sangrientos están en rtld.c , en el dl_main función.

    Tenga en cuenta, sin embargo, que ld.so no tiene dependencias externas. Puedes ver los símbolos involucrados con nm -D; ninguno de ellos está indefinido.

  2. La página de manual solo hace referencia a las entradas directamente bajo /lib , es decir, /lib/ld.so (el enlazador dinámico libc 5, que admite a.out ) y /lib*/ld-linux*.so* (el enlazador dinámico libc 6, que admite ELF). La página de manual es muy específico, y ld.so no es ld-2.28.so .

    El enlazador dinámico que se encuentra en la gran mayoría de los sistemas actuales no incluye a.out apoyo.

file y ldd informan cosas diferentes para el enlazador dinámico porque tienen definiciones diferentes de lo que constituye un binario enlazado estáticamente. Para ldd , un binario está enlazado estáticamente si no tiene DT_NEEDED símbolos, es decir, sin símbolos indefinidos. Para file , un binario ELF está vinculado estáticamente si no tiene un PT_DYNAMIC sección (esto cambiará en el lanzamiento de file siguiente 5.37; ahora usa la presencia de un PT_INTERP sección como el indicador de un binario vinculado dinámicamente, que coincide con el comentario en el código).

El enlazador dinámico de la biblioteca GNU C no tiene ningún DT_NEEDED símbolos, pero tiene un PT_DYNAMIC sección (ya que técnicamente es una biblioteca compartida). Como resultado, ldd (que es el enlazador dinámico) indica que está enlazado estáticamente, pero file indica que está vinculado dinámicamente. No tiene un PT_INTERP sección, por lo que la próxima versión de file también indicará que está vinculado estáticamente.

$ ldd /lib64/ld-linux-x86-64.so.2
        statically linked

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

(con file 5.35)

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

(con la versión actualmente en desarrollo de file ).


Linux
  1. ¿Cómo puedo encontrar la versión de Fedora que uso?

  2. ¿Cómo puedo recordar el argumento del comando bash anterior?

  3. ¿Cómo puedo configurar el 'backend' en matplotlib en Python?

  4. En un controlador SIGILL, ¿cómo puedo omitir la instrucción ofensiva?

  5. ¿Cómo puedo ejecutar código PHP desde la línea de comandos?

Cómo instalar el cargador IonCube en Ubuntu Linux

¿Cómo puedo obtener información del contenedor de Docker Linux desde el propio contenedor?

¿Cómo puedo instalar la última Anaconda con wget?

¿Cómo puedo ocultar la barra de herramientas en Emacs de forma persistente?

¿Cómo puedo encontrar el archivo más antiguo en un árbol de directorios?

¿Cómo puedo controlar la longitud de la cola de aceptación?