Historias
Slashboxes
Comentarios
 
Este hilo ha sido archivado. No pueden publicarse nuevos comentarios.
Mostrar opciones Umbral:
Y recuerda: Los comentarios que siguen pertenecen a las personas que los han enviado. No somos responsables de los mismos.
  • Re:Genial

    (Puntos:0)
    por pobrecito hablador el Lunes, 19 Octubre de 2009, 21:46h (#1180364)

    El proceso de enlazado al que haces referencia consiste en la generación de un índice (varios realmente: en Windows son las tablas LDT y GDT, en Linux/ELF la GOT y PLT, etc.) con las direcciones de cada punto de entrada de la biblioteca que fue referenciado en tu programa.

    Ocurre lo mismo cuando compilas con código que no está en una biblioteca, sino en un fichero objeto normal y corriente, separado del tuyo. Solo que luego esos índices se resuelven en el enlazado final, en lugar de dejarse al enlazador dinámico.

    Si tu código no incluye código de la biblioteca -- en el listado o en el código ensamblado porque la ley dice de cualquier forma -- no es obra derivada de la biblioteca.

    Ya te he respondido en el otro post el profundo error en el que te encuentras. Tampoco te voy a responder punto por punto cada una de tus argumentaciones basadas en un error de concepto: no sabes cómo funciona un compilador.

    Te lo voy a poner en un esquema una vez más, aunque ya sea abundar en lo mismo una y otra vez:

    1. Tienes unos ficheros fuente (.c)
    2. El compilador convierte los fuentes (.c) en ficheros con código objeto (.o). Si desde un fuente se utiliza funcionalidad de otro fuente, se incluyen tablas de símbolos del otro fuente, para poder resolverlas durante el enlazado.
    3. A partir de aquí hay dos opciones: un enlazado definitivo o dejar la etapa final de enlazado al enlazador dinámico
    4. Supongamos que queremos un enlazado definitivo: el enlazador resuelve los símbolos y une todo el código en un único ejecutable.
    5. Supogamos que queremos dejarlo al enlazador dinámico: el enlazador resuelve unos símbolos (los de los códigos objetos que van juntos) y el resto (los que van al código objeto de enlazado dinámico), los transforma a un formato, similar al del fichero objeto original (contiene la misma información, al fin y al cabo), que resolverá una segunda etapa de enlazado.
    6. En el segundo caso, el proceso de compilación (si entendemos como tal, transformar código fuente en código ejecutable) lo completará el enlazador dinámico del sistema operativo.

    ¿Te vas dando cuenta ya? Tu error está en tratar una biblioteca como un objeto ajeno al programa, cuando en realidad es parte del programa. Es la gracia de un computador, que el código fuente puedes trocearlo en mil cachos, al final al cacharro se la suda. Por eso podemos coger trozos comunes de código, separarlos y tenerlos en el disco una única vez. Lo llamamos "bibliotecas compartidas" (shared libraries) o "bibliotecas de enlace dinámico" (dynamic link libraries).

    [ Padre ]
  • 1 respuesta por debajo de tu umbral de lectura actual.