SlideShare una empresa de Scribd logo
Archivos complementarios a
        aplicaciones en Win32

El sistema operativo Windows esta compuesto
  por una extensa variedad de módulos
  adicionales al “kernel”, entre ellos podemos
  encontrar:
• “Drivers” (.drv y .sys)
• “Drivers virtuales” (.vxd)
• Bibliotecas estáticas (.lib)
• Bibliotecas dinámicas (.dll)
Bibliotecas estáticas
• Son aquellas que se requieren durante el
  tiempo de compilación.
• Generalmente se tienen en un archivo con
  extensión .lib y un archivo de encabezado
  con extensión .h
• No se requieren en la máquina del “cliente”
  para ejecutar un programa, pero generan un
  código ejecutable grande.
Biblioteca estática

Supóngase que dentro de un programa se desea utilizar una
rutina cuyo código ya fué desarrollado anteriormente, quizás
por alguien que no es el programador actual.

Para hacer esto se requiren tres cosas:
   • Conocer los parámetros que requiere y el tipo de dato
     que regresa la función (API).

                 long Multiply2Longs(long l1, long l2);

   • Archivo con prototipo de la función.


   • Archivo con código intermedio de la función.
Aplicación que utiliza biblioteca estática
     Supóngase que dentro de un programa se desea utilizar una
     rutina cuyo código ya fué desarrollado anteriormente, quizás
     por alguien que no es el programador actual.
 #include <stdio.h>
 #include <stdlib.h>
 #include <windows.h>
                                     Si solo es necesaria una función,
                                     se puede dejar indicada en vez de
 long l1;                            realizar el #include del archivo.
 long l2;
 long lResult;

 extern "C" long Multiply2Longs(long l1, long l2);

 void main() {
          //Inclusión explícita: Requiere la inclusión del archivo .LIB
                   l1=10;
                   l2=20;

                   lResult=Multiply2Longs(l1,l2);
                   printf("Resultado=%dn",lResult);

           getchar();
 }
Aplicación que utiliza biblioteca estática
Código de la biblioteca estática
   El código de una biblioteca estática es simple, consiste
   únicamente de las rutinas que la componen y su código
   interno.




La única consideración que cabe destacar se presenta al compilar
el archivo, esto debido a que no se generará otro archivo con
extensión .exe sino uno con extensión .lib.
Código de una biblioteca estática




 Al crear el proyecto, se debe especificar que se va
 a generar el código para una biblioteca estática.
Bibliotecas dinámicas

• Archivos precomilados que pueden
  enlazarse al código principal durante la
  etapa de ejecución de una aplicación.
• El archivo con extensión DLL se requiere
  en la máquina del “cliente” para que pueda
  ejecutarse la aplicación.
• Normalmente, los DLLs van al directorio 
  windowssystem o windowssystem32
Preparación para utilizar un DLL
Aplicación que utiliza DLL
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

HINSTANCE hCodigoDll;

long l1;
long l2;
long lResult;

typedef long (TIPOFUNCION)(long, long);
TIPOFUNCION* pfuncMultiply2Longs=0;




                           En forma similar al manejo de archivos,
                           se define una variable que servirá para
                           abrir el DLL.
Aplicación que utiliza DLL
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

HINSTANCE hCodigoDll;

long l1;
long l2;
long lResult;

typedef long (TIPOFUNCION)(long, long);

TIPOFUNCION* pfuncMultiply2Longs=0;




                  Se define un tipo de dato que deberá corresponder
                  al prototipo de la función.
                  Se define un apuntador al tipo de función que se
                  definió en el párrafo anterior.
Aplicación que utiliza DLL
void main() {
          //Inclusión implícita: Realiza inclusión dinámica de la biblioteca
          if (hCodigoDll =LoadLibrary("dll_test.dll")) {

                        if (pfuncMultiply2Longs=(TIPOFUNCION*)

                                 GetProcAddress(hCodigoDll ,"Multiply2Longs")) {

                                 l1=10;
                                 l2=20;
                                 lResult=(*pfuncMultiply2Longs)(l1,l2);

                                 printf("Resultado=%dn",lResult);
                        } else
                                 printf("Error al obtener la dirección del procedimiento!n");
           } else
                     printf("Biblioteca no localizada!n");
           FreeLibrary(hModule);

           getchar();
}                                                             Se “carga” el DLL y se liga
                                                              con la variable hModule.
