首页 > 解决方案 > 是否有与 gcc 的 __attribute__((section("name"))) 等效的 gfortran?

问题描述

我正在使用 nestedvm 包,其中包括一个修补的 Gnu gcc 编译器。对于这个包,可调用的用户方法/函数必须用 注释__attribute__((section(".text"))),如下面的 C 示例所示。

void echo(const char *string, int count)  __attribute__((section(".text")));
void echo(const char *string, int count) {
    int i;
    for(i=0;i<count;i++)
        printf("%d: %s\n",i,string);
}

我不知道修补编译器的内部工作原理,但是如果没有此注释,外部调用者将看不到用户函数。

如果使用 gfortran,如何为 Fortran 子例程和函数完成此注释?这可以用链接器脚本文件来完成吗?我可以为 Fortran 函数编写一个 C 包装器,但如果可能的话,我想避免这种情况。

** 更新 1 ** 使用 nm 来调查 .o 文件对这个问题有所了解......没有属性的 C 方法看起来像 sinkram 函数(在 nestedvm 中不可调用),而 echo 函数具有属性并且可以在nestedvm中调用:

Name                  Value   Class        Type         Size     Line  Section
suckram             |00000000|   T  |              FUNC|00000078|     |.text.suckram
echo                |00000200|   T  |              FUNC|00000074|     |.text

我的 Fortran 对象中的 test1 子例程看起来像没有属性的吸盘方法:

test1_              |00000000|   T  |              FUNC|00000080|     |.text.test1_

根据我发现的一些nestedvm 文档,为了在nestedvm 中调用用户函数,它必须在该.text部分结束。

** 更新 2 ** 链接命令行如下。发表评论太长了。我删除了许多 .o 文件中的一些 (...)

mips-unknown-elf-gfortran -O3 -mmemcpy -ffunction-sections -fdata-sections -falign-functions=512 -fno-rename-registers -fno-schedule-insns -fno-delayed-branch -march=mips1 -specs=/home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec -I. -Wall -Wno-unused -o build/refprop/Refprop.mips build/refprop/NVM.o (...) build/refprop/TRNS_VIS.o build/refprop/MAIN.o -march=mips1 -specs=/home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec --static -Wl,--gc-sections -Wl,-Map=output1.map -Wl,--cref -lc -Wl,-Map=output.map -Wl,--cref

此外,即使我将代码作为库调用,nestedvm 也要求库具有用于初始化的 MAIN 例程。如果我在 MAIN 例程中对库函数进行一些虚拟调用,则在 MAIN 中调用的那些函数将移动到该.text部分,并变为可调用。

** 更新 3 ** make 的详细输出。我删除了许多 .o 文件中的一些 (...)

mips-unknown-elf-gfortran -O3 -mmemcpy -ffunction-sections -fdata-sections -falign-functions=512 -fno-rename-registers -fno-schedule-insns -fno-delayed-branch -march=mips1 -specs=/home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec -I. -Wall -Wno-unused -o build/refprop/Refprop.mips build/refprop/NVM.o (…) build/refprop/TRNS_VIS.o build/refprop/MAIN.o -march=mips1 -specs=/home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec --static -Wl,--gc-sections -Wl,-Map=output1.map -Wl,--cref -lc -Wl,-Map=output.map -Wl,--cref -v

Driving: mips-unknown-elf-gfortran -O3 -mmemcpy -ffunction-sections -fdata-sections -falign-functions=512 -fno-rename-registers -fno-schedule-insns -fno-delayed-branch -march=mips1 -specs=/home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec -I. -Wall -Wno-unused -o build/refprop/Refprop.mips build/refprop/NVM.o (…) build/refprop/TRNS_VIS.o build/refprop/MAIN.o -march=mips1 -specs=/home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec --static -Wl,--gc-sections -Wl,-Map=output1.map -Wl,--cref -lc -Wl,-Map=output.map -Wl,--cref -v -l gfortran -l m

