Topic brought up on #gfortran by Janne. There are some potential issues in using main.c in a library; thus one should have only link a "main()" if the *.o files don't have a "main". See also: http://groups.google.com/group/comp.os.linux.development.apps/browse_thread/thread/e35b2224a7dc27bf/ http://groups.google.com/group/comp.lang.fortran/browse_thread/thread/7d483c59db0bb6f/ The solution of SUN is to generate for PROGRAM not only a "MAIN_" but also a main() which does the initialization and calls then MAIN_. ("MAIN_" should be present for backward compatibility.) I think we could do likewise, especially as the code is rather short (libgfortran/fmain.c): main (int argc, char *argv[]) { store_exe_path (argv[0]); set_args (argc, argv); MAIN__ (); /* The Fortran PROGRAM */ return 0; } Intel's solution is to link "for_main-o", but that is not as elegant as for "ifort *.o" one needs to specify "-nofor-main" if there is a non-fortran C library. * * * Independent of all, I think one should document the gfortran_init() functions to make the full library functions available even if the "main()" program is written in C. Besides store_exe_path (argv[0]); set_args (argc, argv); (which should be combined to one function) one also has _gfortran_set_options() * * * Marked as depending on the array descriptor stuff as with the ABI break one can get also rid of fmain.c's main(). It might also help with -fwhole-program (cf. PR fortran/26682) as a "main()" shouldn't be optimized away ;-)
s/MAIN_/MAIN__/g * * * > Intel's solution is to link "for_main-o", but that is not as elegant as for > "ifort *.o" one needs to specify "-nofor-main" if there is a non-fortran C The last line should read: 'if there is a non-fortran "main()"'. * * * Regarding MAIN__: - gdb assumes that this is the main function for Fortran programs; as gfortran now sets "main_program_symbol" this might be not an issue. - For stepping through the code, having a separate MAIN_ avoids that the user enters libgfortran for the initialization, which can be a bit confusing.
Note: Moving main() to f951 will break programs which assume that MAIN__ will be called, compile e.g. the following program with gcc: ------------------- #include <stdio.h> int MAIN__( int argc, char* argv[] ) {printf("argc is %i:0 %s\n", argc,argv[0]); printf("argc is %i:1 %s\n", argc,argv[1]); return(0);} ------------------- and link it with gfortran. If you run it, MAIN__ will be executed and by some magic the arguments are passed to MAIN__. (That the arguments are available is a complete puzzle to me.) -- Found in c.l.f thread linked above.
Patch: http://gcc.gnu.org/ml/fortran/2009-05/msg00310.html
Subject: Bug 39178 Author: burnus Date: Tue May 26 21:19:57 2009 New Revision: 147883 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=147883 Log: fortran/ 2009-05-26 Tobias Burnus <burnus@net-b.de> PR fortran/39178 * gfortranspec.c (lang_specific_driver): Stop linking libgfortranbegin. * trans-decl.c (gfc_build_builtin_function_decls): Stop making MAIN__ publicly visible. (gfc_build_builtin_function_decls): Add gfor_fndecl_set_args. (create_main_function) New function. (gfc_generate_function_code): Use it. libgfortran/ 2009-05-26 Tobias Burnus <burnus@net-b.de> PR fortran/39178 * runtime/main.c (store_exe_path): Make static and multiple-times callable. (set_args): Call store_exe_path. * libgfortran.h: Remove store_exe_path prototype. * fmain.c (main): Remove store_exe_path call. Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/gfortranspec.c trunk/gcc/fortran/trans-decl.c trunk/libgfortran/ChangeLog trunk/libgfortran/fmain.c trunk/libgfortran/libgfortran.h trunk/libgfortran/runtime/main.c
FIXED on the trunk (4.5). Regarding libgfortranbegin.a, see PR 40267.