Aplicación que utiliza DLL
void main() {
          //Inclusión implícita: Realiza inclusión dinámica de la biblioteca
          if (hCodigoDll =LoadLibrary("dll_test.dll")) {

                        if (pfuncMultiply2Longs=(TIPOFUNCION*)

                                 GetProcAddress(hCodigoDll ,"Multiply2Longs")) {

                                 l1=10;
                                 l2=20;
                                 lResult=(*pfuncMultiply2Longs)(l1,l2);

                                 printf("Resultado=%dn",lResult);
                        } else
                                 printf("Error al obtener la dirección del procedimiento!n");
           } else
                     printf("Biblioteca no localizada!n");
           FreeLibrary(hModule);

           getchar();                                Se busca dentro del DLL la función
}                                                    que nos interesa invocar, utilizando
                                                     para ello la referencia hModule.
Aplicación que utiliza DLL
void main() {
          //Inclusión implícita: Realiza inclusión dinámica de la biblioteca
          if (hCodigoDll =LoadLibrary("dll_test.dll")) {

                        if (pfuncMultiply2Longs=(TIPOFUNCION*)

                                 GetProcAddress(hCodigoDll,"Multiply2Longs")) {

                                 l1=10;
                                 l2=20;
                                 lResult=(*pfuncMultiply2Longs)(l1,l2);

                                 printf("Resultado=%dn",lResult);
                        } else
                                 printf("Error al obtener la dirección del procedimiento!n");
           } else
                     printf("Biblioteca no localizada!n");
           FreeLibrary(hModule);

           getchar();
}                                                Si la función fué localizada, se liga
                                                 con el apuntador pfuncMultiply2Longs.
Aplicación que utiliza DLL
void main() {
          //Inclusión implícita: Realiza inclusión dinámica de la biblioteca
          if (hCodigoDll =LoadLibrary("dll_test.dll")) {

                        if (pfuncMultiply2Longs=(TIPOFUNCION*)

                                 GetProcAddress(hCodigoDll ,"Multiply2Longs")) {

                                 l1=10;
                                 l2=20;
                                 lResult=(*pfuncMultiply2Longs)(l1,l2);

                                 printf("Resultado=%dn",lResult);
                        } else
                                 printf("Error al obtener la dirección del procedimiento!n");
           } else
                     printf("Biblioteca no localizada!n");
           FreeLibrary(hCodigoDll);

           getchar();                     Se manda ejecutar el contenido del apuntador
}
                                          pfuncMultiply2Longs, en forma similar a
                                          como se invoca una función.
Código de un DLL




        //Archivo dll_test.c

        #include <windows.h>

        #define DllExport __declspec(dllexport)

        DllExport long Multiply2Longs(long n1, long n2) {
                   return(n1*n2);
        }
Bibliotecas en LINUX
• Existen tres tipos de bibliotecas.
   – De enlace estático.
   – De enlace dinámico (“shared object”).
      • Con enlace implícito: Etiquetadas durante tiempo de
        compilación con rutinas implícitamente enlazadas durante
        tiempo de ejecución.
      • Con enlace explícito: Explícitas en el procedimiento de enlace
        y desenlace durante tiempo de ejecución.


• Para soportar el proceso de enlace dinámico el
  sistema operativo utiliza un módulo de código
  llamado “dynamic linker”.
Formatos de código binario
•   Todos los tipos de bibliotecas consisten de código binario que debe ser
    enlazado al código binario de un programa para su ejecución.

•   El vinculador (“linker”) debe realizar un proceso de relocalización de
    código cada vez que una biblioteca se enlaza con una aplicación.

•   Para que en vinculador (dinámico o estático, cualquiera de ellos)
    pueda realizar su función requiere un formato estandarizado de
    código; en Linux existen dos:
     – COFF (“Common Object File Format”): Utilizado inicialmente pero
       descontinuado en la actualidad.
     – ELF (“Executable Linkage Format”): Vigente en todas las distribuciones
       del sistema operativo.
Tablas de símbolos
•   Una vez que se realiza el proceso de compilación del código fuente,
    se pierden todas las referencias a los nombres de variables y rutinas,
    en el código objeto solo quedan referencias a memoria dónde se
    localizarían variables y rutinas … pero esto no es útil para el “dynamic
    linker” de modo que el proceso de compilación requiere que en el
    código binario queden definidas las tablas de símbolos de las
    bibliotecas, a esto se le conoce como ABI.
     – API (“Application Programmer Interface”).
     – ABI (“Application Binary Interface”).
