DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(gcc.info) VMS Misc

Info Catalog (gcc.info) Global Declarations (gcc.info) VMS
 
 Other VMS Issues
 ================
 
    GCC automatically arranges for `main' to return 1 by default if you
 fail to specify an explicit return value.  This will be interpreted by
 VMS as a status code indicating a normal successful completion.
 Version 1 of GCC did not provide this default.
 
    GCC on VMS works only with the GNU assembler, GAS.  You need version
 1.37 or later of GAS in order to produce value debugging information for
 the VMS debugger.  Use the ordinary VMS linker with the object files
 produced by GAS.
 
    Under previous versions of GCC, the generated code would occasionally
 give strange results when linked to the sharable `VAXCRTL' library.
 Now this should work.
 
    A caveat for use of `const' global variables: the `const' modifier
 must be specified in every external declaration of the variable in all
 of the source files that use that variable.  Otherwise the linker will
 issue warnings about conflicting attributes for the variable.  Your
 program will still work despite the warnings, but the variable will be
 placed in writable storage.
 
    Although the VMS linker does distinguish between upper and lower case
 letters in global symbols, most VMS compilers convert all such symbols
 into upper case and most run-time library routines also have upper case
 names.  To be able to reliably call such routines, GCC (by means of the
 assembler GAS) converts global symbols into upper case like other VMS
 compilers.  However, since the usual practice in C is to distinguish
 case, GCC (via GAS) tries to preserve usual C behavior by augmenting
 each name that is not all lower case.  This means truncating the name
 to at most 23 characters and then adding more characters at the end
 which encode the case pattern of those 23.   Names which contain at
 least one dollar sign are an exception; they are converted directly into
 upper case without augmentation.
 
    Name augmentation yields bad results for programs that use
 precompiled libraries (such as Xlib) which were generated by another
 compiler.  You can use the compiler option `/NOCASE_HACK' to inhibit
 augmentation; it makes external C functions and variables
 case-independent as is usual on VMS.  Alternatively, you could write
 all references to the functions and variables in such libraries using
 lower case; this will work on VMS, but is not portable to other
 systems.  The compiler option `/NAMES' also provides control over
 global name handling.
 
    Function and variable names are handled somewhat differently with GNU
 C++.  The GNU C++ compiler performs "name mangling" on function names,
 which means that it adds information to the function name to describe
 the data types of the arguments that the function takes.  One result of
 this is that the name of a function can become very long.  Since the
 VMS linker only recognizes the first 31 characters in a name, special
 action is taken to ensure that each function and variable has a unique
 name that can be represented in 31 characters.
 
    If the name (plus a name augmentation, if required) is less than 32
 characters in length, then no special action is performed.  If the name
 is longer than 31 characters, the assembler (GAS) will generate a hash
 string based upon the function name, truncate the function name to 23
 characters, and append the hash string to the truncated name.  If the
 `/VERBOSE' compiler option is used, the assembler will print both the
 full and truncated names of each symbol that is truncated.
 
    The `/NOCASE_HACK' compiler option should not be used when you are
 compiling programs that use libg++.  libg++ has several instances of
 objects (i.e.  `Filebuf' and `filebuf') which become indistinguishable
 in a case-insensitive environment.  This leads to cases where you need
 to inhibit augmentation selectively (if you were using libg++ and Xlib
 in the same program, for example).  There is no special feature for
 doing this, but you can get the result by defining a macro for each
 mixed case symbol for which you wish to inhibit augmentation.  The
 macro should expand into the lower case equivalent of itself.  For
 example:
 
      #define StuDlyCapS studlycaps
 
    These macro definitions can be placed in a header file to minimize
 the number of changes to your source code.
 
Info Catalog (gcc.info) Global Declarations (gcc.info) VMS
automatically generated byinfo2html