Function 如何将函数从一个对象文件放到GCC链接器的一个特殊部分和内存区域?

Function 如何将函数从一个对象文件放到GCC链接器的一个特殊部分和内存区域?,function,gcc,linker,embedded,ld,Function,Gcc,Linker,Embedded,Ld,如何将函数从一个对象文件放到GCC链接器的一个特殊部分和内存区域? 我正在为Xilinx MPSoC A53处理器构建一个独立的应用程序。使用Linaro 2.27的GNU ld。Xilinx软件是Xilinx SDK 2017.4。我计划将大部分代码放入DDR,并将一些关键功能从一个文件放入芯片内存。 我查了4.6.4.5。输入来自的“示例”部分。因此,我创建了以下链接器脚本。输出部分“.text\u ocm”由我添加 .text_ocm : { src/ocm_init.o(.tex

如何将函数从一个对象文件放到GCC链接器的一个特殊部分和内存区域? 我正在为Xilinx MPSoC A53处理器构建一个独立的应用程序。使用Linaro 2.27的GNU ld。Xilinx软件是Xilinx SDK 2017.4。我计划将大部分代码放入DDR,并将一些关键功能从一个文件放入芯片内存。 我查了4.6.4.5。输入来自的“示例”部分。因此,我创建了以下链接器脚本。输出部分“.text\u 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


(这一遗漏导致多个定义的原因并不直观,但我可以重现您的问题,并通过更改解决问题。)

我假设,由于您显式地将src/ocm_init.o(.text)调用到一个特殊的节,因此您必须将同一文件从.text节*(.text)中排除,否则您会要求链接器包含它两次……我尝试了以下两种方法来排除ocm_init.o。但它们都不起作用。我也犯了同样的错误。text:{KEEP((EXCLUDE_-FILE(src/ocm_-init.o).vectors))*(EXCLUDE_-FILE(src/ocm_-init.o).text)*(EXCLUDE_-FILE(src/ocm_-init.o.text.)}>psu-ddr_-0_-MEM_-0.text:{KEEP((EXCLUDE_-FILE(*ocm_-init.o).vectors))*(EXCLUDE_-FILE(*ocm_-init.o).text)*(EXCLUDE_-FILE(*ocm-init.o).text.))>psu_ddr_0_MEM_0作为告诉链接器在一个节中包含整个对象文件的替代方法,您还应该能够定义一个节,然后转到该.c文件中的各个函数,将它们淹没在一些非标准的gcc goo语法中(我不记得了,很多u属性和u declspec毫无疑问)然后让链接器从那里获取它。