Salut les C,
"Ceci n'est pas un poste d'un sujet méritant qu'on le classe dans la section débutant mais comme la section avancé n'existe pas je poste ici."
Je suis en train de lire un excellent bouquin traitant de library de tout genre, ou plutôt sous tout le formats: static, shared, Linux *.dll et Windows.
Mais aussi beaucoup de code machine (Le format ELF) et de désassemblage.
Et je me posait la question qu'est-ce que fait exactement la directive de prépocesseur #pragma véritablement ?
Ou plutôt comment en donner une définition claire et ce que fait ce #pragma
Par exemple l'auteur du livre commence ses en-tête avec
Et j'ai appris que l'on pouvait cacher des symboles grace au #pragma("hidden").
Code : Sélectionner tout - Visualiser dans une fenêtre à part #pragma once
Ou alors que l'on pouvait changer de version une fonction d'une bibliothèque
dans le cas énoncé dans le livre il s'agissait du sens de la valeur de retour d'une fonction, selon la version mineure de la bibliothèque.
Qui dans un cas donnait un résultat en millisecondes et dans l'autre en nanosecondes tout cela grâce au bout de code suivant:
En exportant comme symbole la fonction my_func(...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 __asm__(".symver my_func_1_0,my_func@@LIBSIMPLE_1.0") int my_func_1_0(int x) { printf("lib %s\n", __FUNCTION__) ; return (x) } __asm__(".symver my_func_2_0,my_func@@LIBSIMPLE_2.0") int my_func_2_0(int x) { printf("lib %s\n", __FUNCTION__) ; return 100*(x) }
Et donc suivant le numéro mineure de la bibliothèque la fonction my_func(...) retourne un résultat différents.
Bon rien d'anormale a cela en soit mais vous aurez sans doutes remarquez comment est écrit le code.
Par ailleurs l'auteur peut surcharger une fonction (En C) sans changer de numéro majeure une fonction grâce a une technique similaire.
Étonnant tout cela !
En passant un fichier de version au compilateur GNU:
Tout cela me laisse #pragmatique et je suis impatient d'entendre vos commentaires avisé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 gcc -Wall -g -O0 -fPIC -c simple.c gcc -shared simple.o -Wl,--version-script,my_script -o libsimple.so.1.0.0
Partager