【问题标题】:symbol '__aeabi_uidiv' not found for arm-none-eabi没有为 arm-none-eabi 找到符号“__aeabi_uidiv”
【发布时间】:2019-12-06 10:05:28
【问题描述】:

我知道这个问题已经被问过好几次了(例如here),但到目前为止,我找到的答复似乎都不适用于我的情况。

在 Debian stretch 上,gcc 版本 6.3.0,gcc-arm-none-eabi 版本 5.4.1,尝试为 STM32L072 构建。

这是我正在使用的 Makefile:

TARGET=main
TOOL_PATH=/usr/lib/gcc/arm-none-eabi/5.4.1
BLDDIR = ./src/
BINDIR = ./build

VECT_TBL   = $(BLDDIR)startup.s
AS_SRC     = $(BLDDIR)core.s
C_SRC      = $(BLDDIR)main.c

OBJS  = $(VECT_TBL:.s=.o)
OBJS += $(AS_SRC:.s=.o)
OBJS += $(C_SRC:.c=.o)

TOOL=arm-none-eabi-
CC=$(TOOL)gcc
CXX=$(TOOL)g++
LD=$(TOOL)ld
AS=$(TOOL)as
OC=$(TOOL)objcopy
OD=$(TOOL)objdump
OS=$(TOOL)size

ARCH = -mcpu=cortex-m0plus -mlittle-endian -march=armv6s-m -mthumb
COMMON_OPTS = -c -Wall
CC_OPTS  = -mlong-calls -ffunction-sections --specs=nosys.specs
DBG_OPTS = -O0 -g

CCFLAGS  = $(ARCH) $(COMMON_OPTS) $(CC_OPTS) $(DBG_OPTS) -DSTM32L072xx
ASFLAGS  = $(ARCH) $(COMMON_OPTS)
LDFLAGS  = -nostdlib
LDFLAGS += -L $(TOOL_PATH)/ -lgcc

.PHONY: all
all: $(BINDIR)/$(TARGET).bin

%.o: %.s
    $(AS) $(ASFLAGS) $< -o $@

%.o: %.c
    $(CC) $(CCFLAGS) $(INCLUDE) $< -o $@

$(BINDIR)/$(TARGET).elf: $(OBJS)
    $(LD) $(LDFLAGS) -T $(BLDDIR)/link.ld $^ -o $@

$(BINDIR)/$(TARGET).bin: $(BINDIR)/$(TARGET).elf
    $(OC) -S -O binary $< $@
    $(OS) $<

.PHONY: clean
clean:
    rm $(OBJS)
    rm $(BINDIR)/$(TARGET).elf

我已经仔细检查了 libgcc.a 是否存在于该路径中并包含带有 nm 的符号,并使用 make -d 进行了验证,但找不到为什么该符号仍未定义的线索。

我注意到还有其他包含文件 libgcc.a 的文件夹可以匹配我正在使用的架构:

  • 拇指
  • armv6-m(与-march 中使用的名称不完全相同,但足够接近值得一试)

但到目前为止还没有运气。

知道如何解决这个问题,或者至少找到一些轨道吗?

【问题讨论】:

  • 你试过armv6-m而不是armv6s-m吗? armv6s-marmv6-m 之间的唯一区别是 SVC 指令,它现在是强制性的。所以生成的代码应该没有任何区别了。
  • 您的意思是,在Makefile 中的ARCH 变量上?刚读完你就试了一下,还是不行。
  • 在链接 .elf 时尝试将 $^ 参数移到 $(LDFLAGS) 之前。对象和库的顺序很重要,库应该在 objs 之后,所以导入的符号将被解析。
  • @Vlad:请将此作为答案,因为它解决了我的问题。非常感谢!

标签: gcc stm32


【解决方案1】:

链接 .elf 时,尝试在 $(LDFLAGS) 之前移动 $^ 参数。 对象和库的顺序很重要,库应该在 obj 之后。

原因在于链接器的工作方式。行为将取决于实际的链接器,并且对于“典型的 UNIX 链接器”文件将按顺序处理。将在具有该引用的文件后面的代码 (obj/lib) 中搜索对外部符号的引用。如果库是在需要它的目标文件之前指定的,那么以后将找不到库中的“未使用”函数。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2014-02-08
    • 2015-08-08
    相关资源
    最近更新 更多