2 GCC Frequently Asked Questions
4 The latest version of this document is always available at
5 [1]http://gcc.gnu.org/faq.html.
7 This FAQ tries to answer specific questions concerning GCC. For general
8 information regarding C, C++, resp. Fortran please check the [2]comp.lang.c
9 FAQ, [3]comp.std.c++ FAQ, and the [4]Fortran Information page.
11 Other GCC-related FAQs: [5]libstdc++-v3, and [6]GCJ.
12 _________________________________________________________________
16 1. [7]General information
17 1. [8]How do I get a bug fixed or a feature added?
18 2. [9]Does GCC work on my platform?
20 1. [11]How to install multiple versions of GCC
21 2. [12]Dynamic linker is unable to find GCC libraries
22 3. [13]libstdc++/libio tests fail badly with --enable-shared
23 4. [14]GCC can not find GNU as/GNU ld
24 5. [15]cpp: Usage:... Error
25 6. [16]Optimizing the compiler itself
26 7. [17]Why does libiconv get linked into jc1 on Solaris?
27 3. [18]Testsuite problems
28 1. [19]How do I pass flags like -fnew-abi to the testsuite?
29 2. [20]How can I run the test suite with multiple options?
31 1. [22]Friend Templates
32 2. [23]dynamic_cast, throw, typeid don't work with shared libraries
33 3. [24]Why do I need autoconf, bison, xgettext, automake, etc?
34 4. [25]Why can't I build a shared library?
35 5. [26]When building C++, the linker says my constructors, destructors
36 or virtual tables are undefined, but I defined them
37 _________________________________________________________________
41 How do I get a bug fixed or a feature added?
43 There are lots of ways to get something fixed. The list below may be
44 incomplete, but it covers many of the common cases. These are listed roughly
45 in order of decreasing difficulty for the average GCC user, meaning someone
46 who is not skilled in the internals of GCC, and where difficulty is measured
47 in terms of the time required to fix the bug. No alternative is better than
48 any other; each has its benefits and disadvantages.
49 * Fix it yourself. This alternative will probably bring results, if you
50 work hard enough, but will probably take a lot of time, and, depending
51 on the quality of your work and the perceived benefits of your changes,
52 your code may or may not ever make it into an official release of GCC.
53 * [27]Report the problem to the GCC bug tracking system and hope that
54 someone will be kind enough to fix it for you. While this is certainly
55 possible, and often happens, there is no guarantee that it will. You
56 should not expect the same response from this method that you would see
57 from a commercial support organization since the people who read GCC bug
58 reports, if they choose to help you, will be volunteering their time.
59 * Hire someone to fix it for you. There are various companies and
60 individuals providing support for GCC. This alternative costs money, but
61 is relatively likely to get results.
62 _________________________________________________________________
64 Does GCC work on my platform?
66 The host/target specific installation notes for GCC include information
67 about known problems with installing or using GCC on particular platforms.
68 These are included in the sources for a release in INSTALL/specific.html,
69 and the [28]latest version is always available at the GCC web site. Reports
70 of [29]successful builds for several versions of GCC are also available at
72 _________________________________________________________________
76 How to install multiple versions of GCC
78 It may be desirable to install multiple versions of the compiler on the same
79 system. This can be done by using different prefix paths at configure time
82 Basically, configure the two compilers with different --prefix options, then
83 build and install each compiler. Assume you want "gcc" to be the latest
84 compiler and available in /usr/local/bin; also assume that you want "gcc2"
85 to be the older gcc2 compiler and also available in /usr/local/bin.
87 The easiest way to do this is to configure the new GCC with
88 --prefix=/usr/local/gcc and the older gcc2 with --prefix=/usr/local/gcc2.
89 Build and install both compilers. Then make a symlink from
90 /usr/local/bin/gcc to /usr/local/gcc/bin/gcc and from /usr/local/bin/gcc2 to
91 /usr/local/gcc2/bin/gcc. Create similar links for the "g++", "c++" and "g77"
94 An alternative to using symlinks is to configure with a
95 --program-transform-name option. This option specifies a sed command to
96 process installed program names with. Using it you can, for instance, have
97 all the new GCC programs installed as "new-gcc" and the like. You will still
98 have to specify different --prefix options for new GCC and old GCC, because
99 it is only the executable program names that are transformed. The difference
100 is that you (as administrator) do not have to set up symlinks, but must
101 specify additional directories in your (as a user) PATH. A complication with
102 --program-transform-name is that the sed command invariably contains
103 characters significant to the shell, and these have to be escaped correctly,
104 also it is not possible to use "^" or "$" in the command. Here is the option
105 to prefix "new-" to the new GCC installed programs:
107 --program-transform-name='s,\\\\(.*\\\\),new-\\\\1,'
109 With the above --prefix option, that will install the new GCC programs into
110 /usr/local/gcc/bin with names prefixed by "new-". You can use
111 --program-transform-name if you have multiple versions of GCC, and wish to
112 be sure about which version you are invoking.
114 If you use --prefix, GCC may have difficulty locating a GNU assembler or
115 linker on your system, [30]GCC can not find GNU as/GNU ld explains how to
118 Another option that may be easier is to use the --program-prefix= or
119 --program-suffix= options to configure. So if you're installing GCC 2.95.2
120 and don't want to disturb the current version of GCC in /usr/local/bin/, you
123 configure --program-suffix=-2.95.2 <other configure options>
125 This should result in GCC being installed as /usr/local/bin/gcc-2.95.2
126 instead of /usr/local/bin/gcc.
127 _________________________________________________________________
129 Dynamic linker is unable to find GCC libraries
131 This problem manifests itself by programs not finding shared libraries they
132 depend on when the programs are started. Note this problem often manifests
133 itself with failures in the libio/libstdc++ tests after configuring with
134 --enable-shared and building GCC.
136 GCC does not specify a runpath so that the dynamic linker can find dynamic
137 libraries at runtime.
139 The short explanation is that if you always pass a -R option to the linker,
140 then your programs become dependent on directories which may be NFS mounted,
141 and programs may hang unnecessarily when an NFS server goes down.
143 The problem is not programs that do require the directories; those programs
144 are going to hang no matter what you do. The problem is programs that do not
145 require the directories.
147 SunOS effectively always passed a -R option for every -L option; this was a
148 bad idea, and so it was removed for Solaris. We should not recreate it.
150 However, if you feel you really need such an option to be passed
151 automatically to the linker, you may add it to the GCC specs file. This file
152 can be found in the same directory that contains cc1 (run gcc
153 -print-prog-name=cc1 to find it). You may add linker flags such as -R or
154 -rpath, depending on platform and linker, to the *link or *lib specs.
156 Another alternative is to install a wrapper script around gcc, g++ or ld
157 that adds the appropriate directory to the environment variable LD_RUN_PATH
158 or equivalent (again, it's platform-dependent).
160 Yet another option, that works on a few platforms, is to hard-code the full
161 pathname of the library into its soname. This can only be accomplished by
162 modifying the appropriate .ml file within libstdc++/config (and also
163 libg++/config, if you are building libg++), so that $(libdir)/ appears just
164 before the library name in -soname or -h options.
165 _________________________________________________________________
167 GCC can not find GNU as/GNU ld
169 GCC searches the PATH for an assembler and a loader, but it only does so
170 after searching a directory list hard-coded in the GCC executables. Since,
171 on most platforms, the hard-coded list includes directories in which the
172 system assembler and loader can be found, you may have to take one of the
173 following actions to arrange that GCC uses the GNU versions of those
176 To ensure that GCC finds the GNU assembler (the GNU loader), which are
177 required by [31]some configurations, you should configure these with the
178 same --prefix option as you used for GCC. Then build & install GNU as (GNU
179 ld) and proceed with building GCC.
181 Another alternative is to create links to GNU as and ld in any of the
182 directories printed by the command `gcc -print-search-dirs | grep
183 '^programs:''. The link to `ld' should be named `real-ld' if `ld' already
184 exists. If such links do not exist while you're compiling GCC, you may have
185 to create them in the build directories too, within the gcc directory and in
186 all the gcc/stage* subdirectories.
188 GCC 2.95 allows you to specify the full pathname of the assembler and the
189 linker to use. The configure flags are `--with-as=/path/to/as' and
190 `--with-ld=/path/to/ld'. GCC will try to use these pathnames before looking
191 for `as' or `(real-)ld' in the standard search dirs. If, at configure-time,
192 the specified programs are found to be GNU utilities, `--with-gnu-as' and
193 `--with-gnu-ld' need not be used; these flags will be auto-detected. One
194 drawback of this option is that it won't allow you to override the search
195 path for assembler and linker with command-line options -B/path/ if the
196 specified filenames exist.
197 _________________________________________________________________
201 If you get an error like this when building GCC (particularly when building
202 __mulsi3), then you likely have a problem with your environment variables.
203 cpp: Usage: /usr/lib/gcc-lib/i586-unknown-linux-gnulibc1/2.7.2.3/cpp
204 [switches] input output
206 First look for an explicit '.' in either LIBRARY_PATH or GCC_EXEC_PREFIX
207 from your environment. If you do not find an explicit '.', look for an empty
208 pathname in those variables. Note that ':' at either the start or end of
209 these variables is an implicit '.' and will cause problems.
211 Also note '::' in these paths will also cause similar problems.
212 _________________________________________________________________
214 Optimizing the compiler itself
216 If you want to test a particular optimization option, it's useful to try
217 bootstrapping the compiler with that option turned on. For example, to test
218 the -fssa option, you could bootstrap like this:
219 make BOOT_CFLAGS="-O2 -fssa" bootstrap
220 _________________________________________________________________
222 Why does libiconv get linked into jc1 on Solaris?
224 The Java front end requires iconv. If the compiler used to bootstrap GCC
225 finds libiconv (because the GNU version of libiconv has been installed in
226 the same prefix as the bootstrap compiler), but the newly built GCC does not
227 find the library (because it will be installed with a different prefix),
228 then a link-time error will occur when building jc1. This problem does not
229 show up so often on platforms that have libiconv in a default location (like
230 /usr/lib) because then both compilers can find a library named libiconv,
231 even though it is a different library.
233 Using --disable-nls at configure-time does not prevent this problem because
234 jc1 uses iconv even in that case. Solutions include temporarily removing the
235 GNU libiconv, copying it to a default location such as /usr/lib/, and using
236 --enable-languages at configure-time to disable Java.
237 _________________________________________________________________
241 How do I pass flags like -fnew-abi to the testsuite?
243 If you invoke runtest directly, you can use the --tool_opts option, e.g:
244 runtest --tool_opts "-fnew-abi -fno-honor-std" <other options>
246 Or, if you use make check you can use the make variable RUNTESTFLAGS, e.g:
247 make RUNTESTFLAGS="--tool_opts '-fnew-abi -fno-honor-std'" check-g++
248 _________________________________________________________________
250 How can I run the test suite with multiple options?
252 If you invoke runtest directly, you can use the --target_board option, e.g:
253 runtest --target_board "unix{-fPIC,-fpic,}" <other options>
255 Or, if you use make check you can use the make variable RUNTESTFLAGS, e.g:
256 make RUNTESTFLAGS="--target_board 'unix{-fPIC,-fpic,}'" check-gcc
258 Either of these examples will run the tests three times. Once with -fPIC,
259 once with -fpic, and once with no additional flags.
261 This technique is particularly useful on multilibbed targets.
262 _________________________________________________________________
268 In order to make a specialization of a template function a friend of a
269 (possibly template) class, you must explicitly state that the friend
270 function is a template, by appending angle brackets to its name, and this
271 template function must have been declared already. Here's an example:
272 template <typename T> class foo {
273 friend void bar(foo<T>);
276 The above declaration declares a non-template function named bar, so it must
277 be explicitly defined for each specialization of foo. A template definition
278 of bar won't do, because it is unrelated with the non-template declaration
279 above. So you'd have to end up writing:
280 void bar(foo<int>) { /* ... */ }
281 void bar(foo<void>) { /* ... */ }
283 If you meant bar to be a template function, you should have forward-declared
284 it as follows. Note that, since the template function declaration refers to
285 the template class, the template class must be forward-declared too:
286 template <typename T>
289 template <typename T>
292 template <typename T>
294 friend void bar<>(foo<T>);
297 template <typename T>
298 void bar(foo<T>) { /* ... */ }
300 In this case, the template argument list could be left empty, because it can
301 be implicitly deduced from the function arguments, but the angle brackets
302 must be present, otherwise the declaration will be taken as a non-template
303 function. Furthermore, in some cases, you may have to explicitly specify the
304 template arguments, to remove ambiguity.
306 An error in the last public comment draft of the ANSI/ISO C++ Standard and
307 the fact that previous releases of GCC would accept such friend declarations
308 as template declarations has led people to believe that the forward
309 declaration was not necessary, but, according to the final version of the
311 _________________________________________________________________
313 dynamic_cast, throw, typeid don't work with shared libraries
315 The new C++ ABI in the GCC 3.0 series uses address comparisons, rather than
316 string compares, to determine type equality. This leads to better
317 performance. Like other objects that have to be present in the final
318 executable, these std::type_info objects have what is called vague linkage
319 because they are not tightly bound to any one particular translation unit
320 (object file). The compiler has to emit them in any translation unit that
321 requires their presence, and then rely on the linking and loading process to
322 make sure that only one of them is active in the final executable. With
323 static linking all of these symbols are resolved at link time, but with
324 dynamic linking, further resolution occurs at load time. You have to ensure
325 that objects within a shared library are resolved against objects in the
326 executable and other shared libraries.
327 * For a program which is linked against a shared library, no additional
328 precautions are needed.
329 * You cannot create a shared library with the "-Bsymbolic" option, as that
330 prevents the resolution described above.
331 * If you use dlopen to explicitly load code from a shared library, you
332 must do several things. First, export global symbols from the executable
333 by linking it with the "-E" flag (you will have to specify this as
334 "-Wl,-E" if you are invoking the linker in the usual manner from the
335 compiler driver, g++). You must also make the external symbols in the
336 loaded library available for subsequent libraries by providing the
337 RTLD_GLOBAL flag to dlopen. The symbol resolution can be immediate or
340 Template instantiations are another, user visible, case of objects with
341 vague linkage, which needs similar resolution. If you do not take the above
342 precautions, you may discover that a template instantiation with the same
343 argument list, but instantiated in multiple translation units, has several
344 addresses, depending in which translation unit the address is taken. (This
345 is not an exhaustive list of the kind of objects which have vague linkage
346 and are expected to be resolved during linking & loading.)
348 If you are worried about different objects with the same name colliding
349 during the linking or loading process, then you should use namespaces to
350 disambiguate them. Giving distinct objects with global linkage the same name
351 is a violation of the One Definition Rule (ODR) [basic.def.odr].
353 For more details about the way that GCC implements these and other C++
354 features, please read the [32]ABI specification. Note the std::type_info
355 objects which must be resolved all begin with "_ZTS". Refer to ld's
356 documentation for a description of the "-E" & "-Bsymbolic" flags.
357 _________________________________________________________________
359 Why do I need autoconf, bison, xgettext, automake, etc?
361 If you're using diffs up dated from one snapshot to the next, or if you're
362 using the SVN repository, you may need several additional programs to build
365 These include, but are not necessarily limited to autoconf, automake, bison,
368 This is necessary because neither diff nor cvs keep timestamps correct. This
369 causes problems for generated files as "make" may think those generated
370 files are out of date and try to regenerate them.
372 An easy way to work around this problem is to use the gcc_update script in
373 the contrib subdirectory of GCC, which handles this transparently without
374 requiring installation of any additional tools.
376 When building from diffs or SVN or if you modified some sources, you may
377 also need to obtain development versions of some GNU tools, as the
378 production versions do not necessarily handle all features needed to rebuild
381 In general, the current versions of these tools from
382 [33]ftp://ftp.gnu.org/gnu/ will work. At present, Autoconf 2.50 is not
383 supported, and you will need to use Autoconf 2.13; work is in progress to
384 fix this problem. Also look at [34]ftp://gcc.gnu.org/pub/gcc/infrastructure/
385 for any special versions of packages.
386 _________________________________________________________________
388 Why can't I build a shared library?
390 When building a shared library you may get an error message from the linker
391 like `assert pure-text failed:' or `DP relative code in file'.
393 This kind of error occurs when you've failed to provide proper flags to gcc
394 when linking the shared library.
396 You can get this error even if all the .o files for the shared library were
397 compiled with the proper PIC option. When building a shared library, gcc
398 will compile additional code to be included in the library. That additional
399 code must also be compiled with the proper PIC option.
401 Adding the proper PIC option (-fpic or -fPIC) to the link line which creates
402 the shared library will fix this problem on targets that support PIC in this
404 gcc -c -fPIC myfile.c
405 gcc -shared -o libmyfile.so -fPIC myfile.o
406 _________________________________________________________________
408 When building C++, the linker says my constructors, destructors or virtual
409 tables are undefined, but I defined them
411 The ISO C++ Standard specifies that all virtual methods of a class that are
412 not pure-virtual must be defined, but does not require any diagnostic for
413 violations of this rule [class.virtual]/8. Based on this assumption, GCC
414 will only emit the implicitly defined constructors, the assignment operator,
415 the destructor and the virtual table of a class in the translation unit that
416 defines its first such non-inline method.
418 Therefore, if you fail to define this particular method, the linker may
419 complain about the lack of definitions for apparently unrelated symbols.
420 Unfortunately, in order to improve this error message, it might be necessary
421 to change the linker, and this can't always be done.
423 The solution is to ensure that all virtual methods that are not pure are
424 defined. Note that a destructor must be defined even if it is declared
425 pure-virtual [class.dtor]/7.
429 1. http://gcc.gnu.org/faq.html
431 3. http://www.comeaucomputing.com/csc/faq.html
432 4. http://www.fortran.com/fortran/info.html
433 5. http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html
434 6. http://gcc.gnu.org/java/faq.html
435 7. http://gcc.gnu.org/faq.html#general
436 8. http://gcc.gnu.org/faq.html#support
437 9. http://gcc.gnu.org/faq.html#platforms
438 10. http://gcc.gnu.org/faq.html#installation
439 11. http://gcc.gnu.org/faq.html#multiple
440 12. http://gcc.gnu.org/faq.html#rpath
441 13. http://gcc.gnu.org/faq.html#rpath
442 14. http://gcc.gnu.org/faq.html#gas
443 15. http://gcc.gnu.org/faq.html#environ
444 16. http://gcc.gnu.org/faq.html#optimizing
445 17. http://gcc.gnu.org/faq.html#iconv
446 18. http://gcc.gnu.org/faq.html#testsuite
447 19. http://gcc.gnu.org/faq.html#testoptions
448 20. http://gcc.gnu.org/faq.html#multipletests
449 21. http://gcc.gnu.org/faq.html#misc
450 22. http://gcc.gnu.org/faq.html#friend
451 23. http://gcc.gnu.org/faq.html#dso
452 24. http://gcc.gnu.org/faq.html#generated_files
453 25. http://gcc.gnu.org/faq.html#picflag-needed
454 26. http://gcc.gnu.org/faq.html#vtables
455 27. http://gcc.gnu.org/bugs.html
456 28. http://gcc.gnu.org/install/specific.html
457 29. http://gcc.gnu.org/buildstat.html
458 30. http://gcc.gnu.org/faq.html#gas
459 31. http://gcc.gnu.org/install/specific.html
460 32. http://www.codesourcery.com/cxx-abi/
461 33. ftp://ftp.gnu.org/gnu/
462 34. ftp://gcc.gnu.org/pub/gcc/infrastructure/