2011-12-15 163 views
0

我试图构建一个arm引导装载程序,它依靠newlib提供一些系统调用(如memcpy)。与newlib链接:未定义引用memcpy

当我运行:

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 

我得到如下:

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' 

现在,我攻击的memcpy,并希望其他人跟着。当我运行nm /usr/arm-elf/lib/thumb/libc.a(我相信它,是libc中的newlib版),它表明:

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

所以,这表明的memcpy在库中定义。

我在上面的ld命令上运行了strace以确保它实际上正在查看该文件,实际上它是。

我在这里错过了什么?为什么它抱怨未定义的memcpy?

回答

2

这看起来腥:

-lc -nostdlibs 

我觉得-nostdlibs被抵消-lc。尝试直接链接libc.a,看看会发生什么。

当你在这里,我看到你在一些内在的实现(如_udivsi3.o)链接。尝试链接libgcc.a,它应该有你需要的所有内在函数的定义。

+0

链接文件直接工作,虽然我仍不确定为什么`-lc`与`-L`结合不起作用,即使没有`-nostdlib`。有任何想法吗? – 2011-12-16 16:58:21

相关问题