Installation guide

time consuming. (To find pointer-to-int assignments in existing source
code, use the lint Q command.)
Another way to overcome this problem is to use the Truncated Address
Support Option (taso option). The taso option makes it unnecessary for
the pointer-to-int assignments to be modified. It does this by causing a
program’s address space to be arranged so that all locations within the
program when it starts execution can be expressed within the 31 low-order
bits of a 64-bit address, including the addresses of routines and data
coming from shared libraries.
The taso option does not affect the sizes used for any of the data types
supported by a DIGITAL UNIX system. Its only effect on any of the data
types is to limit addresses in pointers to 31 bits (that is, the size of pointers
remains at 64 bits but addresses use only the low-order 31 bits).
The 31-bit address limit is used to avoid the possibility of setting the sign
bit (bit 31) in 32-bit int variables when pointer-to-int assignments are
made. Allowing the sign bit to be set in an int variable by a pointer-to-int
assignment would create a potential problem with sign extension. For
example:
{
char *x; /* 64-bit pointer */
int z; /* 32-bit int variable */
.
.
.
/* address of named_obj = 0x0000 0000 8000 0000 */
x = &named_obj; /* 0x0000 0000 8000 0000 = original pointer
value */
z = x; /* 0x8000 0000 = value created by pointer-to-int
assignment */
x = z; /* 0xffff ffff 8000 0000 = value created by pointer-
to-int-to-pointer or pointer-to-int-to-long
assignment (32 high-order bits set to ones by
sign extension) */
}
7.3.1.3 Use and Effects of the taso Option
You can specify the taso option on the cc or ld command lines used to
create an application’s object modules. (If you specifiy it on the cc
command line, the option is passed to the ld linker.) The taso option
directs the linker to set a flag in object modules and this flag directs the
loader to load the modules into 31-bit address space.
The taso option ensures that text and data segments of an application
are loaded into memory that can be reached by a 31-bit address. Thus,
whenever a pointer is assigned to an int variable, the values of the 64-bit
pointer and the 32-bit int variable will always be identical (except in the
special situations described in Section 7.3.1.4).
7–8 Migrating Your ULTRIX Application to a DIGITAL UNIX System