home *** CD-ROM | disk | FTP | other *** search
GNU Info File | 1993-10-22 | 42.4 KB | 982 lines |
- This is Info file gcc.info, produced by Makeinfo-1.54 from the input
- file gcc.texi.
-
- This file documents the use and the internals of the GNU compiler.
-
- Published by the Free Software Foundation 675 Massachusetts Avenue
- Cambridge, MA 02139 USA
-
- Copyright (C) 1988, 1989, 1992, 1993 Free Software Foundation, Inc.
-
- Permission is granted to make and distribute verbatim copies of this
- manual provided the copyright notice and this permission notice are
- preserved on all copies.
-
- Permission is granted to copy and distribute modified versions of
- this manual under the conditions for verbatim copying, provided also
- that the sections entitled "GNU General Public License" and "Protect
- Your Freedom--Fight `Look And Feel'" are included exactly as in the
- original, and provided that the entire resulting derived work is
- distributed under the terms of a permission notice identical to this
- one.
-
- Permission is granted to copy and distribute translations of this
- manual into another language, under the above conditions for modified
- versions, except that the sections entitled "GNU General Public
- License" and "Protect Your Freedom--Fight `Look And Feel'", and this
- permission notice, may be included in translations approved by the Free
- Software Foundation instead of in the original English.
-
- File: gcc.info, Node: C++ Extensions, Next: Trouble, Prev: C Extensions, Up: Top
-
- Extensions to the C++ Language
- ******************************
-
- The GNU compiler provides these extensions to the C++ language (and
- you can also use most of the C language extensions in your C++
- programs). If you want to write code that checks whether these
- features are available, you can test for the GNU compiler the same way
- as for C programs: check for a predefined macro `__GNUC__'. You can
- also use `__GNUG__' to test specifically for GNU C++ (*note Standard
- Predefined Macros: (cpp.info)Standard Predefined.).
-
- * Menu:
-
- * Naming Results:: Giving a name to C++ function return values.
- * Min and Max:: C++ Minimum and maximum operators.
- * Destructors and Goto:: Goto is safe to use in C++ even when destructors
- are needed.
- * C++ Interface:: You can use a single C++ header file for both
- declarations and definitions.
-
- File: gcc.info, Node: Naming Results, Next: Min and Max, Up: C++ Extensions
-
- Named Return Values in C++
- ==========================
-
- GNU C++ extends the function-definition syntax to allow you to
- specify a name for the result of a function outside the body of the
- definition, in C++ programs:
-
- TYPE
- FUNCTIONNAME (ARGS) return RESULTNAME;
- {
- ...
- BODY
- ...
- }
-
- You can use this feature to avoid an extra constructor call when a
- function result has a class type. For example, consider a function
- `m', declared as `X v = m ();', whose result is of class `X':
-
- X
- m ()
- {
- X b;
- b.a = 23;
- return b;
- }
-
- Although `m' appears to have no arguments, in fact it has one
- implicit argument: the address of the return value. At invocation, the
- address of enough space to hold `v' is sent in as the implicit argument.
- Then `b' is constructed and its `a' field is set to the value 23.
- Finally, a copy constructor (a constructor of the form `X(X&)') is
- applied to `b', with the (implicit) return value location as the
- target, so that `v' is now bound to the return value.
-
- But this is wasteful. The local `b' is declared just to hold
- something that will be copied right out. While a compiler that
- combined an "elision" algorithm with interprocedural data flow analysis
- could conceivably eliminate all of this, it is much more practical to
- allow you to assist the compiler in generating efficient code by
- manipulating the return value explicitly, thus avoiding the local
- variable and copy constructor altogether.
-
- Using the extended GNU C++ function-definition syntax, you can avoid
- the temporary allocation and copying by naming `r' as your return value
- as the outset, and assigning to its `a' field directly:
-
- X
- m () return r;
- {
- r.a = 23;
- }
-
- The declaration of `r' is a standard, proper declaration, whose effects
- are executed *before* any of the body of `m'.
-
- Functions of this type impose no additional restrictions; in
- particular, you can execute `return' statements, or return implicitly by
- reaching the end of the function body ("falling off the edge"). Cases
- like
-
- X
- m () return r (23);
- {
- return;
- }
-
- (or even `X m () return r (23); { }') are unambiguous, since the return
- value `r' has been initialized in either case. The following code may
- be hard to read, but also works predictably:
-
- X
- m () return r;
- {
- X b;
- return b;
- }
-
- The return value slot denoted by `r' is initialized at the outset,
- but the statement `return b;' overrides this value. The compiler deals
- with this by destroying `r' (calling the destructor if there is one, or
- doing nothing if there is not), and then reinitializing `r' with `b'.
-
- This extension is provided primarily to help people who use
- overloaded operators, where there is a great need to control not just
- the arguments, but the return values of functions. For classes where
- the copy constructor incurs a heavy performance penalty (especially in
- the common case where there is a quick default constructor), this is a
- major savings. The disadvantage of this extension is that you do not
- control when the default constructor for the return value is called: it
- is always called at the beginning.
-
- File: gcc.info, Node: Min and Max, Next: Destructors and Goto, Prev: Naming Results, Up: C++ Extensions
-
- Minimum and Maximum Operators in C++
- ====================================
-
- It is very convenient to have operators which return the "minimum"
- or the "maximum" of two arguments. In GNU C++ (but not in GNU C),
-
- `A <? B'
- is the "minimum", returning the smaller of the numeric values A
- and B;
-
- `A >? B'
- is the "maximum", returning the larger of the numeric values A and
- B.
-
- These operations are not primitive in ordinary C++, since you can
- use a macro to return the minimum of two things in C++, as in the
- following example.
-
- #define MIN(X,Y) ((X) < (Y) ? : (X) : (Y))
-
- You might then use `int min = MIN (i, j);' to set MIN to the minimum
- value of variables I and J.
-
- However, side effects in `X' or `Y' may cause unintended behavior.
- For example, `MIN (i++, j++)' will fail, incrementing the smaller
- counter twice. A GNU C extension allows you to write safe macros that
- avoid this kind of problem (*note Naming an Expression's Type: Naming
- Types.). However, writing `MIN' and `MAX' as macros also forces you to
- use function-call notation notation for a fundamental arithmetic
- operation. Using GNU C++ extensions, you can write `int min = i <? j;'
- instead.
-
- Since `<?' and `>?' are built into the compiler, they properly
- handle expressions with side-effects; `int min = i++ <? j++;' works
- correctly.
-
- File: gcc.info, Node: Destructors and Goto, Next: C++ Interface, Prev: Min and Max, Up: C++ Extensions
-
- `goto' and Destructors in GNU C++
- =================================
-
- In C++ programs, you can safely use the `goto' statement. When you
- use it to exit a block which contains aggregates requiring destructors,
- the destructors will run before the `goto' transfers control. (In ANSI
- C++, `goto' is restricted to targets within the current block.)
-
- The compiler still forbids using `goto' to *enter* a scope that
- requires constructors.
-
- File: gcc.info, Node: C++ Interface, Prev: Destructors and Goto, Up: C++ Extensions
-
- Declarations and Definitions in One Header
- ==========================================
-
- C++ object definitions can be quite complex. In principle, your
- source code will need two kinds of things for each object that you use
- across more than one source file. First, you need an "interface"
- specification, describing its structure with type declarations and
- function prototypes. Second, you need the "implementation" itself. It
- can be tedious to maintain a separate interface description in a header
- file, in parallel to the actual implementation. It is also dangerous,
- since separate interface and implementation definitions may not remain
- parallel.
-
- With GNU C++, you can use a single header file for both purposes.
-
- *Warning:* The mechanism to specify this is in transition. For the
- nonce, you must use one of two `#pragma' commands; in a future
- release of GNU C++, an alternative mechanism will make these
- `#pragma' commands unnecessary.
-
- The header file contains the full definitions, but is marked with
- `#pragma interface' in the source code. This allows the compiler to
- use the header file only as an interface specification when ordinary
- source files incorporate it with `#include'. In the single source file
- where the full implementation belongs, you can use either a naming
- convention or `#pragma implementation' to indicate this alternate use
- of the header file.
-
- `#pragma interface'
- Use this directive in *header files* that define object classes,
- to save space in most of the object files that use those classes.
- Normally, local copies of certain information (backup copies of
- inline member functions, debugging information, and the internal
- tables that implement virtual functions) must be kept in each
- object file that includes class definitions. You can use this
- pragma to avoid such duplication. When a header file containing
- `#pragma interface' is included in a compilation, this auxiliary
- information will not be generated (unless the main input source
- file itself uses `#pragma implementation'). Instead, the object
- files will contain references to be resolved at link time.
-
- `#pragma implementation'
- `#pragma implementation "OBJECTS.h"'
- Use this pragma in a *main input file*, when you want full output
- from included header files to be generated (and made globally
- visible). The included header file, in turn, should use `#pragma
- interface'. Backup copies of inline member functions, debugging
- information, and the internal tables used to implement virtual
- functions are all generated in implementation files.
-
- `#pragma implementation' is *implied* whenever the basename(1) of
- your source file matches the basename of a header file it
- includes. There is no way to turn this off (other than using a
- different name for one of the two files). In the same vein, if
- you use `#pragma implementation' with no argument, it applies to an
- include file with the same basename as your source file. For
- example, in `allclass.cc', `#pragma implementation' by itself is
- equivalent to `#pragma implementation "allclass.h"'; but even if
- you do not say `#pragma implementation' at all, `allclass.h' is
- treated as an implementation file whenever you include it from
- `allclass.cc'.
-
- If you use an explicit `#pragma implementation', it must appear in
- your source file *before* you include the affected header files.
-
- Use the string argument if you want a single implementation file to
- include code from multiple header files. (You must also use
- `#include' to include the header file; `#pragma implementation'
- only specifies how to use the file--it doesn't actually include
- it.)
-
- There is no way to split up the contents of a single header file
- into multiple implementation files.
-
- `#pragma implementation' and `#pragma interface' also have an effect
- on function inlining.
-
- If you define a class in a header file marked with `#pragma
- interface', the effect on a function defined in that class is similar to
- an explicit `extern' declaration--the compiler emits no code at all to
- define an independent version of the function. Its definition is used
- only for inlining with its callers.
-
- Conversely, when you include the same header file in a main source
- file that declares it as `#pragma implementation', the compiler emits
- code for the function itself; this defines a version of the function
- that can be found via pointers (or by callers compiled without
- inlining).
-
- ---------- Footnotes ----------
-
- (1) A file's "basename" is the name stripped of all leading path
- information and of trailing suffixes, such as `.h' or `.C' or `.cc'.
-
- File: gcc.info, Node: Trouble, Next: Bugs, Prev: C++ Extensions, Up: Top
-
- Known Causes of Trouble with GNU CC
- ***********************************
-
- This section describes known problems that affect users of GNU CC.
- Most of these are not GNU CC bugs per se--if they were, we would fix
- them. But the result for a user may be like the result of a bug.
-
- Some of these problems are due to bugs in other software, some are
- missing features that are too much work to add, and some are places
- where people's opinions differ as to what is best.
-
- * Menu:
-
- * Actual Bugs:: Bugs we will fix later.
- * Installation Problems:: Problems that manifest when you install GNU CC.
- * Cross-Compiler Problems:: Common problems of cross compiling with GNU CC.
- * Interoperation:: Problems using GNU CC with other compilers,
- and with certain linkers, assemblers and debuggers.
- * External Bugs:: Problems compiling certain programs.
- * Incompatibilities:: GNU CC is incompatible with traditional C.
- * Fixed Headers:: GNU C uses corrected versions of system header files.
- This is necessary, but doesn't always work smoothly.
- * Disappointments:: Regrettable things we can't change, but not quite bugs.
- * C++ Misunderstandings:: Common misunderstandings with GNU C++.
- * Protoize Caveats:: Things to watch out for when using `protoize'.
- * Non-bugs:: Things we think are right, but some others disagree.
- * Warnings and Errors:: Which problems in your code get warnings,
- and which get errors.
-
- File: gcc.info, Node: Actual Bugs, Next: Installation Problems, Up: Trouble
-
- Actual Bugs We Haven't Fixed Yet
- ================================
-
- * The `fixincludes' script interacts badly with automounters; if the
- directory of system header files is automounted, it tends to be
- unmounted while `fixincludes' is running. This would seem to be a
- bug in the automounter. We don't know any good way to work around
- it.
-
- * Loop unrolling doesn't work properly for certain C++ programs.
- This is because of difficulty in updating the debugging
- information within the loop being unrolled. We plan to revamp the
- representation of debugging information so that this will work
- properly, but we have not done this in version 2.5 because we
- don't want to delay it any further.
-
- File: gcc.info, Node: Installation Problems, Next: Cross-Compiler Problems, Prev: Actual Bugs, Up: Trouble
-
- Installation Problems
- =====================
-
- This is a list of problems (and some apparent problems which don't
- really mean anything is wrong) that show up during installation of GNU
- CC.
-
- * On certain systems, defining certain environment variables such as
- `CC' can interfere with the functioning of `make'.
-
- * If you encounter seemingly strange errors when trying to build the
- compiler in a directory other than the source directory, it could
- be because you have previously configured the compiler in the
- source directory. Make sure you have done all the necessary
- preparations. *Note Other Dir::.
-
- * In previous versions of GNU CC, the `gcc' driver program looked for
- `as' and `ld' in various places; for example, in files beginning
- with `/usr/local/lib/gcc-'. GNU CC version 2 looks for them in
- the directory `/usr/local/lib/gcc-lib/TARGET/VERSION'.
-
- Thus, to use a version of `as' or `ld' that is not the system
- default, for example `gas' or GNU `ld', you must put them in that
- directory (or make links to them from that directory).
-
- * Some commands executed when making the compiler may fail (return a
- non-zero status) and be ignored by `make'. These failures, which
- are often due to files that were not found, are expected, and can
- safely be ignored.
-
- * It is normal to have warnings in compiling certain files about
- unreachable code and about enumeration type clashes. These files'
- names begin with `insn-'. Also, `real.c' may get some warnings
- that you can ignore.
-
- * Sometimes `make' recompiles parts of the compiler when installing
- the compiler. In one case, this was traced down to a bug in
- `make'. Either ignore the problem or switch to GNU Make.
-
- * If you have installed a program known as purify, you may find that
- it causes errors while linking `enquire', which is part of building
- GNU CC. The fix is to get rid of the file `real-ld' which purify
- installs--so that GNU CC won't try to use it.
-
- * On Linux SLS 1.01, there is a problem with `libc.a': it does not
- contain the obstack functions. However, GNU CC assumes that the
- obstack functions are in `libc.a' when it is the GNU C library.
- To work around this problem, change the `__GNU_LIBRARY__'
- conditional around line 31 to `#if 1'.
-
- * On some 386 systems, building the compiler never finishes because
- `enquire' hangs due to a hardware problem in the motherboard--it
- reports floating point exceptions to the kernel incorrectly. You
- can install GNU CC except for `float.h' by patching out the
- command to run `enquire'. You may also be able to fix the problem
- for real by getting a replacement motherboard. This problem was
- observed in Revision E of the Micronics motherboard, and is fixed
- in Revision F. It has also been observed in the MYLEX MXA-33
- motherboard.
-
- If you encounter this problem, you may also want to consider
- removing the FPU from the socket during the compilation.
- Alternatively, if you are running SCO Unix, you can reboot and
- force the FPU to be ignored. To do this, type `hd(40)unix auto
- ignorefpu'.
-
- * On some 386 systems, GNU CC crashes trying to compile `enquire.c'.
- This happens on machines that don't have a 387 FPU chip. On 386
- machines, the system kernel is supposed to emulate the 387 when you
- don't have one. The crash is due to a bug in the emulator.
-
- One of these systems is the Unix from Interactive Systems: 386/ix.
- On this system, an alternate emulator is provided, and it does
- work. To use it, execute this command as super-user:
-
- ln /etc/emulator.rel1 /etc/emulator
-
- and then reboot the system. (The default emulator file remains
- present under the name `emulator.dflt'.)
-
- Try using `/etc/emulator.att', if you have such a problem on the
- SCO system.
-
- Another system which has this problem is Esix. We don't know
- whether it has an alternate emulator that works.
-
- On NetBSD 0.8, a similar problem manifests itself as these error
- messages:
-
- enquire.c: In function `fprop':
- enquire.c:2328: floating overflow
-
- * On SCO systems, when compiling GNU CC with the system's compiler,
- do not use `-O'. Some versions of the system's compiler miscompile
- GNU CC with `-O'.
-
- * Sometimes on a Sun 4 you may observe a crash in the program
- `genflags' or `genoutput' while building GNU CC. This is said to
- be due to a bug in `sh'. You can probably get around it by running
- `genflags' or `genoutput' manually and then retrying the `make'.
-
- * On Solaris 2, executables of GNU CC version 2.0.2 are commonly
- available, but they have a bug that shows up when compiling current
- versions of GNU CC: undefined symbol errors occur during assembly
- if you use `-g'.
-
- The solution is to compile the current version of GNU CC without
- `-g'. That makes a working compiler which you can use to recompile
- with `-g'.
-
- * Solaris 2 comes with a number of optional OS packages. Some of
- these packages are needed to use GNU CC fully. If you did not
- install all optional packages when installing Solaris, you will
- need to verify that the packages that GNU CC needs are installed.
-
- To check whether an optional package is installed, use the
- `pkginfo' command. To add an optional package, use the `pkgadd'
- command. For further details, see the Solaris documentation.
-
- For Solaris 2.0 and 2.1, GNU CC needs six packages: `SUNWarc',
- `SUNWbtool', `SUNWesu', `SUNWhea', `SUNWlibm', and `SUNWtoo'.
-
- For Solaris 2.2, GNU CC needs an additional seventh package:
- `SUNWsprot'.
-
- * On Solaris 2, trying to use the linker and other tools in
- `/usr/ucb' to install GNU CC has been observed to cause trouble.
- For example, the linker may hang indefinitely. The fix is to
- remove `/usr/ucb' from your `PATH'.
-
- * If you use the 1.31 version of the MIPS assembler (such as was
- shipped with Ultrix 3.1), you will need to use the
- -fno-delayed-branch switch when optimizing floating point code.
- Otherwise, the assembler will complain when the GCC compiler fills
- a branch delay slot with a floating point instruction, such as
- add.d.
-
- * If on a MIPS system you get an error message saying "does not have
- gp sections for all it's [sic] sectons [sic]", don't worry about
- it. This happens whenever you use GAS with the MIPS linker, but
- there is not really anything wrong, and it is okay to use the
- output file. You can stop such warnings by installing the GNU
- linker.
-
- It would be nice to extend GAS to produce the gp tables, but they
- are optional, and there should not be a warning about their
- absence.
-
- * Users have reported some problems with version 2.0 of the MIPS
- compiler tools that were shipped with Ultrix 4.1. Version 2.10
- which came with Ultrix 4.2 seems to work fine.
-
- * Some versions of the MIPS linker will issue an assertion failure
- when linking code that uses `alloca' against shared libraries on
- RISC-OS 5.0, and DEC's OSF/1 systems. This is a bug in the
- linker, that is supposed to be fixed in future revisions. To
- protect against this, GCC passes `-non_shared' to the linker
- unless you pass an explicit `-shared' or `-call_shared' switch.
-
- * On System V release 3, you may get this error message while
- linking:
-
- ld fatal: failed to write symbol name SOMETHING
- in strings table for file WHATEVER
-
- This probably indicates that the disk is full or your ULIMIT won't
- allow the file to be as large as it needs to be.
-
- This problem can also result because the kernel parameter `MAXUMEM'
- is too small. If so, you must regenerate the kernel and make the
- value much larger. The default value is reported to be 1024; a
- value of 32768 is said to work. Smaller values may also work.
-
- * On System V, if you get an error like this,
-
- /usr/local/lib/bison.simple: In function `yyparse':
- /usr/local/lib/bison.simple:625: virtual memory exhausted
-
- that too indicates a problem with disk space, ULIMIT, or `MAXUMEM'.
-
- * Current GNU CC versions probably do not work on version 2 of the
- NeXT operating system.
-
- * On the Tower models 4N0 and 6N0, by default a process is not
- allowed to have more than one megabyte of memory. GNU CC cannot
- compile itself (or many other programs) with `-O' in that much
- memory.
-
- To solve this problem, reconfigure the kernel adding the following
- line to the configuration file:
-
- MAXUMEM = 4096
-
- * On HP 9000 series 300 or 400 running HP-UX release 8.0, there is a
- bug in the assembler that must be fixed before GNU CC can be
- built. This bug manifests itself during the first stage of
- compilation, while building `libgcc2.a':
-
- _floatdisf
- cc1: warning: `-g' option not supported on this version of GCC
- cc1: warning: `-g1' option not supported on this version of GCC
- ./xgcc: Internal compiler error: program as got fatal signal 11
-
- A patched version of the assembler is available by anonymous ftp
- from `altdorf.ai.mit.edu' as the file
- `archive/cph/hpux-8.0-assembler'. If you have HP software support,
- the patch can also be obtained directly from HP, as described in
- the following note:
-
- This is the patched assembler, to patch SR#1653-010439, where
- the assembler aborts on floating point constants.
-
- The bug is not really in the assembler, but in the shared
- library version of the function "cvtnum(3c)". The bug on
- "cvtnum(3c)" is SR#4701-078451. Anyway, the attached
- assembler uses the archive library version of "cvtnum(3c)"
- and thus does not exhibit the bug.
-
- This patch is also known as PHCO_0800.
-
- * Some versions of the Pyramid C compiler are reported to be unable
- to compile GNU CC. You must use an older version of GNU CC for
- bootstrapping. One indication of this problem is if you get a
- crash when GNU CC compiles the function `muldi3' in file
- `libgcc2.c'.
-
- You may be able to succeed by getting GNU CC version 1, installing
- it, and using it to compile GNU CC version 2. The bug in the
- Pyramid C compiler does not seem to affect GNU CC version 1.
-
- * There may be similar problems on System V Release 3.1 on 386
- systems.
-
- * On the Altos 3068, programs compiled with GNU CC won't work unless
- you fix a kernel bug. This happens using system versions V.2.2
- 1.0gT1 and V.2.2 1.0e and perhaps later versions as well. See the
- file `README.ALTOS'.
-
- * You will get several sorts of compilation and linking errors on the
- we32k if you don't follow the special instructions. *Note WE32K
- Install::.
-
- File: gcc.info, Node: Cross-Compiler Problems, Next: Interoperation, Prev: Installation Problems, Up: Trouble
-
- Cross-Compiler Problems
- =======================
-
- You may run into problems with cross compilation on certain machines,
- for several reasons.
-
- * Cross compilation can run into trouble for certain machines because
- some target machines' assemblers require floating point numbers to
- be written as *integer* constants in certain contexts.
-
- The compiler writes these integer constants by examining the
- floating point value as an integer and printing that integer,
- because this is simple to write and independent of the details of
- the floating point representation. But this does not work if the
- compiler is running on a different machine with an incompatible
- floating point format, or even a different byte-ordering.
-
- In addition, correct constant folding of floating point values
- requires representing them in the target machine's format. (The C
- standard does not quite require this, but in practice it is the
- only way to win.)
-
- It is now possible to overcome these problems by defining macros
- such as `REAL_VALUE_TYPE'. But doing so is a substantial amount of
- work for each target machine. *Note Cross-compilation::.
-
- * At present, the program `mips-tfile' which adds debug support to
- object files on MIPS systems does not work in a cross compile
- environment.
-
- File: gcc.info, Node: Interoperation, Next: External Bugs, Prev: Cross-Compiler Problems, Up: Trouble
-
- Interoperation
- ==============
-
- This section lists various difficulties encountered in using GNU C or
- GNU C++ together with other compilers or with the assemblers, linkers,
- libraries and debuggers on certain systems.
-
- * If you are using version 2.3 of libg++, you need to rebuild it with
- `make CC=gcc' to avoid mismatches in the definition of `size_t'.
-
- * Objective C does not work on the RS/6000 or the Alpha.
-
- * GNU C++ does not do name mangling in the same way as other C++
- compilers. This means that object files compiled with one compiler
- cannot be used with another.
-
- This effect is intentional, to protect you from more subtle
- problems. Compilers differ as to many internal details of C++
- implementation, including: how class instances are laid out, how
- multiple inheritance is implemented, and how virtual function
- calls are handled. If the name encoding were made the same, your
- programs would link against libraries provided from other
- compilers--but the programs would then crash when run.
- Incompatible libraries are then detected at link time, rather than
- at run time.
-
- * Older GDB versions sometimes fail to read the output of GNU CC
- version 2. If you have trouble, get GDB version 4.4 or later.
-
- * DBX rejects some files produced by GNU CC, though it accepts
- similar constructs in output from PCC. Until someone can supply a
- coherent description of what is valid DBX input and what is not,
- there is nothing I can do about these problems. You are on your
- own.
-
- * The GNU assembler (GAS) does not support PIC. To generate PIC
- code, you must use some other assembler, such as `/bin/as'.
-
- * On some BSD systems including some versions of Ultrix, use of
- profiling causes static variable destructors (currently used only
- in C++) not to be run.
-
- * Use of `-I/usr/include' may cause trouble.
-
- Many systems come with header files that won't work with GNU CC
- unless corrected by `fixincludes'. The corrected header files go
- in a new directory; GNU CC searches this directory before
- `/usr/include'. If you use `-I/usr/include', this tells GNU CC to
- search `/usr/include' earlier on, before the corrected headers.
- The result is that you get the uncorrected header files.
-
- Instead, you should use these options (when compiling C programs):
-
- -I/usr/local/lib/gcc-lib/TARGET/VERSION/include -I/usr/include
-
- For C++ programs, GNU CC also uses a special directory that
- defines C++ interfaces to standard C subroutines. This directory
- is meant to be searched *before* other standard include
- directories, so that it takes precedence. If you are compiling
- C++ programs and specifying include directories explicitly, use
- this option first, then the two options above:
-
- -I/usr/local/lib/g++-include
-
- * On a Sparc, GNU CC aligns all values of type `double' on an 8-byte
- boundary, and it expects every `double' to be so aligned. The Sun
- compiler usually gives `double' values 8-byte alignment, with one
- exception: function arguments of type `double' may not be aligned.
-
- As a result, if a function compiled with Sun CC takes the address
- of an argument of type `double' and passes this pointer of type
- `double *' to a function compiled with GNU CC, dereferencing the
- pointer may cause a fatal signal.
-
- One way to solve this problem is to compile your entire program
- with GNU CC. Another solution is to modify the function that is
- compiled with Sun CC to copy the argument into a local variable;
- local variables are always properly aligned. A third solution is
- to modify the function that uses the pointer to dereference it via
- the following function `access_double' instead of directly with
- `*':
-
- inline double
- access_double (double *unaligned_ptr)
- {
- union d2i { double d; int i[2]; };
-
- union d2i *p = (union d2i *) unaligned_ptr;
- union d2i u;
-
- u.i[0] = p->i[0];
- u.i[1] = p->i[1];
-
- return u.d;
- }
-
- Storing into the pointer can be done likewise with the same union.
-
- * On Solaris, the `malloc' function in the `libmalloc.a' library may
- allocate memory that is only 4 byte aligned. Since GNU CC on the
- Sparc assumes that doubles are 8 byte aligned, this may result in a
- fatal signal if doubles are stored in memory allocated by the
- `libmalloc.a' library.
-
- The solution is to not use the `libmalloc.a' library. Use instead
- `malloc' and related functions from `libc.a'; they do not have
- this problem.
-
- * On a Sun, linking using GNU CC fails to find a shared library and
- reports that the library doesn't exist at all.
-
- This happens if you are using the GNU linker, because it does only
- static linking and looks only for unshared libraries. If you have
- a shared library with no unshared counterpart, the GNU linker
- won't find anything.
-
- We hope to make a linker which supports Sun shared libraries, but
- please don't ask when it will be finished--we don't know.
-
- * Sun forgot to include a static version of `libdl.a' with some
- versions of SunOS (mainly 4.1). This results in undefined symbols
- when linking static binaries (that is, if you use `-static'). If
- you see undefined symbols `_dlclose', `_dlsym' or `_dlopen' when
- linking, compile and link against the file `mit/util/misc/dlsym.c'
- from the MIT version of X windows.
-
- * The 128-bit long double format that the Sparc port supports
- currently works by using the architecturally defined quad-word
- floating point instructions. Since there is no hardware that
- supports these instructions they must be emulated by the operating
- system. Long doubles do not work in Sun OS versions 4.0.3 and
- earlier, because the kernel eumulator uses an obsolete and
- incompatible format. Long doubles do not work in Sun OS versions
- 4.1.1 to 4.1.3 because of emululator bugs that cause random
- unpredicatable failures. Long doubles appear to work in Sun OS 5.x
- (Solaris 2.x).
-
- A future implementation of the sparc long double support will use
- functions calls to library routines instead of the quad-word
- floating point instructions. This will allow long doubles to work
- in more situtations, since one can then substitute a working
- library if the kernel emulator is buggy.
-
- * On HP-UX version 9.01 on the HP PA, the HP compiler `cc' does not
- compile GNU CC correctly. We do not yet know why. However, GNU CC
- compiled on earlier HP-UX versions works properly on HP-UX 9.01
- and can compile itself properly on 9.01.
-
- * On the HP PA machine, ADB sometimes fails to work on functions
- compiled with GNU CC. Specifically, it fails to work on functions
- that use `alloca' or variable-size arrays. This is because GNU CC
- doesn't generate HP-UX unwind descriptors for such functions. It
- may even be impossible to generate them.
-
- * Debugging (`-g') is not supported on the HP PA machine, unless you
- use the preliminary GNU tools (*note Installation::.).
-
- * Taking the address of a label may generate errors from the HP-UX
- PA assembler. GAS for the PA does not have this problem.
-
- * Using floating point parameters for indirect calls to static
- functions will not work when using the HP assembler. There simply
- is no way for GCC to specify what registers hold arguments for
- static functions when using the HP assembler. GAS for the PA does
- not have this problem.
-
- * For some very large functions you may receive errors from the HP
- linker complaining about an out of bounds unconditional branch
- offset. Fixing this problem correctly requires fixing problems in
- GNU CC and GAS. We hope to fix this in time for GNU CC 2.6.
- Until then you can work around by making your function smaller,
- and if you are using GAS, splitting the function into multiple
- source files may be necessary.
-
- * GNU CC compiled code sometimes emits warnings from the HP-UX
- assembler of the form:
-
- (warning) Use of GR3 when
- frame >= 8192 may cause conflict.
-
- These warnings are harmless and can be safely ignored.
-
- * The current version of the assembler (`/bin/as') for the RS/6000
- has certain problems that prevent the `-g' option in GCC from
- working. Note that `Makefile.in' uses `-g' by default when
- compiling `libgcc2.c'.
-
- IBM has produced a fixed version of the assembler. The upgraded
- assembler unfortunately was not included in any of the AIX 3.2
- update PTF releases (3.2.2, 3.2.3, or 3.2.3e). Users of AIX 3.1
- should request PTF U403044 from IBM and users of AIX 3.2 should
- request PTF U416277. See the file `README.RS6000' for more
- details on these updates.
-
- You can test for the presense of a fixed assembler by using the
- command
-
- as -u < /dev/null
-
- If the command exits normally, the assembler fix already is
- installed. If the assembler complains that "-u" is an unknown
- flag, you need to order the fix.
-
- * On the IBM RS/6000, compiling code of the form
-
- extern int foo;
-
- ... foo ...
-
- static int foo;
-
- will cause the linker to report an undefined symbol `foo'.
- Although this behavior differs from most other systems, it is not a
- bug because redefining an `extern' variable as `static' is
- undefined in ANSI C.
-
- * AIX on the RS/6000 provides support (NLS) for environments outside
- of the United States. Compilers and assemblers use NLS to support
- locale-specific representations of various objects including
- floating-point numbers ("." vs "," for separating decimal
- fractions). There have been problems reported where the library
- linked with GCC does not produce the same floating-point formats
- that the assembler accepts. If you have this problem, set the
- LANG environment variable to "C" or "En_US".
-
- * On the RS/6000, XLC version 1.3.0.0 will miscompile `jump.c'. XLC
- version 1.3.0.1 or later fixes this problem. We do not yet have a
- PTF number for this fix.
-
- * There is an assembler bug in versions of DG/UX prior to 5.4.2.01
- that occurs when the `fldcr' instruction is used. GNU CC uses
- `fldcr' on the 88100 to serialize volatile memory references. Use
- the option `-mno-serialize-volatile' if your version of the
- assembler has this bug.
-
- * On VMS, GAS versions 1.38.1 and earlier may cause spurious warning
- messages from the linker. These warning messages complain of
- mismatched psect attributes. You can ignore them. *Note VMS
- Install::.
-
- * On NewsOS version 3, if you include both of the files `stddef.h'
- and `sys/types.h', you get an error because there are two typedefs
- of `size_t'. You should change `sys/types.h' by adding these
- lines around the definition of `size_t':
-
- #ifndef _SIZE_T
- #define _SIZE_T
- ACTUAL TYPEDEF HERE
- #endif
-
- * On the Alliant, the system's own convention for returning
- structures and unions is unusual, and is not compatible with GNU
- CC no matter what options are used.
-
- * On the IBM RT PC, the MetaWare HighC compiler (hc) uses a different
- convention for structure and union returning. Use the option
- `-mhc-struct-return' to tell GNU CC to use a convention compatible
- with it.
-
- * On Ultrix, the Fortran compiler expects registers 2 through 5 to
- be saved by function calls. However, the C compiler uses
- conventions compatible with BSD Unix: registers 2 through 5 may be
- clobbered by function calls.
-
- GNU CC uses the same convention as the Ultrix C compiler. You can
- use these options to produce code compatible with the Fortran
- compiler:
-
- -fcall-saved-r2 -fcall-saved-r3 -fcall-saved-r4 -fcall-saved-r5
-
- * On the WE32k, you may find that programs compiled with GNU CC do
- not work with the standard shared C ilbrary. You may need to link
- with the ordinary C compiler. If you do so, you must specify the
- following options:
-
- -L/usr/local/lib/gcc-lib/we32k-att-sysv/2.5 -lgcc -lc_s
-
- The first specifies where to find the library `libgcc.a' specified
- with the `-lgcc' option.
-
- GNU CC does linking by invoking `ld', just as `cc' does, and there
- is no reason why it *should* matter which compilation program you
- use to invoke `ld'. If someone tracks this problem down, it can
- probably be fixed easily.
-
- * On the Alpha, you may get assembler errors about invalid syntax as
- a result of floating point constants. This is due to a bug in the
- C library functions `ecvt', `fcvt' and `gcvt'. Given valid
- floating point numbers, they sometimes print `NaN'.
-
- * On Irix 4.0.5F (and perhaps in some other versions), an assembler
- bug sometimes reorders instructions incorrectly when optimization
- is turned on. If you think this may be happening to you, try
- using the GNU assembler; GAS version 2.1 supports ECOFF on Irix.
-
- Or use the `-noasmopt' option when you compile GNU CC with itself,
- and then again when you compile your program. (This is a temporary
- kludge to turn off assembler optimization on Irix.) If this
- proves to be what you need, edit the assembler spec in the file
- `specs' so that it unconditionally passes `-O0' to the assembler,
- and never passes `-O2' or `-O3'.
-
- File: gcc.info, Node: External Bugs, Next: Incompatibilities, Prev: Interoperation, Up: Trouble
-
- Problems Compiling Certain Programs
- ===================================
-
- * Parse errors may occur compiling X11 on a Decstation running
- Ultrix 4.2 because of problems in DEC's versions of the X11 header
- files `X11/Xlib.h' and `X11/Xutil.h'. People recommend adding
- `-I/usr/include/mit' to use the MIT versions of the header files,
- using the `-traditional' switch to turn off ANSI C, or fixing the
- header files by adding this:
-
- #ifdef __STDC__
- #define NeedFunctionPrototypes 0
- #endif
-
- * If you have trouble compiling Perl on a SunOS 4 system, it may be
- because Perl specifies `-I/usr/ucbinclude'. This accesses the
- unfixed header files. Perl specifies the options
-
- -traditional -Dvolatile=__volatile__
- -I/usr/include/sun -I/usr/ucbinclude
- -fpcc-struct-return
-
- all of which are unnecessary with GCC 2.4.5 and newer versions.
- You can make a properly working Perl by setting `ccflags' and
- `cppflags' to empty values in `config.sh', then typing `./doSH;
- make depend; make'.
-
- * On various 386 Unix systems derived from System V, including SCO,
- ISC, and ESIX, you may get error messages about running out of
- virtual memory while compiling certain programs.
-
- You can prevent this problem by linking GNU CC with the GNU malloc
- (which thus replaces the malloc that comes with the system). GNU
- malloc is available as a separate package, and also in the file
- `src/gmalloc.c' in the GNU Emacs 19 distribution.
-
- If you have installed GNU malloc as a separate library package,
- use this option when you relink GNU CC:
-
- MALLOC=/usr/local/lib/libgmalloc.a
-
- Alternatively, if you have compiled `gmalloc.c' from Emacs 19, copy
- the object file to `gmalloc.o' and use this option when you relink
- GNU CC:
-
- MALLOC=gmalloc.o
-
-