我正在使用FreeScale Code Warrior 5.9连接MPC5554,这是一款带有e500mc核心的PPC芯片。我正在编译为powerpc-none-eabi编译的GCC 4.6.4。
我正在为我的项目编译一些C代码,包括使用GCC交叉编译器的main
文件。不过,我需要使用Code Warrior进行链接。 GCC在main的开头添加了一个名为__eabi
的函数的调用,它应该初始化几个寄存器。它无法删除,对我正在做的事情是不必要的。 GCC预计它将由crt。
这些是GCC的编译标志:
-O2 -std=c99 -w -mno-eabi -mregnames -mcpu=e500mc -misel=yes -mfloat-gprs=single -mno-string -msdata=none
GCC PowerPC的文档说有一个-no-eabi
参数,应该删除它,但是如果你深入研究它有一些错误报告指出文档是错误的并且标志不是实际上删除了对__eabi
的调用。
我尝试从CodeWarrior向crt添加__eabi
函数。在__ppc_eabi_init.c中我添加了函数:
asm extern void __eabi(void)
{
addis r13,r0,_SDA_BASE_@h
ori r13,r13,_SDA_BASE_@l
addis r2,r0,_SDA2_BASE_@h
ori r2,r2,_SDA2_BASE_@l
blr
}
但是,当我尝试链接时,仍然会收到main.o中main __eabi
未定义的错误。似乎Code Warrior链接器找不到我的功能。我确认__ppc_eabi_init.c是链接顺序中的第一个。
如何才能将其链接起来?有没有办法删除对__eabi
的通话?为什么Code Warrior在我提供时无法找到该功能?
答案 0 :(得分:0)
事实证明我有正确的想法,但是我不小心将__eabi
函数定义放在了从程序集中排除的#ifdef
块中。当我将定义移到此块之外时,它正确链接。
我还修改了提供的链接器脚本,以便它们能够正确定位GCC用于只读数据的.rodata.cst *部分。我不确定这很重要,但我收到链接器的警告,所以我修复了它。
在MPC5554.lcf中,我改变了
.rodata (CONST) : {
*(.rdata)
*(.rodata)
}
阅读
.rodata (CONST) : {
*(.rdata)
*(.rodata)
*(.rodata.cst*)
}