Gcc 在嵌入式目标上动态加载代码

Gcc 在嵌入式目标上动态加载代码,gcc,embedded,ld,Gcc,Embedded,Ld,我有一个在裸机目标上运行的应用程序,其结构如下 main.c service.c/.h 它使用标准的gcc-c,ld序列编译成ELF可执行文件(system.ELF)。我使用链接器生成一个映射文件,显示所有符号的地址 现在,在不重新刷新我的系统的情况下,我需要添加一个带有自定义运行时加载程序的额外功能。记住,这是一个没有操作系统的裸机 我想 编译extra.c,它使用service.h中定义的API(并以某种方式链接到现有的service.o/system.elf) 在运行时将生成的可执行

我有一个在裸机目标上运行的应用程序,其结构如下

  • main.c
  • service.c/.h
它使用标准的
gcc-c
ld
序列编译成ELF可执行文件(system.ELF)。我使用链接器生成一个映射文件,显示所有符号的地址

现在,在不重新刷新我的系统的情况下,我需要添加一个带有自定义运行时加载程序的额外功能。记住,这是一个没有操作系统的裸机

我想

  • 编译extra.c,它使用service.h中定义的API(并以某种方式链接到现有的service.o/system.elf)
  • 在运行时将生成的可执行文件复制到我的SDRAM并跳转到它
  • 加载的代码应该能够按照预期运行和访问service.c中导出的符号
我认为我可以重用映射文件来链接额外的.o和system.elf,但这不起作用:

ld -o extraExe extra.o system.map
gcc或ld是否有一些模式来完成这个延迟链接过程?如果没有,我如何实现上面概述的动态代码加载?

您可以在ld中使用“-R filename”或“-just symbols=filename”命令选项。它从文件名中读取符号名及其地址,但不重新定位或将其包含在输出中。这允许输出文件以符号方式引用system.elf程序中定义的内存的绝对位置。 (请参阅)

所以这里的文件名是“system.elf”。您可以使用GCC编译extra.c,通常包括services.h,但不需要链接并生成'extra.o',然后调用ld,如下所示:

ld -R"system.elf" -o"extra.out" extra.o
“extra.out”将链接您的符号。您可以使用objdump比较“extra.out”和“extra.o”的内容。 请注意,您始终可以将程序的开始地址传递给ld(例如-defsym\u TEXT\u start\u ADDR=0xAAAA0123)以及其他内存段(如bss、data)的开始地址。(即-Tbss,-Tdata)

请小心使用与“system.elf”不冲突的有效地址,因为ld不会为此生成错误。您可以在原始链接器脚本中为加载的代码+数据+bss定义新区域,并重新编译system.elf,然后在链接“extra.o”时将起始地址指向您定义的区域

gcc不是alinker。修复了标题,请删除-1,或者简单地给出富有成效的答案:)它仍然是链接器的前端,因此您可以使用gcc进行链接…@tarekeldeb到目前为止,您的问题还不清楚…
gcc service.o extra.c
有什么问题?