Topic: Help with building the library for ARM Cortex-32
Hello, hope to find you well. I'm new to embedded development, so I'm sorry if what I'm asking is out of place. I'm trying to build wolfSSL targetting the Nordic NRF52840 microcontroller.
However, after I run make, at the final stage I get the following error:
------------------------------------------------------------------------------------------
# lib/libwolfssl.a
lib/libwolfssl.a
make[1]: lib/libwolfssl.a: Permission denied
make[1]: *** [Makefile.common:205: build_static] Error 127
------------------------------------------------------------------------------------------
This is my Makefile.common:
------------------------------------------------------------------------------------------
# Set to @ if you want to suppress command echo
CMD_ECHO =
# Important directories
BUILD_DIR = lib
WOLFSSL_DIR ?= ../../third-party/wolfssl-5.8.0-gplv3-fips-ready
# Toolchain location and prefix
# This depends on your OS
# On Arch:
TOOLCHAIN = /usr/bin/arm-none-eabi-gcc
UTILS_DIR = /usr/arm-none-eabi/bin/
# Tools selection
CC = $(TOOLCHAIN)
AS = $(UTILS_DIR)as
LD = $(UTILS_DIR)ld
AR = $(UTILS_DIR)ar
NM = $(UTILS_DIR)nm
OBJCOPY ?= $(UTILS_DIR)objcopy
OBJDUMP ?= $(UTILS_DIR)objdump
#SIZE ?= $(TOOLCHAIN)size
STRIP=$(UTILS_DIR)strip
RANLIB=$(UTILS_DIR)ranlib
# Includes
USER_SETTINGS_DIR ?= include
INC = -I$(USER_SETTINGS_DIR) \
-I$(WOLFSSL_DIR)
# Defines
DEF = -DWOLFSSL_USER_SETTINGS
# Architecture
ARCHFLAGS ?= -mcpu=cortex-m4 -mthumb -mabi=aapcs -DUSE_WOLF_ARM_STARTUP
# Compiler and linker flags
ASFLAGS ?= $(ARCHFLAGS)
CFLAGS_EXTRA ?= -Wno-cpp -DTIME_T_NOT_64BIT
CFLAGS ?= $(ARCHFLAGS) -std=gnu99 -Wall $(CFLAGS_EXTRA)
LDFLAGS ?= $(ARCHFLAGS)
FIPS?=1
# LD: Link with nosys
#LDFLAGS += --specs=nosys.specs
# LD: Link with nano or rdimon implementation for standard library
#LDFLAGS += --specs=nano.specs
#LDFLAGS += --specs=rdimon.specs
# LD: generate map
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(BIN).map
# LD: Entry point
LDFLAGS += -Wl,-ereset_handler
# Math lib (for DH)
LIBS = -lm
# Memory Map
SRC_LD = -T./linker.ld
# Optimization level and place functions / data into separate sections to allow dead code removal
CFLAGS += -Os -ffunction-sections -fdata-sections -fno-builtin
# Remove unused sections and link time optimizations
LDFLAGS += -Wl,--gc-sections -flto
# Debugging
#DBGFLAGS = -ggdb -g3
CFLAGS += $(DBGFLAGS)
LDFLAGS += $(DBGFLAGS)
# FILES
# Port and Test/Benchmark
#ifndef NO_EXAMPLES
#SRC_C += ./Source/wolf_main.c
SRC_C += ./src/armtarget.c
#SRC_C += $(WOLFSSL_DIR)/wolfcrypt/test/test.c
#SRC_C += $(WOLFSSL_DIR)/wolfcrypt/benchmark/benchmark.c
#endif
# WOLFSSL TLS FILES
SRC_C += $(WOLFSSL_DIR)/src/bio.c
SRC_C += $(WOLFSSL_DIR)/src/crl.c
SRC_C += $(WOLFSSL_DIR)/src/internal.c
SRC_C += $(WOLFSSL_DIR)/src/keys.c
SRC_C += $(WOLFSSL_DIR)/src/ocsp.c
SRC_C += $(WOLFSSL_DIR)/src/sniffer.c
SRC_C += $(WOLFSSL_DIR)/src/ssl.c
SRC_C += $(WOLFSSL_DIR)/src/tls.c
SRC_C += $(WOLFSSL_DIR)/src/tls13.c
SRC_C += $(WOLFSSL_DIR)/src/wolfio.c
# wolfCrypt Core (FIPS)
ifeq "$(FIPS)" "1"
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/wolfcrypt_first.c
endif
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/aes.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/cmac.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/des3.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/dh.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/ecc.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/hmac.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/kdf.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/random.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/rsa.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sha.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sha256.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sha512.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sha3.c
ifeq "$(FIPS)" "1"
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/fips.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/fips_test.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/wolfcrypt_last.c
endif
# wolfCrypt Additional
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/asm.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/asn.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/blake2s.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/chacha.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/chacha20_poly1305.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/coding.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/compress.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/cpuid.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/cryptocb.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/curve25519.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/curve448.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/ecc_fp.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/eccsi.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/ed25519.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/ed448.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/error.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/evp.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/fe_448.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/fe_low_mem.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/fe_operations.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/ge_448.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/ge_low_mem.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/ge_operations.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/hash.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/integer.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/logging.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/md5.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/memory.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/misc.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/pkcs12.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/pkcs7.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/poly1305.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/pwdbased.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/rc2.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sakke.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/signature.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/srp.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sp_arm32.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sp_arm64.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sp_armthumb.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sp_c32.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sp_c64.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sp_cortexm.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sp_dsp32.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sp_int.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/sp_x86_64.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/tfm.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/wc_dsp.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/wc_encrypt.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/wc_pkcs11.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/wc_port.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/wolfevent.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/wolfmath.c
ifeq "$(ASYNC)" "1"
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/async.c
endif
ifeq "$(SELFTEST)" "1"
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/selftest.c
endif
# wolfCrypt non-standard algorithms (disabled by default)
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/arc4.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/blake2b.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/camellia.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/dsa.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/md2.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/md4.c
SRC_C += $(WOLFSSL_DIR)/wolfcrypt/src/ripemd.c
FILENAMES_C = $(notdir $(SRC_C))
FILENAMES_C := $(filter-out evp.c, $(FILENAMES_C))
OBJS_C = $(addprefix $(BUILD_DIR)/, $(FILENAMES_C:.c=.o))
vpath %.c $(dir $(SRC_C))
build_hex: $(BUILD_DIR) $(BUILD_DIR)/$(BIN).hex
@echo ""
#$(CMD_ECHO) $(SIZE) $(BUILD_DIR)/$(BIN).elf
$(CMD_ECHO) $(BUILD_DIR)/$(BIN).elf
build_static: $(BUILD_DIR) $(BUILD_DIR)/$(BIN).a
@echo ""
#$(CMD_ECHO) $(SIZE) $(BUILD_DIR)/$(BIN).a
$(CMD_ECHO) $(BUILD_DIR)/$(BIN).a
$(BUILD_DIR):
$(CMD_ECHO) mkdir -p $(BUILD_DIR)
$(BUILD_DIR)/$(BIN).hex: $(BUILD_DIR)/$(BIN).elf
@echo "Generating HEX binary: $(notdir $@)"
$(CMD_ECHO) $(OBJCOPY) -O ihex $< $@
$(BUILD_DIR)/%.o: %.s
@echo "Compiling ASM file: $(notdir $<)"
$(CMD_ECHO) $(AS) $(ASFLAGS) $(DEF) $(INC) -c -o $@ $<
$(BUILD_DIR)/%.o: %.c
@echo "Compiling C file: $(notdir $<)"
$(CMD_ECHO) $(CC) $(CFLAGS) $(DEF) $(INC) -c -o $@ $<
$(BUILD_DIR)/$(BIN).elf: $(OBJS_ASM) $(OBJS_C)
@echo "Linking ELF binary: $(notdir $@)"
$(CMD_ECHO) $(LD) $(LDFLAGS) $(SRC_LD) -o $@ $^ $(LIBS)
@echo "Generating name list: $(BIN).sym"
$(CMD_ECHO) $(NM) -n $@ > $(BUILD_DIR)/$(BIN).sym
@echo "Showing final size:"
$(CMD_ECHO) ls -la $@
@echo "Generating disassembly: $(BIN).disasm"
$(CMD_ECHO) $(OBJDUMP) -S $@ > $(BUILD_DIR)/$(BIN).disasm
$(BUILD_DIR)/$(BIN).a: $(OBJS_ASM) $(OBJS_C)
@echo "Building static library: $(notdir $@)"
$(CMD_ECHO) $(AR) -r $@ $^
@echo "Generating name list: $(BIN).sym"
$(CMD_ECHO) $(NM) -n $@ > $(BUILD_DIR)/$(BIN).sym
@echo "Showing final size:"
$(CMD_ECHO) ls -la $@
@echo "Generating disassembly: $(BIN).disasm"
$(CMD_ECHO) $(OBJDUMP) -S $@ > $(BUILD_DIR)/$(BIN).disasm
clean:
rm -f $(BUILD_DIR)/*.elf $(BUILD_DIR)/*.hex $(BUILD_DIR)/*.map
rm -f $(BUILD_DIR)/*.o $(BUILD_DIR)/*.a $(BUILD_DIR)/*.sym $(BUILD_DIR)/*.disasm
------------------------------------------------------------------------------------------
Thanks in advance for any insight and again, sorry if this is out of place.