我正在尝试构建一个Fortran共享库,以便插入到另一个代码中,并试图了解模块级参数会发生什么以及它们存储在库中的位置。
这样的最小例子:
MODULE test
IMPLICIT NONE
public
integer,parameter :: my_x=1
integer :: my_y
contains
subroutine my_func(a)
integer, intent(in) :: a
my_y=my_x*a
end subroutine my_func
END MODULE
从中创建共享库:
gfortran -shared -fPIC testShared.f90 -o libtest.so
然后运行
nm libtest.so
输出:
0000000000201018 B __bss_start
<00> 0000000000201018 b已完成.6938w __cxa_finalize@@GLIBC_2.2.5
00000000000005e0 t deregister_tm_clones
0000000000000670 t __do_global_dtors_aux
0000000000200de8 t __do_global_dtors_aux_fini_array_entry
0000000000200df8 d __dso_handle
0000000000200e00 d _DYNAMIC
0000000000201018 D _edata
0000000000201020 B _end
00000000000006fc T _fini
00000000000006b0 t frame_dummy
0000000000200de0 t __frame_dummy_init_array_entry
0000000000000788 r FRAME_END
0000000000201000 d _GLOBAL_OFFSET_TABLE _
w __gmon_start__
0000000000000708 r __GNU_EH_FRAME_HDR
0000000000000598 T _init
w _ITM_deregisterTMCloneTable w _ITM_registerTMCloneTable
0000000000200df0 d JCR_END
0000000000200df0 d JCR_LIST
w _Jv_RegisterClasses
0000000000000620 t register_tm_clones
00000000000006e0 T __test_MOD_my_func
000000000020101c B __test_MOD_my_y
0000000000201018 d TMC_END
我也试过了:
gfortran -shared -fPIC -ggdb -O0 testShared.f90 -o libtest.so
达到同样的效果。
我们可以看到(适合用下划线修改)my_func和my_y但没有my_x。我假设编译器必须仍然将my_x存储在某个地方的库中,以防后来链接的另一个函数想要使用它,即使它是从函数my_func中编译出来的,但是我不知道它可能在哪里。
我的假设错了,my_x消失了,或者是以某种方式存储,我只是没有正确使用nm才能看到它?