使用FreeScale Code Warrior将GCC对象文件链接到main中的_eabi调用

使用FreeScale Code Warrior将GCC对象文件链接到main中的_eabi调用,c,linker,powerpc,codewarrior,eabi,C,Linker,Powerpc,Codewarrior,Eabi,我正在链接用于MPC5554的飞思卡尔代码战士5.9,这是一款带有e500mc内核的PPC芯片。我使用为powerpc none-eabi编译的GCC4.6.4进行编译 我正在使用GCC交叉编译器为我的项目编译一些C代码,包括带有main的文件。不过,我需要使用CodeWarrior链接。GCC在main的开头添加了一个名为\uu eabi的函数调用,该函数用于初始化两个寄存器。它不能被移除,对于我正在做的事情来说是不必要的。GCC希望由crt提供 以下是我的GCC编译标志: -O2-std=c

我正在链接用于MPC5554的飞思卡尔代码战士5.9,这是一款带有e500mc内核的PPC芯片。我使用为powerpc none-eabi编译的GCC4.6.4进行编译

我正在使用GCC交叉编译器为我的项目编译一些C代码,包括带有
main
的文件。不过,我需要使用CodeWarrior链接。GCC在main的开头添加了一个名为
\uu 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
参数,它应该会删除这个参数,但是如果深入研究,就会有许多错误报告指出文档是错误的,并且该标志实际上不会删除对
\u eabi
的调用

我试着简单地从CodeWarrior向crt添加一个
\uu eabi
函数。在u_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的
\uu eabi
未定义。代码战士链接器似乎找不到我的函数。我验证了uu ppc_eabi_init.c是链接顺序中的第一个


我怎样才能把这个链接到link?有没有办法删除对
\uu eabi
的调用?为什么Code Warrior在我提供函数时找不到它?

结果表明我的想法是正确的,但我不小心将\uu eabi函数定义放在了一个\ifdef块中,该块被从程序集中排除。当我将定义移到这个块之外时,它链接正确

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

在MPC5554.lcf中,我更改了

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

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

codewarrior汇编语言具有指令
.global
,以使标签对其他文件可见。因此,我希望,至少第一行是:
asmglobalvoid\uu eabi(void)
@user3629249您可能会这么想,但在这个上下文中它需要
extern
关键字。