Publicidad

jueves, 10 de noviembre de 2011

Bibliotecas dinámicas

Bibliotecas Compartidas

gcc -c -fPIC funcion1.c funcion2.c

Generar la biblioteca compartida:

gcc -shared -o libcompartida.so funcion1.o funcion2.o

Generar el ejecutable:

gcc -o ejecutable principal.c -L. -lcompartida
________________________________
Falta modificar las variables de entorno, ejecute lo siguiente desde
la interfaz de línea de comandos:

LD_LIBRARY_PATH=.
export LD_LIBRARY_PATH

genere el ejecutable.

2.- Si ya siguió los pasos, haga lo que sigue:

a) Verifique que funcione el programa principal.
¿Funciona?
¿Falta algo?
c) Una vez que se haya resuelto el problema si es que existiera,
pruebe mover el archivo (ejecutable) a una ubicación distinta a la
actual, funciona?
Si ¿por qué?
No ¿Por qué?

viernes, 21 de octubre de 2011

Definición del proyecto

Se requiere programar un Cargador relocalizable en "C" usando archivos de texto y/o binarios, 
con la(s) siguiente(s) funcionalidad(es):

  • Carga de un archivo determinado en la "memoria"
  • Descarga de un archivo de la "memoria"
  • Impresión en pantalla de la "memoria" identificando los archivos que se encuentran en ella (use colores para identificar estos archivos).

Fecha Entrega: Examen ordinario

Elaborar un reporte en el que se:
  • Explique el diseño modular del programa.
  • Explicar de forma breve cada una de las funciones ocupadas.

Entregar:
  1. Documentación básica.
  2. Código.
  3. Ejecutable.
  4. En CD en un sobre bolsa.

martes, 4 de octubre de 2011

Ejercicio: 041011

Capturar el archivo y generar el analizador de léxico.

viernes, 12 de noviembre de 2010

[Algunos enlaces útiles]

Material de bibliotecas: http://goo.gl/uov2n
Material para aprender a programar en shell: http://goo.gl/pj9KD
Diapositivas de repaso: http://goo.gl/Q30UB
Código(búsqueda, API's, Android, etc.): http://code.google.com/




martes, 9 de noviembre de 2010

Práctica de Utilerías

Descarga el material de utilerías.


Haz una evidencia de lectura (cuadro sinóptico, mapa mental, mapa de araña, etc.)


Haz la siguiente investigación en Internet:


Busca en qué consiste:

Dist-utils

bin-utils

shell-utils

file-utils

core-utils

diff-utils

Anota en tu libreta cuál o cuáles son los comandos que forman parte de cada una de estas utils y una descripción breve, así como la sintaxis de cada uno.

Diapositivas: Depuración

Depuradores

Depuración con GDB

#include 
#include 

char* Mstrupr(char* szCad);

int main()
{
char szCadena[] = "Esto es una cadena";

printf("%s\n", Mstrupr(szCadena));
printf("%s\n", Mstrupr("Esto es otra cadena"));

return 0;
}

char* Mstrupr(char* szCad)
{
int i;

for (i=0; szCad[i]; i++)
szCad[i] = toupper(szCad[i]);

return szCad;
}



Compilamos y ...
Según el compilador no hay error alguno en el código, pero al ejecutar, esto es lo que sucede:
$ ./sample
ESTO ES UNA CADENA
Segmentation Fault (core dumped)
$
Para localizar el problema utilizamos gdb con el programa del siguiente modo:
$ gdb sample
.
.
(gdb) break main
Breakpoint 1 at 0x8048348: file sample.c, line 8
(gdb) run
Breakpoint 1, main() at sample.c:8
8     char szCadena[] = "Esto es una cadena";
(gdb) next
10    printf("%s\n", Mstrupr(szCadena));
(gdb) next
ESTO ES UNA CADENA
12    printf("%s\n", Mstrupr("Esto es otra cadena"));
(gdb) step
Mstrupr(szCad=0x804856f "Esto es otra cadena") at sample.c:17
21    for (i=0; szCad[i]; i++)
(gdb) next
22       szCad[i] = toupper(szCad[i]);
(gdb) next
Program received signal SIGSEGV, Segmentation fault
0x80484e1 in Mstrupr (szCad=0x08048e1 in Mstrupr (szCad=0x0804856f
"Esto es otra cadena") at sample.c:19
22       szCad[i] = toupper(szCad[i]);
(quit) next
Program terminated with signal SIGSEGV, Segmentation fault
The program no longer exists
(gdb) quit
$
Como vemos, el programa recibe la señal SIGSEGV cuyo significado es "fallo de segmentación" o "violación de segmento", eso quiere decir que nuestro programa ha intentado acceder a memoria que NO       le ha sido asignada por el sistema operativo.
El punto en el que el programa es abortado corresponde con la asignación:
szCad[i] = toupper(szCad[i]);
que corresponde a la función Mstrupr( ), es decir, el valor a la izquierda de la asignación es una localización de memoria que no podemos modificar. Dicha posición de memoria es parte de la cadena "Esto es otra cadena", concretamente el primer carácter.
Pero... ¿por qué no falló la función la primera vez que se llamó y sí la segunda? La respuesta es evidente a la vista del código: En la primera llamada, el argumento es una cadena estática, mientras que en la segunda llamada el argumento es un literal, y como es lógico un literal no puede modificarse porque no es una variable.
De modo que, para solucionar el problema debemos almacenar el literal en otra cadena igual que se hace con la primera. El código modificado quedaría como sigue (la función Mstrupr( ) no sufre ninguna modificación).
int main()
{
char szCadena[] = "Esto es una cadena";
char szOtraCadena[] = "Esto es otra cadena";

printf("%s\n", Mstrupr(szCadena));
printf("%s\n", Mstrupr(szOtraCadena));

return 0;
}
Al compilar y ejecutar el nuevo código obtenemos:
$ ./sample
ESTO ES UNA CADENA
ESTO ES OTRA CADENA
$