source: BOOK/final-system/multilib/multiarch_wrapper.xml @ bf996fc

clfs-2.1clfs-3.0.0-systemdclfs-3.0.0-sysvinitsystemdsysvinit
Last change on this file since bf996fc was bf996fc, checked in by William Harrington <kb0iic@…>, 12 years ago

Remove multiarch_wrapper.c in multilib books.

  • Property mode set to 100644
File size: 3.8 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
4  <!ENTITY % general-entities SYSTEM "../../general.ent">
5  %general-entities;
6]>
7
8<sect1 id="ch-system-multiarch-wrapper" role="wrap">
9  <?dbhtml filename="multiarch_wrapper.html"?>
10
11  <title>Creating a Multiarch Wrapper</title>
12
13  <indexterm zone="ch-system-multiarch-wrapper">
14    <primary sortas="a-Multiarch Wrapper">Multiarch Wrapper</primary>
15  </indexterm>
16
17  <sect2 role="package">
18    <title/>
19
20    <para>The Multiarch Wrapper is used to wrap certain binaries that have
21    hardcoded paths to libraries or are architecture specific.</para>
22
23  </sect2>
24
25  <sect2 role="installation">
26    <title>Installation of The Multiarch Wrapper</title>
27
28    <para os="a">Create the source file:</para>
29
30<screen os="b"><userinput>cat &gt; multiarch_wrapper.c &lt;&lt; "EOF"
31#define _GNU_SOURCE
32
33#include &lt;errno.h&gt;
34#include &lt;stdio.h&gt;
35#include &lt;stdlib.h&gt;
36#include &lt;sys/types.h&gt;
37#include &lt;sys/wait.h&gt;
38#include &lt;unistd.h&gt;
39
40#ifndef DEF_SUFFIX
41#  define DEF_SUFFIX "64"
42#endif
43
44int main(int argc, char **argv)
45{
46  char *filename;
47  char *suffix;
48
49  if(!(suffix = getenv("USE_ARCH")))
50    if(!(suffix = getenv("BUILDENV")))
51      suffix = DEF_SUFFIX;
52
53  if (asprintf(&amp;filename, "%s-%s", argv[0], suffix) &lt; 0) {
54    perror(argv[0]);
55    return -1;
56  }
57
58  int status = EXIT_FAILURE;
59  pid_t pid = fork();
60
61  if (pid == 0) {
62    execvp(filename, argv);
63    perror(filename);
64  } else if (pid &lt; 0) {
65    perror(argv[0]);
66  } else {
67    if (waitpid(pid, &amp;status, 0) != pid) {
68      status = EXIT_FAILURE;
69      perror(argv[0]);
70    } else {
71      status = WEXITSTATUS(status);
72    }
73  }
74
75  free(filename);
76
77  return status;
78}
79
80EOF</userinput></screen>
81
82    <para os="c">Compile and Install the Multiarch Wrapper:</para>
83
84<screen os="d"><userinput>gcc ${BUILD64} multiarch_wrapper.c -o /usr/bin/multiarch_wrapper</userinput></screen>
85
86    <para os="e">This multiarch wrapper is going to be used later on in the book
87    with Perl. It will also be very useful outside of the base CLFS system.</para>
88
89    <para os="f">Create a testcase:</para>
90
91<screen os="g"><userinput>echo 'echo "32bit Version"' &gt; test-32
92echo 'echo "64bit Version"' &gt; test-64
93chmod 755 test-32 test-64
94ln -sv /usr/bin/multiarch_wrapper test</userinput></screen>
95
96    <para os="h">Test the wrapper:</para>
97
98<screen os="i"><userinput>USE_ARCH=32 ./test
99USE_ARCH=64 ./test</userinput></screen>
100
101    <para os="j">The output of the above command should be:</para>
102
103<screen os="k" role="nodump"><userinput>32bit Version
10464bit Version</userinput></screen>
105
106    <para os="l">Remove the testcase source, binaries, and link:</para>
107
108<screen os="m"><userinput>rm -v multiarch_wrapper.c test{,-32,-64}</userinput></screen>
109
110  </sect2>
111
112  <sect2 id="contents-multiarch-wrapper" role="content">
113    <title>Contents of The Multiarch Wrapper</title>
114
115    <segmentedlist>
116      <segtitle>Installed programs</segtitle>
117
118      <seglistitem>
119        <seg>multiarch_wrapper</seg>
120      </seglistitem>
121    </segmentedlist>
122
123    <variablelist>
124      <bridgehead renderas="sect3">Short Descriptions</bridgehead>
125      <?dbfo list-presentation="list"?>
126      <?dbhtml list-presentation="table"?>
127
128      <varlistentry id="multiarch_wrapper">
129        <term><command>multiarch_wrapper</command></term>
130        <listitem>
131          <para>Will execute a different program based on the
132          <envar>USE_ARCH</envar> variable. The <envar>USE_ARCH</envar>
133          variable will be the suffix of the executed program.</para>
134          <indexterm zone="ch-system-multiarch-wrapper multiarch_wrapper">
135            <primary sortas="b-multiarch_wrapper">multiarch_wrapper</primary>
136          </indexterm>
137        </listitem>
138      </varlistentry>
139
140    </variablelist>
141
142  </sect2>
143
144</sect1>
Note: See TracBrowser for help on using the repository browser.