ITEM: M8913L
prob w/static consrtuctors on link
Question:
prob w/static consrtuctors on link
Response:
ENV:
AIX 3.2.5
DESCRIPTION:
Forced to compiler with a 3-party compiler that isn't recognizing
C++ static objects defined outside of main. The customer says he has
heard there is a way to pass these objects to the linker, and would like
the appropriate option to do so.
Response:
The customer is using Micofocus compiler with C++, and it is not
creating the static objects at run time. He called Microfocus, but
they told him they did not support C++.
Told customer we would get back with him, and check on ways to get those
static objects created.
Response:
Discovered the following paragraph in Item H9352L.
Using the Cobol compiler to perform the final link,
the C++ starup code is not being utilized. XLC++ requires that the
C++ startup module /usr/lpp/xlC/lib/crt0.o is used. If not, the
static constructors and destructors are not called on program startup
and exit, and therefore the C++ portions of the application will not
work; this is illustrated by the segmentation fault that is
experiencing. *--> There is no way (currently) to combine MF Cobol and XL
C++ if the C++ code has static constructors and destructors. \<--*
Might want to double-check to make sure this has not been changed.
Response:
Told customer about the above paragraph concerning static objects
constructors. He still thinks there should be a way to do this. I
think that he needs to speak with a specialist to
give him a confident, sure answer.
Response:
D: Customer wanted an easy way to get the C++ code munched; since the
MF cobol compiler is used to do the final link, munch is not
automatically invoked, and this is the difficulty.
A: I suggested the customer take all of their C++ code and pretend to
build a shared object. Take this object, relink it to remove the
shared object attributes, and hand the result to the cobol compiler.
To do this, use the /usr/lpp/xlC/bin/makeC++SharedLib script to build
a shared object from _all_ C++ code. This script invokes munch,
includes all named objects, and properly constructs an object file.
Then, use a command like
ld -o tmp.o shr.o -bnso -r
to get a non-shared version of the object module. Assume for this
example that shr.o is the output of makeC++SharedLib. Pass the tmp.o
object to the cobol compiler, using the C++ startup code
/usr/lpp/xlC/lib/crt0.o, and link in the cobol. The result should be
a valid application.
N: Customer understood the steps, and will try this approach.
Response:
Action: Customer called in and needed help creating a shared library.
Customer should compile all object code and then run the script
/usr/lpp/xlC/bin/makeC++SharedLib. This will create a
shared library.
Response:
D: Customer is having some problem with the compiler. A test case of this form:
\#include \
\#include \
struct _foo
{ int i;
int j;
} foo;
typedef const unsigned int mystructype;
static mystructype staticStruct[] = { 24, XtOffsetOf(struct _foo, j)};
main()
{ cout \<\< staticStruct[0] \<\< endl;
cout \<\< staticStruct[1] \<\< endl;
cout \<\< XtOffsetOf(struct _foo, j) \<\< endl;
return( 0 );
}
is not working on xlC 1.1.2.45. He gets a 0 for the static data structure
value for XtOffsetOf, but a correct value of 4 (in this example) from the
XtOffsetOf in a function. The data structure is not initialized correctly
by the compiler.
A: Have tested this code on a 2.1 compiler; will have to install xlC 1.x
and test it.
Response:
D: Customer still cannot produce a binary that triggers the static
constructors and desctructors.
A: Will research using the cobol compiler to build an application.
Response:
D: Went over compile and link commands; can't get his system to
produce the same (expected) results as I can locally.
Response:
D: Discovered that the makeC++SharedLib approach is a dead-end. The
constructor/ destructor data structure created my munch for
applications is not the same as that created for shared objects, due
to some priority information. Therefore, using the output of xlC -v
as a guide, it's necessary to invoke munch manually on the object
modules of interest. For example, a command of the form
/usr/lpp/xlC/exe/munch -o munchstuff.C -t munchstuff file1.o \\
file2.o ... /usr/lpp/xlC/lib/libC.a /usr/lib/libc.a
will generate in the source file munchstuff.C a list of the available
static construtors and destructors for objects file1.o, file2.o, etc.
This file must then be compiled (xlC -c munchstuff.C) and included in
the final link for the application. For cobol, for example, the
command might be something like
cob -x -o main /usr/lpp/xlC/lib/crt0.o main.o file1.o ... \\
munchstuff.o -lC -lm
This includes the correct startup module, and the
constructor/destructor list from munch.
An additional consideration is the use of archives. Since archives
often contain unneeded object modules, and munch will generate a list
of symbols based on _all_ available modules, the -qtwolink option
combined with the -v option for xlC can be useful in determining the
steps necessary to automate the munch/link process for any given
application.
Support Line: prob w/static consrtuctors on link ITEM: M8913L
Dated: March 1996 Category: N/A
This HTML file was generated 99/06/24~13:30:39
Comments or suggestions?
Contact us