home *** CD-ROM | disk | FTP | other *** search
GNU Info File | 1994-07-15 | 43.3 KB | 986 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++ Interface, Next: C++ Signatures, 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: C++ Signatures, Prev: C++ Interface, Up: C++ Extensions
-
- Type Abstraction using Signatures
- =================================
-
- In GNU C++, you can use the keyword `signature' to define a
- completely abstract class interface as a datatype. You can connect this
- abstraction with actual classes using signature pointers. If you want
- to use signatures, run the GNU compiler with the `-fhandle-signatures'
- command-line option. (With this option, the compiler reserves a second
- keyword `sigof' as well, for a future extension.)
-
- Roughly, signatures are type abstractions or interfaces of classes.
- Some other languages have similar facilities. C++ signatures are
- related to ML's signatures, Haskell's type classes, definition modules
- in Modula-2, interface modules in Modula-3, abstract types in Emerald,
- type modules in Trellis/Owl, categories in Scratchpad II, and types in
- POOL-I. For a more detailed discussion of signatures, see `Signatures:
- A C++ Extension for Type Abstraction and Subtype Polymorphism' by
- Gerald Baumgartner and Vincent F. Russo (Tech report CSD-TR-93-059,
- Dept. of Computer Sciences, Purdue University, September 1993, to
- appear in *Software Practice & Experience*). You can get the tech
- report by anonymous FTP from `ftp.cs.purdue.edu' in
- `pub/reports/TR93-059.PS.Z'.
-
- Syntactically, a signature declaration is a collection of member
- function declarations and nested type declarations. For example, this
- signature declaration defines a new abstract type `S' with member
- functions `int foo ()' and `int bar (int)':
-
- signature S
- {
- int foo ();
- int bar (int);
- };
-
- Since signature types do not include implementation definitions, you
- cannot write an instance of a signature directly. Instead, you can
- define a pointer to any class that contains the required interfaces as a
- "signature pointer". Such a class "implements" the signature type.
-
- To use a class as an implementation of `S', you must ensure that the
- class has public member functions `int foo ()' and `int bar (int)'.
- The class can have other member functions as well, public or not; as
- long as it offers what's declared in the signature, it is suitable as
- an implementation of that signature type.
-
- For example, suppose that `C' is a class that meets the requirements
- of signature `S' (`C' "conforms to" `S'). Then
-
- C obj;
- S * p = &obj;
-
- defines a signature pointer `p' and initializes it to point to an
- object of type `C'. The member function call `int i = p->foo ();'
- executes `obj.foo ()'.
-
- Abstract virtual classes provide somewhat similar facilities in
- standard C++. There are two main advantages to using signatures
- instead:
-
- 1. Subtyping becomes independent from inheritance. A class or
- signature type `T' is a subtype of a signature type `S'
- independent of any inheritance hierarchy as long as all the member
- functions declared in `S' are also found in `T'. So you can
- define a subtype hierarchy that is completely independent from any
- inheritance (implementation) hierarchy, instead of being forced to
- use types that mirror the class inheritance hierarchy.
-
- 2. Signatures allow you to work with existing class hierarchies as
- implementations of a signature type. If those class hierarchies
- are only available in compiled form, you're out of luck with
- abstract virtual classes, since an abstract virtual class cannot
- be retrofitted on top of existing class hierarchies. So you would
- be required to write interface classes as subtypes of the abstract
- virtual class.
-
- There is one more detail about signatures. A signature declaration
- can contain member function *definitions* as well as member function
- declarations. A signature member function with a full definition is
- called a *default implementation*; classes need not contain that
- particular interface in order to conform. For example, a class `C' can
- conform to the signature
-
- signature T
- {
- int f (int);
- int f0 () { return f (0); };
- };
-
- whether or not `C' implements the member function `int f0 ()'. If you
- define `C::f0', that definition takes precedence; otherwise, the
- default implementation `S::f0' applies.
-
- 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.
-
- * The `fixproto' script will sometimes add prototypes for the
- `sigsetjmp' and `siglongjmp' functions that reference the
- `jmp_buf' type before that type is defined. To work around this,
- edit the offending file and place the typedef in front of the
- prototypes.
-
- * 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.6 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::.
-
- * If you build GNU CC on a BSD system using a directory stored in a
- System V file system, problems may occur in running `fixincludes'
- if the System V file system doesn't support symbolic links. These
- problems result in a failure to fix the declaration of `size_t' in
- `sys/types.h'. If you find that `size_t' is a signed type and
- that type mismatches occur, this could be the cause.
-
- The solution is not to use such a directory for building GNU CC.
-
- * 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.
-
- * In Ultrix 4.0 on the MIPS machine, `stdio.h' does not work with GNU
- CC at all unless it has been fixed with `fixincludes'. This causes
- problems in building GNU CC. Once GNU CC is installed, the
- problems go away.
-
- To work around this problem, when making the stage 1 compiler,
- specify this option to Make:
-
- GCC_FOR_TARGET="./xgcc -B./ -I./include"
-
- When making stage 2 and stage 3, specify this option:
-
- CFLAGS="-g -I./include"
-
- * 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.
-
- Users have also reported some problems with version 2.20 of the
- MIPS compiler tools that were shipped with RISC/os 4.x. The
- earlier version 2.11 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, GNU CC 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 NeXTStep 3.0, the Objective C compiler does not work, due,
- apparently, to a kernel bug that it happens to trigger. This
- problem does not happen on 3.1.
-
- * 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.
-
- * On HP-UX version 8.05, but not on 8.07 or more recent versions,
- the `fixproto' shell script triggers a bug in the system shell.
- If you encounter this problem, upgrade your operating system or
- use BASH (the GNU shell) to run `fixproto'.
-
- * 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 Intel Paragon (an i860 machine), if you are using operating
- system version 1.0, you will get warnings or errors about
- redefinition of `va_arg' when you build GNU CC.
-
- If this happens, then you need to link most programs with the
- library `iclib.a'. You must also modify `stdio.h' as follows:
- before the lines
-
- #if defined(__i860__) && !defined(_VA_LIST)
- #include <va_list.h>
-
- insert the line
-
- #if __PGC__
-
- and after the lines
-
- extern int vprintf(const char *, va_list );
- extern int vsprintf(char *, const char *, va_list );
- #endif
-
- insert the line
-
- #endif /* __PGC__ */
-
- These problems don't exist in operating system version 1.1.
-
- * 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
- Configurations::.
-
- * A bug in the HP-UX 8.05 (and earlier) shell will cause the fixproto
- program to report an error of the form:
-
- ./fixproto: sh internal 1K buffer overflow
-
- To fix this, change the first line of the fixproto script to look
- like:
-
- #!/bin/ksh
-
- 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.
-
- * Objective C does not work on the RS/6000.
-
- * 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 some SGI systems, when you use `-lgl_s' as an option, it gets
- translated magically to `-lgl_s -lX11_s -lc_s'. Naturally, this
- does not happen when you use GNU CC. You must specify all three
- options explicitly.
-
- * 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).
-
- * 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".
-
- * Even if you specify `-fdollars-in-identifiers', you cannot
- successfully use `$' in identifiers on the RS/6000 due to a
- restriction in the IBM assembler. GAS supports these identifiers.
-
- * 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. You can obtain
- XLC-1.3.0.2 by requesting PTF 421749 from IBM.
-
- * 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.6.0 -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
-
- most of which are unnecessary with GCC 2.4.5 and newer versions.
- You can make a properly working Perl by setting `ccflags' to
- `-fwritable-strings' (implied by the `-traditional' in the
- original options) and `cppflags' to empty 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
-
-