Chrooter apache
Matériel
Ajout disque dur
Ajout carte
Audit des disques durs
Gestion des peripheriques
Disquette d'installation
Ajout d'un scanner
Graver en ligne de commande
Astuces
Ajout d'une imprimante
Réseau
Configuration reseau
Dns
Serveur cvs
Proxy squid 
Installation serveur ftp
Installation qmail 
Installation serveur courrier sous debian
Outil TCP/IP 
Le serveur samba
Connexion a distance securisee
Client/serveur vnc
Configurer apache
Dyndns
Sécurité
Chiffrer un fichier/dossier
Securiser son poste
Mur pare feu pas a pas
Authentification ht-access
Surveillance de serveur CACTI
Snort
Snort-inline
Securiser Apache avec mod_security
Filtrage squid/squidguard/dansguardian
Auditer son site web
Sécuriser son linux
Installer un Lamp avec ssl
Contrer les scans de ports
Traitement anti-spam
Installer/Utiliser tripwire
Faire des sauvegardes incrémentales
Divers
Utilisation de lilo
Les commandes Linux
Le multi-tache
Le crontab
Exploration de la configuration
Quotas
Messagerie
Installer une application
Debugger ses applications
Le format RPM
Mise a jour du noyau
Qemu
Tour d'horizon des principaux p2p
Récupération du système
Bips d'un pc
Astuces windows
Table Ascii
Lamerland
Conversion de fichiers musicaux
Compiler ses rpms
Liens
hakin9
Secureroot.com
Hackerthreads.org
Defcon
Hackerlounge
Les derniers exploits
Tous les codes sources
Securite sous Linux
Les logiciels libres quotidiens
Ezine divers
Madchat
Textes divers
Archives
 
Traductions LG
Toutes les traductions
Traductions Phrack
Toutes les traductions

Il y a actuellement 3 visiteurs connectés sur le site !

Google

Comment compiler avec gcc
Comment compiler avec gcc

 

Introduction
Installation
Les arguments de gcc
Avec des bibliothèques
Make 
Les directives
Creer une adresse mail anonyme

 

Introduction :

GCC (GNU Compiler Compilation) est un compilateur sous linux, permettant de compiler du C, du C++, du Java, et j'en passe...

Installation :

Comme d'habitude il s'agira de privilégier l'installation via les paquetages de votre distribution :
sous mandriva et avec les sources à jour depuis easyurpmi.org saisir en console et en root :

urpmi binutils

Ceci installera gcc, g++, mais aussi la commande make qui sera utile pour la suite !
gcc se lance depuis un terminal avec les arguments suivants :

gcc [arguments] [fichiers à compiler] (-o fichier de sortie)

Sans arguments, gcc fait toute la compilation jusqu'à l'exécutable. L'argument -o permettra de spécifier le nom du fichier de sortie, quelque soit les autres arguments, et donc quelque soit son type !

exemple
gcc main.c fonctions.c -o application
Ceci créera l'exécutable 'application' basé sur main.c et fonctions.c.
Cela se passe de la même façon en C++ ou l'on utilise g++ au lieu de gcc :

g++ main.cpp fonctions.cpp -o Application
Le programme se lance avec
./Application

Les arguments de gcc

