es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Se pueden tener varias DLL con exportaciones/ordinales comunes y intercambiarlas en tiempo de ejecución?

Estoy tratando de crear un par de DLL de 64 bits de Win32 (Windows 10) que tienen diferentes implementaciones pero exportan símbolos consistentes. El objetivo de esto es que uno se enlace con cualquiera de ellos en tiempo de compilación, pero tenga la opción en el despliegue de instalar cualquiera de las DLL y ejecutar correctamente con ella. Ya he logrado esto de manera sencilla en Linux, donde me siento más cómodo y familiarizado con el enlace en tiempo de ejecución. Pero en Windows, aún no he logrado esto y me pregunto si es posible en absoluto. Estoy intentando esto utilizando tanto VS2010 como VS2019.

Supongamos que tengo dos bibliotecas blah-legacy.dll y blah-modern.dll. Ambas exportan 6 símbolos que son la interfaz para usar la biblioteca, por ejemplo, blah-open, blah-read, blah-write, blah-close, blah-control, blah-status.

Puedo enlazar con la biblioteca de importación para cualquiera de las dos implementaciones y un programa de prueba que llama a cada símbolo se carga y se ejecuta correctamente con la correspondiente DLL de blah.

Sin embargo, aún no puedo cambiar las DLL en tiempo de ejecución. Por ejemplo, ¿debería poder enlazar realmente con blah-legacy.lib y luego ejecutar con blah-modern.dll si lo renombro a blah-legacy.dll? (O viceversa).

Ya superé los problemas básicos de nombres de archivo y me aseguré de que se pueda encontrar la DLL necesaria. Aún así, obtengo el error “Aplicación no se pudo iniciar (0x22)”.

Usé “objdump -xs” en las DLL y noté que el orden de los símbolos y sus números de orden son diferentes. Entonces creé un archivo .def y me aseguré de que los símbolos exportados coincidan en número, nombres y orden. Aún así, nada, ocurre el mismo error.

Aún hay algo en esto que claramente no he descubierto y agradecería algo de orientación. ¿Es esto realmente posible? ¿Por dónde debo empezar a buscar (qué herramientas) para averiguar qué paso debo seguir a continuación?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en C, Windows, DLL y DLLImport, puedo confirmar que es posible crear DLL de 64 bits de Win32 con diferentes implementaciones pero con exportaciones de símbolos consistentes. Sin embargo, parece que el problema que estás enfrentando está relacionado con la vinculación en tiempo de ejecución en Windows, lo cual puede requerir un enfoque diferente en comparación con lo que estás acostumbrado en Linux.

    Una posible solución a este problema es utilizar la vinculación dinámica en tiempo de ejecución, lo cual implica cargar la DLL requerida en tiempo de ejecución utilizando la función LoadLibrary y obtener los punteros de función utilizando la función GetProcAddress. Esto te permite cambiar entre diferentes implementaciones de la misma DLL en tiempo de ejecución, siempre y cuando tengan las mismas exportaciones de símbolos.

    Otra posible solución es utilizar la tecnología de ensamblado lado a lado de Windows (SxS), lo cual permite que múltiples versiones de la misma DLL coexistan en el mismo sistema. Esto implica utilizar archivos de manifiesto para especificar las dependencias de tus DLL y asegurarte de que estén instaladas en directorios separados.

    En cuanto a herramientas, puedes utilizar la herramienta Dependency Walker (Depends.exe) para analizar las dependencias de tus DLL y asegurarte de que se resuelvan correctamente en tiempo de ejecución. También puedes utilizar el depurador de Visual Studio para establecer puntos de interrupción y seguir paso a paso tu código para diagnosticar cualquier problema.

    En resumen, definitivamente es posible crear DLL de 64 bits de Win32 con diferentes implementaciones pero con exportaciones de símbolos consistentes. Sin embargo, esto requiere un conocimiento profundo de la carga de DLL de Windows y la vinculación en tiempo de ejecución, así como familiaridad con las herramientas y tecnologías relevantes.

Comments are closed.