我正在为通过串行连接的设备编写裸机应用程序。该设备上已经有一些基本代码(可能被视为操作系统),但我希望能够在我的计算机上交叉编译代码,通过串行发送机器代码,并使设备将机器代码加载到内存中并运行它。我对安全性没有任何真正的需求,因此基本代码和通过串行发送的机器代码都在管理模式下运行(这是一个 ARM 设备),并且可以访问完整的物理内存,无需分页。所有有问题的代码都是用 C 编写的(以及一些可以忽略的汇编代码)。
我唯一的问题是我希望新编译的机器代码能够调用基本代码中定义的子例程。例如,基本代码有一个写入显示器的
printf
函数,我希望能够从通过串行发送的代码调用该 printf
函数。我想我也许能够从基本代码中提取 printf
函数并放入可重用的库中,但是,该设备的内存有限,所以我不想静态链接它,而且我认为动态链接器太过分了。
我当前的想法是让通过串行发送的代码使用基本代码的符号进行编译。两者最终都在同一台机器上运行,因此应该不会有任何问题。当前的构建过程将我的 C 代码与 Clang 交叉编译为 ELF,然后使用
objcopy code.elf -O binary code.img
提取机器代码。唯一的问题是编译为通过串行发送的代码无法访问基本代码的符号。我以某种方式需要从 base.elf
中提取符号表并在链接 serial_code.o
时传递它。
我该怎么做?最好使用 LLVM 实用程序。