Generación de una biblioteca estática
Pasos para generación de una biblioteca estática:
2.Compilar el código fuente:
     gcc –Wall –c archUnoBibEstatica.c archDosBibEstatica.c
              Lo anterior producirá: archUnoBibEstatica.o y archDosBibEstatica.o

5.Condensar el código objeto de los diferentes archivos que
conformen la biblioteca estática:
     ar –cvq libBibEstatica.a archUnoBibEstatica.o
                                       archDosBibEstatica.o
                                           Lo anterior producirá: libBibEstatica.a

8.Enlazar la biblioteca con alguna aplicación que la requiera
(la aplicación requiere la declaración de prototipos o un
archivo de encabezado):
      gcc prog.c –L/path/to/lib -lBibEstatica
                                  Lo anterior producirá: a.out
Bibliotecas de enlace dinámico
•   Los dos tipos de bibliotecas requieren la creación de un código compartido
    (“shared object”).
•   Este tipo de códigos ofrecen diversas ventajas:
     – Soporte para programas que utilizan diferentes versiones de una misma biblioteca.
     – Actualizaciones automáticas y renovación de versiones.
     – Hacer todo lo anterior mientras otros programas se ejecutan utilizando bibliotecas
       de versiones anteriores.


•   Los objetos compartidos tienen nombres etiquetados como “fully-
    qualified soname”.
     – “soname”  prefijo lib + nombre + .so + .version
     – “real-name”  soname + .minor_num [ + .release ]
     – “linker name”  soname - .version
•   Es común que los nombres “soname” y para el “linker” sean ligas
    simbólicas al “real-name”.
Directorios predefinidos
• Normalmente los “shared objects” están ubicados
  en:
   – /usr/lib … para versiones “release”.
   – /usr/local/lib … para versiones “developer”.


• Sin embargo, la variable de ambiente
  LD_LIBRARY_PATH puede ser utilizada para
  hacer referencia a otra carpeta, de modo que el
  “dynamic linker” pueda encontrar la biblioteca
  durante tiempo de ejecución de un programa.
Generación de un “shared object”
1. Crear el código objeto.
      gcc –fPIC –c archUnoBibDinamica.c archDosBibDinamica.c
                Lo anterior producirá: archUnoBibDinamica.o y archDosBibDinamica.o


4. Crear la biblioteca.
     gcc –shared –Wl,-soname=libBibDinamica.so.1
                            -o libBibDinamica.so.1.0.1 *.o
                                         Lo anterior producirá: libBibDinamica.so.1.0.1

7. Instalar la biblioteca.
      cp libBibDinamica.so.1.0.1 /usr/lib
      ln –sf /usr/lib/libBibDinamica.so.1.0.1 /usr/lib/libBibDinamica.so
      ln –sf /urs/lib/libBibDinamica.so.1.0.1 /usr/lib/libBibDinamica.so.1
              Lo anterior producirá dos ligas simbólicas: libBibDinamica.so y libBibDinamica.so.1



11. Compilar la aplicación que requerirá a la biblioteca.
      gcc –Wall –L/path/to/lib prog.c –lBibDinamica
                                                         Lo anterior producirá: a.out
Biblioteca de enlace dinámico explícito
• Requieren que el código del programa carge
  explícitamente el código binario de la
  biblioteca y búsque en él las rutinas de
  interés.
• Las siguientes funciones son útiles para
  esto:
  –   dlopen(…)
  –   dlclose(…)
  –   dlsym(…)
  –   dlerror(…)
Código fuente de una aplicación
#include <stdio.h>
#include <dlfcn.h>

int main() {
  void *lib_handle;
  int (*fn)(int,int);
  char *error;

    lib_handle = dlopen("/opt/lib/libBibCompartida.so", RTLD_LAZY);
    if (!lib_handle) {
       fprintf(stderr, "%sn", dlerror());
       return(1);
    }

    fn = dlsym(lib_handle, "add2ints");
    if ((error = dlerror()) != NULL) {
       fprintf(stderr, "%sn", error);
       return(1);
    }

    printf("add=%dn",(*fn)(1,2));
.
.
.                                                      gcc -rdynamic prog.c -ldl
    dlclose(lib_handle);                                              Lo anterior producirá: a.out
    return(0);
}

