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.

Share

Re: Help with building the library for ARM Cortex-32

Hello matemagico13,

Thank you for your interest in wolfSSL.  May I ask if you're working on a personal or commercial project?  Are you able to tell us more about your project?  If this information is sensitive, please contact us at support [AT] wolfssl [DOT] com.

Error 127 means command not found, this can mean that your toolchain is unable to find the executable or that it is not marked as executable.  It looks like in this case it is trying to execute the static library directly, which is not valid.
I do see that you've commented out $(SIZE) in the build_static rule, can you elaborate on why you've done this?  Does it work if you uncomment this?

Thanks,
Kareem

Share

Re: Help with building the library for ARM Cortex-32

Sorry for the late response, Kareem. Thank you. Its a non-commercial, research-oriented project. My intention is to experiment with wolfSSL TLS1.3. I'm also interested in using wolfMQTT.

" It looks like in this case it is trying to execute the static library directly, which is not valid." -- Yes! This was the case.

"I do see that you've commented out $(SIZE) in the build_static rule, can you elaborate on why you've done this?" -- I commented out the size because my arm-none-eabi/bin/ does not have it, as shown in the attached image, but failed to realize it would cause a problem. The issue was solved by installing arm-none-eabi-binutils (which includes arm-none-eabi-size), then setting its path and uncommenting the lines in Makefile.common. After this, my output was:

---------------------------------------------------------------------------------------------------------------------
# /usr/bin/arm-none-eabi-size lib/libwolfssl.a
/usr/bin/arm-none-eabi-size lib/libwolfssl.a
   text    data     bss     dec     hex filename
    715       0       0     715     2cb armtarget.o (ex lib/libwolfssl.a)
      0       0       0       0       0 bio.o (ex lib/libwolfssl.a)
      0       0       0       0       0 crl.o (ex lib/libwolfssl.a)
  41626       0       0   41626    a29a internal.o (ex lib/libwolfssl.a)
   1648       0       0    1648     670 keys.o (ex lib/libwolfssl.a)
      0       0       0       0       0 ocsp.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sniffer.o (ex lib/libwolfssl.a)
  11918       0     120   12038    2f06 ssl.o (ex lib/libwolfssl.a)
   5818       0       0    5818    16ba tls.o (ex lib/libwolfssl.a)
      0       0       0       0       0 tls13.o (ex lib/libwolfssl.a)
     96       0       0      96      60 wolfio.o (ex lib/libwolfssl.a)
      0       0       0       0       0 wolfcrypt_first.o (ex lib/libwolfssl.a)
  19406       0       0   19406    4bce aes.o (ex lib/libwolfssl.a)
      0       0       0       0       0 cmac.o (ex lib/libwolfssl.a)
      0       0       0       0       0 des3.o (ex lib/libwolfssl.a)
   3042       0       0    3042     be2 dh.o (ex lib/libwolfssl.a)
  15304       0       0   15304    3bc8 ecc.o (ex lib/libwolfssl.a)
    722       0       0     722     2d2 hmac.o (ex lib/libwolfssl.a)
    594       0       0     594     252 kdf.o (ex lib/libwolfssl.a)
   2712       0       0    2712     a98 random.o (ex lib/libwolfssl.a)
   5132       0       0    5132    140c rsa.o (ex lib/libwolfssl.a)
   4320       0       0    4320    10e0 sha.o (ex lib/libwolfssl.a)
   1770       0       0    1770     6ea sha256.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sha512.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sha3.o (ex lib/libwolfssl.a)
      0       0       0       0       0 fips.o (ex lib/libwolfssl.a)
      0       0       0       0       0 fips_test.o (ex lib/libwolfssl.a)
      0       0       0       0       0 wolfcrypt_last.o (ex lib/libwolfssl.a)
      0       0       0       0       0 asm.o (ex lib/libwolfssl.a)
  20739      32       4   20775    5127 asn.o (ex lib/libwolfssl.a)
      0       0       0       0       0 blake2s.o (ex lib/libwolfssl.a)
      0       0       0       0       0 chacha.o (ex lib/libwolfssl.a)
      0       0       0       0       0 chacha20_poly1305.o (ex lib/libwolfssl.a)
   1968       0       0    1968     7b0 coding.o (ex lib/libwolfssl.a)
      0       0       0       0       0 compress.o (ex lib/libwolfssl.a)
      0       0       0       0       0 cpuid.o (ex lib/libwolfssl.a)
      0       0       0       0       0 cryptocb.o (ex lib/libwolfssl.a)
      0       0       0       0       0 curve25519.o (ex lib/libwolfssl.a)
      0       0       0       0       0 curve448.o (ex lib/libwolfssl.a)
      0       0       0       0       0 ecc_fp.o (ex lib/libwolfssl.a)
      0       0       0       0       0 eccsi.o (ex lib/libwolfssl.a)
      0       0       0       0       0 ed25519.o (ex lib/libwolfssl.a)
      0       0       0       0       0 ed448.o (ex lib/libwolfssl.a)
  10977       0       0   10977    2ae1 error.o (ex lib/libwolfssl.a)
      0       0       0       0       0 fe_448.o (ex lib/libwolfssl.a)
      0       0       0       0       0 fe_low_mem.o (ex lib/libwolfssl.a)
      0       0       0       0       0 fe_operations.o (ex lib/libwolfssl.a)
      0       0       0       0       0 ge_448.o (ex lib/libwolfssl.a)
      0       0       0       0       0 ge_low_mem.o (ex lib/libwolfssl.a)
      0       0       0       0       0 ge_operations.o (ex lib/libwolfssl.a)
    878       0       0     878     36e hash.o (ex lib/libwolfssl.a)
      0       0       0       0       0 integer.o (ex lib/libwolfssl.a)
     20       0       0      20      14 logging.o (ex lib/libwolfssl.a)
      0       0       0       0       0 md5.o (ex lib/libwolfssl.a)
      0       0       0       0       0 memory.o (ex lib/libwolfssl.a)
      0       0       0       0       0 misc.o (ex lib/libwolfssl.a)
      0       0       0       0       0 pkcs12.o (ex lib/libwolfssl.a)
      0       0       0       0       0 pkcs7.o (ex lib/libwolfssl.a)
      0       0       0       0       0 poly1305.o (ex lib/libwolfssl.a)
      0       0       0       0       0 pwdbased.o (ex lib/libwolfssl.a)
      0       0       0       0       0 rc2.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sakke.o (ex lib/libwolfssl.a)
   1006       0       0    1006     3ee signature.o (ex lib/libwolfssl.a)
      0       0       0       0       0 srp.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sp_arm32.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sp_arm64.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sp_armthumb.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sp_c32.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sp_c64.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sp_cortexm.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sp_dsp32.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sp_int.o (ex lib/libwolfssl.a)
      0       0       0       0       0 sp_x86_64.o (ex lib/libwolfssl.a)
  15487       0       0   15487    3c7f tfm.o (ex lib/libwolfssl.a)
      0       0       0       0       0 wc_dsp.o (ex lib/libwolfssl.a)
    216       0       0     216      d8 wc_encrypt.o (ex lib/libwolfssl.a)
      0       0       0       0       0 wc_pkcs11.o (ex lib/libwolfssl.a)
    806       0      40     846     34e wc_port.o (ex lib/libwolfssl.a)
      0       0       0       0       0 wolfevent.o (ex lib/libwolfssl.a)
    424       0       0     424     1a8 wolfmath.o (ex lib/libwolfssl.a)
      0       0       0       0       0 arc4.o (ex lib/libwolfssl.a)
      0       0       0       0       0 blake2b.o (ex lib/libwolfssl.a)
      0       0       0       0       0 camellia.o (ex lib/libwolfssl.a)
      0       0       0       0       0 dsa.o (ex lib/libwolfssl.a)
      0       0       0       0       0 md2.o (ex lib/libwolfssl.a)
      0       0       0       0       0 md4.o (ex lib/libwolfssl.a)
      0       0       0       0       0 ripemd.o (ex lib/libwolfssl.a)
make[1]: Leaving directory '/home/user/Documents/project/lib/wolfssl-arm'
---------------------------------------------------------------------------------------------------------------------

Again, thank you so much for your response, and I'm sorry for the trouble.

Share