棋子 · 2020年02月24日

Linking with newlib for NE10 library

I am using arm-none-eabi-* (7 2018-q2-update) to link with newlib-nano to use the NE10 library in a bare metal envirolment.

It looks like i am unable to be successful in compiling the code with newlib nano as i get many undefined references. I have messed up the makefile (which may look shabby) code from what it used to be for which i have been trying to link withour success.

I do not know what am I missing. It looks like calls to : malloc memmove free should be included in newlib. I am also unable to link the math functions for which i try to include libm libgcc...

My link process just fails(fails when arm-none-eabi-ld is called!) a copy of the makefile is below

An extract of errors or output log while making :

arm-none-eabi-ld -T src/linker32.ld -Map output.map -o build/kernel7.elf -static build/gpio_test_c.o build/serial_c.o build/cstart_c.o build/NE10_sample_real_fft_c.o build/interrupts_c.o build/Ne10Test_c.o build/mailbox_c.o build/start32_s.o -L. -LC:/Users/Sheroy/Desktop/RpiBareMetal/Codes -lNE10

C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_abs.c.obj): In function `ne10_abs_float_c':
NE10_abs.c:(.text+0x14): undefined reference to `fabs'
C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_abs.c.obj): In function `ne10_abs_vec2f_c':
NE10_abs.c:(.text+0x44): undefined reference to `fabs'
NE10_abs.c:(.text+0x58): undefined reference to `fabs'
C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_abs.c.obj): In function `ne10_abs_vec3f_c':
NE10_abs.c:(.text+0x8a): undefined reference to `fabs'
NE10_abs.c:(.text+0x9e): undefined reference to `fabs'

