[comp.os.vms] VAX C - relative adresses?

U0012@DGOGWDG5.BITNET ("GWDGV1::MOELLER") (05/11/88)

A question directed at VAX C gurus:
I would like to create a static table of address offsets in VAX C, like
        static <type> base
        extern <type> item1,item2,...
        static readonly int tab[size] = {&item1 - &base,&item2 - &base, ...}
so I'd have POSITION-INDEPENDENT data only (for use in a shareable image)

Now simple adresses (+- offset) are legal initializers in C,
but not their difference, so the above program won't compile,
while
        static readonly char *tab[size] = {&item1,&item2,...}
is o.k.

Do you know of a way to convince VAX C to do the desired
(compile-time) initialization?

Wolfgang J. Moeller, GWDG, D-3400 Goettingen, F.R.Germany | Disclaimer ...
Bitnet/Earn: U0012@DGOGWDG5         Phone: +49 551 201516 | No claim intended

LEICHTER@VENUS.YCC.YALE.EDU ("Jerry Leichter ", LEICHTER-JERRY@CS.YALE.EDU) (05/16/88)

	[In VAX C,] I would like to create a static table of address offsets
	in VAX C, like

        static <type> base
        extern <type> item1,item2,...
        static readonly int tab[size] = {&item1 - &base,&item2 - &base, ...}

	so I'd have POSITION-INDEPENDENT data only (for use in a shareable
	image)

	Now simple adresses (+- offset) are legal initializers in C, but not
	their difference, so the above program won't compile, while

        static readonly char *tab[size] = {&item1,&item2,...}

	is o.k.

	Do you know of a way to convince VAX C to do the desired
	(compile-time) initialization?

Ah, but it ISN'T a compile-time initialization:  The value of &item1-&base
isn't known to the compiler, nor can it be known until the program is linked.

This kind of initializer is certainly not allowable in standard C; many
linkers are unable to evaluate such expressions.  On an architecture with a
segmented address space, the difference between two addresses may not even be
meaningful.

The VMS Linker could, in fact, evaluate such an expression if asked to, but
VAX C doesn't provide any mechanism for this.

You can build a table like tab[] in macro.  I don't know Bliss well enough to
know if it can specify such a table; probably.  I doubt any other VMS HLL will
let you do this.

The best I can suggest is that rather than using a whole bunch of separate
variables, you use one structure with a lot of fields, one per variable.
You then end up with a table of offsets to structure fields, which it IS
possible to compute at compile time; in fact, ANSI C even provides an offsetto
built-in macro to do this.

On the other hand, once you've put everything into one structure, you may find
that you really don't need the table anyway.

							-- Jerry

dhesi@bsu-cs.UUCP (Rahul Dhesi) (05/20/88)

In article <8805170934.AA05192@ucbvax.Berkeley.EDU> LEICHTER@VENUS.YCC.YALE.EDU 
("Jerry Leichter ", LEICHTER-JERRY@CS.YALE.EDU) writes:
>	[In VAX C,] I would like to create a static table of address offsets
>	in VAX C, like

It's better to say "VMS C" because it avoids mixing up hardware (VAX)
with software (VMS).  It also avoids the ambiguity of VMS versus UNIX
or Ultrix etc.

DEC document writers are quite confused about this issue, but we
users and programmers should know better.
-- 
Rahul Dhesi         UUCP:  <backbones>!{iuvax,pur-ee,uunet}!bsu-cs!dhesi