gpt4 book ai didi

c - 使用 FreeScale Code Warrior 将 GCC 目标文件与 main 中的 __eabi 调用链接起来

转载 作者:行者123 更新时间:2023-11-30 17:04:21 25 4
gpt4 key购买 nike

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

我正在使用 GCC 交叉编译器为我的项目编译一些 C 代码,包括 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 的调用。

我尝试简单地将 __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
}

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

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

最佳答案

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

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

在MPC5554.lcf中,我改变了

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

阅读

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

关于c - 使用 FreeScale Code Warrior 将 GCC 目标文件与 main 中的 __eabi 调用链接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35847470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com