Использование 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*)
}
Другие вопросы по тегам