2011-12-15 9 views
0

arm 부트 로더를 빌드하려고하는데, newlib에 의존하여 (memcpy와 같은) 일부 시스템 호출을 제공합니다.newlib와 연결 : memcpy에 대한 정의되지 않은 참조

나는 실행하면, 지금은

flashatmel.o flashjedec.o image.o time.o clock.o led.o register.o sdram.o    
main.o: In function `TtyPutConfiguration': 
/home/shawn/projects/netbridge-fx/loader/main.c:19: undefined reference to `memcpy' 
main.o: In function `main': 
/home/shawn/projects/netbridge-fx/loader/main.c:135: undefined reference to `__gnu_thumb1_case_uqi' 
/home/shawn/projects/netbridge-fx/loader/main.c:145: undefined reference to `__gnu_thumb1_case_uqi' 
/home/shawn/projects/netbridge-fx/loader/main.c:155: undefined reference to `__gnu_thumb1_case_uqi' 
/home/shawn/projects/netbridge-fx/loader/main.c:165: undefined reference to `__gnu_thumb1_case_uqi' 
gpio.o: In function `GpioTest': 
/home/shawn/projects/netbridge-fx/loader/gpio.c:139: undefined reference to `__gnu_thumb1_case_uqi' 

나는 방어 적이기를 공격하고, 다른 사람들이 따라 바라고 있어요 :

arm-elf-ld -static -L /usr/arm-elf/lib/thumb/ -lc -nostdlib -nostartfile -Map=loader.map --cref -T loader.lds --gc-sections -Ttext 0x000000 -n -o loader.elf start.o _udivsi3.o _umodsi3.o main.o util.o gpio.o spi.o flashatmel.o flashjedec.o image.o time.o clock.o led.o register.o sdram.o 

나는 다음과 같은 얻을. 그래서

lib_a-memcpy.o: 
00000010 N $d 
00000000 t $t 
00000001 T memcpy 

그 방어 적이기는 라이브러리에 정의되어 있음을 보여줍니다 : 나는 nm /usr/arm-elf/lib/thumb/libc.a를 실행하면 보여줍니다 (내가 생각하는, libc의의 newlib에 버전입니다).

위의 ld 명령에서 strace을 실행하여 파일을 실제로보고 있는지 확인했습니다. 실제로는 그렇습니다.

무엇이 여기에 있습니까? 왜 정의되지 않은 memcpy에 대해 불평합니까?

답변

2

이 비린내 같습니다

-lc -nostdlibs 

나는 -nostdlibs이 -lc을 취소 생각합니다. libc.a를 직접 연결하여 어떤 일이 일어나는지보십시오.

당신이있는 동안, 당신은 _udivsi3.o와 같은 몇 가지 본질적인 구현을 연결하고있는 것을 봅니다. libgcc.a와 연결해보십시오. 필요한 모든 내장 함수에 대한 정의가 있어야합니다.

+0

파일을 직접 연결했는데, 왜'-lc'와'-L'가 결합 된 것이'-nostdlib' 없이도 작동하지 않는지 아직 확실하지는 않습니다. 어떤 아이디어? –