Использование FreeScale Code Warrior для связывания объектных файлов GCC с вызовами __eabi в главном
Я связываюсь с FreeScale Code Warrior 5.9 для MPC5554, который является чипом PPC с ядром e500mc. Я компилирую с GCC 4.6.4, скомпилированным для powerpc-none-eabi.
Я компилирую некоторый код C для моего проекта, включая файл с main
, используя кросс-компилятор GCC. Мне нужно связать с помощью Code Warrior, хотя. GCC добавляет вызов к функции с именем __eabi
в начале main, которая должна инициализировать пару регистров. Это не может быть удалено, и ненужно для того, что я делаю. GCC ожидает, что это будет предоставлено КРТ.
Вот мои флаги компиляции для 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. В __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
}
Тем не менее, когда я пытаюсь связать, я все равно получаю сообщение об ошибке __eabi
от main в main.o не определено. Кажется, компоновщик Code Warrior не может найти мою функцию. Я убедился, что __ppc_eabi_init.c стоит первым в порядке ссылок.
Как я могу получить это по ссылке? Есть ли способ удалить звонок __eabi
? Почему Code Warrior не может найти функцию, когда я ее предоставляю?
1 ответ
Оказалось, что у меня была правильная идея, но я случайно __eabi
определение функции внутри #ifdef
блок, который был исключен из сборки. Когда я переместил определение за пределы этого блока, он правильно связался.
Я также изменил предоставленные сценарии компоновщика, чтобы они правильно находили разделы.rodata.cst*, которые GCC использует для данных только для чтения. Я не уверен, что это было важно, но я получил предупреждение от компоновщика, поэтому я исправил его.
В MPC5554.lcf я поменял
.rodata (CONST) : {
*(.rdata)
*(.rodata)
}
читать
.rodata (CONST) : {
*(.rdata)
*(.rodata)
*(.rodata.cst*)
}