Más contenido relacionado

La actualidad más candente

Introduccion a Python
Introduccion a PythonIntroduccion a Python
Introduccion a Python
Andrés Ignacio Martínez Soto
 
Decompiladores
DecompiladoresDecompiladores
Decompiladores
Manuel Martín
 
Ficheros de cabecera
Ficheros de cabecera Ficheros de cabecera
Ficheros de cabecera
cecibelencalada
 
Paralela9
Paralela9Paralela9
Paralela9
Abraham Zamudio
 
ATIX05
ATIX05ATIX05
¿Porqué Python? ...y Django
¿Porqué Python? ...y Django¿Porqué Python? ...y Django
¿Porqué Python? ...y Django
Antonio Ognio
 
Intro Python
Intro PythonIntro Python
Intro Python
ctme
 
Bibliotecas o librerias_para_c_
Bibliotecas o librerias_para_c_Bibliotecas o librerias_para_c_
Bibliotecas o librerias_para_c_
Oziel Solis Juarez
 
Presentacion Python
Presentacion  Python Presentacion  Python
Presentacion Python
Fco Javier Lucena
 
Estructuras básicas para C++
Estructuras básicas para C++Estructuras básicas para C++
Estructuras básicas para C++
Bryangio2002
 
Precentacion
PrecentacionPrecentacion
Precentacion
MaryferGaitan
 
Programador Jr. para Python Primera Parte
Programador Jr. para Python Primera ParteProgramador Jr. para Python Primera Parte
Programador Jr. para Python Primera Parte
José Luis Chiquete Valdivieso
 
Compilador Usando Jflex y Cup
Compilador Usando Jflex y CupCompilador Usando Jflex y Cup
Compilador Usando Jflex y Cup
ditopo
 
Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015
Mariano Reingart
 
Integrando mis librerías C++ con Python
Integrando mis librerías C++ con PythonIntegrando mis librerías C++ con Python
Integrando mis librerías C++ con Python
Carlos Gustavo Ruiz
 
Estructura programa c++
Estructura programa c++Estructura programa c++
Estructura programa c++
UVM
 
C++
C++C++
Python (Lenguaje de Programación)
Python (Lenguaje de Programación)Python (Lenguaje de Programación)
Python (Lenguaje de Programación)
Ricardo Muñiz
 

La actualidad más candente (18)

Introduccion a Python
Introduccion a PythonIntroduccion a Python
Introduccion a Python
 
Decompiladores
DecompiladoresDecompiladores
Decompiladores
 
Ficheros de cabecera
Ficheros de cabecera Ficheros de cabecera
Ficheros de cabecera
 
Paralela9
Paralela9Paralela9
Paralela9
 
ATIX05
ATIX05ATIX05
ATIX05
 
¿Porqué Python? ...y Django
¿Porqué Python? ...y Django¿Porqué Python? ...y Django
¿Porqué Python? ...y Django
 
Intro Python
Intro PythonIntro Python
Intro Python
 
Bibliotecas o librerias_para_c_
Bibliotecas o librerias_para_c_Bibliotecas o librerias_para_c_
Bibliotecas o librerias_para_c_
 
Presentacion Python
Presentacion  Python Presentacion  Python
Presentacion Python
 
Estructuras básicas para C++
Estructuras básicas para C++Estructuras básicas para C++
Estructuras básicas para C++
 
Precentacion
PrecentacionPrecentacion
Precentacion
 
Programador Jr. para Python Primera Parte
Programador Jr. para Python Primera ParteProgramador Jr. para Python Primera Parte
Programador Jr. para Python Primera Parte
 
Compilador Usando Jflex y Cup
Compilador Usando Jflex y CupCompilador Usando Jflex y Cup
Compilador Usando Jflex y Cup
 
Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015Mini clase Intro Programación Python UTN Profesorado 2015
Mini clase Intro Programación Python UTN Profesorado 2015
 
Integrando mis librerías C++ con Python
Integrando mis librerías C++ con PythonIntegrando mis librerías C++ con Python
Integrando mis librerías C++ con Python
 
Estructura programa c++
Estructura programa c++Estructura programa c++
Estructura programa c++
 
C++
C++C++
C++
 