Il existe de nombreux arguments dont voici les plus courants :
-c : indique à GCC de ne pas linker.
ce qui donne un fichier objet (.o).
gcc -c main.c -o main.o
-v : mode verbeux.comme son nom l'indique
-g : mode Debugger
L'affichage des warnings sera plus détaillé !
-o [fichier] : spécifie la cible qui peut être un exécutable ou un fichier objet
gcc -o main.o -c main.c
-I : spécifie le ou les répertoire(s) des headers
indique à gcc où rechercher les fichiers .h.
Par exemple, si vos .c sont dans le dossier sources et vos .h sont dans le dossier headers, il vous faudra entrer :
gcc sources/*.c -I headers -o Programme
-w : supprime tous les avertissements
-W : GCC plus exigeant quant aux warnings
-Wall : GCC est encore plus exigeant !

Avec des bibliothèques

Le compilateur gcc permet de compiler des bibliothèques statiques ou dynamiques. Les premières (généralement d'extension .a) sont jointes a l'exécutable lors de la compilation.
exemple:

gcc -c fichier.c -o fichier.o
ar -q libfichier.a fichier.o

Après avoir créé le fichier objet, ar archive ce fichier.
gcc fichier1.o fichier2.o fichier3.o libfichier.a -o Application

Les bibliothèques dynamiques - .so (Sharing Object) sous Linux ou .dll (Dynamic Link Library) sous Windows - sont des bibliothèques qui ne sont pas intégrées à l'exécutable lors de l'édition de liens. L'exécutable appelle alors la bibliothèque pour exécuter les fonctions, ce qui permet de l'utiliser plusieurs programmes et d'alléger l'exécutable
exemple

gcc -c -fPIC fichier -o fichier.o
gcc -shared -fPIC fichier.o -o libfichier.so


L'option -fPIC (Position Independent Code) compile sans indiquer d'adresse mémoire dans le code, car en fonction du programme qui l'utilisera les adresses pourront être différentes. Ceci évitera des conflits entre les bibliothèques.
L'option -shared indique que c'est une bibliothèque partagée (autre façon de dire dynamique).
Cela se compile de la sorte

gcc -fPIC fichier.o fichier2.o fichier3.o libfichier.so -o Application
Toutefois, Linux a pour coutume de chercher sa bibliothèque non pas dans le répertoire courant, mais dans un répertoire donné On utilisera donc la variable LD_LIBRARY_PATH :
Cette variable donne les autres chemins où sont appelés les bibliothèques. Elle est sous la forme chemin1:chemin2:chemin3.Vous pouvez voir sa valeur en utilisant:
echo $LD_LIBRARY_PATH
qui sera définie de la sorte
export LD_LIBRARY_PATH=chemin:$LD_LIBRARY_PATH
Pour indiquer le répertoire courant, utilisez le point (.).

Make

Les fichiers make se rencontrent lors de la compilation d'archive au format tar.gz. Make exécute une série de commandes dans un fichier appelé Makefile.

Le fichier Makefile est celui dans lequel on met les commandes qui seront exécutées par make. Vous devez donc avoir make installé (relancez votre gestionnaire de paquets si nécessaire).
Le fichier make se compose d'une cible (le nom du fichier crée), des dépendances,(les fichiers necessaires à la cible), et des commandes pour créer la cible.
Pour effectuer un Makefile avec ces trois fichiers :
Nous avons trois fichiers : main.c, fonctions.c et fonctions.h.
Pour compiler on fait :

gcc -c fonctions.c -o fonctions.o
gcc -c main.c -o main.o
gcc main.o fonctions.o -o Programme

#Ceci est mon Makefile
Programme : main.o fonctions.o
gcc main.o fonctions.o -o Programme

main.o : main.c fonctions.c
gcc -c main.c -o main.o

fonctions.o : fonctions.c
gcc -c fonctions.c -o fonctions.o

Ne pas oublier les tabulations avant les lignes de commandes
Pour créer l'exécutable Programme, on exécute la première dépendance (main.o).
Si le fichier main.c est plus récent que le fichier main.o, la commande est alors exécutée et main.o est construit, mais si main.o est plus récent que main.c ,la commande n'est pas exécutée. L'évalution de la règle main.o est terminée.
Les autres dépendances de la règle Programme (en l'ocurrence ici : fonctions.o) sont examinées de la même manière (si fonctions.c est plus récent que fonctions.o, la commande qui construit ce dernier est exécutée).
Enfin, si nécessaire (si un des objets est plus récent que Programme), la commande de la règle Programme est exécutée et Programme est construit.
En résumé, les règles seront exécutées dans l'ordre inverse de l'écriture du Makefile, selon que les dépendances soient ou non plus récentes que leur cible !
Et on le lance de la sorte :
make Programme

Si on veut ajouter d'autres fonctions à notre Makefile, comme par exemple une fonction clean qui permet de supprimer les fichiers temporaires, et une fonction mrproper qui permet un rebuild complet, on a

#création de l'exécutable 'Programme'
all: main.o fonctions.o
gcc main.o fonctions.o -o Programme

main.o: main.c fonctions.h
gcc -c main.c -o main.o

fonctions.o: fonctions.c
gcc -c fonctions.c -o fonctions.o

#suppression des fichiers temporaires
clean:
rm -rf *.o

#suppression de tous les fichiers, sauf les sources,
#en vue d'une reconstruction complète
mrproper: clean
rm -rf hello

* all: compile tous les fichiers source pour créer l'exécutable principal;
* install: exécute all, et copie l'exécutable, les librairies, les datas, et les fichiers en-tête s'il y en a dans les répertoires de destination;
* uninstall: détruit les fichiers créés lors de l'installation, mais pas les fichiers du répertoire d'installation (où se trouvent les fichiers source et le Makefile);
* clean: détruit tout les fichiers créés par all;
* info: génère un fichier info;
* dvi: génère un fichier dvi;
* dist: crée un fichier tar de distribution;


Ensuite on continue avec
make all

make clean

pour supprimer les fichiers temporaires

make mrproper

pour préparer une reconstruction complète.

make && make clean

pour installer le programme sans laisser de fichiers temporaires.

make mrproper && make

fera une reconstruction complète du programme.

Les directives

Dans certains cas, le Makefile tel que ci-dessus peut présenter quelques problèmes. Reprenons la règle clean :

clean: rm -rf *.o

Vous remarquerez que cette règle ne présente pas de dépendance. make accepte ces règles, le fichier est alors considéré comme à jour s'il existe.
Mais il n'y a pas de fichiers clean ?
Justement, s'il y a dans le répertoire courant un fichier nommé clean, la commande ne sera jamais effectuée.
On définit alors clean comme étant une cible particulière avec la directive .PHONY ! On ajoutera simplement une ligne au Makefile avant clean, voire même en tête du fichier. Dans notre exemple on définira clean et mrproper comme cibles spéciales :
.PHONY: clean, mrproper

Les règles implicites

Make est capable de générer certains fichiers même si on ne lui indique pas la commande !

Reprenons la règle all et ses dépendances :

all: main.o fonctions.o
gcc main.o fonctions.o -o Programme

main.o: main.c fonctions.h
gcc -c main.c -o main.o

fonctions.o: fonctions.c
gcc -c fonctions.c -o fonctions.o

Si on supprime la règle main.o make trouvera tout seul comme un grand comment créer main.o à partir de main.c !
On appelle cela les règles implicites. Ces règles - inexistantes dans le Makefile mais appliquées - peuvent poser des problèmes avec certains Makefile plus complexes. On mettra alors la directive .SUFFIXES en tête du Makefile pour etre tranquille !

Mon Makefile devient alors :

#définition des cibles particulières
.PHONY: clean, mrproper

#désactivation des règles implicites
.SUFFIXES

#all
all: main.o fonctions.o
gcc main.o fonctions.o -o Programme

main.o: main.c fonctions.h
gcc -c main.c -o main.o

fonctions.o: fonctions.c
gcc -c fonctions.c -o fonctions.o

#clean
clean:
rm -rf *.bak rm -rf *.o

#mrproper
mrproper: clean
rm -rf hello
Ces directives ne sont pas obligatoires, mais il vaut mieux prendre l'habitude de les mettre par sécurité.

Les variables dans Make

On peut introduire des variables dans Make.qui ressemblent aux macro-commandes #define en C !
On introduit une variable sous la forme NOM = VALEUR.
On appelle ensuite sa valeur avec $(NOM).

Un petit exemple pour être plus clair :
Définissons la variable CC pour définir le compilateur : CC = gcc.
on remplace alors gcc par $(CC) dans les commandes.

De même, imaginons qu'on veuille mettre des arguments à gcc pour la compilation.
Par exemple gcc -W -Wall -v.
On définit pareillement CFLAGS = -W -Wall -v.
On ajoute $(CFLAGS) aux commandes.

Mettons ça sur notre Makefile (toujours le même) :

#définition des cibles particulières
.PHONY: clean, mrproper

#désactivation des règles implicites
.SUFFIXES

#définition des variables
CC = gcc
CFLAGS = -W -Wall -v

#all
all: main.o fonctions.o
$(CC) main.o fonctions.o -o Programme

main.o: main.c fonctions.h
$(CC) -c main.c -o main.o $(CFLAGS)

fonctions.o: fonctions.c fonctions.h
$(CC) -c fonctions.c -o fonctions.o $(CFLAGS)

#clean
clean:
rm -rf *.bak rm -rf *.o

#mrproper
mrproper: clean
rm -rf Programme

Maintenant, si on veut utiliser d'autres arguments, il suffira de changer la valeur de CXFLAGS en tête du fichier !

* AR: programme de maintenance d'archive (ar);
* CC: compilateur C (gcc);
* CXX: compilateur C++ (g++);
* RM: commande pour effacer un fichier (rm);
* TEX: programme pour créer un fichier TeX dvi à partir d'un source TeX (tex);
* ARFLAGS: paramètres à passer au programme de maintenance d'archives;
* CFLAGS: paramètres à passer au compilateur C;
* CXXFLAGS: paramètres à passer au compilateur C++;
* LDFLAGS: paramètres à passer au compilateur pour l'éditions de liens;

Pour les noms de répertoires et les destinations :

* prefix: racine du répertoire d'installation (= /usr/local);
* exec_prefix: racine pour les binaires (= $(prefix));
* bindir: répertoire d'installation des binaires (= $(exec_prefix)/bin);
* libdir: répertoire d'installation des librairies (= $(exec_prefix)/lib);
* datadir: répertoire d'installation des données statiques pour le programme (= $(exec_prefix)/lib);
* statedir: répertoire d'installation des données modifiables par le programme (= $(prefix)/lib);
* includedir: répertoire d'installation des en-têtes (= $(prefix)/include);
* mandir: répertoire d'installation des fichiers de manuel (= $(prefix)/man);
* manxdir: répertoire d'installation des fichiers de la section x du manuel (= $(prefix)/manx);
* infodir: répertoire d'installation des fichiers info (= $(prefix)/info);
* srcdir: répertoire d'installation des fichiers sources (= $(prefix)/src);


Les variables automatiques


Makefile permet aussi l'utilisation de variables automatiques, calculées lors de l'exécution de chaque règle.

* $@: nom de la cible;
* $<: première dépendance de la liste des dépendances;
* $?: les dépendances plus récentes que la cible;
* $^: toutes les dépendances;
* $*: correspond au ' * ' simple dans le shell, i.e. représente n'importe quel nom;

On peut alors (encore!) remplacer notre Makefile par :

#all
all: main.o fonctions.o
$(CC) $^ -o Programme $(CFLAGS)

main.o: main.c fonctions.h
$(CC) -c $< -o $@ $(CFLAGS)

fonctions.o: fonctions.c
$(CC) -c $< -o $@ $(CFLAGS)

Sources de l'article

 

Forum
Forum d'entraide
Blog
Le blog
News
Les news du site
Php/Mysql
Formulaire en php
Administrer un serveur Mysql
Session en php
Gerer ses bases mysql
Les bases php
Securiser ses scripts PHP
Controler ses programmes avec RATS
Convertir une base sql en utf8
Astuces php
Programmation
Python rapide
Tutorial Python
Tutorial Perl
Tutorial Perl complet
Tutoriel ruby
Tutoriel C
Introduction à gawk
Filtres et utilitaires
Find
Programmation Shell
Ecriture de scripts bash
Expressions regulieres
Vi
Introduction a Javascript
Compiler avec gcc
Astuces en Bash
Cracking
Tutoriel Assembleur
Guide du cracking pour débutant
Assembleur
Manual Unpacking
Techniques de Protection
Différentes failles Web
Arp spoofing dans un réseau switché
Les intrusions
Les attaques externes
Defacage
Defacage complet
Buffer overflow
Netcat
Injection sql
Injection sql(suite)
John the Ripper
Spoofer un email
Utiliser google
La faille system
Usurper une identité
Le rooting
Shellcode sous Unix
La faille race condition
La faille xss
La faille xss (2)
Attaques sur un routeur
P2P
Azureus pas-a-pas
News
Lire les news de Linux-pour-lesnuls.com au format RSS
Distros
Gestion des paquets debian
101 commandes debian
Graphisme
Effet neon dans GIMP
Effet vapeur dans GIMP
Cours fonctionnalités de GIMP
Humour
Ensemble
Divers