
1: 2: GCC Frequently Asked Questions 3: 4: The latest version of this document is always available at 5: [1]http://gcc.gnu.org/faq.html. 6: 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. 10: 11: Other GCC-related FAQs: [5]libstdc++-v3, and [6]GCJ. 12: _________________________________________________________________ 13: 14: Questions 15: 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? 19: 2. [10]Installation 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? 30: 4. [21]Miscellaneous 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: _________________________________________________________________ 38: 39: General information 40: 41: How do I get a bug fixed or a feature added? 42: 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: _________________________________________________________________ 63: 64: Does GCC work on my platform? 65: 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 71: the web site. 72: _________________________________________________________________ 73: 74: Installation 75: 76: How to install multiple versions of GCC 77: 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 80: and a few symlinks. 81: 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. 86: 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" 92: compiler drivers. 93: 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: 106: 107: --program-transform-name='s,\\\\(.*\\\\),new-\\\\1,' 108: 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. 113: 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 116: deal with this. 117: 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 121: could do 122: 123: configure --program-suffix=-2.95.2 <other configure options> 124: 125: This should result in GCC being installed as /usr/local/bin/gcc-2.95.2 126: instead of /usr/local/bin/gcc. 127: _________________________________________________________________ 128: 129: Dynamic linker is unable to find GCC libraries 130: 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. 135: 136: GCC does not specify a runpath so that the dynamic linker can find dynamic 137: libraries at runtime. 138: 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. 142: 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. 146: 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. 149: 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. 155: 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). 159: 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: _________________________________________________________________ 166: 167: GCC can not find GNU as/GNU ld 168: 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 174: programs. 175: 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. 180: 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. 187: 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: _________________________________________________________________ 198: 199: cpp: Usage:... Error 200: 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 205: 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. 210: 211: Also note '::' in these paths will also cause similar problems. 212: _________________________________________________________________ 213: 214: Optimizing the compiler itself 215: 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: _________________________________________________________________ 221: 222: Why does libiconv get linked into jc1 on Solaris? 223: 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. 232: 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: _________________________________________________________________ 238: 239: Testsuite problems 240: 241: How do I pass flags like -fnew-abi to the testsuite? 242: 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> 245: 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: _________________________________________________________________ 249: 250: How can I run the test suite with multiple options? 251: 252: If you invoke runtest directly, you can use the --target_board option, e.g: 253: runtest --target_board "unix{-fPIC,-fpic,}" <other options> 254: 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 257: 258: Either of these examples will run the tests three times. Once with -fPIC, 259: once with -fpic, and once with no additional flags. 260: 261: This technique is particularly useful on multilibbed targets. 262: _________________________________________________________________ 263: 264: Miscellaneous 265: 266: Friend Templates 267: 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>); 274: } 275: 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>) { /* ... */ } 282: 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> 287: class foo; 288: 289: template <typename T> 290: void bar(foo<T>); 291: 292: template <typename T> 293: class foo { 294: friend void bar<>(foo<T>); 295: }; 296: 297: template <typename T> 298: void bar(foo<T>) { /* ... */ } 299: 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. 305: 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 310: Standard, it is. 311: _________________________________________________________________ 312: 313: dynamic_cast, throw, typeid don't work with shared libraries 314: 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 338: lazy. 339: 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.) 347: 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]. 352: 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: _________________________________________________________________ 358: 359: Why do I need autoconf, bison, xgettext, automake, etc? 360: 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 363: GCC. 364: 365: These include, but are not necessarily limited to autoconf, automake, bison, 366: and xgettext. 367: 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. 371: 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. 375: 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 379: GCC. 380: 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: _________________________________________________________________ 387: 388: Why can't I build a shared library? 389: 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'. 392: 393: This kind of error occurs when you've failed to provide proper flags to gcc 394: when linking the shared library. 395: 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. 400: 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 403: manner. For example: 404: gcc -c -fPIC myfile.c 405: gcc -shared -o libmyfile.so -fPIC myfile.o 406: _________________________________________________________________ 407: 408: When building C++, the linker says my constructors, destructors or virtual 409: tables are undefined, but I defined them 410: 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. 417: 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. 422: 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. 426: 427: References 428: 429: 1. http://gcc.gnu.org/faq.html 430: 2. http://c-faq.com/ 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/