使用 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*)
}
我正在 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*)
}