GCC链接器如何将一个对象文件的函数放到一个特殊的部分和内存区域?我正在为Xilinx MPSoC A53处理器构建一个独立的应用程序。使用Linaro 2.27的GNU ld。Xilinx软件是Xilinx 2017.4。我计划将大部分代码放入DDR中,并将一些关键的函数从一个文件放到片上内存中。我从Linker/sections.html中选中了“4.6.4.5.InputSection示例”。所以我创建了下面的链接器脚本。输出部分'.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发布于 2018-03-15 19:55:55
当匹配文件名时,链接器在某种程度上关心前面的./,所以要么编写
.text_ocm : {
*src/ocm_init.o(.text)
} > psu_ocm_ram_0_MEM_0在链接器脚本中,或者在链接器命令行中将对象文件引用为src/ocm_init.o。
(这并不是很直观的原因,为什么这个遗漏会导致多个定义,但是我可以重现您的问题,而更改可以修复它。)
https://stackoverflow.com/questions/49253291
复制相似问题