使用ifort构建可执行共享库及添加.interp段的问题咨询
Fortran(含ifort编译链)生成可执行共享库实现方案
整体实现逻辑和C/C++一致,核心分为添加.interp段、指定入口点两步,以下是ifort环境下的具体实现方法:
1. 添加.interp段
ifort支持通过DEC编译指令指定变量所属的ELF段,直接在Fortran源码中声明存储动态链接器路径的变量,同时指定其分配到.interp段即可,示例代码如下:
! 路径需替换为当前系统对应架构的动态链接器路径 ! x86_64平台默认路径一般为 /lib64/ld-linux-x86-64.so.2 CHARACTER(LEN=*), PARAMETER :: interp_path = "/lib64/ld-linux-x86-64.so.2" !DEC$ ATTRIBUTES SECTION(".interp") :: interp_path
如果使用gfortran编译,写法调整为使用__attribute__属性声明即可:
CHARACTER(LEN=*), PARAMETER :: interp_path __attribute__((section(".interp"))) = "/lib64/ld-linux-x86-64.so.2"
2. 链接阶段指定入口点
和C/C++实现逻辑一致,链接时通过编译器向链接器传递参数,指定自定义的入口函数即可,参数格式为-Wl,-e,自定义入口函数名。
完整编译示例(假设源码文件为mylib.f90,自定义入口函数名为lib_entry):ifort -shared -fPIC -o libmylib.so mylib.f90 -Wl,-e,lib_entry
注意事项
- 动态链接器路径需要和系统架构匹配,可通过
ldd /bin/ls等命令查看当前系统使用的动态链接器实际路径 - 自定义入口函数需要定义为无参数的Fortran子过程,避免运行时参数传递异常
- 编译必须添加
-fPIC参数生成位置无关代码,符合共享库的编译要求
内容的提问来源于stack exchange,提问作者Ingo
相关产品推荐
相关产品推荐

