我正在尝试构建一个arm引导加载程序,它依赖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'
现在,我正在攻击记忆体,并希望其他记忆体跟随。当我运行nm /usr/arm-elf/lib/thumb/libc.a
(我相信它是libc的新lib版本)时,它显示:
lib_a-memcpy.o:
00000010 N $d
00000000 t $t
00000001 T memcpy
这表明memcpy是在标准库中定义的
我在上面的ld
命令上运行strace
以确保它实际上正在查看该文件,并且确实如此。
我在这里错过了什么?为什么它会抱怨一个未定义的内存?
这看起来很可疑:
-lc -nostdlibs
我认为- nosdlibs可以抵消-lc。尝试链接libc。直接A,看看会发生什么
当你在它,我看到你链接在一些内在的实现(如_udivsi3.o)。尝试使用libgcc链接。首先,它应该有你需要的所有内在属性的定义。