■
以下のテストプログラム argtest.f *1をコンパイルしてみる。環境はcolinux + ifort 9.1, g77(gcc バージョン 3.4.6 Gentoo 3.4.6-r1, ssp-3.4.5-1.0, pie-8.7.9))
program argtest integer iargc external iargc character(LEN=120) argv do i=1, iargc() call getarg(i, argv) write(*,*) argv enddo end program
このソースは、g77でもifortでも使える引数処理機構らしい。iargc() が引数の数を返す関数、getarg(i, argv)がi番目の引数をバッファargvに渡す手続きなのだろう。
ifortの場合。
cobodo@localhost ~ $ ifort argtest.f cobodo@localhost ~ $ nm a.out | grep [^l]arg 08098920 b argtest_$ARGV.0.0 0809bc60 B for__a_argv 0807b0fa T for__close_args 0809bc5c B for__l_argc 0809622c D for__l_current_arg 0805c15c T for__open_args 080520ec T for_getarg 080521a4 T for_getarg_i2 08052334 T for_getcmd_arg 080520dc T for_iargc 080520d0 T for_nargs 0805229c T getarg_ 0805227c T iarg_ 0805226c T iargc_ 08052260 T nargs_ 0805228c T numarg_
g77の場合。
cobodo@localhost ~ $ g77 argtest.f cobodo@localhost ~ $ nm a.out | grep [^l]arg U G77_getarg_0 U f_setarg U iargc_
grepの引数は、単に"arg"だと"largest〜"がいくつか引っかかったため、こうしてあります。
さて。g77 の方に f__xargc, f__xargv がないのはどういうことなんだろう。別の処理機構が存在するのか?
ifortの方は、恐らく for__a_argv が f__xargv に、for__l_argc が f__xargc に当たるのではないだろうか。nmのmanを見ると、'B'は"uninitialized data section"とのことなので。'D'は"initialized data section"、'T'は"text (code) section"、'U'は"undefined"らしい。小文字'b'は書いてないんだけど……