gpt4 book ai didi

fortran - 使用 ifort 构建可执行共享库

转载 作者:行者123 更新时间:2023-12-04 11:25:35 26 4
gpt4 key购买 nike

有几个关于 SO 的精彩讨论已经涵盖了如何在 Linux 上生成可执行共享库:

  • https://unix.stackexchange.com/questions/7066
  • building a .so that is also an executable例如

  • 在 C/C++ 中,这似乎相对简单;基本上有两个部分:
  • 添加 .interp ELF 部分(如 ld 不包括用于共享库的部分),方法是在库源代码中包含以下内容:const char interp_section[] __attribute__((section(".interp"))) = "/path/to/dynamic/linker";
  • 链接时设置适当的入口点,使用 -Wl,-e,entry_point

  • 有谁知道如何使用 Fortran 编写的库来实现这一目标?具体如何添加 .interp使用 ifort 编译的共享库的部分?

    最佳答案

    借助 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 */
    ! testif.f90: compile e.g. with ifort -c -fPIC testif.f90

    subroutine execentry
    write(*,*) 'Written from executable.'
    ! without call to exit seems to lead to segmentation fault
    call exit(0)
    end subroutine

    subroutine libroutine
    write(*,*) 'Written by libroutine.'
    end subroutine
    ! linktest.f90: compile e.g. with ifort -c linktest.f90
    ! main Fortran program for testing

    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 编译器的符号名称修改添加的。

    关于fortran - 使用 ifort 构建可执行共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68916250/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com