por
pobrecito hablador
el Lunes, 19 Octubre de 2009, 16:47h
(#1180296)
¿O el proceso de compilación y enlazado te resulta tan ajeno que te vale decir cualquier cosa?
Por fortuna no. 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.
Este índice no es parte de la biblioteca sino que es generado por el enlazador y sus entradas fijadas por él o resueltas en tiempo de ejecución por el montador de enlaces (que es tanto como decir por el sistema operativo)
La compilación, pues, genera un producto independiente: mi programa, que hace uso de las bibliotecas que son, desde el punto de vista del sistema productos independientes. También son productos independientes desde el punto de vista legal, ya que pueden ser licenciadas y distribuidas por separado.
Puedo escribir otro programa que haga uso de la biblioteca y puedo escribir otra biblioteca que, respetando el "índice", funcione directamente con mi programa. Son igualmente independientes.
Desensambla todo el código objeto de un programa y no encontrarás ni una línea que pertenezca a la biblioteca con la que enlace, salvo en el caso de templates, macros e inlines evidentemente.
Cuando enlazas, el programa final es tu código + el código de la biblioteca.
Ese es tu error. Ya has visto que el resultado del enlazado no es la unión de ambos y, cuando registras un programa en el registro de la propiedad intelectual, registras el código del programa, no el código de las bibliotecas que use (que además no puedes porque no eres su autor en este caso)
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. De la misma manera nadie puede decir que libro es obra derivada por incluir una referencia bibliográfica: debe incluir parte del original de alguna forma, ya sea adaptado, traducido, compendiado, etc. El libro no es una metáfora capciosa porque de hecho los programas de ordenador están equiparados a obras literarias en cuestiones de propiedad intelectual.
Sobre el resto, he visto que has obviado dar una explicación de por qué, si las licencias de Microsoft prohíben las obras derivadas (en general) es posible distribuir programas GPL para Windows. Si el resultado de la compilación es tu código más el de la biblioteca está claro que se trata de una obra derivada y para su distribución es necesario el permiso del titular de los derechos de autor que, ya de antemano, no te lo concede en su licencia.
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:
Tienes unos ficheros fuente (.c)
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.
A partir de aquí hay dos opciones: un enlazado definitivo o dejar la etapa final de enlazado al enlazador dinámico
Supongamos que queremos un enlazado definitivo: el enlazador resuelve los símbolos y une todo el código en un único ejecutable.
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.
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).
Re:Genial
(Puntos:0)Este índice no es parte de la biblioteca sino que es generado por el enlazador y sus entradas fijadas por él o resueltas en tiempo de ejecución por el montador de enlaces (que es tanto como decir por el sistema operativo)
La compilación, pues, genera un producto independiente: mi programa, que hace uso de las bibliotecas que son, desde el punto de vista del sistema productos independientes. También son productos independientes desde el punto de vista legal, ya que pueden ser licenciadas y distribuidas por separado.
Puedo escribir otro programa que haga uso de la biblioteca y puedo escribir otra biblioteca que, respetando el "índice", funcione directamente con mi programa. Son igualmente independientes. Desensambla todo el código objeto de un programa y no encontrarás ni una línea que pertenezca a la biblioteca con la que enlace, salvo en el caso de templates, macros e inlines evidentemente.
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. De la misma manera nadie puede decir que libro es obra derivada por incluir una referencia bibliográfica: debe incluir parte del original de alguna forma, ya sea adaptado, traducido, compendiado, etc. El libro no es una metáfora capciosa porque de hecho los programas de ordenador están equiparados a obras literarias en cuestiones de propiedad intelectual.
Sobre el resto, he visto que has obviado dar una explicación de por qué, si las licencias de Microsoft prohíben las obras derivadas (en general) es posible distribuir programas GPL para Windows. Si el resultado de la compilación es tu código más el de la biblioteca está claro que se trata de una obra derivada y para su distribución es necesario el permiso del titular de los derechos de autor que, ya de antemano, no te lo concede en su licencia.
Re:Genial
(Puntos:0)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.
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:
¿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).