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 ]
  • Re:Genial

    (Puntos:0)
    por pobrecito hablador el Lunes, 19 Octubre de 2009, 22:37h (#1180375)

    Ocurre lo mismo cuando compilas con código que no está en una biblioteca, sino en un fichero objeto normal y corriente,
    Pues la verdad es que no X-D El código en ese caso acaba junto con el resto del código, típicamente en la sección de código ejecutable.

    Puedes verlo si la desensamblas, y puedes ver también que no aparece el código de las bibliotecas por ninguna parte. En Linux podría ser:

    ~$ objdump -d -j .text a.out

    Verás que las llamadas a función aparece como call blablabla@plt. ¿En blablabla@plt está el código de la biblioteca? Compruébalo tú mismo:

    ~$ objdump -d -j .plt a.out

    no sabes cómo funciona un compilador.
    ¿Sabes? A veces la mejor forma de salir de un hoyo no es seguir cavando :-)
    [ Padre ]
    • Re:Genial de pobrecito hablador (Puntos:0) Martes, 20 Octubre de 2009, 06:58h
      • Re:Genial de pobrecito hablador (Puntos:0) Martes, 20 Octubre de 2009, 11:06h