add directory Ref-docs
This commit is contained in:
446
Ref-docs/manual gcc2.95.3/gcc_11.html
Normal file
446
Ref-docs/manual gcc2.95.3/gcc_11.html
Normal file
@@ -0,0 +1,446 @@
|
||||
<HTML>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<!-- Created on March, 17 2001 by texi2html 1.64 -->
|
||||
<!--
|
||||
Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
|
||||
Karl Berry <karl@freefriends.org>
|
||||
Olaf Bachmann <obachman@mathematik.uni-kl.de>
|
||||
and many others.
|
||||
Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
|
||||
Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
|
||||
|
||||
-->
|
||||
<HEAD>
|
||||
<TITLE>Using and Porting the GNU Compiler Collection (GCC): VMS</TITLE>
|
||||
|
||||
<META NAME="description" CONTENT="Using and Porting the GNU Compiler Collection (GCC): VMS">
|
||||
<META NAME="keywords" CONTENT="Using and Porting the GNU Compiler Collection (GCC): VMS">
|
||||
<META NAME="resource-type" CONTENT="document">
|
||||
<META NAME="distribution" CONTENT="global">
|
||||
<META NAME="Generator" CONTENT="texi2html 1.64">
|
||||
|
||||
</HEAD>
|
||||
|
||||
<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
|
||||
|
||||
<A NAME="SEC142"></A>
|
||||
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||||
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_10.html#SEC141" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_10.html#SEC141"> < </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC143" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC143"> > </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_2.html#SEC2" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_2.html#SEC2"> << </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc.html#SEC_Top" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html#SEC_Top"> Up </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_12.html#SEC146" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_12.html#SEC146"> >> </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc.html#SEC_Top" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html#SEC_Top">Top</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_toc.html#SEC_Contents" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_toc.html#SEC_Contents">Contents</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_24.html#SEC261" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_24.html#SEC261">Index</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_abt.html#SEC_About" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_abt.html#SEC_About"> ? </A>]</TD>
|
||||
</TR></TABLE>
|
||||
<H1> 11. Using GCC on VMS </H1>
|
||||
<!--docid::SEC142::-->
|
||||
<P>
|
||||
|
||||
Here is how to use GCC on VMS.
|
||||
</P><P>
|
||||
|
||||
<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0>
|
||||
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gcc_11.html#SEC143" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC143">11.1 Include Files and VMS</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Where the preprocessor looks for the include files.</TD></TR>
|
||||
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gcc_11.html#SEC144" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC144">11.2 Global Declarations and VMS</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">How to do globaldef, globalref and globalvalue with
|
||||
GCC.</TD></TR>
|
||||
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="gcc_11.html#SEC145" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC145">11.3 Other VMS Issues</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Misc information.</TD></TR>
|
||||
</TABLE></BLOCKQUOTE>
|
||||
<P>
|
||||
|
||||
<A NAME="Include Files and VMS"></A>
|
||||
<HR SIZE="6">
|
||||
<A NAME="SEC143"></A>
|
||||
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||||
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC142" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC142"> < </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC144" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC144"> > </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC142" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC142"> << </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC142" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC142"> Up </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_12.html#SEC146" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_12.html#SEC146"> >> </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc.html#SEC_Top" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html#SEC_Top">Top</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_toc.html#SEC_Contents" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_toc.html#SEC_Contents">Contents</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_24.html#SEC261" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_24.html#SEC261">Index</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_abt.html#SEC_About" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_abt.html#SEC_About"> ? </A>]</TD>
|
||||
</TR></TABLE>
|
||||
<H2> 11.1 Include Files and VMS </H2>
|
||||
<!--docid::SEC143::-->
|
||||
<P>
|
||||
|
||||
<A NAME="IDX415"></A>
|
||||
<A NAME="IDX416"></A>
|
||||
<A NAME="IDX417"></A>
|
||||
Due to the differences between the filesystems of Unix and VMS, GCC
|
||||
attempts to translate file names in <SAMP>`#include'</SAMP> into names that VMS
|
||||
will understand. The basic strategy is to prepend a prefix to the
|
||||
specification of the include file, convert the whole filename to a VMS
|
||||
filename, and then try to open the file. GCC tries various prefixes
|
||||
one by one until one of them succeeds:
|
||||
</P><P>
|
||||
|
||||
<OL>
|
||||
<LI>
|
||||
The first prefix is the <SAMP>`GNU_CC_INCLUDE:'</SAMP> logical name: this is
|
||||
where GNU C header files are traditionally stored. If you wish to store
|
||||
header files in non-standard locations, then you can assign the logical
|
||||
<SAMP>`GNU_CC_INCLUDE'</SAMP> to be a search list, where each element of the
|
||||
list is suitable for use with a rooted logical.
|
||||
<P>
|
||||
|
||||
<LI>
|
||||
The next prefix tried is <SAMP>`SYS$SYSROOT:[SYSLIB.]'</SAMP>. This is where
|
||||
VAX-C header files are traditionally stored.
|
||||
<P>
|
||||
|
||||
<LI>
|
||||
If the include file specification by itself is a valid VMS filename, the
|
||||
preprocessor then uses this name with no prefix in an attempt to open
|
||||
the include file.
|
||||
<P>
|
||||
|
||||
<LI>
|
||||
If the file specification is not a valid VMS filename (i.e. does not
|
||||
contain a device or a directory specifier, and contains a <SAMP>`/'</SAMP>
|
||||
character), the preprocessor tries to convert it from Unix syntax to
|
||||
VMS syntax.
|
||||
<P>
|
||||
|
||||
Conversion works like this: the first directory name becomes a device,
|
||||
and the rest of the directories are converted into VMS-format directory
|
||||
names. For example, the name <TT>`X11/foobar.h'</TT> is
|
||||
translated to <TT>`X11:[000000]foobar.h'</TT> or <TT>`X11:foobar.h'</TT>,
|
||||
whichever one can be opened. This strategy allows you to assign a
|
||||
logical name to point to the actual location of the header files.
|
||||
</P><P>
|
||||
|
||||
<LI>
|
||||
If none of these strategies succeeds, the <SAMP>`#include'</SAMP> fails.
|
||||
</OL>
|
||||
<P>
|
||||
|
||||
Include directives of the form:
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=example><pre>#include foobar
|
||||
</pre></td></tr></table></P><P>
|
||||
|
||||
are a common source of incompatibility between VAX-C and GCC. VAX-C
|
||||
treats this much like a standard <CODE>#include <foobar.h></CODE> directive.
|
||||
That is incompatible with the ANSI C behavior implemented by GCC: to
|
||||
expand the name <CODE>foobar</CODE> as a macro. Macro expansion should
|
||||
eventually yield one of the two standard formats for <CODE>#include</CODE>:
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=example><pre>#include "<VAR>file</VAR>"
|
||||
#include <<VAR>file</VAR>>
|
||||
</pre></td></tr></table></P><P>
|
||||
|
||||
If you have this problem, the best solution is to modify the source to
|
||||
convert the <CODE>#include</CODE> directives to one of the two standard forms.
|
||||
That will work with either compiler. If you want a quick and dirty fix,
|
||||
define the file names as macros with the proper expansion, like this:
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=example><pre>#define stdio <stdio.h>
|
||||
</pre></td></tr></table></P><P>
|
||||
|
||||
This will work, as long as the name doesn't conflict with anything else
|
||||
in the program.
|
||||
</P><P>
|
||||
|
||||
Another source of incompatibility is that VAX-C assumes that:
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=example><pre>#include "foobar"
|
||||
</pre></td></tr></table></P><P>
|
||||
|
||||
is actually asking for the file <TT>`foobar.h'</TT>. GCC does not
|
||||
make this assumption, and instead takes what you ask for literally;
|
||||
it tries to read the file <TT>`foobar'</TT>. The best way to avoid this
|
||||
problem is to always specify the desired file extension in your include
|
||||
directives.
|
||||
</P><P>
|
||||
|
||||
GCC for VMS is distributed with a set of include files that is
|
||||
sufficient to compile most general purpose programs. Even though the
|
||||
GCC distribution does not contain header files to define constants
|
||||
and structures for some VMS system-specific functions, there is no
|
||||
reason why you cannot use GCC with any of these functions. You first
|
||||
may have to generate or create header files, either by using the public
|
||||
domain utility <CODE>UNSDL</CODE> (which can be found on a DECUS tape), or by
|
||||
extracting the relevant modules from one of the system macro libraries,
|
||||
and using an editor to construct a C header file.
|
||||
</P><P>
|
||||
|
||||
A <CODE>#include</CODE> file name cannot contain a DECNET node name. The
|
||||
preprocessor reports an I/O error if you attempt to use a node name,
|
||||
whether explicitly, or implicitly via a logical name.
|
||||
</P><P>
|
||||
|
||||
<A NAME="Global Declarations"></A>
|
||||
<HR SIZE="6">
|
||||
<A NAME="SEC144"></A>
|
||||
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||||
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC143" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC143"> < </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC145" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC145"> > </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC145" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC145"> << </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC142" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC142"> Up </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_12.html#SEC146" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_12.html#SEC146"> >> </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc.html#SEC_Top" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html#SEC_Top">Top</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_toc.html#SEC_Contents" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_toc.html#SEC_Contents">Contents</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_24.html#SEC261" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_24.html#SEC261">Index</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_abt.html#SEC_About" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_abt.html#SEC_About"> ? </A>]</TD>
|
||||
</TR></TABLE>
|
||||
<H2> 11.2 Global Declarations and VMS </H2>
|
||||
<!--docid::SEC144::-->
|
||||
<P>
|
||||
|
||||
<A NAME="IDX418"></A>
|
||||
<A NAME="IDX419"></A>
|
||||
<A NAME="IDX420"></A>
|
||||
<A NAME="IDX421"></A>
|
||||
GCC does not provide the <CODE>globalref</CODE>, <CODE>globaldef</CODE> and
|
||||
<CODE>globalvalue</CODE> keywords of VAX-C. You can get the same effect with
|
||||
an obscure feature of GAS, the GNU assembler. (This requires GAS
|
||||
version 1.39 or later.) The following macros allow you to use this
|
||||
feature in a fairly natural way:
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>#ifdef __GNUC__
|
||||
#define GLOBALREF(TYPE,NAME) \
|
||||
TYPE NAME \
|
||||
asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME)
|
||||
#define GLOBALDEF(TYPE,NAME,VALUE) \
|
||||
TYPE NAME \
|
||||
asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME) \
|
||||
= VALUE
|
||||
#define GLOBALVALUEREF(TYPE,NAME) \
|
||||
const TYPE NAME[1] \
|
||||
asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME)
|
||||
#define GLOBALVALUEDEF(TYPE,NAME,VALUE) \
|
||||
const TYPE NAME[1] \
|
||||
asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME) \
|
||||
= {VALUE}
|
||||
#else
|
||||
#define GLOBALREF(TYPE,NAME) \
|
||||
globalref TYPE NAME
|
||||
#define GLOBALDEF(TYPE,NAME,VALUE) \
|
||||
globaldef TYPE NAME = VALUE
|
||||
#define GLOBALVALUEDEF(TYPE,NAME,VALUE) \
|
||||
globalvalue TYPE NAME = VALUE
|
||||
#define GLOBALVALUEREF(TYPE,NAME) \
|
||||
globalvalue TYPE NAME
|
||||
#endif
|
||||
</FONT></pre></td></tr></table></P><P>
|
||||
|
||||
(The <CODE>_$$PsectAttributes_GLOBALSYMBOL</CODE> prefix at the start of the
|
||||
name is removed by the assembler, after it has modified the attributes
|
||||
of the symbol). These macros are provided in the VMS binaries
|
||||
distribution in a header file <TT>`GNU_HACKS.H'</TT>. An example of the
|
||||
usage is:
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=example><pre>GLOBALREF (int, ijk);
|
||||
GLOBALDEF (int, jkl, 0);
|
||||
</pre></td></tr></table></P><P>
|
||||
|
||||
The macros <CODE>GLOBALREF</CODE> and <CODE>GLOBALDEF</CODE> cannot be used
|
||||
straightforwardly for arrays, since there is no way to insert the array
|
||||
dimension into the declaration at the right place. However, you can
|
||||
declare an array with these macros if you first define a typedef for the
|
||||
array type, like this:
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=example><pre>typedef int intvector[10];
|
||||
GLOBALREF (intvector, foo);
|
||||
</pre></td></tr></table></P><P>
|
||||
|
||||
Array and structure initializers will also break the macros; you can
|
||||
define the initializer to be a macro of its own, or you can expand the
|
||||
<CODE>GLOBALDEF</CODE> macro by hand. You may find a case where you wish to
|
||||
use the <CODE>GLOBALDEF</CODE> macro with a large array, but you are not
|
||||
interested in explicitly initializing each element of the array. In
|
||||
such cases you can use an initializer like: <CODE>{0,}</CODE>, which will
|
||||
initialize the entire array to <CODE>0</CODE>.
|
||||
</P><P>
|
||||
|
||||
A shortcoming of this implementation is that a variable declared with
|
||||
<CODE>GLOBALVALUEREF</CODE> or <CODE>GLOBALVALUEDEF</CODE> is always an array. For
|
||||
example, the declaration:
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=example><pre>GLOBALVALUEREF(int, ijk);
|
||||
</pre></td></tr></table></P><P>
|
||||
|
||||
declares the variable <CODE>ijk</CODE> as an array of type <CODE>int [1]</CODE>.
|
||||
This is done because a globalvalue is actually a constant; its "value"
|
||||
is what the linker would normally consider an address. That is not how
|
||||
an integer value works in C, but it is how an array works. So treating
|
||||
the symbol as an array name gives consistent results--with the
|
||||
exception that the value seems to have the wrong type. <STRONG>Don't
|
||||
try to access an element of the array.</STRONG> It doesn't have any elements.
|
||||
The array "address" may not be the address of actual storage.
|
||||
</P><P>
|
||||
|
||||
The fact that the symbol is an array may lead to warnings where the
|
||||
variable is used. Insert type casts to avoid the warnings. Here is an
|
||||
example; it takes advantage of the ANSI C feature allowing macros that
|
||||
expand to use the same name as the macro itself.
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=example><pre>GLOBALVALUEREF (int, ss$_normal);
|
||||
GLOBALVALUEDEF (int, xyzzy,123);
|
||||
#ifdef __GNUC__
|
||||
#define ss$_normal ((int) ss$_normal)
|
||||
#define xyzzy ((int) xyzzy)
|
||||
#endif
|
||||
</pre></td></tr></table></P><P>
|
||||
|
||||
Don't use <CODE>globaldef</CODE> or <CODE>globalref</CODE> with a variable whose
|
||||
type is an enumeration type; this is not implemented. Instead, make the
|
||||
variable an integer, and use a <CODE>globalvaluedef</CODE> for each of the
|
||||
enumeration values. An example of this would be:
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=example><pre>#ifdef __GNUC__
|
||||
GLOBALDEF (int, color, 0);
|
||||
GLOBALVALUEDEF (int, RED, 0);
|
||||
GLOBALVALUEDEF (int, BLUE, 1);
|
||||
GLOBALVALUEDEF (int, GREEN, 3);
|
||||
#else
|
||||
enum globaldef color {RED, BLUE, GREEN = 3};
|
||||
#endif
|
||||
</pre></td></tr></table></P><P>
|
||||
|
||||
<A NAME="VMS Misc"></A>
|
||||
<HR SIZE="6">
|
||||
<A NAME="SEC145"></A>
|
||||
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||||
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC144" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC144"> < </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_12.html#SEC146" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_12.html#SEC146"> > </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC142" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC142"> << </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC142" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC142"> Up </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_12.html#SEC146" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_12.html#SEC146"> >> </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc.html#SEC_Top" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html#SEC_Top">Top</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_toc.html#SEC_Contents" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_toc.html#SEC_Contents">Contents</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_24.html#SEC261" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_24.html#SEC261">Index</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_abt.html#SEC_About" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_abt.html#SEC_About"> ? </A>]</TD>
|
||||
</TR></TABLE>
|
||||
<H2> 11.3 Other VMS Issues </H2>
|
||||
<!--docid::SEC145::-->
|
||||
<P>
|
||||
|
||||
<A NAME="IDX422"></A>
|
||||
<A NAME="IDX423"></A>
|
||||
<A NAME="IDX424"></A>
|
||||
GCC automatically arranges for <CODE>main</CODE> 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.
|
||||
</P><P>
|
||||
|
||||
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.
|
||||
</P><P>
|
||||
|
||||
<A NAME="IDX425"></A>
|
||||
<A NAME="IDX426"></A>
|
||||
Under previous versions of GCC, the generated code would occasionally
|
||||
give strange results when linked to the sharable <TT>`VAXCRTL'</TT> library.
|
||||
Now this should work.
|
||||
</P><P>
|
||||
|
||||
A caveat for use of <CODE>const</CODE> global variables: the <CODE>const</CODE>
|
||||
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.
|
||||
</P><P>
|
||||
|
||||
<A NAME="IDX427"></A>
|
||||
<A NAME="IDX428"></A>
|
||||
<A NAME="IDX429"></A>
|
||||
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.
|
||||
</P><P>
|
||||
|
||||
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 <SAMP>`/NOCASE_HACK'</SAMP> 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 <SAMP>`/NAMES'</SAMP>
|
||||
also provides control over global name handling.
|
||||
</P><P>
|
||||
|
||||
Function and variable names are handled somewhat differently with GNU
|
||||
C++. The GNU C++ compiler performs <EM>name mangling</EM> 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.
|
||||
</P><P>
|
||||
|
||||
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
|
||||
<SAMP>`/VERBOSE'</SAMP> compiler option is used, the assembler will print both
|
||||
the full and truncated names of each symbol that is truncated.
|
||||
</P><P>
|
||||
|
||||
The <SAMP>`/NOCASE_HACK'</SAMP> compiler option should not be used when you are
|
||||
compiling programs that use libg++. libg++ has several instances of
|
||||
objects (i.e. <CODE>Filebuf</CODE> and <CODE>filebuf</CODE>) 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:
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=example><pre>#define StuDlyCapS studlycaps
|
||||
</pre></td></tr></table></P><P>
|
||||
|
||||
These macro definitions can be placed in a header file to minimize the
|
||||
number of changes to your source code.
|
||||
</P><P>
|
||||
|
||||
<A NAME="Portability"></A>
|
||||
<HR SIZE="6">
|
||||
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
|
||||
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_11.html#SEC142" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_11.html#SEC142"> << </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_12.html#SEC146" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_12.html#SEC146"> >> </A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc.html#SEC_Top" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html#SEC_Top">Top</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_toc.html#SEC_Contents" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_toc.html#SEC_Contents">Contents</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_24.html#SEC261" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_24.html#SEC261">Index</A>]</TD>
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gcc_abt.html#SEC_About" tppabs="http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_abt.html#SEC_About"> ? </A>]</TD>
|
||||
</TR></TABLE>
|
||||
<BR>
|
||||
<FONT SIZE="-1">
|
||||
This document was generated
|
||||
by <I>GCC Administrator</I> on <I>March, 17 2001</I>
|
||||
using <A HREF="tppmsgs/msgs0.htm#1" tppabs="http://www.mathematik.uni-kl.de/~obachman/Texi2html"><I>texi2html</I></A>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
Reference in New Issue
Block a user