Python (Lenguaje de Programación)
Python (Lenguaje de Programación)Python (Lenguaje de Programación)
Python (Lenguaje de Programación)
 

Similar a Roger1 libreria

Estructura básica de un programa en C++
Estructura básica de un programa en C++Estructura básica de un programa en C++
Estructura básica de un programa en C++
Rosbelia Balza
 
procesos
procesosprocesos
Estructura(2)
Estructura(2)Estructura(2)
Estructura(2)
wendy_romero06
 
Estructura
EstructuraEstructura
Estructura
Efren Pacheco
 
Estructura Básica para C++
Estructura Básica para C++Estructura Básica para C++
Estructura Básica para C++
pilgrim15
 
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)
Maztherprozh
 
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup
 
Estructura basica de un programa en C++
Estructura basica de un programa en C++Estructura basica de un programa en C++
Estructura basica de un programa en C++
juliancetis109
 
Estructura basica de_un_programa_en_c_
Estructura basica de_un_programa_en_c_Estructura basica de_un_programa_en_c_
Estructura basica de_un_programa_en_c_
oscar020615
 
ESTRUCTURA BASICA C++
ESTRUCTURA BASICA C++ESTRUCTURA BASICA C++
ESTRUCTURA BASICA C++
KatherinBarrios17
 
Estructura basica C++
Estructura basica C++Estructura basica C++
Estructura basica C++
ManuelHernandez480
 
ESTRUCTURA BÁSICA PARA C++
ESTRUCTURA BÁSICA PARA C++ESTRUCTURA BÁSICA PARA C++
ESTRUCTURA BÁSICA PARA C++
GabrielFVilla15
 
Guia final so
Guia final soGuia final so
Guia final so
puracastillo
 
Estructura basica para_c_(2)
Estructura basica para_c_(2)Estructura basica para_c_(2)
Estructura basica para_c_(2)
Efren Pacheco
 
Estructura basica de_un_programa_en_c_
Estructura basica de_un_programa_en_c_Estructura basica de_un_programa_en_c_
Estructura basica de_un_programa_en_c_
Diego Arturo
 
Estructura basica para_c_
Estructura basica para_c_Estructura basica para_c_
Estructura basica para_c_
CARLOS EDUARDO BALDIT MARTINEZ
 
Estructura basica de_c_
Estructura basica de_c_Estructura basica de_c_
Estructura basica de_c_
LaishaXime
 
Estructura basica de_c_(2)
Estructura basica de_c_(2)Estructura basica de_c_(2)
Estructura basica de_c_(2)
gadiel1515
 
Extendiendo aplicaciones en C y C++ con Python
Extendiendo aplicaciones en C y C++ con PythonExtendiendo aplicaciones en C y C++ con Python
Extendiendo aplicaciones en C y C++ con Python
Angel Freire
 
Guía de trabajo
Guía de trabajoGuía de trabajo
Guía de trabajo
Jenny Andrea Flores
 

Similar a Roger1 libreria (20)

Estructura básica de un programa en C++
Estructura básica de un programa en C++Estructura básica de un programa en C++
Estructura básica de un programa en C++
 
procesos
procesosprocesos
procesos
 
Estructura(2)
Estructura(2)Estructura(2)
Estructura(2)
 
Estructura
EstructuraEstructura
Estructura
 
Estructura Básica para C++
Estructura Básica para C++Estructura Básica para C++
Estructura Básica para C++
 
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)
 
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
 
Estructura basica de un programa en C++
Estructura basica de un programa en C++Estructura basica de un programa en C++
Estructura basica de un programa en C++
 
Estructura basica de_un_programa_en_c_
Estructura basica de_un_programa_en_c_Estructura basica de_un_programa_en_c_
Estructura basica de_un_programa_en_c_
 
ESTRUCTURA BASICA C++
ESTRUCTURA BASICA C++ESTRUCTURA BASICA C++
ESTRUCTURA BASICA C++
 
Estructura basica C++
Estructura basica C++Estructura basica C++
Estructura basica C++
 
ESTRUCTURA BÁSICA PARA C++
ESTRUCTURA BÁSICA PARA C++ESTRUCTURA BÁSICA PARA C++
ESTRUCTURA BÁSICA PARA C++
 
Guia final so
Guia final soGuia final so
Guia final so
 
