_
~ DAMOLAB - Les tambouilles textes, teks et hacks ~
"Quand nous saurons une bonne fois d'où nous venons et où nous allons, nous pourrons alors savoir où nous en sommes." [ Pierre Dac ]
DAMOLAB (#TAGS) _./._ XBNF blog _./._ Blog _./._

Conserver une toolchain de compilation C++ avant d'installer une nouvelle distribution


| FR | par DAMO | | 01/08/2021 19h00 | (last update 21/12/2025 18h09) | Commentaires |
#DAMOLAB #SOMAD #GRIMOIRE #LINUX #LFS #ARCHITECTURE
cet article propose de réaliser une arborescence dans un loop fileset permettant d'avoir plusieurs versions
de toolchain simultanément.
L'idée est de conserver la toolchain C++ et donc garder un état stable qui continuera de fonctionner.
L'arborescence (téléchargeable) réalisée à titre d'exemple est ici une toolchain Linux/GNU-C++ version 7 en
64 bits et version 4.8 en 32 & 64 bits
|




1) Contexte



1.1) Open-source


N'importe quelle application GNU est disponible en priorité à partir de ses sources.
Souvent l'executable n'est pas disponible, seulement à partir d'une distribution Linux.

Cette contrainte incite, vous l'aurez compris, l'utilisateur à compiler le projet à partir des sources:

1) Cela permet d'avoir un binaire optimisé pour chaque système (32 bits, 64 Bits, Linux, Win32, ...).

2) Cela permet de conserver une transparence vis à vis du code,
toute modification aussi infime soit t'elle est compilable et vérifiable par rapport au code.
(comprendre l'origine de tout bug éventuel mais pas seulement)

3) L'administrateur conserve la possibliter de jeter un oeil aux sources et
cela pour vérifier l'absence de toute sorte de backdoor (connexion site tiers, trojan, virus, publicités, ...).


1.2) Objectifs du loop


L'idée est de maîtriser une chaine de compilation C++ pour compiler un projet (dans mon cas, Neurotranslator/XBNF).

Ici nous n'allons pas recompiler la toolchain mais juste recreer une arborescence permettant de
faire cohabiter éventuellement plusieurs versions du compilateur GNU en parallèle dans la même arborescence.

Pour travailler sur une version précise de toolchain donnée,
un chemin /somad/app/arch pointera sur /somad/app/[ARCHITECTURE]/, garder en tête que
l'environnement chrooté nous positionnera dans /somad/ qui sera la racine /.

L'utilisation d'un loop permet de conserver d'anciennes toolchain qui ont été validées dans un contexte particulier
(version d'OS, librairies C++, version de votre projet).

Chaque toolchain doit incorporer le très fameux compilateur GCC pour une architecture donnée mais
aussi les commandes outils, de compilation, ... (make, grep, ls, ...).


2) Préparation d'un loop filesystem



Vous devez partir de votre système fonctionnel :
- avoir la commande chroot
- avoir la commande mount
- avoir les commandes de bases : ls, find, df, ...
- avoir 4Go de disponible pour stocker le loop FS : disque-dur, lecteur DVD, clef usb, ...
- avoir la toolchain C++ que vous souhaitez conserver

2.3) Les trois toolchain réalisées dans cet article


Si vous voulez télécharger le somad.loopfs-linux (4Go) réalisé dans cet article.
MD5: 0814c9305161accab2848cc9cc284eb2


2.4) Création du loop filesystem



Manipuler un fichier loop se fait comme un fichier normal mais
/!\\ toujours démonter le loop si vous souhaiter le déplacer.

Création d'un loop filesystem:

cd /home
dd if=/dev/zero of=somad.loopfs-linux bs=1M count=4000
mkfs.ext2 somad.loopfs-linux


Puis montage du FS et vérification que l'on a bien 4Go,
le 1% d'occupation est normal à ce stade.

mkdir /somad
mount -o loop somad.loopfs-linux /somad
df -h /somad
ls -l /somad



Si vous souhaitez garder la signature MD5 et le contenu intact, l'écriture peut être desactivé avec l'option ro.
mkdir /somad
mount -o loop,ro somad.loopfs-linux /somad


N'oubliez pas de démonter le FS une fois terminée, pour manipuler le fichier somad.loopfs.
/!\\ ne surtout pas manipuler le fichier somad.loopfs tant que le fichier est monté.

cd /
umount /somad/proc
umount /somad


3) Création de l'arborescence



3.5) construction des éléments système de base à partir d'une mint 19 et 17.3


Nous allons créer un système de base simple capable de lancer un shell et faire un ls.
Les binaires et librairies seront recopiés depuis le système hôte.


Garder en tête que toutes les commandes ont une version qui diffère selon la toolchain active.
(le lien symbolique /app/arch doit pointer sur le dossier de la toolchain active)

/app/arch/{commande} --version



(A)rborescence générique / a réaliser selon la/les toolchain GNU/C++

cd /somad
mkdir app
cd app

(*) mkdir x86_64-mint19
(*) ln -s x86_64-mint19 arch
(*) mkdir x86_64-mint17.3
(*) ln -s x86_64-mint17.3 arch

(*) mkdir i686-mint17.3
(*) ln -s i686-mint17.3 arch



Ici, nous allons réaliser le setup trois fois :
- x86_64-mint19 => OS Linux Mint19 en 64 bits / toolchain C++ GNU v7
- x86_64-mint17.3 => OS Linux Mint17.3 en 64 bits / toolchain C++ GNU v4.8
- i686-mint17.3 => OS Linux Mint17.3 en 32 bits / toolchain C++ GNU v4.8


Commandes liées au package coreutils seront regroupées dans un même répertoire.


mkdir arch/coreutils
cp /bin/ls /bin/echo /usr/bin/touch /bin/ln /bin/rm /bin/date /bin/sleep /bin/mkdir /usr/bin/tail /bin/uname arch/coreutils/

cd /somad
mkdir bin
ln -s /app/arch/coreutils bin/coreutils

ln -s coreutils/ls bin/ls 
ln -s coreutils/echo bin/echo 
ln -s coreutils/touch bin/touch 
ln -s coreutils/ln bin/ln
ln -s coreutils/rm bin/rm
ln -s coreutils/date bin/date
ln -s coreutils/sleep bin/sleep
ln -s coreutils/tail bin/tail
ln -s coreutils/mkdir bin/mkdir
ln -s coreutils/uname bin/uname

mkdir root

cat > root/.bashrc
echo .bashrc

PATH=/etc:/bin/
PATH=/app/arch/:$PATH
PATH=/usr/bin/:$PATH

export LD_LIBRARY_PATH=/app/arch/

# /bin/ 
alias lrt='ls -lart'

# /etc/
# alias cmd=cmd-{version}.sh

# /app/{ARCH}/
# alias make=make-4.1

mount -a
^D



(*) pour chaque nouvelle architecture 64 bits


cp /bin/bash app/arch/

# librairies pour bash
cp /lib/x86_64-linux-gnu/libtinfo.so.5 app/arch/
cp /lib/x86_64-linux-gnu/libc.so.6 app/arch/
cp /lib/x86_64-linux-gnu/libdl.so.2 app/arch/
cp /lib64/ld-linux-x86-64.so.2 app/arch/

mkdir lib64
ln -s /app/arch/ld-linux-x86-64.so.2 lib64/ld-linux-x86-64.so.2


(*) pour chaque nouvelle architecture 32 bits


cp /bin/bash app/arch/

# librairies pour bash
cp /lib/i386-linux-gnu/libtinfo.so.5 app/arch/
cp /lib/i386-linux-gnu/libc.so.6 app/arch/
cp /lib/i386-linux-gnu/libdl.so.2 app/arch/
cp /lib/ld-linux.so.2 app/arch/

mkdir lib
ln -s /app/arch/ld-linux.so.2 lib/ld-linux.so.2


(A)rborescence générique / a ne réaliser qu'une fois :


ln -s /app/arch//bash bin/bash
ln -s /app/arch//bash bin/sh

mkdir etc

cat > etc/somad.sh
echo "SOMAD : lancement d'un shell dans un envirronement chrooté"
uname -a
#export LD_LIBRARY_PATH=/app/arch
chroot /somad /app/arch/bash
^D

chmod +x etc/*



3.6) Lancement d'un shell dans l'envirronnement chrooté


A ce stade, nous allons tester le fonctionnement du bash dans la nouvelle arborescence.

cd /somad
etc/somad.sh
# exit


L'erreur sur le script mount est normal, nous allons y remédier.


3.7) Incorporation des éléments système


Nous allons activer le /proc, /dev/, /tmp.

cd /somad

mkdir tmp
cp -r /dev/ .
mkdir proc
echo "none /proc proc defaults 0 0" > etc/fstab


Nous allons avoir besoin de la commande mount.

cp /bin/mount app/arch/


(*) pour chaque nouvelle architecture 64 bits:

cd /lib/x86_64-linux-gnu

# librairies pour mount
cp libblkid.so.1 libmount.so.1 librt.so.1 libuuid.so.1 /somad/app/arch/
cp libselinux.so.1 libpcre.so.3 libpthread.so.0 /somad/app/arch/

# librairies pour les commandes coreutils
cp libgcc_s.so.1 libattr.so.1 librt.so.1 liblzma.so.5 /somad/app/arch/
cp libz.so.1 libacl.so.1 libcrypt.so.1 libm.so.6 libgpg-error.so.0 /somad/app/arch/

# librairies pour Mint19 seulement
cp  libgcrypt.so.20 libmvec.so.1 libprocps.so.6 libsystemd.so.0  /somad/app/arch/


(*) pour chaque nouvelle architecture 32 bits:

cd /lib/i386-linux-gnu/

# librairies pour mount
cp libblkid.so.1 libmount.so.1 librt.so.1 libuuid.so.1 /somad/app/arch/
cp libselinux.so.1 libpcre.so.3 libpthread.so.0 /somad/app/arch/

# librairies pour les commandes coreutils
cp libgcc_s.so.1 libattr.so.1 librt.so.1 liblzma.so.5 /somad/app/arch/
cp libz.so.1 libacl.so.1 libcrypt.so.1 libm.so.6 libgpg-error.so.0 /somad/app/arch/


(A)rborescence générique / a ne réaliser qu'une fois :

cd /somad
mkdir lib
ln -s /app/arch/ lib/x86_64-linux-gnu
ln -s /app/arch/ lib/i386-linux-gnu


Test du montage de /proc
etc/somad.sh
# ls -l /proc
# exit



3.8) Local FR


Les locales sont les éléments liés aux paramètres régionaux de ta situation géographique.

La commande perl affiche un warning indiquant qu'il manque les fichiers de définition des locales.
warning: Setting locale failed

Pour palier à cela :

cd /somad
cp -r /usr/lib/locale/ app/arch/
ln -s /app/arch/locale usr/lib/locale



4) toolchain GNU C++



Ici, nous allons réaliser la procédure trois fois : une avec Mint19 64 bits (toolchain GNU/C++ v7) et
une avec Mint17.3 en 64bits & 32bits (toolchain GNU/v4.8).


4.9) outils de compilation


(A)rborescence générique / a ne réaliser qu'une fois :

cd /somad
mkdir usr
mkdir usr/lib
mkdir usr/bin
ln -s /app/arch/g++/include usr/include


Actions pour chaque nouvelle toolchain.

cd /somad

mkdir app/arch/g++/
cp -r /usr/include app/arch/g++/


EX: pour la toolchain GNU C++ 7 64 bits


cp -r /usr/lib/gcc usr/lib/gcc.mint19
unlink usr/lib/gcc # desactive l'ancienne toolchain
ln -s gcc.mint19  usr/lib/gcc

cp -r /usr/lib/x86_64-linux-gnu/ app/arch/g++/x86_64-linux-gnu

ln -s /app/arch/g++/x86_64-linux-gnu/ usr/lib/x86_64-linux-gnu

cp /usr/bin/x86_64-linux-gnu-g++-7 usr/bin/
cd usr/bin/
ln -s x86_64-linux-gnu-g++-7 g++


4.10) Architecture 64 bits


EX: pour la toolchain GNU C++ 4.8 64 bits

cd /somad

cp -r /usr/lib/gcc usr/lib/gcc.mint17
unlink usr/lib/gcc # desactive l'ancienne toolchain
ln -s gcc.mint17  usr/lib/gcc

cp -r /usr/lib/x86_64-linux-gnu/ app/arch/g++/x86_64-linux-gnu
ln -s /app/arch/g++/x86_64-linux-gnu/ usr/lib/x86_64-linux-gnu

cp /usr/bin/x86_64-linux-gnu-g++-4.8 usr/bin/x86_64-linux-gnu-g++-4.8
# A VOIR : cp /usr/bin/g++-4.8 usr/bin/x86_64-linux-gnu-g++-4.8

cd usr/bin/
#ln -s x86_64-linux-gnu-g++-4.8 g++-4.8
ln -s x86_64-linux-gnu-g++-4.8 g++

# librairies complémentaires 
## pour g++
cp /usr/lib/libbfd-2.24-system.so /usr/lib/libopcodes-2.24-system.so app/arch/

## pour Perl
cp /usr/lib/libperl.so.5.18 app/arch/
cp -r /usr/share/perl/5.18.2/ usr/lib/perl5

## pour pkill
cp /lib/x86_64-linux-gnu/libprocps.so.3 app/arch/


4.11) Architecture 32 bits


EX: Pour la toolchain GNU C++ 4.8 32 bits

cd /somad

cp -r /usr/lib/gcc usr/lib/gcc.mint17-32bits
unlink usr/lib/gcc # desactive l'ancienne toolchain
ln -s gcc.mint17-32bits  usr/lib/gcc

cp -r /usr/lib/i386-linux-gnu/ app/arch/g++/i386-linux-gnu
ln -s /app/arch/g++/i386-linux-gnu/ usr/lib/i386-linux-gnu

cp /usr/bin/g++-4.8 usr/bin/i386-linux-gnu-g++-4.8

cd usr/bin/
ln -s i386-linux-gnu-g++-4.8 g++

# librairies complémentaires 
## pour g++
cd /somad
cp /usr/lib/libbfd-2.24-system.so /usr/lib/libopcodes-2.24-system.so app/arch/

## pour Perl
cp /usr/lib/libperl.so.5.18 app/arch/
cp -r /usr/share/perl/5.18.2/ usr/lib/perl5

## pour pkill
cp /lib/i386-linux-gnu/libprocps.so.3 app/arch/


Ajout de commandes supplémentaires pour la toolchain GNU/C++:

Commandes liées au package binutils seront regroupées dans un même répertoire.

(*)
cd /somad

mkdir app/arch/binutils
cp /usr/bin/as /usr/bin/ld app/arch/binutils/


(A)rborescence générique / a ne réaliser qu'une fois :

ln -s /app/arch/binutils bin/binutils
ln -s binutils/as bin/as
ln -s binutils/ld bin/ld


Commandes unitaires pour chaque architecture


cd /usr/bin
cp make perl find xargs time diff pkill ldd vi /somad/app/arch/

cd /somad

cp /bin/grep app/arch/

ln -s /app/arch/perl bin/perl



4.12) Test de compilation


cat > test.c
#include <iostream>
int main() { std::cerr  << "hello world"; }
^D

etc/somad.sh
# g++ test.c




5) Utilisation




5.13) Exemple avec les sources de neurotranslator



La toolchain est prête pour compiler la commande xbnf du projet neurotranslator.

cd /somad

mkdir app/arch/neurotranslator_v1.05
cd app/arch/neurotranslator_v1.05
wget https://sourceforge.net/projects/neurotranslator/files/neurotranslator_v1.05_2021-05-22.tar.gz/download
gzip -dc download | tar -xvf -



Compilation dans l'envirronement propre chrooté :

cd /somad

ln -s /app/arch/neurotranslator_v1.05/xbnf  bin/xbnf

etc/somad.sh
# cd app/arch/neurotranslator_v1.05
# make clean all
# xbnf --version



5.14) Basculer d'une toolchain C++ à une autre


== Vérifier quelle toolchain C++ est active

La commande xbnf appelée dépend du chemin actif /app/*/neurotranslator_v1.05/

etc/somad.sh
# xbnf --version
# exit



       
5.14.1) == Basculer vers la toolchain C++/GNU 7 (mint19) 64 bits


cd /somad/app/
unlink arch
ln -s x86_64-mint19 arch

cd /somad/usr/bin
unlink g++
ln -s x86_64-linux-gnu-g++-7 g++

cd /somad/usr/lib
unlink gcc
ln -s gcc.mint19 gcc


       
5.14.2) == Basculer vers la toolchain C++/GNU 4.8 (mint17.3) 64 bits


cd /somad/app
unlink arch
ln -s x86_64-mint17.3 arch

cd /somad/usr/bin
unlink g++
ln -s x86_64-linux-gnu-g++-4.8 g++

cd /somad/usr/lib
unlink gcc
ln -s gcc.mint17 gcc


       
5.14.3) == Basculer vers la toolchain C++/GNU 4.8 (mint17.3) 32 bits


cd /somad/app
unlink arch
ln -s i686-mint17.3 arch

cd /somad/usr/bin
unlink g++
ln -s i386-linux-gnu-g++-4.8 g++

cd /somad/usr/lib
unlink gcc
ln -s gcc.mint17-32bits gcc



Bonne compilation ...



0.1) DamoLab


DamoLab@Sourceforge
DamoLab@DockerHub

0.2) Calculette composants radio


Electro-slide

0.3) Technologies


-- IA --
Mistral IA (le chat) (i)

-- Cyber-securité --
Shodan (i)11
Have I been pwned ? (i)
personal-data-leak-check
Osint
Zataz actualités

-- Adresses IP --
Mes Infos (IP, UA, ...)
info IP: WHOIS,ping,...
info IP: WHOIS,ping,...
info IP: Locallisation
info IP: abus
DNS checker

-- Mails --
GMX
Hushmail - mail temporaire sécurisé

encode/decode email for defeating bots
 $_='mailto: matt@org';s/(.)/chr(ord($1)+5)/eg;$_ 


-- Linux --
News LinuxFr
Mind-map Linux
Tutorials
crontab

-- Blogs Teks --
@TechWorldwithNana
@Cookieconnect
@GoCloudArchitects
@grafikart
@Underscore_
@cybernewsenfrancais


-- Geek Code --

décoder un GC

GCS d>+(---) s- a+ C++$ UL+>$ UOS++$
P++++>$ L++ E W++(++) N(+) o-- K+ w>--- O- M>+ PS+>+++ PE-- Y+@ t-(+) >5 X+ R>+ !tv b+
D---- D+ G e+++ h---- r+++ z+++



Rescue NEO...
(JS by Rezmason)


Nom/surnom:
Message:


revenir sur l'article
#DAMOLAB #SOMAD #GRIMOIRE #LINUX #LFS #ARCHITECTURE

Aucun commentaire.

dans
une
galaxy
lointaine
Charte du site damolab.zapto.org est motorisé par

"La force est une sorte de fluide crée par tout être vivant, une énergie qui nous entoure et nous pénètre, et qui maintient la galaxie en un tout unique."
- Obi-Wan à Luke Yoda