NE10_fft.c:(.text+0x70): undefined reference to `cos'
NE10_fft.c:(.text+0x80): undefined reference to `sin'
C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_fft.c.obj): In function `ne10_fft_generate_twiddles_line_transposed_float32':
NE10_fft.c:(.text+0x128): undefined reference to `cos'
NE10_fft.c:(.text+0x138): undefined reference to `sin'
C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_fft.c.obj): In function `ne10_fft_generate_twiddles_line_int32':
NE10_fft.c:(.text+0x1e0): undefined reference to `cos'
NE10_fft.c:(.text+0x1f0): undefined reference to `floor'
NE10_fft.c:(.text+0x200): undefined reference to `sin'
NE10_fft.c:(.text+0x210): undefined reference to `floor'
C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_fft.c.obj): In function `ne10_factor.part.0':
NE10_fft.c:(.text+0x2a0): undefined reference to `__aeabi_idiv'
NE10_fft.c:(.text+0x31e): undefined reference to `__aeabi_idiv'
C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_fft.c.obj): In function `ne10_fft_generate_twiddles_int32':
NE10_fft.c:(.text+0x3a4): undefined reference to `__aeabi_idiv'
C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_fft.c.obj): In function `ne10_fft_generate_twiddles_impl_float32':
NE10_fft.c:(.text+0x454): undefined reference to `__aeabi_idiv'
C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_fft.c.obj): In function `ne10_fft_alloc_c2c_float32_neon':
NE10_fft.c:(.text+0x4b8): undefined reference to `malloc'
NE10_fft.c:(.text+0x542): undefined reference to `memmove'
NE10_fft.c:(.text+0x572): undefined reference to `free'
C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_fft.c.obj): In function `ne10_fft_alloc_c2c_int32_neon':
NE10_fft.c:(.text+0x5bc): undefined reference to `malloc'
NE10_fft.c:(.text+0x63a): undefined reference to `memmove'
NE10_fft.c:(.text+0x660): undefined reference to `free'
C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_fft.c.obj): In function `ne10_fft_destroy_c2c_float32':
NE10_fft.c:(.text+0x6b0): undefined reference to `free'
C:/Users/Sheroy/Desktop/RpiBareMetal/Codes\libNE10.a(NE10_fft.c.obj): In function `ne10_fft_destroy_c2c_int32':
NE10_fft.c:(.text+0x6b4): undefined reference to `free'

and a lot more undefined references...

The makefile is below:

ARMGNU ?= arm-none-eabi-

-IC:\Users\Sheroy\Desktop\RpiBareMetal\Codes\Ne10-master\Ne10-master\inc

INCPATH = -Iinclude \
-IC:/Users/Sheroy/Desktop/RpiBareMetal/Codes/Ne10-master/Ne10-master/inc

-LC:\Users\Sheroy\Desktop\RpiBareMetal\Codes\

SHLIB = -L. -LC:/Users/Sheroy/Desktop/RpiBareMetal/Codes -lNE10
libs = -lm -lc -lgcc -lnosys

Link for code size

GC=-Wl,--gc-sections

CPUOPS = -O2 -mfloat-abi=hard -mthumb -mcpu=cortex-a53 -mfpu=neon-vfpv4

--specs=nano.specs --specs=nosys.specs -nostdlib

COPS = --specs=nano.specs --specs=nosys.specs $(libs) \
$(CPUOPS) -Wall -nostartfiles -ffreestanding $(INCPATH) $(GC)

ASMOPS = $(INCPATH) $(CPUOPS) $(libs)

-u floor -u sin -u cos -u fabs -u malloc -u memcpy -u free -u __aeabi_idiv -u sqrt

LDOPS = -static $(OBJ_FILES) $(SHLIB)
BUILD_DIR = build
SRC_DIR = src

all :kernel7.img

clean:
del $(BUILD_DIR)*.o
del $(BUILD_DIR)*.d

del $(BUILD_DIR)*.elf

$(BUILD_DIR)/%_c.o: $(SRC_DIR)/%.c

mkdir -p $(@D)

$(ARMGNU)gcc $(COPS) -MD -H -c $< -o $@

$(BUILD_DIR)/%_s.o: $(SRC_DIR)/%.S
$(ARMGNU)gcc $(ASMOPS) -MD -c $< -o $@

C_FILES = $(wildcard src/*.c)
ASM_FILES = $(wildcard src/*.S)

OBJ_FILES = $(wildcard $(BUILD_DIR)/*.o)

OBJ_FILES = $(C_FILES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%_c.o)
OBJ_FILES += $(ASM_FILES:$(SRC_DIR)/%.S=$(BUILD_DIR)/%_s.o)

DEP_FILES = $(OBJ_FILES:%.o=%.d)
-include $(DEP_FILES)

include the previously built object files

OBJ_FILES += $(wildcard $(BUILD_DIR)/*.o)

kernel7.img: $(SRC_DIR)/linker32.ld $(OBJ_FILES)

$(ARMGNU)ld $(SHLIB) -Map output.map -o $(BUILD_DIR)/kernel7.elf $(OBJ_FILES) $(SHLIB)

$(ARMGNU)ld -T src/linker32.ld -Map output.map -o $(BUILD_DIR)/kernel7.elf $(LDOPS)

$(ARMGNU)objcopy $(BUILD_DIR)/kernel7.elf -O binary kernel7.img
$(ARMGNU)nm -n $(BUILD_DIR)/kernel7.elf > $(BUILD_DIR)/output.symbol
$(ARMGNU)objdump -D $(BUILD_DIR)/kernel7.elf > $(BUILD_DIR)/output.list
readelf.exe -x .rodata $(BUILD_DIR)/kernel7.elf > $(BUILD_DIR)/rodata.list

1 个回答 得票排序 · 时间排序
极术小姐姐 · 2020年02月24日

You probably want to let gcc handle your linking:

To achieve that you should repace

$(ARMGNU)ld -T src/linker32.ld -Map output.map -o $(BUILD_DIR)/kernel7.elf $(LDOPS)

With:

$(ARMGNU)gcc $(COPS) -T src/linker32.ld -o $(BUILD_DIR)/kernel7.elf $(LDOPS)

你的回答
关注数
1
收藏数
0
浏览数
3124
极术小姐姐
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息