Using built-in specs. Reading specs from /home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec Reading specs from /home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec COLLECT_GCC=mips-unknown-elf-gfortran COLLECT_LTO_WRAPPER=/home/jhuber/Documents/source/nestedvm/upstream/install/libexec/gcc/mips-unknown-elf/4.8.5/lto-wrapper Target: mips-unknown-elf Configured with: ../gcc-4.8.5/configure --prefix=/home/jhuber/Documents/source/nestedvm/upstream/install --target=mips-unknown-elf --disable-threads --disable-libssp --with-gnu-ld --with-gnu-as --with-newlib=yes --enable-sjlj-exceptions --enable-languages=c : (reconfigured) ../gcc-4.8.5/configure --prefix=/home/jhuber/Documents/source/nestedvm/upstream/install --target=mips-unknown-elf --disable-threads --disable-libssp --with-gnu-ld --with-gnu-as --with-newlib=yes --enable-sjlj-exceptions --enable-languages=c --enable-languages=c,c++,fortran Thread model: single gcc version 4.8.5 (GCC) Reading specs from /home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5/../../../../mips-unknown-elf/lib/libgfortran.spec rename spec lib to liborig COLLECT_GCC_OPTIONS='-O3' '-mmemcpy' '-ffunction-sections' '-fdata-sections' '-falign-functions=512' '-fno-rename-registers' '-fno-schedule-insns' '-fno-delayed-branch' '-march=mips1' '-specs=/home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec' '-I' '.' '-Wall' '-Wno-unused' '-o' 'build/refprop/Refprop.mips' '-march=mips1' '-specs=/home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec' '-static' '-v' COMPILER_PATH=/home/jhuber/Documents/source/nestedvm/upstream/install/libexec/gcc/mips-unknown-elf/4.8.5/:/home/jhuber/Documents/source/nestedvm/upstream/install/libexec/gcc/mips-unknown-elf/4.8.5/:/home/jhuber/Documents/source/nestedvm/upstream/install/libexec/gcc/mips-unknown-elf/:/home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5/:/home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/:/home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5/../../../../mips-unknown-elf/bin/ LIBRARY_PATH=/home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5/:/home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5/../../../../mips-unknown-elf/lib/ COLLECT_GCC_OPTIONS='-O3' '-mmemcpy' '-ffunction-sections' '-fdata-sections' '-falign-functions=512' '-fno-rename-registers' '-fno-schedule-insns' '-fno-delayed-branch' '-march=mips1' '-specs=/home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec' '-I' '.' '-Wall' '-Wno-unused' '-o' 'build/refprop/Refprop.mips' '-march=mips1' '-specs=/home/jhuber/Documents/source/nestedvm/upstream/install/mips-unknown-elf/lib/crt0-override.spec' '-static' '-v' /home/jhuber/Documents/source/nestedvm/upstream/install/libexec/gcc/mips-unknown-elf/4.8.5/collect2 -EB -o build/refprop/Refprop.mips /home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5/crti.o /home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5/crtbegin.o /home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5/../../../../mips-unknown-elf/lib/crt0.o -L/home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5 -L/home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5/../../../../mips-unknown-elf/lib build/refprop/NVM.o (…) build/refprop/TRNS_VIS.o build/refprop/MAIN.o --gc-sections -Map=output1.map --cref -lc -Map=output.map --cref -lgfortran -lm -lgcc -lm -lgcc -lgcc /home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5/crtend.o /home/jhuber/Documents/source/nestedvm/upstream/install/lib/gcc/mips-unknown-elf/4.8.5/crtn.o

标签: gccmethodsgnugfortranannotate

解决方案


我做了一些本地测试,并按-ffunction-sections预期将每个 fortran 函数放在自己的部分。相比:

$ gfortran -c -O3 -o hello.o hello.f90
$ objdump -h hello.o 

hello.o:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         000000aa  0000000000000000  0000000000000000  00000040  2**4
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         00000000  0000000000000000  0000000000000000  000000ea  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  0000000000000000  0000000000000000  000000ea  2**0
                  ALLOC
  3 .rodata.str1.1 0000000a  0000000000000000  0000000000000000  000000ea  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .text.startup 00000026  0000000000000000  0000000000000000  00000100  2**4
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  5 .rodata       0000001c  0000000000000000  0000000000000000  00000130  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .comment      00000026  0000000000000000  0000000000000000  0000014c  2**0
                  CONTENTS, READONLY
  7 .note.GNU-stack 00000000  0000000000000000  0000000000000000  00000172  2**0
                  CONTENTS, READONLY
  8 .eh_frame     00000068  0000000000000000  0000000000000000  00000178  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

至:

$ gfortran -ffunction-sections -c -O3 -o hello.o hello.f90
$ objdump -h hello.o 

hello.o:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00000000  0000000000000000  0000000000000000  00000040  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  0000000000000000  0000000000000000  00000040  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  0000000000000000  0000000000000000  00000040  2**0
                  ALLOC
  3 .rodata.str1.1 0000000a  0000000000000000  0000000000000000  00000040  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .text.MAIN__  00000097  0000000000000000  0000000000000000  00000050  2**4
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  5 .text.foo_    0000000a  0000000000000000  0000000000000000  000000f0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  6 .text.startup.main 00000026  0000000000000000  0000000000000000  00000100  2**4
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  7 .rodata       0000001c  0000000000000000  0000000000000000  00000130  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 .comment      00000026  0000000000000000  0000000000000000  0000014c  2**0
                  CONTENTS, READONLY
  9 .note.GNU-stack 00000000  0000000000000000  0000000000000000  00000172  2**0
                  CONTENTS, READONLY
 10 .eh_frame     00000068  0000000000000000  0000000000000000  00000178  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

默认情况下,我本地机器上的内置链接器脚本会将所有这些都卷入其中.text。看起来你链接的任何东西都没有。您应该能够修改该脚本以执行您正在尝试的操作。这比属性扩展要困难一些,因为您必须在单独的文件中维护列表,但您应该能够找到您喜欢的任何内容。如果您在问题中提供更多有关此内容的背景信息,我可以在这里举一个例子。


推荐阅读