Está en la página 1de 5

1.4.

4b2c Librera de importacin


1 Sinopsis Las libreras de importacin son libreras estticas de terminacin clsica .lib o .a, que no contienen cdigo objeto, solo tablas. Cada entrada contiene el nombre de una DLL y la direccin de un recurso exportable dentro de la DLL. Por ejemplo, una funcin dllexport de la librera. Generalmente estas direcciones estn en forma de nmeros. Nota: los compiladores C/C++ pensados para escribir aplicaciones que corrern en la plataforma Win32 incorporan algunas de estas libreras con las direcciones de los recursos de la API de Windows (que est constituida por un conjunto de DLLs). Entre las ms frecuentes de estas libreras de importacin estn: IMPORT32.LIB, KERNEL32.LIB, USER32.LIB, y GDI32.LIB.

Estas libreras se enlazan estticamente con la aplicacin que debe utilizar los recursos de la DLL, de forma que el cargador del ejecutable (que debe cargar tambin las libreras) puede resolver las invocaciones a los recursos contenidos en ellas. El juego es como sigue: supongamos tres funciones func1(); utilA() y utilB(); la primera est en la librera dinmica LibF.dll, las otras dos enLibU.dll. Supongamos que deseamos construir una aplicacin, Apli.exe, que debe utilizar dichas funciones. A su vez, los fuentes de la aplicacin estn en los ficheros Main.cpp y Utils.cpp. Una forma de proceder sera construir una librera de importacin, digamos Mi.LIB, con informacin sobre la localizacin de las tres funciones externas. Una vez construida, la librera se enlazara junto con el resto de los mdulos para conseguir un ejecutable. Por ejemplo, con el compilador de BC++ podra utilizarse el siguiente comando [1]: BCC32 -IC:\BCPP\Include -LC:\BCPP\Lib Main.CPP Utils.CPP Mi.LIB -eApli

La construccin de una librera de importacin como Mi.LIB puede hacerse de varias formas. La ms simple es crearla en el momento de crear la librera, pero tambin puede ser creada posteriormente a partir de la DLL (cuando no se dispone de los fuentes) mediante herramientas especiales. Por ejemplo, en Borland C++, mediante una utilidad denominada implib , y en GNU mediante la utilidaddlltool, que suele estar incluida junto con las "binutils" del compilador .

2 Utilidad impdef El compilador Borland C++ dispone de la utilidad IMPDEF que permite obtener un fichero .DEF de definicin a partir de una librera .DLL; este fichero contiene una seccin EXPORTS con los nombres de todos los recursos exportables de la librera. Nota: El nombre de esta utilidad es acrnimo de "Import Definition", ya que se trata de un manejador de ficheros de definicin .DEF.

2.1 Sintaxis IMPDEF FicheroDestino.DEF NombreLibreria.DLL

2.2 Comentario Esta orden crea un fichero de definicin de nombre FicheroDestino.DEF a partir del fichero NombreLibreria.DLL. El fichero .DEF tiene el siguiente aspecto: LIBRARY NombreLibreria DESCRIPTION 'Descripcion' EXPORTS Nombre_de_funcion_exportable @Ordinal . . . Nombre_de_funcion_exportable @Ordinal Con el significado siguiente: NombreLibreria es el nombre que aparece en la variable NAME de la seccin de cabecera de la librera analizada (ver Fichero de definicin 1.4.4a). Descripcion es el valor de la seccin DESCRIPTION si la librera DLL fue enlazada utilizando un fichero de definicin .DEF que inclua una sentencia DESCRIPTION. Nombre_de_funcion_exportable Es el nombre de cada funcin exportable de la librera analizada. Ordinal es un entero que expresa el orden de dicha funcin. La utilidad acepta los siguientes comandos de ejecucin:

