如何将一个目标文件中的函数放入 GCC 链接器的一个特殊部分和内存区域?

How to put functions from one object file to one special section and memory region for GCC linker?

如何将一个目标文件中的函数放入GCC链接器的一个特殊部分和内存区域? 我正在为 Xilinx MPSoC A53 处理器构建一个独立的应用程序。使用来自 Linaro 2.27 的 GNU ld。 Xilinx软件为Xilinx SDK 2017.4。我计划将大部分代码放入 DDR,并将一个文件中的一些关键功能放入片上存储器。 我检查了'4.6.4.5。输入 Using_ld_the_GNU_Linker/sections.html 中的部分示例'。所以我创建了以下链接描述文件。输出部分 '.text_ocm' 是我添加的。

.text_ocm : {
    src/ocm_init.o(.text)
}  > psu_ocm_ram_0_MEM_0

.text : {
   KEEP (*(.vectors))
   *(.boot)
   *(.text)
   *(.text.*)
   *(.gnu.linkonce.t.*)
   *(.plt)
   *(.gnu_warning)
   *(.gcc_execpt_table)
   *(.glue_7)
   *(.glue_7t)
   *(.ARM.extab)
   *(.gnu.linkonce.armextab.*)
} > psu_ddr_0_MEM_0

但是我收到了错误消息。好像有两个'ocm_init'。但是文件 'src/ocm_init.c' 我的源代码中只有一个 'ocm_init' 的定义。

'Invoking: ARM v8 gcc linker'
aarch64-none-elf-gcc -Wl,-T -Wl,../src/lscript.ld -L../../a53a0_ddrsr_wfi_bsp/psu_cortexa53_0/lib -o "a53a0_ddrsr_wfi_step4_from_ddr.elf"  ./src/ocm_init.o ./src/gic_setup.o ./src/helloworld.o ./src/platform.o ./src/timer.o   -Wl,--start-group,-lxil,-lgcc,-lc,--end-group -Wl,--start-group,-lxil,-lmetal,-lgcc,-lc,--end-group -Wl,--start-group,-lxilpm,-lxil,-lgcc,-lc,--end-group
./src/ocm_init.o: In function `ocm_init':
C:\prj\mpsoc\v174\zcu102\a53a0_ddr\Debug/../src/ocm_init.c:1667: multiple definition of `ocm_init'
src/ocm_init.o:C:\prj\mpsoc\v174\zcu102\a53a0_ddr\Debug/../src/ocm_init.c:1667: first defined here

链接器在匹配文件名时在某些方面关心前导./,所以要么写

.text_ocm : {
    *src/ocm_init.o(.text)
}  > psu_ocm_ram_0_MEM_0

在您的链接器脚本中,或在您的链接器命令行中将目标文件引用为 src/ocm_init.o

(这个遗漏导致多个定义的原因不是很直观,但我可以重现你的问题,并且更改修复了它。)