153 lines
4.6 KiB
Plaintext
153 lines
4.6 KiB
Plaintext
Abstract:
|
|
|
|
Program (htcobrun) to enable TC COBOL (sub)programs, or modules,
|
|
compiled with TC as shared libraries (DLL's), to be dynamically loaded
|
|
and run.
|
|
|
|
The shared library files, which can contain one or more modules, are generally
|
|
stored in a directory.
|
|
|
|
The TC run-time will use the 'TCOB_LD_LIBRARY_PATH' and 'LD_LIBRARY_PATH'
|
|
environment variables, to locate the requested (sub)program or module name.
|
|
|
|
Note that the (sub)programs, or module name, is the 'PROGRAM-ID' name, not
|
|
the actual shared library file name.
|
|
The actual file (shared library) may contain one or more modules.
|
|
|
|
|
|
Why use 'htcobrun':
|
|
|
|
The 'htcobrun' program can be compiled to fully include the full run-time
|
|
(static) library (Not available on MinGW version).
|
|
This approach yields substantial runtime performance improvements.
|
|
|
|
The COBOL (sub)programs can be built as shared libraries, which may contain
|
|
one or more modules, and are loaded and run dynamically.
|
|
|
|
Problems in using this approach:
|
|
Currently, there is no support for passing 'LINKAGE SECTION' parameters to
|
|
sub-programs.
|
|
|
|
>---------------------------------------------------------------------------<
|
|
|
|
How to build the program:
|
|
make
|
|
Modify the 'htcobrun.sh' as required.
|
|
make install (su required)
|
|
|
|
>---------------------------------------------------------------------------<
|
|
|
|
How to run an application:
|
|
|
|
You can use the 'htcobrun' program directly or use the sample
|
|
shell script 'htcobrun.sh' provided.
|
|
|
|
To use the 'htcobrun' program directly, first set the modules location(s).
|
|
|
|
Example:
|
|
$LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
|
|
$TCOB_LD_LIBRARY_PATH=.
|
|
$export TCOB_LD_LIBRARY_PATH LD_LIBRARY_PATH
|
|
$htcobrun dyntest
|
|
|
|
To use the sample shell script 'htcobrun.sh', edit the script and set
|
|
the modules location(s).
|
|
|
|
Example:
|
|
$edit tcobrun.sh
|
|
...
|
|
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
|
|
TCOB_LD_LIBRARY_PATH=.
|
|
export TCOB_LD_LIBRARY_PATH LD_LIBRARY_PATH
|
|
...
|
|
$htcobrun.sh dyntest
|
|
|
|
>---------------------------------------------------------------------------<
|
|
|
|
Notes:
|
|
|
|
The current version of TC will substitute a 'main' entry point, for the
|
|
name of the COBOL program, if it does not detect a 'USING' clause in
|
|
the 'PROCEDURE DIVISION'.
|
|
|
|
Also the 'ACCEPT identifier FROM COMMAND-LINE' statement, will not work when
|
|
when COBOL programs are compiled as modules.
|
|
|
|
These problems will be corrected in the future
|
|
|
|
The MinGW version can only be compiled and run using the TC run-time as a
|
|
DLL (not static).
|
|
|
|
>---------------------------------------------------------------------------<
|
|
|
|
Original OpenCOBOL mailing-list posting:
|
|
|
|
Subject: [open-cobol-list] Open Cobol Optimization
|
|
Date: Sun, 16 Nov 2003 17:16:22 +0100
|
|
|
|
Keisuke asked me to post this info - so here it is.
|
|
Note - Applies to Linux
|
|
|
|
In an effort to get the same performance as MF, I noticed
|
|
that we are heavily bouncing in and out of the shared libs.
|
|
So I came up with this. "cobcrun" is a driver prog used to
|
|
call the Cobol prog.
|
|
(This is equivalent to MF's "cobrun" and ACU's "runcbl").
|
|
It pulls in the complete static versions of libcob and libgmp.
|
|
|
|
The difference in runtime performance is astounding !
|
|
|
|
This also has a useful side effect in that all Cobol progs
|
|
can be compiled as modules.
|
|
(And therefore we do not need to work out which are main progs
|
|
and which are sub-progs for the compile)
|
|
(Note in cobcrun, that I move out argv0, otherwise we would
|
|
have to do some fancy checking for the command line accept)
|
|
(Note this is a quick and dirty, must do more checking)
|
|
|
|
In addition, with GCC > 3, you can tweak a bit more by passing
|
|
CFLAGS="-march=pentium3 -minline-all-stringops" (for P3 - arch=pentium4 for P4)
|
|
into the Open Cobol configure and also into the program compiles.
|
|
|
|
Here's cobcrun.c :
|
|
#include <stdio.h>
|
|
extern void *cob_resolve (const char *name);
|
|
extern void cob_call_error (void);
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
int ret;
|
|
int (*func)();
|
|
char *argn[64];
|
|
|
|
if ( argc <= 1 ) {
|
|
fprintf(stderr, "No parameters specified\n");
|
|
return 1;
|
|
}
|
|
for ( ret = 1; ret < argc; ret++ ) {
|
|
argn[ret - 1] = argv[ret];
|
|
}
|
|
cob_init (argc - 1, argn);
|
|
func = cob_resolve (argn[0]);
|
|
if (func == NULL) {
|
|
cob_call_error ();
|
|
} else {
|
|
ret = func ();
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
And here's the compile/link for it :
|
|
gcc -rdynamic -Wl,-export-dynamic -O2 -o cobcrun \
|
|
cobcrun.c -Wl,-whole-archive /usr/local/lib/libcob.a \
|
|
/usr/lib/libgmp.a -Wl,-no-whole-archive -lltdl -ldb -lncurses -lm
|
|
|
|
Keisuke has indicated that something like this will be included in the next
|
|
release.
|
|
|
|
Comments welcome.
|
|
|
|
Regards
|
|
|
|
Roger While
|