【问题标题】:arm-eabi-none undefined reference to memset error for LPC2148arm-eabi-none 未定义对 LPC2148 的 memset 错误的引用
【发布时间】:2018-06-17 07:13:21
【问题描述】:

每当我尝试使用任何数组参数时,都会收到memset() 错误。此外,即使在包含标准库之后,我也无法使用 sprintf() 语句,我应该在生成文件中包含哪些参数来链接或修复此 memset()sprintf() 引用错误。

memset()error full code with lpc214x linker file

我的目标板是 LPC2148(基于 arm7-TDMA) 这是Makefile

ARMGNU ?= arm-none-eabi

COPS = -Wall -nostdlib -nostartfiles -ffreestanding 

all : main.hex main.bin main.elf

clean :
    rm -f *.o
    rm -f *.bin
    rm -f *.hex
    rm -f *.elf

crt0.o : crt0.S
    $(ARMGNU)-gcc -c crt0.S

main.o : main.c
    $(ARMGNU)-gcc $(COPS) -c main.c -o main.o

main.elf : lpc2148.ld crt0.o main.o 
    $(ARMGNU)-ld crt0.o main.o -T lpc2148.ld -o main.elf

main.bin : main.elf
    $(ARMGNU)-objcopy main.elf -O binary main.bin

main.hex : main.elf
    $(ARMGNU)-objcopy main.elf -O ihex main.hex

【问题讨论】:

  • arm-none-eabi-gcc代替arm-none-eabi-ld

标签: gcc makefile arm linker-errors


【解决方案1】:

问题是您在链接操作期间使用arm-none-eabi-ld,它无法链接到目标处理器的标准libgcc

请修改Makefile 并使用arm-none-eabi-gcc 链接您的各种目标文件。

由于您使用的是自定义启动文件,您还需要将-nostartfiles 选项传递给链接器。

修改后的Makefile如下:

all : main.hex main.bin main.elf

clean :
    rm -f *.o
    rm -f *.bin
    rm -f *.hex
    rm -f *.elf

crt0.o : crt0.S
    $(ARMGNU)-gcc -c crt0.S

main.o : main.c
    $(ARMGNU)-gcc $(COPS) -c main.c -o main.o

main.elf : lpc2148.ld crt0.o main.o 
    $(ARMGNU)-gcc crt0.o main.o -T lpc2148.ld -o main.elf -nostartfiles

main.bin : main.elf
    $(ARMGNU)-objcopy main.elf -O binary main.bin

main.hex : main.elf
    $(ARMGNU)-objcopy main.elf -O ihex main.hex

【讨论】:

  • 得到这个错误 arm-none-eabi-gcc crt0.o main.o -T lpc2148.ld -o main.elf crt0.o: In function _mainCRTStartup': (.text+0x50): multiple definition of _start' /usr/lib/ gcc/arm-none-eabi/5.4.1/../../../arm-none-eabi/lib/crt0.o:/build/newlib-OTNHfJ/newlib-2.4.0.20160527/build/arm- none-eabi/libgloss/arm/../../../../libgloss/arm/crt0.S:180: 首先在这里定义 crt0.o: 在函数_mainCRTStartup': (.text+0x50): multiple definition of _mainCRTStartup' /usr/lib/gcc /arm-none-eabi/5.4.1/../../../arm-none-eabi/lib/crt0.o:/build/newlib-OTNHfJ/newlib-2.4.0.20160527/build/arm-none -eabi/libgloss/arm/
  • @SiddharthSidhu For main.elf: 在行尾添加-nostartfiles $(ARMGNU)-gcc crt0.o main.o -T lpc2148.ld -o main.elf
  • 对不起,它现在可以工作了,非常感谢,你能解释一下链接过程的流程吗
  • @SiddharthSidhu 它应该可以工作。我正在使用 Ubuntu,只有当我从 main.elf 的规则中删除 -nostartfiles 然后执行 make cleanmake 时才会收到此错误。如果我在目标main.elf 的规则中使用-nostartfiles 并执行make cleanmake 我看不到任何错误。
  • @SiddharthSidhu 你可以阅读整个编译过程here 和简短的here
猜你喜欢
  • 2023-02-06
  • 2021-12-03
  • 2013-10-25
  • 2017-03-24
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多