HP OpenVMS Systemsask the wizard |
The Question is:
Hello,
I tried your example in OpenVMS Linker Utility, but got some errors. Please
advise on how to use the VMS linker to add symbol vector. Thanks.
my_math.cxx
int myadd(int value_1, int value_2)
int result;
result=value_1 + value_2;
return(result);
int mysub(int value_1, int value_2)
int result;
result=value_1 - value_2;
return(result);
$ cxx my_math.cxx
$ link /share my_math.OBJ, -
sys$input:/opt
SYMBOL_VECTOR=(myadd=procedure,mysub=procedure)
Here is what I get:
%LINK-W-NUDFSYMS, 2 undefined symbols:
%LINK-I-UDFSYM, MYADD
%LINK-I-UDFSYM, MYSUB
%LINK-W-USEUNDEFSYMV, undefined symbol MYADD referenced
in symbol vector option
%LINK-W-USEUNDEFSYMV, undefined symbol MYSUB referenced
in symbol vector option
The Answer is :
Thank you for bringing this old VAX C syntax to the attention
of the OpenVMS Wizard. (Please note that the examples are C,
and not C++.)
Please see the shareable image cookbook available at the Ask
The Wizard website, and also please see topic 2486.
An updated version -- one that contains the rough equivilent of
the various examples present in chapters 2, 3, and 4 of the
OpenVMS LINKER manual -- is included below.
$! my_linker_demo.com
$! OpenVMS LINKER Example Procedure
$ CALL CLEAN
$ create my_defs.h
#ifndef __MY_LOADED
#define __MY_LOADED 1
int myadd( int, int );
int mysub( int, int );
int mymul( int, int );
int mydiv( int, int );
#endif
$ create my_main.c
#include "my_defs.h"
#include <stdio.h>
#include <ssdef.h>
main()
{
int Num1 = 6, Num2 = 5, Result = 0;
Result = mysub( Num1, Num2 );
printf("The result is %d\n", Result );
return SS$_NORMAL;
}
$ cc/decc/prefix=all my_main.c
$ create my_math.c
#include "my_defs.h"
myadd( int Val1, int Val2 )
{
return Val1 + Val2;
}
mysub( int Val1, int Val2 )
{
return Val1 - Val2;
}
mymul( int Val1, int Val2 )
{
return Val1 * Val2;
}
mydiv( int Val1, int Val2 )
{
return Val1 / Val2;
}
$ cc/decc/prefix=all my_math.c
$! +++++++
$! MY_IMG1 -- Create a monolithic image
$!
$ link/execute=my_img1 my_math.obj,my_main.obj
$! Run the MY_IMG1 image.
$!
$ write sys$output "run my_img1"
$ run my_img1
$! +++++++
$! MY_IMG2 -- With an object library
$!
$ library/create/object/insert my_objlib.olb my_math.obj
$ link/execute=my_img2 my_main.obj,my_objlib/library
$! Run the MY_IMG2 image.
$!
$ write sys$output "run my_img2"
$ run my_img2
$! +++++++
$! MY_IMG3 -- With a (temporary/user) library reference via LNK$LIBRARY
$!
$ define/user lnk$library my_objlib.olb
$ link/execute=my_img3.exe my_main.obj
$! Run the MY_IMG3 image.
$!
$ write sys$output "run my_img3"
$ run my_img3
$ goto SHRIMG_'f$getsyi("ARCH_NAME")
$ exit
$SHRIMG_VAX:
$! Build an OpenVMS VAX shareable image.
$! Build the Macro32 transfer vectors.
$!
$ macro sys$input:/object=my_vectors.obj
; create a program section to hold just the vectors, and
; to keep all transfer vectors quadword aligned.
.psect $$$XFRVEC,exe,shr,nowrt,rd,pic,quad
; define a macro to simplify creating a transfer vector
; to a routine located in the shareable image.
.macro XFRVEC entry_point
.align QUAD
.transfer entry_point
.mask entry_point
JMP l^entry_point+2
.endm
; define a macro that places a longword constant directly
; into the transfer vector array.
.macro XFRCON constant
.align QUAD
.long constant
.endm
; and start defining the transfer vectors...
; Append any new entries, and do not remove any existing entries
; (Either make all changes to the vectors in an upward-compatible
; fashion, or plan to have to change the GSMATCH major value on
; the shareable image.)
XFRVEC myadd
XFRVEC mysub
XFRVEC mymul
XFRVEC mydiv
.End
$! +++++++++
$! MY_SHRIMG -- Link a shareable image on an OpenVMS VAX system
$!
$ link/shareable=my_shrimg my_math.obj,my_vectors.obj,sys$input:/option
gsmatch=lequal,1,42
Cluster=$$$XFRVEC
Collect=$$$XFRVEC,$$$XFRVEC
$ Goto SHRIMG_COMMON
$SHRIMG_Alpha:
$! Build an OpenVMS VAX shareable image.
$! +++++++++
$! MY_SHRIMG -- Link a shareable image on an OpenVMS Alpha system
$!
$ link/shareable=my_shrimg my_math.obj,sys$input:/option
gsmatch=lequal,1,42
! do not re-order nor remove any symbol vector entries.
! append all new entries to the end of the list.
SYMBOL_VECTOR=(-
myadd=PROCEDURE,-
mysub=PROCEDURE,-
mymul=PROCEDURE,-
mydiv=PROCEDURE )
$ Goto SHRIMG_COMMON
$SHRIMG_COMMON:
$! +++++++
$! MY_IMG4 -- Link with the shareable image
$!
$ link/execute=my_img4 my_main.obj,sys$input/options
my_shrimg/shareable
$! Run the MY_IMG4 image.
$! Since the shareable image is not in SYS$SHARE:, we
$! need a (temporary/user) logical name to reference it.
$!
$ write sys$output "run my_img4"
$ define/user my_shrimg sys$disk:[]my_shrimg
$ run my_img4
$! +++++++
$! MY_IMG5 -- Link with the shareable image via a shareable image library
$!
$ library/create/share/insert my_shrlib.olb my_shrimg.exe
$ define/user lnk$library my_shrlib.olb
$ link/execute=my_img5 my_main.obj
$! Run the MY_IMG5 image.
$! Since the shareable image is not in SYS$SHARE:, we
$! need a (temporary/user) logical name to reference it.
$!
$ write sys$output "run my_img5"
$ define/user my_shrimg sys$disk:[]my_shrimg
$ run my_img5
$ CALL CLEAN
$ EXIT
$CLEAN: SUBROUTINE
$! Clean up any remnants
$ if f$search("my_defs.h") .nes. "" then delete my_defs.h;*
$ if f$search("my_main.c") .nes. "" then delete my_main.c;*
$ if f$search("my_main.obj") .nes. "" then delete my_main.obj;*
$ if f$search("my_math.c") .nes. "" then delete my_math.c;*
$ if f$search("my_math.obj") .nes. "" then delete my_math.obj;*
$ if f$search("my_img1.exe") .nes. "" then delete my_img1.exe;*
$ if f$search("my_img2.exe") .nes. "" then delete my_img2.exe;*
$ if f$search("my_img3.exe") .nes. "" then delete my_img3.exe;*
$ if f$search("my_img4.exe") .nes. "" then delete my_img4.exe;*
$ if f$search("my_img5.exe") .nes. "" then delete my_img5.exe;*
$ if f$search("my_vectors.obj") .nes. "" then delete my_vectors.obj;*
$ if f$search("my_shrimg.exe") .nes. "" then delete my_shrimg.exe;*
$ if f$search("my_shrlib.olb") .nes. "" then delete my_shrlib.olb;*
$ if f$search("my_objlib.olb") .nes. "" then delete my_objlib.olb;*
$ ENDSUBROUTINE
|