неопределенная ссылка элемента сборки в файле c - PullRequest
0 голосов
/ 27 января 2012

У меня есть ошибки компоновщика (неопределенная ссылка), которые я не могу устранить самостоятельно.Я использую GCC Sourcery G ++ Lite 4.5.2 для ARM.

У меня много неопределенных ссылок, и почти все они ссылаются на файл сборки.Вот один пример:

У меня есть "_CPU_MmuConfigGet", определенный в файле сборки с именем cpu.sx:

.global _CPU_MmuConfigGet
CPU_MmuConfigGet: 
mrc p15,0,r0,c1,c0,0        
mov pc,lr

В файле ac с именем mmu.c, CPU_MmuConfigGet называется:

#include "cpu.h"
U32 MMU_ConfigGet(void) {
    return CPU_MmuConfigGet();
}

Наконец, в заголовочном файле cpu.h объявлен CPU_MmuConfigGet:

extern U32 CPU_MmuConfigGet(void);

Файлы дерева тезисов расположены в следующих папках:

Base/Common/src/mmu.c     
Base/Common/inc/cpu.h     
Base/Common/src/cpu.sx    

Из разных постовЯ красный в сети, я обнаружил, что я должен добавить подчеркивание к CPU_MmuConfigGet (пытался, но не решил мою проблему).На некоторых форумах я также отмечал, что при связывании важен порядок объектных файлов, но на других форумах порядок объектов не важен (я запутался здесь ...).Я попробовал параметр -S, чтобы увидеть версию сборки mmu.c, но это не помогло мне найти ключ к моей ошибке ...

Вот команда, используемая компилятором (я добавил -Hв случае, если это поможет найти, что не так ...):

arm-none-eabi-gcc -c -g3 -gdwarf-2  -H -o"mmu.o" -Wall -Wa,-adhlns="mmu.o.lst" 
-fmessage-length=0 -MMD -MP -MF"mmu.d" -MT"mmu.d" -fpic  -march=armv4t -mcpu=arm7tdmi -mlittle-endian 
-I"../../OS/ngos/hw/cdb89712" -I"../../OS/ngos" -I"../../OS/ngos/include" -I"../../OS/ngos/rtos/ucosii"  
-I"C:/Program Files/CodeSourcery/Sourcery G++ Lite/lib/gcc/arm-none-eabi/4.5.2/include" -I"./"  
-I"src/" -I"../../Common/inc" -I"../../OS/uCOS-II/SOURCE" -I"../../OS/ngos/drivers/arm" 
-I"../../OS/ngos/include/ngos" -I"../../OS/ngip/include" -I"../../OS/ngip/include/ngip" 
-I"../../Dvcscomponent/Inc" -I"../../Inc"  "../../Common/src/mmu.c"
. ../../Common/inc/base.h
. ../../Common/inc/hw7312.h
. ../../Common/inc/serial.h
.. ../../Common/inc/base.h
.. ../../Common/inc/hw7312.h
. ../../Common/inc/base.h
. ../../Common/inc/cpu.h
.. ../../Common/inc/base.h
.. ../../Common/inc/hw7312.h
. ../../Common/inc/mmu.h

Теперь команда сборки:

arm-none-eabi-gcc -g3 -gdwarf-2  -x assembler-with-cpp -Wa,-adhlns="cpu.o.lst" -Wall -c 
-fmessage-length=0 -MMD -MP -MF"cpu.d" -MT"cpu.d" -fpic -o"cpu.o" -march=armv4t  -mcpu=arm7tdmi -mlittle-endian 
-I"../../OS/ngos/hw/cdb89712" -I"../../Common" -I"../../OS/ngos/drivers/arm" 
"../../Common/src/cpu.sx"

Наконец команда связывания с ошибкой:

arm-none-eabi-gcc -fpic -mcpu=arm7tdmi -T".\linker.ld" -Wl,-Map,BootLoad.map -g3 -gdwarf-2  -o "BootLoad.elf"  
InitMain.o tsk_main.o ecp.o memalloc.o tsk_ecp.o firmdesc.o crc.o flash.o eth.o firmflash.o 
firmdest.o bcfg.o bootdownload.o cinit.o serial.o cpu.o mmu.o  ngucos.o cdbini.o cs712sio.o  
cs712eth.o  ../../OS/ngos/lib/rtstub/arm/gcc/libngosd4m32l.a ../../OS/ngip/lib/rtstub/arm/gcc/libngipd4m32l.a 
mmu.o: In function `MMU_ConfigGet':
C:\Working\SF2100-0074-BootLoaderMezz\Base\NexGen\BootLoader/../../Common/src/mmu.c:28: undefined reference to `CPU_MmuConfigGet'

У меня есть предложения, буду рад их услышать!

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 30 января 2012

Наконец, после просмотра списка cpu.sx, я был удивлен, что часть файла «пропала».Я понял, что файл включает в себя другой файл сборки.Этот включенный файл сборки был завершен ... директивой

.end

.

Я удалил эту директиву и проект скомпилирован.

0 голосов
/ 30 января 2012

Проблема заключается в том, что ваш источник в некоторых местах имеет подчеркивание, но не в других. Вам не нужно их с этим набором инструментов, хотя вы можете, если хотите, но это должно быть согласованным.

Еще лучше, может быть, вам следует вообще отказаться от маленьких ассемблерных файлов и использовать ассемблерные вставки в файлах C?

1007 * Е.Г. *

int CPU_MmuConfigGet ()
{
  int config;
  asm ("mrc p15,0,%0,c1,c0,0" : "=r" (config));
  return config;
}

Эта маленькая функция скрывает всю эту бессмыслицу компоновщика, очищает дерево вашего проекта и ваши make-файлы, и компилятор может даже свободно включать его в другие функции, если это возможно.

В руководстве по компилятору есть полная информация о том, как указать входы и выходы для сборочных вставок. Сначала они немного сбивают с толку, но я считаю, что в конечном итоге это того стоит.

Конечно, в некоторых местах файл ассемблера все еще необходим - например, crt0.s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...