Le programme envoloppe multi-architecture, ou « Multiarch Wrapper », sert à envelopper certains binaires contenant en dur les chemins vers leurs bibliothèques ou bien qui sont spécifiques à certaines architectures..
Créez le fichier source :
cat > multiarch_wrapper.c << "EOF"
#define _GNU_SOURCE
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#ifndef DEF_SUFFIX
# define DEF_SUFFIX "64"
#endif
int main(int argc, char **argv)
{
char *filename;
char *suffix;
if(!(suffix = getenv("USE_ARCH")))
if(!(suffix = getenv("BUILDENV")))
suffix = DEF_SUFFIX;
if (asprintf(&filename, "%s-%s", argv[0], suffix) < 0) {
perror(argv[0]);
return -1;
}
int status = EXIT_FAILURE;
pid_t pid = fork();
if (pid == 0) {
execvp(filename, argv);
perror(filename);
} else if (pid < 0) {
perror(argv[0]);
} else {
if (waitpid(pid, &status, 0) != pid) {
status = EXIT_FAILURE;
perror(argv[0]);
} else {
status = WEXITSTATUS(status);
}
}
free(filename);
return status;
}
EOF
Compilez et installez le « Multiarch Wrapper » :
gcc ${BUILD64} multiarch_wrapper.c -o /usr/bin/multiarch_wrapper
Ce programme sera utilisé plus tard dans le livre avec Perl. Il sera également très utile hors du système CLFS de base.
Faisons un test :
echo 'echo "Version 32 bits"' > test-32 echo 'echo "Version 64 bits"' > test-64 chmod -v 755 test-32 test-64 ln -sv /usr/bin/multiarch_wrapper test
Testons le programme enveloppe :
USE_ARCH=32 ./test USE_ARCH=64 ./test
Le résultat de ces commandes devrait être alors :
32bit Version 64bit Version
Supprimez les sources, les binaires et le lien testcase :
rm -v multiarch_wrapper.c test{,-32,-64}