5.17. Creating a Sysroot Wrapper

The Sysroot Wrapper is used to wrap certain binaries that have hardcoded paths to libraries or are architecture specific.

5.17.1. Installation of The Sysroot Wrapper

Create the source file:

cat > sysroot_wrapper.c << "EOF"
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

char *sysrootdir = "";

int main(int argc, char *argv[]) {
  sysrootdir = getenv("CLFS");
  if (!sysrootdir)
    sysrootdir="";

  int stdout_pipe[2];
  pipe(stdout_pipe);

  pid_t pid = fork();

  if (pid == 0) {
    /* Redirect stdout to our pipe */
    close(1);
    dup(stdout_pipe[1]);
    close(stdout_pipe[0]);
    close(stdout_pipe[1]);

    char *name = strdup(argv[0]);
    strcat(name, ".sysroot");

    execvp(name, argv);

    free(name);

    exit(0);
  } else {
    /* Close stdout for write */
    close(stdout_pipe[1]);

    /* redirect our stdout pipe from the child to our stdin */
    close(0);
    dup(stdout_pipe[0]);
    close(stdout_pipe[0]);

    char c, lc;
    char *d = malloc(1);
    int d_len = 0;

    while ((c = fgetc(stdin)) != EOF) {
      d_len++;
      d = realloc(d, d_len + 1);
      *(d + d_len - 1) = c;
      *(d + d_len) = '\0';

      if ((lc == '-')&&((c == 'L')||(c == 'I'))) {
        d_len = d_len + strlen(sysrootdir);
        d = realloc(d, d_len + 1);
        strcat(d, sysrootdir);
      }

      lc = c;
    }

    printf ("%s", d);
    free(d);

    exit(0);
  }

  return 0;
}
EOF

Compile and Install the Sysroot Wrapper:

gcc ${BUILD64} sysroot_wrapper.c -o ${CLFS}/cross-tools/bin/sysroot_wrapper

5.17.2. Contents of The Sysroot Wrapper

Installed programs: sysroot_wrapper

Short Descriptions

sysroot_wrapper

Description Needed