0

我正在链接用于 MPC5554 的 FreeScale Code Warrior 5.9,它是具有 e500mc 内核的 PPC 芯片。我正在使用为 powerpc-none-eabi 编译的 GCC 4.6.4 进行编译。

我正在main使用 GCC 交叉编译器为我的项目编译一些 C 代码,包括带有 的文件。不过,我需要使用 Code Warrior 进行链接。__eabiGCC在 main 的开头添加了一个对函数的调用,该函数应该初始化几个寄存器。它不能被删除,并且对于我正在做的事情是不必要的。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.

我尝试简单地__eabi从 CodeWarrior 向 crt 添加一个函数。在 __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
}

但是,当我尝试链接时,我仍然收到__eabimain.o 中的 main 未定义的错误。Code Warrior 链接器似乎找不到我的函数。我验证了 __ppc_eabi_init.c 在链接顺序中排在第一位。

我怎样才能得到这个链接?有没有办法删除对 的调用__eabi?为什么Code Warrior在我提供的时候找不到这个功能?

4

1 回答 1

0

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

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

在 MPC5554.lcf 中,我改变了

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

读书

.rodata (CONST) : {
    *(.rdata)
    *(.rodata)
    *(.rodata.cst*)
}
于 2016-03-11T20:42:40.587 回答