--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
Joaquín,te sugerí que miraras unplugged.googlecode.com, lo viste? Viste los ejemplos?
Vamos por partes porque hay mucho para responder.Vos, primero, sabés que el problema no es tanto el compilador, sino el DYNAMIC LOADER del sistema operativo?
El binding entre la aplicación y un shared object ocurre dinámicamente por la acción del DYNAMIC LOADER, que es un componente del sistema operativo.El compilador ("casi" sin linker, puedo explicar en más detalle), es amigo del sistema operativo target, ya que respeta lo que se llama ABI (Application Binary Interface), un documento que escriben de la manito el fabricante del sistema operativo y el fabricante del microprocesador.NO HAY NAME MANGLING al menos en linux (no sé en windows), es todo C-calling conventions.
Y por último, si el plugin genera una instancia de una clase escrita en un .h, que la aplicación usará, ni siquiera hace falta que cambies de compilador para tener kilombo: basta con que hayas compilado con distintas opciones de empaquetamiento para que se rompa todo.
Ahora bien, fijáte el link y después contáme para qué querés hacer esto.Ni C ni C++ tienen interés desde diseño en ser binary-compatible codes, para eso está Java y .net.
On Fri, Mar 30, 2012 at 12:45 AM, Daniel Gutson <daniel...@gmail.com> wrote:Joaquín,te sugerí que miraras unplugged.googlecode.com, lo viste? Viste los ejemplos?Sí, lo ví. Debería probarlo con más profundidad.
Ya tengo una versión funcional del sistema de plugins.
Sin embargo está pensado con interfaces en C, para que también se puedan escribir plugins en C.
La idea es luego hacer una clase en C++ Wrapper de las funciones de comunicación con el núcleo de la aplicación.
Así los plugins en C++ tendrán una interface más cómoda.
Cuando aborde esta etapa seguramente los consulte.
Vamos por partes porque hay mucho para responder.Vos, primero, sabés que el problema no es tanto el compilador, sino el DYNAMIC LOADER del sistema operativo?Sí. :-)El binding entre la aplicación y un shared object ocurre dinámicamente por la acción del DYNAMIC LOADER, que es un componente del sistema operativo.El compilador ("casi" sin linker, puedo explicar en más detalle), es amigo del sistema operativo target, ya que respeta lo que se llama ABI (Application Binary Interface), un documento que escriben de la manito el fabricante del sistema operativo y el fabricante del microprocesador.NO HAY NAME MANGLING al menos en linux (no sé en windows), es todo C-calling conventions.No comprendo a qué te referís.
En el siguiente email mencionás que" la razón de la existencia del name mangling, es histórica:"Sé que la tabla de símbolos solo acepta cierto tipo de formato de nombre.
Como explicas en el siguiente correo.
Y por último, si el plugin genera una instancia de una clase escrita en un .h, que la aplicación usará, ni siquiera hace falta que cambies de compilador para tener kilombo: basta con que hayas compilado con distintas opciones de empaquetamiento para que se rompa todo.
Ahora bien, fijáte el link y después contáme para qué querés hacer esto.Ni C ni C++ tienen interés desde diseño en ser binary-compatible codes, para eso está Java y .net.Saquemos del contexto a los plugins. Ahora mi interés es meramente teórico.
Quisiera saber cuándo se rompen las compatibilidades y cuándo no.
Dentro de un mismo compilador:
Por ejemplo. Si yo tengo las librerías QT y las compilo con gcc-A.B, donde A y B son numeros
Dandome como resultado un .a o .so (no debería haber diferencia como decís)
Si compilo mi aplicación linkeando contra la librería: (suponiendo que utilizo las mismas opciones de empaquetamiento)
1- con gcc-A.B (tiene que andar)
2- con gcc-A.(B+1) (andaría?)
3- con gcc-(A+1).(B+x) (ya es seguro que se rompe?)
En diferentes compiladores:
Por otro lado mencionás que ni siquiera C es binary-compatible.
Esto se traduce a que no existen en el mundo sistemas que utilicen librerías compiladas con diferentes compiladores?
O hay ciertos límites dentro de los cuales se puede llamar otras funciones y pasarles parámetros? (y que parámetros y resultados sean tipos estándares o que sigan alguna regla)
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
2012/3/30 Joaquin Duo <joa...@gmail.com>On Fri, Mar 30, 2012 at 12:45 AM, Daniel Gutson <daniel...@gmail.com> wrote:Joaquín,te sugerí que miraras unplugged.googlecode.com, lo viste? Viste los ejemplos?Sí, lo ví. Debería probarlo con más profundidad.
Ya tengo una versión funcional del sistema de plugins.
Sin embargo está pensado con interfaces en C, para que también se puedan escribir plugins en C.por qué es algo distinto a lo que propone dlfcn.h ?
(insisto en que deberías ver plugin.h :) )
Sí fui poco claro: que no hay name mangling en el soporte a dynamic loading, porque es todo C-calling types. Y porque es una librería de C.
En el siguiente email mencionás que" la razón de la existencia del name mangling, es histórica:"Sé que la tabla de símbolos solo acepta cierto tipo de formato de nombre.
tabla de símbolos? de quién? del compilador? No, en ese caso la tabla de símbolos del compilador no tiene nada que ver. La tabla de símbolos del compilador vive temporalmente mientras compila, y se usa para hacer lookup de símbolos justamente. El name mangling aparece mucho después, al momento de escribir esos símbolos en el archivo objeto para que el linker no se ofenda. Te aconsejo jugar con c++filt.
xfa distingamos compilador de linker, porque en esta discusión es muy relevante. Yo te puedo romper compatibilidad binaria sólo entre compiladores, sin meter al linker en el medio. Te muestro debajo cómo.Y decir "gcc" no es suficiente, porque gcc es el "compiler driver", es decir, el programa titiritero que invoca a los distintos componentes del toolchain: preprocesador, compilador, ensamblador, y eventualmente linker.
En diferentes compiladores:
Por otro lado mencionás que ni siquiera C es binary-compatible.
Esto se traduce a que no existen en el mundo sistemas que utilicen librerías compiladas con diferentes compiladores?
Fijáte el kilombo que tiene q hacer una distribución de linux para poder enviarte un binario y que te ande. Eso lo pueden hacer porque ellos controlan qué tenés instalado. Y a veces así ni anda.
En windows es "aparentemente" más fácil, en que copiás una dll y salís a festejar diciendo eureka eureka con la felicidad del ignorante...
O hay ciertos límites dentro de los cuales se puede llamar otras funciones y pasarles parámetros? (y que parámetros y resultados sean tipos estándares o que sigan alguna regla)Calling conventions. Leé todo lo de arriba y después seguimos. Fijáte lo del empaquetamiento.A todo esto: por qué querés a tanta costa forzar algo para lo que no fue pensado y para lo que no es natural? (compatibilidad binaria en C)
En windows es "aparentemente" más fácil, en que copiás una dll y salís a festejar diciendo eureka eureka con la felicidad del ignorante...
On Fri, Mar 30, 2012 at 4:02 PM, Daniel Gutson <daniel...@gmail.com> wrote:2012/3/30 Joaquin Duo <joa...@gmail.com>On Fri, Mar 30, 2012 at 12:45 AM, Daniel Gutson <daniel...@gmail.com> wrote:Joaquín,te sugerí que miraras unplugged.googlecode.com, lo viste? Viste los ejemplos?Sí, lo ví. Debería probarlo con más profundidad.
Ya tengo una versión funcional del sistema de plugins.
Sin embargo está pensado con interfaces en C, para que también se puedan escribir plugins en C.por qué es algo distinto a lo que propone dlfcn.h ?No es distinto, lo que debo especificar es el prototipo de las funciones que el plugin debe implementar.
De la misma manera que unplugged crea la función "create_plugin"
(insisto en que deberías ver plugin.h :) ):-D Ahí lo vi.
Sí fui poco claro: que no hay name mangling en el soporte a dynamic loading, porque es todo C-calling types. Y porque es una librería de C.Querés decir que no hay soporte cuando uno busca un símbolo con dlsym?
Porque con nm aparecen todos los símbolos de C++. Me imagino que si una .so usa otra .so de C++, por lo tanto usa los símbolos correspondientes en el linkeo dinámico, no?
En el siguiente email mencionás que" la razón de la existencia del name mangling, es histórica:"Sé que la tabla de símbolos solo acepta cierto tipo de formato de nombre.
tabla de símbolos? de quién? del compilador? No, en ese caso la tabla de símbolos del compilador no tiene nada que ver. La tabla de símbolos del compilador vive temporalmente mientras compila, y se usa para hacer lookup de símbolos justamente. El name mangling aparece mucho después, al momento de escribir esos símbolos en el archivo objeto para que el linker no se ofenda. Te aconsejo jugar con c++filt.Me he expresado mal.
Uno puede inspeccionar los símbolos de una librería con el programa "nm".
No sé si le llaman tabla, pero son símbolos.
xfa distingamos compilador de linker, porque en esta discusión es muy relevante. Yo te puedo romper compatibilidad binaria sólo entre compiladores, sin meter al linker en el medio. Te muestro debajo cómo.Y decir "gcc" no es suficiente, porque gcc es el "compiler driver", es decir, el programa titiritero que invoca a los distintos componentes del toolchain: preprocesador, compilador, ensamblador, y eventualmente linker.Tenés razón.
En diferentes compiladores:
Por otro lado mencionás que ni siquiera C es binary-compatible.
Esto se traduce a que no existen en el mundo sistemas que utilicen librerías compiladas con diferentes compiladores?Fijáte el kilombo que tiene q hacer una distribución de linux para poder enviarte un binario y que te ande. Eso lo pueden hacer porque ellos controlan qué tenés instalado. Y a veces así ni anda.Sí, como decís, eso es problemático. Lo ideal es que el usuario tenga un experiencia transparente. (que en general lo tiene, pero como decís, a veces no anda)
En windows es "aparentemente" más fácil, en que copiás una dll y salís a festejar diciendo eureka eureka con la felicidad del ignorante...Uhm, sí, realmente me he llevado esta impresión de compatibilidad por cómo trabajan algunos programas de windows.
Ya que mencionás "aparentemente". cómo resuelven el problema? Estandarizan todo, y por lo tanto tiene menos flexibilidad?
O hay ciertos límites dentro de los cuales se puede llamar otras funciones y pasarles parámetros? (y que parámetros y resultados sean tipos estándares o que sigan alguna regla)Calling conventions. Leé todo lo de arriba y después seguimos. Fijáte lo del empaquetamiento.A todo esto: por qué querés a tanta costa forzar algo para lo que no fue pensado y para lo que no es natural? (compatibilidad binaria en C)No es forzar. Bah, hubiese sido conveniente en algunos casos.
Ejemplo de caso de uso
1- El usuario tiene el núcleo del programa version 1.0 con 100 plugins para ese núcleo.
2- El usuario descarga el núcleo del programa version 2.0 compilado con una nueva versión del compilador.
3- El usuario debería poder reutilizar los 100 plugins que ya tiene compilados.
En este último caso, la compatibilidad binaria no sería un problema por lo menos con mi sistema. (el núcleo no interactúa con las información de los plugins)
En el caso de la interacción entre los plugins sí hay problemas de compatibilidad binaria.
Un caso de uso:
(aclaro: los plugins "tipo de dato" definen los tipos de dato, y los plugins "procesador" hacen operaciones sobre estos datos)
1- El usuario posee un plugin de "tipo de dato" X_v1 y un plugin "procesador" de dato Y_v1
2- El usuario actualiza el plugin de "tipo de dato" X_v1 a X_v2, compilado con otra versión del compilador.
3- El usuario debería poder reutilizar el "procesador" Y_v1 ya compilado
Te resumo mi conclusión con respecto a los plugins:
1- Voy a tener que hacer que el usuario recompile en su máquina, con los pro y contras que tiene esto.
Lo cierto es que soy de la idea que "el código debe acompañar al programa", en el sentido que el usuario debería tener facilidades para cambiar el programa en cualquier entorno. Esto significa que el usuario debe tener un compilador junto con mi sistema. Y en realidad no solo quisiera que tenga un compilador, sino un IDE asociado.
Mi finalidad de las preguntas es conocer los límites de la compatibilidad binaria.
Realmente tenía otra impresión del tema, me has desburrado. :-)
Con respecto a calling conventions, podrías recomendarme algún link/artículo? (voy a googlear igual)
Gracias! :-)
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
Volvé a re-pensar todo esto a partir de lo que te aclaré del toolchain recién. Y por favor, no vuelvas a mencionar "la versión de gcc" porque no te contesto más :)
On Sat, Mar 31, 2012 at 4:35 PM, Daniel Gutson <daniel...@gmail.com> wrote:Volvé a re-pensar todo esto a partir de lo que te aclaré del toolchain recién. Y por favor, no vuelvas a mencionar "la versión de gcc" porque no te contesto más :)En mi último email nunca mencioné a gcc.
-Una cosa es la compatibilidad a nivel de linkeo.
-Otra cosa es la compatibilidad binaria.
Por qué interpretás que en mi último email mezclo ambos conceptos?
Los casos de uso son de compatibilidad binaria, dejando de lado los problemas de linkeo. (no los tengas en cuenta. En algunos casos se pueden arreglar, pero tengo que sacarme una duda antes de contestar sobre esto)
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"