通过使用C编译器创建一个额外的目标文件来链接到动态库,就可以创建类似Fortran90可执行文件和动态链接库这样的文件:
/* stub.c: compile e.g. with gcc -c stub.c
const char dl_loader[] __attribute__((section(".interp"))) =
"/lib64/ld-linux-x86-64.so.2";
/* adjust string if path or architecture is different */
subroutine execentry
write(*,*) 'Written from executable.'
call exit(0)
end subroutine
subroutine libroutine
write(*,*) 'Written by libroutine.'
end subroutine
program linktest
call libroutine
end
编译和链接:
gcc -c stub.c
ifort -c -fPIC testif.f90
ifort -c linktest.f90
ifort -shared -o libtestif.so testif.o stub.o -Wl,-e,execentry_
ifort -o linktest linktest.o -L. -ltestif
直接执行动态链接库 ./libtestif.so
将调用 execentry
函数,而运行链接测试程序
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./linktest
将调用libroutine
。
仅需要C代码创建.interp
节。在ld
标志-Wl,-e,execentry_
中添加下划线是根据符号名称混淆的规则添加的,适用于Intel ifort(或GNU gfortran)与GNU或Intel C编译器。
readelf
确认了INTERP
部分的存在,但是没有成功。 - Ingo00000000000008a0 T execentry_
。这与readelf -h
列出的入口点相匹配:入口点地址:0x8a0
。 - Ingo