README.gnuefi revision 1.1 1 1.1 jakllsch -------------------------------------------------
2 1.1 jakllsch Building EFI Applications Using the GNU Toolchain
3 1.1 jakllsch -------------------------------------------------
4 1.1 jakllsch
5 1.1 jakllsch David Mosberger <davidm (a] hpl.hp.com>
6 1.1 jakllsch
7 1.1 jakllsch 23 September 1999
8 1.1 jakllsch
9 1.1 jakllsch
10 1.1 jakllsch Copyright (c) 1999-2007 Hewlett-Packard Co.
11 1.1 jakllsch Copyright (c) 2006-2010 Intel Co.
12 1.1 jakllsch
13 1.1 jakllsch Last update: 04/09/2007
14 1.1 jakllsch
15 1.1 jakllsch * Introduction
16 1.1 jakllsch
17 1.1 jakllsch This document has two parts: the first part describes how to develop
18 1.1 jakllsch EFI applications for IA-64,x86 and x86_64 using the GNU toolchain and the EFI
19 1.1 jakllsch development environment contained in this directory. The second part
20 1.1 jakllsch describes some of the more subtle aspects of how this development
21 1.1 jakllsch environment works.
22 1.1 jakllsch
23 1.1 jakllsch
24 1.1 jakllsch
25 1.1 jakllsch * Part 1: Developing EFI Applications
26 1.1 jakllsch
27 1.1 jakllsch
28 1.1 jakllsch ** Prerequisites:
29 1.1 jakllsch
30 1.1 jakllsch To develop x86 and x86_64 EFI applications, the following tools are needed:
31 1.1 jakllsch
32 1.1 jakllsch - gcc-3.0 or newer (gcc 2.7.2 is NOT sufficient!)
33 1.1 jakllsch As of gnu-efi-3.0b, the Redhat 8.0 toolchain is known to work,
34 1.1 jakllsch but the Redhat 9.0 toolchain is not currently supported.
35 1.1 jakllsch
36 1.1 jakllsch - A version of "objcopy" that supports EFI applications. To
37 1.1 jakllsch check if your version includes EFI support, issue the
38 1.1 jakllsch command:
39 1.1 jakllsch
40 1.1 jakllsch objcopy --help
41 1.1 jakllsch
42 1.1 jakllsch and verify that the line "supported targets" contains the
43 1.1 jakllsch string "efi-app-ia32" and "efi-app-x86_64". The binutils release
44 1.1 jakllsch binutils-2.17.50.0.14 supports Intel64 EFI.
45 1.1 jakllsch
46 1.1 jakllsch - For debugging purposes, it's useful to have a version of
47 1.1 jakllsch "objdump" that supports EFI applications as well. This
48 1.1 jakllsch allows inspect and disassemble EFI binaries.
49 1.1 jakllsch
50 1.1 jakllsch To develop IA-64 EFI applications, the following tools are needed:
51 1.1 jakllsch
52 1.1 jakllsch - A version of gcc newer than July 30th 1999 (older versions
53 1.1 jakllsch had problems with generating position independent code).
54 1.1 jakllsch As of gnu-efi-3.0b, gcc-3.1 is known to work well.
55 1.1 jakllsch
56 1.1 jakllsch - A version of "objcopy" that supports EFI applications. To
57 1.1 jakllsch check if your version includes EFI support, issue the
58 1.1 jakllsch command:
59 1.1 jakllsch
60 1.1 jakllsch objcopy --help
61 1.1 jakllsch
62 1.1 jakllsch and verify that the line "supported targets" contains the
63 1.1 jakllsch string "efi-app-ia64".
64 1.1 jakllsch
65 1.1 jakllsch - For debugging purposes, it's useful to have a version of
66 1.1 jakllsch "objdump" that supports EFI applications as well. This
67 1.1 jakllsch allows inspect and disassemble EFI binaries.
68 1.1 jakllsch
69 1.1 jakllsch
70 1.1 jakllsch ** Directory Structure
71 1.1 jakllsch
72 1.1 jakllsch This EFI development environment contains the following
73 1.1 jakllsch subdirectories:
74 1.1 jakllsch
75 1.1 jakllsch inc: This directory contains the EFI-related include files. The
76 1.1 jakllsch files are taken from Intel's EFI source distribution, except
77 1.1 jakllsch that various fixes were applied to make it compile with the
78 1.1 jakllsch GNU toolchain.
79 1.1 jakllsch
80 1.1 jakllsch lib: This directory contains the source code for Intel's EFI library.
81 1.1 jakllsch Again, the files are taken from Intel's EFI source
82 1.1 jakllsch distribution, with changes to make them compile with the GNU
83 1.1 jakllsch toolchain.
84 1.1 jakllsch
85 1.1 jakllsch gnuefi: This directory contains the glue necessary to convert ELF64
86 1.1 jakllsch binaries to EFI binaries. Various runtime code bits, such as
87 1.1 jakllsch a self-relocator are included as well. This code has been
88 1.1 jakllsch contributed by the Hewlett-Packard Company and is distributed
89 1.1 jakllsch under the GNU GPL.
90 1.1 jakllsch
91 1.1 jakllsch apps: This directory contains a few simple EFI test apps.
92 1.1 jakllsch
93 1.1 jakllsch ** Setup
94 1.1 jakllsch
95 1.1 jakllsch It is necessary to edit the Makefile in the directory containing this
96 1.1 jakllsch README file before EFI applications can be built. Specifically, you
97 1.1 jakllsch should verify that macros CC, AS, LD, AR, RANLIB, and OBJCOPY point to
98 1.1 jakllsch the appropriate compiler, assembler, linker, ar, and ranlib binaries,
99 1.1 jakllsch respectively.
100 1.1 jakllsch
101 1.1 jakllsch If you're working in a cross-development environment, be sure to set
102 1.1 jakllsch macro ARCH to the desired target architecture ("ia32" for x86, "x86_64" for
103 1.1 jakllsch x86_64 and "ia64" for IA-64). For convenience, this can also be done from
104 1.1 jakllsch the make command line (e.g., "make ARCH=ia64").
105 1.1 jakllsch
106 1.1 jakllsch
107 1.1 jakllsch ** Building
108 1.1 jakllsch
109 1.1 jakllsch To build the sample EFI applications provided in subdirectory "apps",
110 1.1 jakllsch simply invoke "make" in the toplevel directory (the directory
111 1.1 jakllsch containing this README file). This should build lib/libefi.a and
112 1.1 jakllsch gnuefi/libgnuefi.a first and then all the EFI applications such as a
113 1.1 jakllsch apps/t6.efi.
114 1.1 jakllsch
115 1.1 jakllsch
116 1.1 jakllsch ** Running
117 1.1 jakllsch
118 1.1 jakllsch Just copy the EFI application (e.g., apps/t6.efi) to the EFI
119 1.1 jakllsch filesystem, boot EFI, and then select "Invoke EFI application" to run
120 1.1 jakllsch the application you want to test. Alternatively, you can invoke the
121 1.1 jakllsch Intel-provided "nshell" application and then invoke your test binary
122 1.1 jakllsch via the command line interface that "nshell" provides.
123 1.1 jakllsch
124 1.1 jakllsch
125 1.1 jakllsch ** Writing Your Own EFI Application
126 1.1 jakllsch
127 1.1 jakllsch Suppose you have your own EFI application in a file called
128 1.1 jakllsch "apps/myefiapp.c". To get this application built by the GNU EFI build
129 1.1 jakllsch environment, simply add "myefiapp.efi" to macro TARGETS in
130 1.1 jakllsch apps/Makefile. Once this is done, invoke "make" in the top level
131 1.1 jakllsch directory. This should result in EFI application apps/myefiapp.efi,
132 1.1 jakllsch ready for execution.
133 1.1 jakllsch
134 1.1 jakllsch The GNU EFI build environment allows to write EFI applications as
135 1.1 jakllsch described in Intel's EFI documentation, except for two differences:
136 1.1 jakllsch
137 1.1 jakllsch - The EFI application's entry point is always called "efi_main". The
138 1.1 jakllsch declaration of this routine is:
139 1.1 jakllsch
140 1.1 jakllsch EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab);
141 1.1 jakllsch
142 1.1 jakllsch - UNICODE string literals must be written as W2U(L"Sample String")
143 1.1 jakllsch instead of just L"Sample String". The W2U() macro is defined in
144 1.1 jakllsch <efilib.h>. This header file also declares the function W2UCpy()
145 1.1 jakllsch which allows to convert a wide string into a UNICODE string and
146 1.1 jakllsch store the result in a programmer-supplied buffer.
147 1.1 jakllsch
148 1.1 jakllsch - Calls to EFI services should be made via uefi_call_wrapper(). This
149 1.1 jakllsch ensures appropriate parameter passing for the architecture.
150 1.1 jakllsch
151 1.1 jakllsch
152 1.1 jakllsch * Part 2: Inner Workings
153 1.1 jakllsch
154 1.1 jakllsch WARNING: This part contains all the gory detail of how the GNU EFI
155 1.1 jakllsch toolchain works. Normal users do not have to worry about such
156 1.1 jakllsch details. Reading this part incurs a definite risk of inducing severe
157 1.1 jakllsch headaches or other maladies.
158 1.1 jakllsch
159 1.1 jakllsch The basic idea behind the GNU EFI build environment is to use the GNU
160 1.1 jakllsch toolchain to build a normal ELF binary that, at the end, is converted
161 1.1 jakllsch to an EFI binary. EFI binaries are really just PE32+ binaries. PE
162 1.1 jakllsch stands for "Portable Executable" and is the object file format
163 1.1 jakllsch Microsoft is using on its Windows platforms. PE is basically the COFF
164 1.1 jakllsch object file format with an MS-DOS2.0 compatible header slapped on in
165 1.1 jakllsch front of it. The "32" in PE32+ stands for 32 bits, meaning that PE32
166 1.1 jakllsch is a 32-bit object file format. The plus in "PE32+" indicates that
167 1.1 jakllsch this format has been hacked to allow loading a 4GB binary anywhere in
168 1.1 jakllsch a 64-bit address space (unlike ELF64, however, this is not a full
169 1.1 jakllsch 64-bit object file format because the entire binary cannot span more
170 1.1 jakllsch than 4GB of address space). EFI binaries are plain PE32+ binaries
171 1.1 jakllsch except that the "subsystem id" differs from normal Windows binaries.
172 1.1 jakllsch There are two flavors of EFI binaries: "applications" and "drivers"
173 1.1 jakllsch and each has there own subsystem id and are identical otherwise. At
174 1.1 jakllsch present, the GNU EFI build environment supports the building of EFI
175 1.1 jakllsch applications only, though it would be trivial to generate drivers, as
176 1.1 jakllsch the only difference is the subsystem id. For more details on PE32+,
177 1.1 jakllsch see the spec at
178 1.1 jakllsch
179 1.1 jakllsch http://msdn.microsoft.com/library/specs/msdn_pecoff.htm.
180 1.1 jakllsch
181 1.1 jakllsch In theory, converting a suitable ELF64 binary to PE32+ is easy and
182 1.1 jakllsch could be accomplished with the "objcopy" utility by specifying option
183 1.1 jakllsch --target=efi-app-ia32 (x86) or --target=efi-app-ia64 (IA-64). But
184 1.1 jakllsch life never is that easy, so here some complicating factors:
185 1.1 jakllsch
186 1.1 jakllsch (1) COFF sections are very different from ELF sections.
187 1.1 jakllsch
188 1.1 jakllsch ELF binaries distinguish between program headers and sections.
189 1.1 jakllsch The program headers describe the memory segments that need to
190 1.1 jakllsch be loaded/initialized, whereas the sections describe what
191 1.1 jakllsch constitutes those segments. In COFF (and therefore PE32+) no
192 1.1 jakllsch such distinction is made. Thus, COFF sections need to be page
193 1.1 jakllsch aligned and have a size that is a multiple of the page size
194 1.1 jakllsch (4KB for EFI), whereas ELF allows sections at arbitrary
195 1.1 jakllsch addresses and with arbitrary sizes.
196 1.1 jakllsch
197 1.1 jakllsch (2) EFI binaries should be relocatable.
198 1.1 jakllsch
199 1.1 jakllsch Since EFI binaries are executed in physical mode, EFI cannot
200 1.1 jakllsch guarantee that a given binary can be loaded at its preferred
201 1.1 jakllsch address. EFI does _try_ to load a binary at it's preferred
202 1.1 jakllsch address, but if it can't do so, it will load it at another
203 1.1 jakllsch address and then relocate the binary using the contents of the
204 1.1 jakllsch .reloc section.
205 1.1 jakllsch
206 1.1 jakllsch (3) On IA-64, the EFI entry point needs to point to a function
207 1.1 jakllsch descriptor, not to the code address of the entry point.
208 1.1 jakllsch
209 1.1 jakllsch (4) The EFI specification assumes that wide characters use UNICODE
210 1.1 jakllsch encoding.
211 1.1 jakllsch
212 1.1 jakllsch ANSI C does not specify the size or encoding that a wide
213 1.1 jakllsch character uses. These choices are "implementation defined".
214 1.1 jakllsch On most UNIX systems, the GNU toolchain uses a wchar_t that is
215 1.1 jakllsch 4 bytes in size. The encoding used for such characters is
216 1.1 jakllsch (mostly) UCS4.
217 1.1 jakllsch
218 1.1 jakllsch In the following sections, we address how the GNU EFI build
219 1.1 jakllsch environment addresses each of these issues.
220 1.1 jakllsch
221 1.1 jakllsch
222 1.1 jakllsch ** (1) Accommodating COFF Sections
223 1.1 jakllsch
224 1.1 jakllsch In order to satisfy the COFF constraint of page-sized and page-aligned
225 1.1 jakllsch sections, the GNU EFI build environment uses the special linker script
226 1.1 jakllsch in gnuefi/elf_$(ARCH)_efi.lds where $(ARCH) is the target architecture
227 1.1 jakllsch ("ia32" for x86, "x86_64" for x86_64 and "ia64" for IA-64).
228 1.1 jakllsch This script is set up to create only eight COFF section, each page aligned
229 1.1 jakllsch and page sized.These eight sections are used to group together the much
230 1.1 jakllsch greater number of sections that are typically present in ELF object files.
231 1.1 jakllsch Specifically:
232 1.1 jakllsch
233 1.1 jakllsch .hash
234 1.1 jakllsch Collects the ELF .hash info (this section _must_ be the first
235 1.1 jakllsch section in order to build a shared object file; the section is
236 1.1 jakllsch not actually loaded or used at runtime).
237 1.1 jakllsch
238 1.1 jakllsch .text
239 1.1 jakllsch Collects all sections containing executable code.
240 1.1 jakllsch
241 1.1 jakllsch .data
242 1.1 jakllsch Collects read-only and read-write data, literal string data,
243 1.1 jakllsch global offset tables, the uninitialized data segment (bss) and
244 1.1 jakllsch various other sections containing data.
245 1.1 jakllsch
246 1.1 jakllsch The reason read-only data is placed here instead of the in
247 1.1 jakllsch .text is to make it possible to disassemble the .text section
248 1.1 jakllsch without getting garbage due to read-only data. Besides, since
249 1.1 jakllsch EFI binaries execute in physical mode, differences in page
250 1.1 jakllsch protection do not matter.
251 1.1 jakllsch
252 1.1 jakllsch The reason the uninitialized data is placed in this section is
253 1.1 jakllsch that the EFI loader appears to be unable to handle sections
254 1.1 jakllsch that are allocated but not loaded from the binary.
255 1.1 jakllsch
256 1.1 jakllsch .dynamic, .dynsym, .rela, .rel, .reloc
257 1.1 jakllsch These sections contains the dynamic information necessary to
258 1.1 jakllsch self-relocate the binary (see below).
259 1.1 jakllsch
260 1.1 jakllsch A couple of more points worth noting about the linker script:
261 1.1 jakllsch
262 1.1 jakllsch o On IA-64, the global pointer symbol (__gp) needs to be placed such
263 1.1 jakllsch that the _entire_ EFI binary can be addressed using the signed
264 1.1 jakllsch 22-bit offset that the "addl" instruction affords. Specifically,
265 1.1 jakllsch this means that __gp should be placed at ImageBase + 0x200000.
266 1.1 jakllsch Strictly speaking, only a couple of symbols need to be addressable
267 1.1 jakllsch in this fashion, so with some care it should be possible to build
268 1.1 jakllsch binaries much larger than 4MB. To get a list of symbols that need
269 1.1 jakllsch to be addressable in this fashion, grep the assembly files in
270 1.1 jakllsch directory gnuefi for the string "@gprel".
271 1.1 jakllsch
272 1.1 jakllsch o The link address (ImageBase) of the binary is (arbitrarily) set to
273 1.1 jakllsch zero. This could be set to something larger to increase the chance
274 1.1 jakllsch of EFI being able to load the binary without requiring relocation.
275 1.1 jakllsch However, a start address of 0 makes debugging a wee bit easier
276 1.1 jakllsch (great for those of us who can add, but not subtract... ;-).
277 1.1 jakllsch
278 1.1 jakllsch o The relocation related sections (.dynamic, .rel, .rela, .reloc)
279 1.1 jakllsch cannot be placed inside .data because some tools in the GNU
280 1.1 jakllsch toolchain rely on the existence of these sections.
281 1.1 jakllsch
282 1.1 jakllsch o Some sections in the ELF binary intentionally get dropped when
283 1.1 jakllsch building the EFI binary. Particularly noteworthy are the dynamic
284 1.1 jakllsch relocation sections for the .plabel and .reloc sections. It would
285 1.1 jakllsch be _wrong_ to include these sections in the EFI binary because it
286 1.1 jakllsch would result in .reloc and .plabel being relocated twice (once by
287 1.1 jakllsch the EFI loader and once by the self-relocator; see below for a
288 1.1 jakllsch description of the latter). Specifically, only the sections
289 1.1 jakllsch mentioned with the -j option in the final "objcopy" command are
290 1.1 jakllsch retained in the EFI binary (see apps/Makefile).
291 1.1 jakllsch
292 1.1 jakllsch
293 1.1 jakllsch ** (2) Building Relocatable Binaries
294 1.1 jakllsch
295 1.1 jakllsch ELF binaries are normally linked for a fixed load address and are thus
296 1.1 jakllsch not relocatable. The only kind of ELF object that is relocatable are
297 1.1 jakllsch shared objects ("shared libraries"). However, even those objects are
298 1.1 jakllsch usually not completely position independent and therefore require
299 1.1 jakllsch runtime relocation by the dynamic loader. For example, IA-64 binaries
300 1.1 jakllsch normally require relocation of the global offset table.
301 1.1 jakllsch
302 1.1 jakllsch The approach to building relocatable binaries in the GNU EFI build
303 1.1 jakllsch environment is to:
304 1.1 jakllsch
305 1.1 jakllsch (a) build an ELF shared object
306 1.1 jakllsch
307 1.1 jakllsch (b) link it together with a self-relocator that takes care of
308 1.1 jakllsch applying the dynamic relocations that may be present in the
309 1.1 jakllsch ELF shared object
310 1.1 jakllsch
311 1.1 jakllsch (c) convert the resulting image to an EFI binary
312 1.1 jakllsch
313 1.1 jakllsch The self-relocator is of course architecture dependent. The x86
314 1.1 jakllsch version can be found in gnuefi/reloc_ia32.c, the x86_64 version
315 1.1 jakllsch can be found in gnuefi/reloc_x86_64.c and the IA-64 version can be
316 1.1 jakllsch found in gnuefi/reloc_ia64.S.
317 1.1 jakllsch
318 1.1 jakllsch The self-relocator operates as follows: the startup code invokes it
319 1.1 jakllsch right after EFI has handed off control to the EFI binary at symbol
320 1.1 jakllsch "_start". Upon activation, the self-relocator searches the .dynamic
321 1.1 jakllsch section (whose starting address is given by symbol _DYNAMIC) for the
322 1.1 jakllsch dynamic relocation information, which can be found in the DT_REL,
323 1.1 jakllsch DT_RELSZ, and DT_RELENT entries of the dynamic table (DT_RELA,
324 1.1 jakllsch DT_RELASZ, and DT_RELAENT in the case of rela relocations, as is the
325 1.1 jakllsch case for IA-64). The dynamic relocation information points to the ELF
326 1.1 jakllsch relocation table. Once this table is found, the self-relocator walks
327 1.1 jakllsch through it, applying each relocation one by one. Since the EFI
328 1.1 jakllsch binaries are fully resolved shared objects, only a subset of all
329 1.1 jakllsch possible relocations need to be supported. Specifically, on x86 only
330 1.1 jakllsch the R_386_RELATIVE relocation is needed. On IA-64, the relocations
331 1.1 jakllsch R_IA64_DIR64LSB, R_IA64_REL64LSB, and R_IA64_FPTR64LSB are needed.
332 1.1 jakllsch Note that the R_IA64_FPTR64LSB relocation requires access to the
333 1.1 jakllsch dynamic symbol table. This is why the .dynsym section is included in
334 1.1 jakllsch the EFI binary. Another complication is that this relocation requires
335 1.1 jakllsch memory to hold the function descriptors (aka "procedure labels" or
336 1.1 jakllsch "plabels"). Each function descriptor uses 16 bytes of memory. The
337 1.1 jakllsch IA-64 self-relocator currently reserves a static memory area that can
338 1.1 jakllsch hold 100 of these descriptors. If the self-relocator runs out of
339 1.1 jakllsch space, it causes the EFI binary to fail with error code 5
340 1.1 jakllsch (EFI_BUFFER_TOO_SMALL). When this happens, the manifest constant
341 1.1 jakllsch MAX_FUNCTION_DESCRIPTORS in gnuefi/reloc_ia64.S should be increased
342 1.1 jakllsch and the application recompiled. An easy way to count the number of
343 1.1 jakllsch function descriptors required by an EFI application is to run the
344 1.1 jakllsch command:
345 1.1 jakllsch
346 1.1 jakllsch objdump --dynamic-reloc example.so | fgrep FPTR64 | wc -l
347 1.1 jakllsch
348 1.1 jakllsch assuming "example" is the name of the desired EFI application.
349 1.1 jakllsch
350 1.1 jakllsch
351 1.1 jakllsch ** (3) Creating the Function Descriptor for the IA-64 EFI Binaries
352 1.1 jakllsch
353 1.1 jakllsch As mentioned above, the IA-64 PE32+ format assumes that the entry
354 1.1 jakllsch point of the binary is a function descriptor. A function descriptors
355 1.1 jakllsch consists of two double words: the first one is the code entry point
356 1.1 jakllsch and the second is the global pointer that should be loaded before
357 1.1 jakllsch calling the entry point. Since the ELF toolchain doesn't know how to
358 1.1 jakllsch generate a function descriptor for the entry point, the startup code
359 1.1 jakllsch in gnuefi/crt0-efi-ia64.S crafts one manually by with the code:
360 1.1 jakllsch
361 1.1 jakllsch .section .plabel, "a"
362 1.1 jakllsch _start_plabel:
363 1.1 jakllsch data8 _start
364 1.1 jakllsch data8 __gp
365 1.1 jakllsch
366 1.1 jakllsch this places the procedure label for entry point _start in a section
367 1.1 jakllsch called ".plabel". Now, the only problem is that _start and __gp need
368 1.1 jakllsch to be relocated _before_ EFI hands control over to the EFI binary.
369 1.1 jakllsch Fortunately, PE32+ defines a section called ".reloc" that can achieve
370 1.1 jakllsch this. Thus, in addition to manually crafting the function descriptor,
371 1.1 jakllsch the startup code also crafts a ".reloc" section that has will cause
372 1.1 jakllsch the EFI loader to relocate the function descriptor before handing over
373 1.1 jakllsch control to the EFI binary (again, see the PECOFF spec mentioned above
374 1.1 jakllsch for details).
375 1.1 jakllsch
376 1.1 jakllsch A final question may be why .plabel and .reloc need to go in their own
377 1.1 jakllsch COFF sections. The answer is simply: we need to be able to discard
378 1.1 jakllsch the relocation entries that are generated for these sections. By
379 1.1 jakllsch placing them in these sections, the relocations end up in sections
380 1.1 jakllsch ".rela.plabel" and ".rela.reloc" which makes it easy to filter them
381 1.1 jakllsch out in the filter script. Also, the ".reloc" section needs to be in
382 1.1 jakllsch its own section so that the objcopy program can recognize it and can
383 1.1 jakllsch create the correct directory entries in the PE32+ binary.
384 1.1 jakllsch
385 1.1 jakllsch
386 1.1 jakllsch ** (4) Convenient and Portable Generation of UNICODE String Literals
387 1.1 jakllsch
388 1.1 jakllsch As of gnu-efi-3.0, we make use (and somewhat abuse) the gcc option
389 1.1 jakllsch that forces wide characters (WCHAR_T) to use short integers (2 bytes)
390 1.1 jakllsch instead of integers (4 bytes). This way we match the Unicode character
391 1.1 jakllsch size. By abuse, we mean that we rely on the fact that the regular ASCII
392 1.1 jakllsch characters are encoded the same way between (short) wide characters
393 1.1 jakllsch and Unicode and basically only use the first byte. This allows us
394 1.1 jakllsch to just use them interchangeably.
395 1.1 jakllsch
396 1.1 jakllsch The gcc option to force short wide characters is : -fshort-wchar
397 1.1 jakllsch
398 1.1 jakllsch * * * The End * * *
399