[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Compiler des logiciels libres (C ou C++) avec -O et -g



Bonjour la liste,



Mon ordinateur de bureau tourne sous Debian/Trixie+Sid/x86-64 avec un processeur AMD Ryzen Threadripper 2970WX et 64Go de RAM
Et j'ai compilé avec succès GCC 16 snapshot 20250907 dessus, installé sous /usr/local/ comme il se doit


Je motive et élabore d'abord ma question avant de la formuler plus bas.

Considérons un logiciel libre (par exemple une bibliothèque) Debian codé[e] en C ou C++


Je pense en particulier à SFML (voir https://www.sfml-dev.org ....) ou http://www.fox-toolkit.org/
ou https://www.fltk.org/software.php?VERSION=1.5.x
mais ma question s'étend à tout logiciel libre codé en C ou C++ (et compilé par GCC récent, pour moi GCC 16....)

Un logiciel en C ou C++ (y compris les versions récentes de ces langages) peut être compilé à la fois
acec une optimisation (donc -O ou -O2) et avec les informations de déboguages au format DWARF (donc -g)

Dans le cas d'une bibliothèque partagée ("shared object") on va la compiler aussi avec -shared -fPIC
https://tldp.org/HOWTO/Program-Library-HOWTO/
https://tldp.org/HOWTO/C++-dlopen
pour pouvoir la charger avec https://man7.org/linux/man-pages/man3/dlopen.3.html et utiliser
https://man7.org/linux/man-pages/man3/dlsym.3.html

et il se trouve que sous Linux il est possible de charger à la volée des dizaines de milliers de telles bibliothèques partagées
Ceux qui en doutent peuvent compiler https://github.com/bstarynk/misc-basile/blob/master/manydl.c
qui génère un nombre arbitrairement grand de fichiers C et compile chacun en une telle bibliothèque (et les chargent toutes avec succès)

Pour la génération de code à la volée voir aussi https://gcc.gnu.org/onlinedocs/jit/ et https://www.gnu.org/software/libjit/
et https://www.gnu.org/software/lightning/ en plus de l'approche génération de code C ou C++ temporaire 
expliquée dans https://arxiv.org/abs/1109.0779

GCC contient depuis plusieurs années une bibliothèque très utile d'inspection de la pile d'appel
(en jargon informatique il s'agit de continuations limitées https://fr.wikipedia.org/wiki/Continuation_(informatique) )

Cette bibliothèque est https://github.com/ianlancetaylor/libbacktrace

Avec l'appel https://man7.org/linux/man-pages/man3/dladdr.3.html cette bibliothèque permet a minima d'imprimer la pile d'appel
(en anglais callstack) ce qui est très utile (par exemple dans un message d'erreur, mais j'entrevois d'autres utilisations possibles, 
sur la thématique de la reflexion et de l'introspection - cf https://fr.wikipedia.org/wiki/R%C3%A9flexion_(informatique 
(la machine virtuelle JAVA illustre l'utilité de celles-ci)

Il me faut toutefois compiler toutes les bibliothèques utiles avec à la fois l'option -O (ou -O2) et l'option -g
(et les options -fPIC -shared si besoin).


Comment le faire facilement avec l'utilitaire cmake, en prenant l'exemple de SFML https://www.sfml-dev.org/ et de FLTK 1.5 en https://www.fltk.org/


NB. Le logiciel RefPerSys (un moteur d'inférences en cours de dévelopement, voir refpersys.org) montre que c'est potentiellement utile (et le compilateur GCC aussi)
-- 
Basile STARYNKEVITCH                            <basile@starynkevitch.net>
8 rue de la Faïencerie                       http://starynkevitch.net/Basile/  
92340 Bourg-la-Reine                         https://github.com/bstarynk
France                                https://github.com/RefPerSys/RefPerSys


Reply to: