【发布时间】:2018-03-13 10:05:21
【问题描述】:
如何将函数从一个目标文件放入 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
【问题讨论】:
-
我假设由于您明确地将 src/ocm_init.o(.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. i>) .........) } > 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 语法中(我不记得了,很多 __attribute 和 __declspec 毫无疑问)并让链接器从那里获取它。
标签: function gcc linker embedded ld