Information about the basic organization of the sources, building the
GNU Compiler Collection, and debugging techniques useful to debug the
built compiler under the GNU debugger,
gdb is described. Some
interesting information about the compiler is also presented.
The GNU Compiler Collection – GCC – is one of the most complex software systems available in full source form. It was initiated by the Free Software Foundation and today is steered by an independent steering committee. While initially, it started off as a efficient C compiler for 32 bit machines, it has evolved to a reasonable generic architecture that accommodates about 7 source languages and a large number of target machines officially. This architecture is highly re-forgettable in practice, and the emphasis has been to have a well tested compilation system for a large number of target machines. The GPL ensures that the evolution of the system will continue. The bazaar (see The Cathedral and the Bazaar) model of development keeps the system reasonably updated in practice. The easy availability, retargetability, the GNU license and continuing development have combined to make it a standard reference implementation with respect to which specific implementations are often compared today.
The availability and maturity of the GCC has made it an attractive development system for a variety of interests: professional, academic & hobby. Despite the availability of the source code, the complexity of the system makes it accessible usually to professionals. Even for these people, a significant effort has to be invested in understanding the compiler internals. Although high development standards have been adhered to by the GCC developers, which include well commented code, adherence to standard coding and maintenance practices, and a few simple principles (like using simple algorithms and data structures), there is almost no description of the compiler at various useful levels of abstraction. The development of such descriptions has been less attractive than the development of the compiler itself. This has been so mainly due to the strong emphasis on creating a practical and an efficient compilation system. This emphasis on a practical working compilation system for a variety of source languages and target architectures has resulted in a complexity that is difficult to master.
This document is the first in a series of articles planned towards a
gradual mastery of the GCC internals. For a start, to master the
compiler internals, we need to understand it's code organization, the
basic reasons that motivate this organization, the basic compiler
building techniques and the basic debugging techniques. The use of
the compiler is documented in the online manuals – in the
man pages and the GNU style
and is therefore not much dealt with here. However, we do point out
some useful switches that can help in understanding the compiler
The description is organized as follows. We first discuss the basic
goals and architecture of the GCC system. This is used to understand
the GCC source organization. We then describe building a native GCC
compiler. Although described in the installation notes of GCC, we
examine the process in more detail with a aim to eventually build
hacking abilities. This is illustrated by a description of a few
simple debugging techniques. Files and documents of the GCC source
base are indicated relative to a “home” in the file system where the
sources have been extracted. This home is indicated by
GCC started it's life as a C compiler. It's goal then (and even today) was to be a useful compiler for general use (see A Brief History of GCC). It was desirable that the compiler be retargetable to facilitate easy porting to new systems. A retargetable architecture postpones target machine specific decisions to build time instead of committing to specific machine properties earlier. This implies that the building process is required to incorporate the target machine properties into the compiler code base. The GCC today actively pursues the retargetability goal mainly because it results in a useful compiler. To be useful is the primary goal and retargetability is viewed as a way to reach the goal. It aims to support all the machines that are in operation at any given point in time. It is possible that support for some machines gets withdrawn as their decreasing usage is not worth the effort to support it. The main goals of GCC are summarized in the mission statement (see the GCC mission statement) of the GNU Project. The design and development goals are:
The GCC effort is mainly an engineering effort aimed at being of immediate use. As with any other software engineering effort, it's concerns are with:
The GCC software architecture strongly reflects the retargetability requirements. As a consequence of retargetability, the build time, tbuild acquires critical importance. The GCC system is designed and developed prior to this instant, and the compiler binary that would eventually be used to compile user programs is created after this instant. Prior to tbuild the GCC system cannot make any assumptions about target properties1. Hence, the implementation must have at least two parts:
The time period tbuild separates two conceptually distinct phases. Prior to tbuild the compilation phases have to be expressed generically and the target properties have to be specified. This is the development time, denoted by tcgf. After tbuild we have a complete target specific compiler executable that a user can use to compile program. This is the operation time denoted by top. At tbuild target specific parts of the compiler code are generated from the target specifications available before tbuild. This is shown in the GCC compiler generation framework figure below. The top half of the figure denotes the implementation before tbuild as developed by a GCC developer and hence is labeled as “GCC”. The bottom half is the target specific compiler generated from the code in the top half during the build process at tbuild and is therefore labeled as “gcc” and executable is used by a user to compile programs.
Figure 2.1: The GCC Compiler Generation Framework (CGF) and it's use to generate the target specific compiler (cc1/gcc) components. Some components of the compiler (cc1/gcc) are selected from the CGF, some are copied from the CGF and some are generated from the framework.
The figure also shows that GCC is “retargetable” with respect to front end languages too. Front end specific processing for various front end languages that GCC supports is also a part of the GCC system. The purpose of front end specific parts is to reduce the input source program to a common IR called the generic. In this series of documents we do not focus on front end specific processing of GCC. For our purposes the compiler starts from the program representation in generic IR.
The top half of the figure, labeled “GCC”, will be called as the Compiler Generation Framework (CGF). The CGF generates the target specific compiler at tbuild. An awareness of this distinction is useful to understand the GCC system. In this article, we describe the basic layout and logical structure of the CGF. Along the way we will introduce some terms that would be used in the other articles of this series. In particular, the source files are divided into implementation groups. The phase sequence wise grouping is described in The Phase wise File Groups of GCC. Note that there are distinct groups of files that are used to generate the target compiler of the bottom half of the figure. These groups will be further refined in later documents (e.g. The Phase wise File Groups of GCC). For completeness, we also briefly describe the build and use of a GCC compiler. Details of this can be consulted in the build instructions that accompany the downloaded compiler. We take this opportunity to bring out a few lesser known ways of using the compiler itself for our goal – the study of the internals. To focus more sharply on the internals, we ignore the other goals of the GCC development like development and implementation of new optimizations, improving run time library support, benchmarking etc. We will be concerned with development of new targets since that forms a part of study of the internals.
The pristine sources of GCC are downloadable from any official GCC
distribution site on the Internet. The list of sites is available on
the official GCC site. A gzipped tape
archive for GCC version 4.1.2 is named as
These sources are extracted in a directory that we denote by
$GCCHOME. Conventionally, the sources extract into a set of
directories and files in a directory named
z are version digits. For example the
GCC version 4.1.2 sources extract into a directory named
gcc-x.y.z is (usually) the last
directory component of
$GCCHOME. This description of the GCC
source organization strives to build the intuition behind the
structure that one obtains on unpacking the distribution. We emphasize
that this is GCC version specific, and some variations are possible in
principle. We describe the general issues here, and leave the details
See Source Organization Details.
The HLL specific components, the target back end components and the actual compiler logic are separate. A driver is needed to collect the components for the chosen HLL and target pair, and “assemble” the final compiler sources which are subsequently compiled. This strategy allows creating various kinds of compilers like native, cross or Canadian cross.
The source and target independent parts of the compiler are within the
$GCCHOME/gcc subdirectory of the main source trunk.
It is in this directory that we find the code that
Corresponding to each HLL, except C2, is a directory within
$GCCHOME/gcc which all the code for processing that language
exists. In particular this involves scanning the tokens of that
language and creating the ASTs. If necessary, the basic AST tree node
types need to be augmented with variations for this language. The
main compiler calls these routines to handle input of that language.
To isolate itself from the details of the source language, the main
compiler uses a table of function pointers that are to be used to
perform each required task. A language implementation needs to fill
in such data structures of the main compiler code and build the
language specific processing chain until the AST is obtained.
The back end specific code is organized as a list of directories
corresponding to each supported back end system. This list of
supported back ends is separately housed in
directory of the main trunk.
Parts of the compiler that are common and find frequent usage have
also been separated into a separate library called the
libiberty and placed in a distinct subdirectory of
$GCCHOME. This facilitates a one-time build of these common
routines. We emphasize that these routines are common to the main
compiler, the front end code and the back end code (e.g. regular
expressions handling); the routines common to only the main compiler
still reside in the main compiler directory, i.e.
GCC also implements a garbage collection based memory management
system for it's use during a run. This code is placed in the
We focus on files relevant to understanding the compiler. Hence files
such have been omitted below.
GCC uses internal garbage collection to manage it's own memory during a run. Supporting each front end may require additional libraries which are also bundled with the GCC sources, except the C library which is a separate package. A few other directories have code for different purposes like maintenance, description of the building and installation procedure etc. Here is a summary.
|Collection of system specific flags
|Useful contributed code
|Bundled Java archiver
|Bundled Foreign Function Interface
|Common GNU routines library
|Objective C library
|Scripts used by maintainers
|General purpose compression library
Apart from the directory organization,
$GCCHOME also has code
and data to build and install the sources. GCC uses
configure script to obtain the detailed building
requirements. This script is supported by a few other scripts. It
emits the top level
Makefile using a few data files in
make command that uses this
Makefile also needs some supporting scripts which reside here.
These scripts thus are used in various phases: configuration,
building, and installation of the compiler.
configure uses the
config.guess script to guess the
canonical name when the user has not supplied one. The canonical name
of a system – build, host or target – is made up of a triple, or
some times a quadruple of CPU type (sparc), Manufacturer (sun),
operating system (unix), and sometimes the kernel (linux) as the third
of the quadruple. The
config.sub script is used to validate a
given canonical name, i.e. it checks if the given name is supported or
not. Adding a new backend may involve adding some code the
config.sub to recognize the new target.
The main compiler sources reside in
This directory contains five categories of code: the supported front
ends, the supported back ends, auxiliary code for various purposes
like internationalization support, hacks to fix vendor supplied files,
the test suite etc., the include files, and the main compiler sources.
Here are the various directories and files.
This code deals with processing the program as expressed by the user and corresponds to the “Language Specific Code” part of GCC box in Fig.(Figure 2.1).
|Fortran front end
|Ada front end
|C++ front end
|Java front end
|Objective C front end
|Treelang front end
The back end support code resides in the
directory and corresponds to the “Machine Dependent Generator Code”
part of the GCC box in Fig.(Figure 2.1). The specifications of supported target are found in
individual subdirectories and are the input to the generation
mechanism (files in section gen:srcs) that generates the target
specific information for the compiler in the bottom half of
Fig.(Figure 2.1). This
directory contains two main types of files. The common header files
usually contain code for various target systems and reside in
$GCCHOME/gcc/config (referred to as
itself while the actual target machine description files are found in
Back end common files
Back end machine description
For each of the supported back end targets, GCC uses the following layout:
The following directories contain auxiliary files as follows:
|Documentation in |
|Hacks to fix vendor's include files
|Additional includes for ISO C support
|GCC Internationalization support
|Internationalization data strings
|GCC test suite
The common include files of the compiler reside in the
$GCCHOME/include directory. This is referred to below as
The bulk of the sources reside in the
We will refer to this directory as
$MAINSRCS below. We divide
the sources into the following six types: scripts, templates to drive
the scripts, definitions, C sources that are used to generate sources
with target specific information at build time, C include files and C
Of particular interest for the study of the GCC compiler are the
machmode.def definition files.
mmon.def together define all the AST node types.
rtl.def defines all the various RTL types that a given version
GCC uses internally. Finally, the
machmode.def file defines
the RTL Abstract machine data types with their relative size in bytes.
We further divide the sources depending on the concept being
implemented by them as: front end processing, Interfacing with the
rest of the compiler, main compilation phases, optimizations, tools
chain interfacing, C preprocessing, measurements and diagnostics,
error detection and reporting, debugging, the
gcc driver files
and other miscellaneous files. These divisions, however, are rough
since a source file sometimes contains code that is useful in a
different context too.
Front end processing
There are four directories3 that are useful to describe the user level building of GCC. They are not required to be defined in practice.
The GCC build instructions in
recommend the use of a distinct build directory and discourages building
$GCCHOME. Any directory with suitable permissions that is
$GCCHOME may be used.
The binaries, libraries, headers and documentation that is built is
installed as a directory tree under
$INSTALLDIR. This is any
convenient directory with suitable permissions, and usually distinct
from the others. The default is a system wide installation directory,
/usr/local, but can be specified when GCC is configured for
There are four steps to building the compiler.
In the description below, unless otherwise stated, we assume a
GNU/Linux system running on an i386 with the GNU Bourne Again SHell –
bash – as the command shell. All commands are issued at the
bash shell prompt, and shell commands or scripts are
The pristine GCC sources must be informed about some details like the
system on which it will eventually run. A shell script called
configure is used for this. Most pieces of required
information have reasonable default values, and the usual way is to
simply issue the
configure command, which uses the defaults.
However, specific non default values can be given to the
configure command through some command line switches. Being a
retargetable compiler that supports a number of high level languages
(HLLs), the sources need to be informed about the particular source
language and the target hardware on which the built compiler is to be
used. By default, GCC is configured to build a compiler for the
target on which it is being compiled – the so called
compiler is desired, then the switch
--enable-languages can be
used. It also builds a compiler for each supported source language.
The install directory defaults to
/usr/local, but can also be
specified using the
--prefix switch. The
--help command lists out various such options whose details are
Here is a list of few configuration options.
--enable-languages: The set of desired source languages separated by commas.
--target: The target hardware for which the built compiler should generate code given as a GNU system triplet,
--prefix: The absolute pathname of the directory below which the built compiler will be installed. This is
$INSTALLDIR. This must be available (created fresh, if necessary) before issuing the
For example, on a typical Intel 386 based machines running the
GNU/Linux systems, the following commands build a native compiler for
C, C++, Java etc. that is installed in
To build only a C compiler for a i386 for running on a GNU/Linux
operating system and
/home/amv/gcc-trial-install as the
installation folder4, we
configure as follows:
/home/amv/gcc-trial-installas the installation folder (each option is shown on a separate line for clarity, but is one single command line)
In any case, the
configure program makes a number of checks for
a successful build and generates a
$BUILDDIR/Makefile) to start building the compiler if all the
checks are successful. However, it occasionally can occur that this
Makefile may result in a failure of the later build in which
case it is a good idea to report the failure to GCC developers.
It is useful to redirect the output of
configure to some file
for later study as follows:5
$GCCHOME/configure > configure.log 2> configure.errors
Once the configuration successfully generates the required
Makefile, to build the compiler one simply issues the
make command. The steps are:
Building GCC involves building the compiler for each source language,
the driver program
gcc, the associated header files, any
support libraries (but not the standard C library – 1 that is built
separately outside of GCC), and the documentation. The driver program
gcc is the command that users use to compile their
source programs. The driver takes the user's source file to be
compiled and invokes a sequence of programs – the compiler, the
assembler and the linker – that generate it's binary.
The GCC build aborts in case an error is encountered.
It is useful to redirect the output of
make to some file for
later study as follows:
$BUILDDIR/make > make.log 2> make.errors
An install follows a successful build. The various components of the
compiler like the driver, the compiler proper, any libraries, the
documentation etc. are installed under a well defined directory
structure in the
$INSTALLDIR directory. The following
structure is typically used:
$INSTALLDIR/bin: Directory where the various executables are installed.
$INSTALLDIR/include: Directory where the various headers are installed.
$INSTALLDIR/lib: Directory where the various libraries are installed.
$INSTALLDIR/man: Directory where the various online manual pages are installed.
$INSTALLDIR/info: Directory where the various online info6 pages are installed.
The install the built sources, use the following command:
It is useful to redirect the output of install to some file for later study as follows:
$BUILDDIR/make install > install.log 2> install.errors
To use the newly built GCC compiler, it is useful to have the
DIR/bin directory in the path. On unix like
systems, like GNU/Linux, a path is a standard shell variable called
PATH whose value is a colon separated list of directories to be
sequentially searched for locating the executable of the
command given by the user. In case the
$INSTALLDIR/bin is not
in the path, the complete pathname of the executable must be given, as
we use in the example commands that follow.
Assume that we have written a C program in a file named
in the current directory. If the installation is successful, the
following command can be used to compile
prog.c and generate
If there are no errors, the executable named
GCC has a number of useful options that can be used to control the
details of the compilation. All the options can be found in the
online documentation using the commands
man gcc, or
gcc. Here are a few:
-Wall: Turns on all warnings. This is extremely useful to trap many conventional errors we make while writing source code. We strongly recommend the use of this switch in normal program development. It is not necessary in final production compilation.
-o <file_name>: The output generated by the compiler is stored in the file named
file_name. Most outputs have default file names. For example, executables are named
a.outby default. This switch is used if we wish to give the executable a specific name. For example, if we wish to name the executable of
progthen the command line is:
$INSTALLDIR/bin/gcc prog.c -o prog
-S: Generate the assembly output of the given program. The assembly code output of the program
prog.cis stored by default in the file named
-oswitch is used).
-c: Generate the object code, not the executable, of the given program. The object code output of the program
prog.cis stored by default in the file named
-oswitch is used).
-dA: Annotate the assembler output with some useful information. Useful information like the source variable to assembly register association can be obtained using this switch.
-fdump-tree-*: The '
*' here stands for a set of additional words like
rawetc. giving us a family of switches like
tree-rawetc. This family of switches tell the compiler to dump the tree intermediate representations of the program being compiled. This is useful to study the internals of the compiler.
-fdump-rtl-*: The '
*' here stands for a set of additional words like
bbroetc. giving us a family of switches like
rtl-bbroetc. This family of switches tell the compiler to dump the RTL intermediate representations of the program being compiled. This is useful to study the internals of the compiler.
This is edition 1.0 of “Basic Information about GCC”, last updated on January 7, 2008.
Copyright © 2004-2008 Abhijat Vichare , I.I.T. Bombay.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with the Front-Cover Texts being “Basic Information about GCC,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”
(a) The FSF's Back-Cover Text is: “You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development.”
Copyright © 2000,2001,2002 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.
This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.
We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.
This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.
A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.
A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.
The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.
The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.
A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”.
Examples of suitable formats for Transparent copies include plain ascii without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.
The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.
A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition.
The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.
You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and you may publicly display copies.
If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.
If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.
You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:
If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.
You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.
You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.”
You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.
A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.
Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.
If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.
You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation.
To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:
Copyright (C) year your name. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''.
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with...Texts.” line with this:
with the Invariant Sections being list their titles, with the Front-Cover Texts being list, and with the Back-Cover Texts being list.
If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.
If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.
 This is not strictly true. The targets are assumed to be at least 32 bit, for example!
 GCC was originally aimed at being just a C compiler
 Directories are also called as “folders”.
 We will describe this by saying that
practice, we do not need to set a
and the complete pathname of
$INSTALLDIR must be given.
 In fact, this is what we did for each stage of building to study some aspects of GCC!
 Info pages are standard GNU online documentation
system similar to unix man pages and accessed using the