10.22. Création d'un programme enveloppe multi-architecture ( « Multiarch Wrapper »)

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..

10.22.1. Installation de The Multiarch Wrapper

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}

10.22.2. Contenu du Multiarch Wrapper

programmes installés: multiarch_wrapper

Descriptions courtes

multiarch_wrapper

Exécute un programme différent en se basant sur la variable USE_ARCH. Cette variable USE_ARCH sera alors le suffixe du programme exécuté.