newsuser@lth.se (LTH network news server) (09/13/89)
PROBLEM Compiling with `-p' (profiling) option causes link time compilation error; exit() multiply defined. PROBLEM CONDITIONS AT&T C++ Translator, Release 2.0, on Sun-3 running SunOS 3.5; uses Sun cc as back end. Probably applicable to other Sun systems. DESCRIPTION The problem arises from the use of exit(3) for two different purposes: 1. AT&T C++ (cfront) uses exit() to call a function (__dtors) which in turn calls the destructors of all static objects. To be "compatible" with existing exit() functions, the cfront exit() also calls cleanup() and lastly _exit(). 2. The `-p' (profiling) option will make the program gather profiling statistics. The statistics is then written to a file (mon.out) with a specially modified exit() that is automatically linked with the program by the Sun cc compiler. The solution presented in the context diff below solves this problem by using a Sun-specific function called on_exit(). 1. The _main() function which calls the initialization routines for static objects has been modified to "register" __dtors() as a clean-up function to be run at program termination. 2. The exit() provided with C++ 2.0 has been dropped. When the patches have been applied, a new run-time library (libC.a) must be built and installed. The new library can be used both with and without the `-p' option. SEE ALSO exit(3) and on_exit(3). NOTES The on_exit() call is specific to Sun Unix and should not be used if portability is a concern. It is still not possible to run programs compiled with the `-a' option to gather profiling information on the "basic block" level. The termination routine cannot find the `.d' files that correspond to the temporary C programs generated by cfront. The patches below apply to the "patch" version of the compiler. A similar solution is probably applicable to the "munch" version. A similar patch is applicable to AT&T C++, Release 1.2. This has been tested to some degree, but I cannot guarantee the code is error free, nor that it doesn't interact with something else. Comments are gratefully accepted. Dag Michael Bruck -- Department of Automatic Control Internet: dag@control.lth.se Lund Institute of Technology P. O. Box 118 Phone: +46 46-108779 S-221 00 Lund, SWEDEN Fax: +46 46-138118 ================== context diff follows ===================================== *** Patch/OLD_main.c Tue Jun 13 17:16:57 1989 --- Patch/_main.c Wed Sep 13 13:30:01 1989 *************** *** 1,4 **** --- 1,5 ---- /*ident "@(#)ctrans:Patch/_main.c 1.1.2.2" */ + /* Modified for SunOS and `-p' option */ /************************************************************************** Copyright (c) 1984 AT&T All Rights Reserved *************** *** 21,27 **** --- 22,30 ---- extern "C" { extern void _main(); + extern void on_exit(void (*)(), int); /* not quite right, but works */ }; + extern void __dtors(); extern void _main() { *************** *** 41,44 **** --- 44,48 ---- } __head = previous; + on_exit(__dtors, 0); } *** lib/static/OLDexit.c Tue Jun 13 17:20:17 1989 --- lib/static/exit.c Wed Sep 13 13:36:31 1989 *************** *** 1,4 **** --- 1,5 ---- /*ident "@(#)ctrans:lib/static/exit.c 1.1.2.2" */ + /* Modified for SunOS and `-p' option */ /************************************************************************** Copyright (c) 1984 AT&T All Rights Reserved *************** *** 20,25 **** --- 21,27 ---- extern void exit(int i); } + #if 0 extern void exit(int i) { __dtors(); *************** *** 26,28 **** --- 28,31 ---- _cleanup(); _exit(i); } + #endif -- Department of Automatic Control Internet: dag@control.lth.se Lund Institute of Technology P. O. Box 118 Phone: +46 46-108779 S-221 00 Lund, SWEDEN Fax: +46 46-138118