elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Capitulo I] Introduccion a la programacion en Linux C/C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Capitulo I] Introduccion a la programacion en Linux C/C++  (Leído 4,204 veces)
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
[Capitulo I] Introduccion a la programacion en Linux C/C++
« en: 4 Octubre 2010, 04:50 am »

Compilando con GCC

   Un compilador transforma desde un codigo fuente legible por los humanos en un objeto legible para una maquina. En los sistemas operativos basados en Linux los compiladores por excelencia forman parte del GNU Compiler Collection, usualmente conocidos como GCC. GCC incluye compiladores para C, C++, Java y Fortran.

   Supongamos que tenemos un codigo simple, por ejemplo verificar si un numero es o no perfecto, en el cual tenemos un codigo fuente en C++ llamado "perfect.cpp", un archivo de cabecera C++ llamado "perfect.hpp" un codigo fuente en C llamado "main.c", supongamos que ambos archivos seran compilados, luego seran enlazados para crear un programa llamado "perfect" el cual nos dira si un numero es o no un numero perfecto.

main.c:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "perfect.hpp"
  4.  
  5. int main(int argc,char *argv[])
  6. {
  7. int a;
  8. if(argc>1)
  9. {
  10. a = atoi(argv[1]);
  11. if(perfect(a))printf("El numero %i es perfecto\n",a);
  12. else printf("El numero %i no es perfecto\n",a);
  13. }
  14. return 0;
  15. }
  16.  

perfect.cpp:
Código
  1. #include "perfect.hpp"
  2.  
  3. int perfect(int a)
  4. {
  5. int b=0;
  6. for(int i=1;i<a;i++)if(a%i==0)b+=i;
  7. if(a==b)return 1;
  8. else return 0;
  9. }

perfect.hpp:
Código
  1. #ifndef _Perfect
  2. #define _Perfect
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6.  
  7. extern int perfect(int);
  8.  
  9. #ifdef __cplusplus
  10. }
  11. #endif
  12. #endif
  13.  


El nombre del compilador de C es gcc y para compilar un archivo se utiliza la opcion -c. El compilador de C++ es g++ y al igual que el compilador de C se utiliza la opcion -c. Compilando los codigo fuente antes vistos tendriamos:

Código:
lordrna@personal-laptop:~$ gcc -c main.c
lordrna@personal-laptop:~$ g++ -c perfect.cpp

En caso de que no suceda ningun error se crearan los archivos "main.o" y "perfect.o".

Para mas informacion del compilador:

Código:
lordrna@personal-laptop:~$ info gcc

Enlazar archivos compilados

Cuando obtengamos los archivos compilados que ya necesitemos enlazarlos, deberemos utilizar siempre g++ en caso de que alguno de los compilados a enlazar contenga codigo en C++, incluso si es simplemente un solo archivo compilado contiene codigo fuente en C++. Para esto utilizaremos:

Código:
lordrna@personal-laptop:~$ g++ -o Perfecto main.o perfect.o

Entre las principales ventajas que nos brinda compilar y luego enlazar  es que en caso de que uno de los archivos fuente tenga un error simplemente tendriamos que reparar el error, compilar el codigo fuente modificado y enlazar con los demas.


Utilizando el Debugger de GNU (GDB)

   Para agregar informacion extra para poder buscar posibles errores con el debugger de GNU añadiremos la opcion '-g', esto agrega informacion extra para poder tracear el programa. La forma de compilar y enlazar quedaria de la siguiente forma:

Código:
lordrna@personal-laptop:~$ gcc -g -c main.c
lordrna@personal-laptop:~$ g++ -g -c perfect.cpp
lordrna@personal-laptop:~$ g++ -g -o Perfecto main.o perfect.o

Cuando compilamos y enlazamos de esta forma el debugger obtiene informacion de que direccion de memoria corresponde a cada linea del codigo fuente, como mostrar variables locales entre otras cosas.

Para ejecutar el GNU Debbuger escribimos en consola:
Código:
lordrna@personal-laptop:~$ gdb perfecto

Para mas informacion 'man gdb'

En caso de que el programa perfecto exista en consola aparecera:

Código:
(gdb)

para ejecutar el programa escribimos 'run' y seguido los parametros, en caso de ser necesarios:

Código:
(gdb) run 6

En caso de que exista un error con 'where' nos mostrara la porcion del codigo donde el debugger tuvo problemas para ejecutar y asi podremos en el codigo fuente modificar la parte defectuosa:

Código:
(gdb) where

Podremos tambien colocar breakpoints dando el nombre de la funcion donde queremos colocarlo:

Código:
(gdb) break main

Para ver el valor de una variable utilizamos 'print' seguido del nombre de la variable.

Código:
(gdb) print argv[1]

Si quieres avanzar un paso, pero recibiendo los valores de retorno de las funciones se utiliza 'next'.

Código:
(gdb) next

Si quieres adentrarte en las funciones mientras avanzas se utiliza 'step'.

Código:
(gdb) step


En línea

Foxy Rider


Desconectado Desconectado

Mensajes: 2.407


Deprecated


Ver Perfil WWW
Re: [Capitulo I] Introduccion a la programacion en Linux C/C++
« Respuesta #1 en: 5 Octubre 2010, 18:12 pm »

El mismo gcc invoca al linker, por lo que lanzar el gcc con -c y luego pasar archivos de objeto es algo redundante ...  por que -c justamente es "compilar/ensamblar pero no linkear"
Código
  1. gcc [fuentes] -o Salida

respecto a lo de gdb, agrego esta mini guía : http://cs.baylor.edu/~donahoo/tools/gdb/tutorial.html

Saludos


En línea

Garfield07


Desconectado Desconectado

Mensajes: 1.121


¡Este año voy a por todas! JMJ 2011


Ver Perfil WWW
Re: [Capitulo I] Introduccion a la programacion en Linux C/C++
« Respuesta #2 en: 5 Octubre 2010, 19:59 pm »

Muy buen post para los que quieren aprender.. yo en mis tiempos estuve 2 semanas para compilar un programa en Linux, porque no sabía ejecutar los ejecutables del GCC...

Gracias!
En línea



* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Blog: Introducción al sinsentido de GNU/Linux (y Linux) « 1 2 »
GNU/Linux
Foxy Rider 10 5,538 Último mensaje 16 Julio 2012, 19:56 pm
por dac
¿Se puede saltar algún capitulo de un libro de programación?
Programación General
Yidu 5 2,554 Último mensaje 9 Febrero 2013, 21:35 pm
por 0xDani
Introducción a Servidores Linux con Debian
Tutoriales - Documentación
r32 0 2,122 Último mensaje 12 Diciembre 2020, 10:14 am
por r32
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines