使用 FreeScale Code Warrior 到 link GCC 目标文件,在 main 中调用 __eabi

Using FreeScale Code Warrior to link GCC object files with __eabi calls in main

我正在 link 为 MPC5554 使用 FreeScale Code Warrior 5.9,它是一个具有 e500mc 内核的 PPC 芯片。我正在使用为 powerpc-none-eabi.

编译的 GCC 4.6.4 进行编译

我正在使用 GCC 交叉编译器为我的项目编译一些 C 代码,包括带有 main 的文件。不过,我需要 link 使用 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
}

但是,当我尝试 link 时,我仍然收到 main.o 中 main 中的 __eabi 未定义的错误。 Code Warrior linker 似乎找不到我的函数。我确认 __ppc_eabi_init.c 在 link 顺序中排在第一位。

我怎样才能把它送到 link?有没有办法删除对 __eabi 的调用?为什么我提供的函数Code Warrior 找不到?

事实证明我的想法是正确的,但我不小心将 __eabi 函数定义放在了一个 #ifdef 块中,该块被排除在汇编之外。当我将定义移到此块之外时,它正确链接。

我还修改了提供的链接描述文件,以便它们可以正确定位 GCC 用于只读数据的 .rodata.cst* 部分。我不确定这是否重要,但我收到了来自链接器的警告,所以我修复了它。

在MPC5554.lcf,我改了

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

阅读

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