-a Aade un guin bajo '_' al nombre de las funciones declaradas cdecl para compatibilidad con las libreras de Microsoft. Aade algunas indicaciones extra h
2.3 Ejemplo: Para aplicar la utilidad IMPDEF a la librera planetsB.dll construida en el ejemplo 3.2 de la pgina anterior ( 1.4.4b2a), se utilizara el siguiente comando: IMPDEF planetsB.DEF palentsB.DLL Obtenindose un fichero planetsB.DEF con el siguiente contenido: LIBRARY PLANETSB.DLL EXPORTS ___CPPdebugHook _showEarth _showMercury _showVenus @4 @3 @1 @2 ; ; ; ; ___CPPdebugHook _showEarth _showMercury _showVenus

3 Utilidad implib El compilador Borland C++ dispone de la utilidad IMPLIB que permite crear libreras de importacin a partir de una o varias DLLs y/o ficheros de definicin .DEF ( 1.4.4a). 3.1 Sintaxis IMPLIB Opciones LibName [ DefFiles... | DLLs... ] [@ResponseFile]

Opciones es una lista de uno o ms comandos opcionales, que pueden ser los siguientes:

-a Aade un guin bajo '_' al nombre de las funciones declaradas cdecl ( 4.4.6a) para compatibilidad con las libreras de Microsoft. -c Avisos para los smbolos sensibles a maysculas/minsculas ("Case sensitive") -f Forzar importacin por nombre No indicar mensajes de aviso w
LibName es el nombre de la librera de importacin que se crear. DefFiles es una lista de uno o varios ficheros de definicin .DEF ralativos a la/s libreras utilizadas. DLLs es una lista de una o varias libreras dinmicas cuya librera de importacin se pretende crear (no tienen que ser necesariamente de terminacin .DLL, pueden ser .EXE, .DRV, etc). ResponseFile es una lista de respuesta ("Response file"). Se trata de un fichero de texto plano (ASCII) que contiene una lista de los ficheros .DEF y DLLs que se quieren procesar. Puede ser til cuando esta lista es muy numerosa, de forma que no es necesario escribir una lnea de comando muy larga. Los nombres de ficheros de la lista deben ir separados por espacios o nueva lnea NL (ASCII 10 2.2.1a). En la lnea de comando el nombre de la lista de respuesta debe ir precedido del carcter arroba '@'. Por ejemplo: IMPLIB -w LibPrincipal.LIB @ResFiPr.txt

3.2 Ejemplo: Para obtener la librera de importacin planetsB.lib a partir de la DLL planetsB.dll construida en el ejemplo de construccin de una librera dinmica con Borland C++ 5.5 Make ( 1.4.4b2a), se utiliz el comando: implib -c planetsB.lib planetsB.dll

4 Utilidad dlltool

Esta utilidad acompaa a las "binutils" del compilador GNU gcc. Es utilizada para crear los ficheros necesarios para construir y usar DLLs. La utilidad solo se incluye en los paquetes destinados a soportar DLLs (los destinados a correr en las plataformas Windows de MS). En lo que sigue, nos referimos a dlltool.exe, la versin que acompaa al compilador GNU c++ de MinGW (ver recuadro en 1.4.0a1). La utilidad dlltool puede ser utilizada de muchas formas; a continuacin incluimos un ejemplo de la ms usual: cuando tenemos una librera esttica somelib.dll de la que no son accesibles los fuentes y que se resiste a compilar con alguna de nuestras aplicaciones que la necesita (quizs por estar construida con un compilador distinto del que utilizamos -el mencionado GNU c++ de MinGW para Windows-). En estos casos la solucin puede consistir en compilar nuestra aplicacin "con" ("against" en la literatura inglesa) una librera de importacin somelib.a construida a partir de la mencionada DLL con ayuda de dlltool. Para abreviar la exposicin, utilizaremos las libreras y aplicaciones de ejemplos anteriores. En concreto, los incluidos en los captulos "Construir una DLL" ( 1.4.4b2a) y "Usar una DLL" ( 1.4.4b2b). Como resumen, recordemos que se construy una DLL con dos compiladores: GNU c+ + y BC++ (Borland C++ 5.5). A continuacin se construy una aplicacin que utiliza las citadas libreras. La aplicacin se construye tambin con ambos compiladores y en sus dos versiones de enlazado para cada caso, implcito y explcito. El resumen de ficheros obtenidos es el siguiente:

Fichero planetsG.dll planetsB.dll planetsE.exe planetsD.exe planetsE.exe planetsD.exe

Compilador tamao Bytes Descripcin GNU gcc 483.328 Librera dinmica Borland C++ 8.192 Librera dinmica GNU gcc 16.384 Usa planetsG.dll con enlazado implcito GNU gcc 479.232 Usa planetsG.dll con enlazado explcito Borland C++ 8.192 Usa planetsB.dll con enlazado implcito Borland C++ 8.192 Usa planetsB.dll con enlazado explcito

Suponemos que no disponemos de la versin GNU de la librera (planetsG.dll) y necesitamos utilizar la versin BC++ disponible (planetsB.dll) para construir un ejecutable que usar enlazado explcito con la citada librera. Para ello, modificamos convenientemente el makefile makefilE.gnu ( 1.4.4b2b): # MakefilE.gnu (modificado) Uso de librera Borland planetsB.dll # crear aplicacin planetsE.exe usando librera dinmica con enlazado esttico LIBS = -L"C:/DEV-CPP/lib" CXXFLAGS = -I"C:/DEV-CPP/lib/gcc/mingw32/3.4.2/include" \ -I"C:/DEV-CPP/include/c++/3.4.2/backward" \ -I"C:/DEV-CPP/include/c++/3.4.2/mingw32" \ -I"C:/DEV-CPP/include/c++/3.4.2" -I"C:/DEV-CPP/include" planetsE.exe: mainE.o g++ mainE.o -o "planetsE.exe" $(LIBS) dlibs/planetsB.dll mainE.o: mainE.cpp g++ -c mainE.cpp -o mainE.o $(CXXFLAGS)

La invocacin de este makefile produce los siguientes errores: mainE.o(.text+0x2b):mainE.cpp: undefined reference to `_imp__showMercury' mainE.o(.text+0x32):mainE.cpp: undefined reference to `_imp__showVenus' mainE.o(.text+0x39):mainE.cpp: undefined reference to `_imp__showEarth' lo que indica que la versin "tal cual" de la DLL no se entiende bin con nuestro compilador GNU g++. Para resolver el problema, crearemos una librera de importacin planetsB.a a partir de planetsB.dll y compilaremos con ella. El makefile a utilizar ser idntico al anterior, pero modificando adecuadamente el comando de la primera regla: planetsE.exe: mainE.o g++ mainE.o -o "planetsE.exe" $(LIBS) dlibs/planetsB.a Para construir la librera con dlltool, primero construimos un fichero de definicin planets.def relacionando en su apartado EXPORTS los identificadores que nos dieron error en la compilacin anterior: LIBRARY PLANETSB.DLL EXPORTS showMercury showVenus showEarth A continuacin invocamos dlltool con el siguiente comando: dlltool -U -d planets.def -l planetsB.a El resultado es la librera solicitada planetsB.a, con lo que ya podemos invocarse el makefile para obtener la aplicacin planetsE.exeque funciona con la librera planetsB.dll de Borland. Nota: el tamao del ejecutable es de 20.480 bytes frente a los 16.384 del obtenido utilizando la DLL de GNU. Ver detalles adicionales en www.mingw.org En el manual de las binutils GNU puede encontrarse la informacin oficial sobre la utilidad dlltool, que acompaa a los binarios de la dististribucin MinGW.

Inicio. [1] Suponemos que las libreras del compilador estn en el directorio C:\BCPP\Lib\, y los ficheros de cabecera enC:\BCPP\Include\. [2] La librera de importacin puede ser sustituida en todo o en parte, por la seccin IMPORTS de un fichero de definicin ("module definition file").

También podría gustarte