Estructura basica para_c_(2)
Estructura basica para_c_(2)Estructura basica para_c_(2)
Estructura basica para_c_(2)
 
Estructura basica de_un_programa_en_c_
Estructura basica de_un_programa_en_c_Estructura basica de_un_programa_en_c_
Estructura basica de_un_programa_en_c_
 
Estructura basica para_c_
Estructura basica para_c_Estructura basica para_c_
Estructura basica para_c_
 
Estructura basica de_c_
Estructura basica de_c_Estructura basica de_c_
Estructura basica de_c_
 
Estructura basica de_c_(2)
Estructura basica de_c_(2)Estructura basica de_c_(2)
Estructura basica de_c_(2)
 
Extendiendo aplicaciones en C y C++ con Python
Extendiendo aplicaciones en C y C++ con PythonExtendiendo aplicaciones en C y C++ con Python
Extendiendo aplicaciones en C y C++ con Python
 
Guía de trabajo
Guía de trabajoGuía de trabajo
Guía de trabajo
 

Roger1 libreria

  • 1. Archivos complementarios a aplicaciones en Win32 El sistema operativo Windows esta compuesto por una extensa variedad de módulos adicionales al “kernel”, entre ellos podemos encontrar: • “Drivers” (.drv y .sys) • “Drivers virtuales” (.vxd) • Bibliotecas estáticas (.lib) • Bibliotecas dinámicas (.dll)
  • 2. Bibliotecas estáticas • Son aquellas que se requieren durante el tiempo de compilación. • Generalmente se tienen en un archivo con extensión .lib y un archivo de encabezado con extensión .h • No se requieren en la máquina del “cliente” para ejecutar un programa, pero generan un código ejecutable grande.
  • 3. Biblioteca estática Supóngase que dentro de un programa se desea utilizar una rutina cuyo código ya fué desarrollado anteriormente, quizás por alguien que no es el programador actual. Para hacer esto se requiren tres cosas: • Conocer los parámetros que requiere y el tipo de dato que regresa la función (API). long Multiply2Longs(long l1, long l2); • Archivo con prototipo de la función. • Archivo con código intermedio de la función.
  • 4. Aplicación que utiliza biblioteca estática Supóngase que dentro de un programa se desea utilizar una rutina cuyo código ya fué desarrollado anteriormente, quizás por alguien que no es el programador actual. #include <stdio.h> #include <stdlib.h> #include <windows.h> Si solo es necesaria una función, se puede dejar indicada en vez de long l1; realizar el #include del archivo. long l2; long lResult; extern "C" long Multiply2Longs(long l1, long l2); void main() { //Inclusión explícita: Requiere la inclusión del archivo .LIB l1=10; l2=20; lResult=Multiply2Longs(l1,l2); printf("Resultado=%dn",lResult); getchar(); }
  • 5. Aplicación que utiliza biblioteca estática
  • 6. Código de la biblioteca estática El código de una biblioteca estática es simple, consiste únicamente de las rutinas que la componen y su código interno. La única consideración que cabe destacar se presenta al compilar el archivo, esto debido a que no se generará otro archivo con extensión .exe sino uno con extensión .lib.
  • 7. Código de una biblioteca estática Al crear el proyecto, se debe especificar que se va a generar el código para una biblioteca estática.
  • 8. Bibliotecas dinámicas • Archivos precomilados que pueden enlazarse al código principal durante la etapa de ejecución de una aplicación. • El archivo con extensión DLL se requiere en la máquina del “cliente” para que pueda ejecutarse la aplicación. • Normalmente, los DLLs van al directorio windowssystem o windowssystem32
  • 10. Aplicación que utiliza DLL #include <stdio.h> #include <stdlib.h> #include <windows.h> HINSTANCE hCodigoDll; long l1; long l2; long lResult; typedef long (TIPOFUNCION)(long, long); TIPOFUNCION* pfuncMultiply2Longs=0; En forma similar al manejo de archivos, se define una variable que servirá para abrir el DLL.
  • 11. Aplicación que utiliza DLL #include <stdio.h> #include <stdlib.h> #include <windows.h> HINSTANCE hCodigoDll; long l1; long l2; long lResult; typedef long (TIPOFUNCION)(long, long); TIPOFUNCION* pfuncMultiply2Longs=0; Se define un tipo de dato que deberá corresponder al prototipo de la función. Se define un apuntador al tipo de función que se definió en el párrafo anterior.
  • 12. Aplicación que utiliza DLL void main() { //Inclusión implícita: Realiza inclusión dinámica de la biblioteca if (hCodigoDll =LoadLibrary("dll_test.dll")) { if (pfuncMultiply2Longs=(TIPOFUNCION*) GetProcAddress(hCodigoDll ,"Multiply2Longs")) { l1=10; l2=20; lResult=(*pfuncMultiply2Longs)(l1,l2); printf("Resultado=%dn",lResult); } else printf("Error al obtener la dirección del procedimiento!n"); } else printf("Biblioteca no localizada!n"); FreeLibrary(hModule); getchar(); } Se “carga” el DLL y se liga con la variable hModule.
  • 13. Aplicación que utiliza DLL void main() { //Inclusión implícita: Realiza inclusión dinámica de la biblioteca if (hCodigoDll =LoadLibrary("dll_test.dll")) { if (pfuncMultiply2Longs=(TIPOFUNCION*) GetProcAddress(hCodigoDll ,"Multiply2Longs")) { l1=10; l2=20; lResult=(*pfuncMultiply2Longs)(l1,l2); printf("Resultado=%dn",lResult); } else printf("Error al obtener la dirección del procedimiento!n"); } else printf("Biblioteca no localizada!n"); FreeLibrary(hModule); getchar(); Se busca dentro del DLL la función } que nos interesa invocar, utilizando para ello la referencia hModule.
  • 14. Aplicación que utiliza DLL void main() { //Inclusión implícita: Realiza inclusión dinámica de la biblioteca if (hCodigoDll =LoadLibrary("dll_test.dll")) { if (pfuncMultiply2Longs=(TIPOFUNCION*) GetProcAddress(hCodigoDll,"Multiply2Longs")) { l1=10; l2=20; lResult=(*pfuncMultiply2Longs)(l1,l2); printf("Resultado=%dn",lResult); } else printf("Error al obtener la dirección del procedimiento!n"); } else printf("Biblioteca no localizada!n"); FreeLibrary(hModule); getchar(); } Si la función fué localizada, se liga con el apuntador pfuncMultiply2Longs.
  • 15. Aplicación que utiliza DLL void main() { //Inclusión implícita: Realiza inclusión dinámica de la biblioteca if (hCodigoDll =LoadLibrary("dll_test.dll")) { if (pfuncMultiply2Longs=(TIPOFUNCION*) GetProcAddress(hCodigoDll ,"Multiply2Longs")) { l1=10; l2=20; lResult=(*pfuncMultiply2Longs)(l1,l2); printf("Resultado=%dn",lResult); } else printf("Error al obtener la dirección del procedimiento!n"); } else printf("Biblioteca no localizada!n"); FreeLibrary(hCodigoDll); getchar(); Se manda ejecutar el contenido del apuntador } pfuncMultiply2Longs, en forma similar a como se invoca una función.
  • 16. Código de un DLL //Archivo dll_test.c #include <windows.h> #define DllExport __declspec(dllexport) DllExport long Multiply2Longs(long n1, long n2) { return(n1*n2); }
  • 17. Bibliotecas en LINUX • Existen tres tipos de bibliotecas. – De enlace estático. – De enlace dinámico (“shared object”). • Con enlace implícito: Etiquetadas durante tiempo de compilación con rutinas implícitamente enlazadas durante tiempo de ejecución. • Con enlace explícito: Explícitas en el procedimiento de enlace y desenlace durante tiempo de ejecución. • Para soportar el proceso de enlace dinámico el sistema operativo utiliza un módulo de código llamado “dynamic linker”.
  • 18. Formatos de código binario • Todos los tipos de bibliotecas consisten de código binario que debe ser enlazado al código binario de un programa para su ejecución. • El vinculador (“linker”) debe realizar un proceso de relocalización de código cada vez que una biblioteca se enlaza con una aplicación. • Para que en vinculador (dinámico o estático, cualquiera de ellos) pueda realizar su función requiere un formato estandarizado de código; en Linux existen dos: – COFF (“Common Object File Format”): Utilizado inicialmente pero descontinuado en la actualidad. – ELF (“Executable Linkage Format”): Vigente en todas las distribuciones del sistema operativo.
  • 19. Tablas de símbolos • Una vez que se realiza el proceso de compilación del código fuente, se pierden todas las referencias a los nombres de variables y rutinas, en el código objeto solo quedan referencias a memoria dónde se localizarían variables y rutinas … pero esto no es útil para el “dynamic linker” de modo que el proceso de compilación requiere que en el código binario queden definidas las tablas de símbolos de las bibliotecas, a esto se le conoce como ABI. – API (“Application Programmer Interface”). – ABI (“Application Binary Interface”).
  • 20. Generación de una biblioteca estática Pasos para generación de una biblioteca estática: 2.Compilar el código fuente: gcc –Wall –c archUnoBibEstatica.c archDosBibEstatica.c Lo anterior producirá: archUnoBibEstatica.o y archDosBibEstatica.o 5.Condensar el código objeto de los diferentes archivos que conformen la biblioteca estática: ar –cvq libBibEstatica.a archUnoBibEstatica.o archDosBibEstatica.o Lo anterior producirá: libBibEstatica.a 8.Enlazar la biblioteca con alguna aplicación que la requiera (la aplicación requiere la declaración de prototipos o un archivo de encabezado): gcc prog.c –L/path/to/lib -lBibEstatica Lo anterior producirá: a.out
  • 21. Bibliotecas de enlace dinámico • Los dos tipos de bibliotecas requieren la creación de un código compartido (“shared object”). • Este tipo de códigos ofrecen diversas ventajas: – Soporte para programas que utilizan diferentes versiones de una misma biblioteca. – Actualizaciones automáticas y renovación de versiones. – Hacer todo lo anterior mientras otros programas se ejecutan utilizando bibliotecas de versiones anteriores. • Los objetos compartidos tienen nombres etiquetados como “fully- qualified soname”. – “soname”  prefijo lib + nombre + .so + .version – “real-name”  soname + .minor_num [ + .release ] – “linker name”  soname - .version • Es común que los nombres “soname” y para el “linker” sean ligas simbólicas al “real-name”.
  • 22. Directorios predefinidos • Normalmente los “shared objects” están ubicados en: – /usr/lib … para versiones “release”. – /usr/local/lib … para versiones “developer”. • Sin embargo, la variable de ambiente LD_LIBRARY_PATH puede ser utilizada para hacer referencia a otra carpeta, de modo que el “dynamic linker” pueda encontrar la biblioteca durante tiempo de ejecución de un programa.
  • 23. Generación de un “shared object” 1. Crear el código objeto. gcc –fPIC –c archUnoBibDinamica.c archDosBibDinamica.c Lo anterior producirá: archUnoBibDinamica.o y archDosBibDinamica.o 4. Crear la biblioteca. gcc –shared –Wl,-soname=libBibDinamica.so.1 -o libBibDinamica.so.1.0.1 *.o Lo anterior producirá: libBibDinamica.so.1.0.1 7. Instalar la biblioteca. cp libBibDinamica.so.1.0.1 /usr/lib ln –sf /usr/lib/libBibDinamica.so.1.0.1 /usr/lib/libBibDinamica.so ln –sf /urs/lib/libBibDinamica.so.1.0.1 /usr/lib/libBibDinamica.so.1 Lo anterior producirá dos ligas simbólicas: libBibDinamica.so y libBibDinamica.so.1 11. Compilar la aplicación que requerirá a la biblioteca. gcc –Wall –L/path/to/lib prog.c –lBibDinamica Lo anterior producirá: a.out
  • 24. Biblioteca de enlace dinámico explícito • Requieren que el código del programa carge explícitamente el código binario de la biblioteca y búsque en él las rutinas de interés. • Las siguientes funciones son útiles para esto: – dlopen(…) – dlclose(…) – dlsym(…) – dlerror(…)
  • 25. Código fuente de una aplicación #include <stdio.h> #include <dlfcn.h> int main() { void *lib_handle; int (*fn)(int,int); char *error; lib_handle = dlopen("/opt/lib/libBibCompartida.so", RTLD_LAZY); if (!lib_handle) { fprintf(stderr, "%sn", dlerror()); return(1); } fn = dlsym(lib_handle, "add2ints"); if ((error = dlerror()) != NULL) { fprintf(stderr, "%sn", error); return(1); } printf("add=%dn",(*fn)(1,2)); . . . gcc -rdynamic prog.c -ldl dlclose(lib_handle); Lo anterior producirá: a.out return(0); }