使用FreeScale Code Warrior链接GCC目标文件和main中的__eabi调用

时间:2016-03-07 15:24:12

标签: c linker powerpc codewarrior eabi

我正在使用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在我提供时无法找到该功能?

1 个答案:

答案 0 :(得分:0)

事实证明我有正确的想法,但是我不小心将__eabi函数定义放在了从程序集中排除的#ifdef块中。当我将定义移到此块之外时,它正确链接。

我还修改了提供的链接器脚本,以便它们能够正确定位GCC用于只读数据的.rodata.cst *部分。我不确定这很重要,但我收到链接器的警告,所以我修复了它。

在MPC5554.lcf中,我改变了

.rodata (CONST) : {
    *(.rdata)
    *(.rodata)
}

阅读

.rodata (CONST) : {
    *(.rdata)
    *(.rodata)
    *(.rodata.cst*)
}