Discuss here different C compiler set ups, and compiling executables for the ESP8266

User avatar
By Patriko
#23064 Hi!

After updating SDK from 1.0 to 1.2 I got the error when compiling the app, that it doesn't fit into the memory.
Before (SDK 1.0) it fits well into 4M (512kB), now (even when I removed icons, js, css, html, etc. - so it should be very small) it doesn't fit into the flash (even 32M / 4096kB).


Code: Select allc:/Espressif/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc  -L../lib -nostdlib -T../ld/eagle.app.v6.ld -Wl,--no-check-sections -u call_user_start -Wl,-static -Wl,--start-group -lc -lgcc -lhal -lphy -lpp -lnet80211 -lwpa -llwip -lmain -ljson -lssl user/.output/eagle/debug/lib/libuser.a http/.output/eagle/debug/lib/http.a dns/.output/eagle/debug/lib/dns.a driver/.output/eagle/debug/lib/libdriver.a json/.output/eagle/debug/lib/libjson.a platform/.output/eagle/debug/lib/libplatform.a libc/.output/eagle/debug/lib/liblibc.a util/.output/eagle/debug/lib/util.a spiffs/.output/eagle/debug/lib/spiffs.a -Wl,--end-group -o .output/eagle/debug/image/eagle.app.v6.out
c:/espressif/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/5.1.0/../../../../xtensa-lx106-elf/bin/ld.exe: .output/eagle/debug/image/eagle.app.v6.out section `.text' will not fit in region `iram1_0_seg'
c:/espressif/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/5.1.0/../../../../xtensa-lx106-elf/bin/ld.exe: .output/eagle/debug/image/eagle.app.v6.out section `.irom0.text' will not fit in region `irom0_0_seg'
collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: *** [.output/eagle/debug/image/eagle.app.v6.out] Error 1
../Makefile:206: recipe for target '.output/eagle/debug/image/eagle.app.v6.out' failed
mingw32-make[1]: Leaving directory 'C:/Espressif/examples/wSwitchBox/app'
C:/Espressif/examples/wSwitchBox/Makefile:151: recipe for target '.subdirs' failed
mingw32-make.exe: *** [.subdirs] Error 2


Is it a problem with a linker files or makefile? How could I solve it?

makefile inside the app directory:

Code: Select all#############################################################
# Required variables for each makefile
# Discard this section from all parent makefiles
# Expected variables (with automatic defaults):
#   CSRCS (all "C" files in the dir)
#   SUBDIRS (all subdirs with a Makefile)
#   GEN_LIBS - list of libs to be generated ()
#   GEN_IMAGES - list of object file images to be generated ()
#   GEN_BINS - list of binaries to be generated ()
#   COMPONENTS_xxx - a list of libs/objs in the form
#     subdir/lib to be extracted and rolled up into
#     a generated lib/image xxx.a ()
#
TARGET = eagle
#FLAVOR = release
FLAVOR = debug
#EXTRA_CCFLAGS += -u

ifndef PDIR # {
GEN_IMAGES= eagle.app.v6.out
GEN_BINS= eagle.app.v6.bin
SPECIAL_MKTARGETS=$(APP_MKTARGETS)
SUBDIRS=    \
    user \
    http \
    dns \
    driver \
    json \
    platform \
    libc \
    util \
    spiffs

endif # } PDIR

APPDIR = .
LDDIR = ../ld

CCFLAGS += -Os

TARGET_LDFLAGS =      \
   -nostdlib      \
   -Wl,-EL \
   --longcalls \
   --text-section-literals

ifeq ($(FLAVOR),debug)
    TARGET_LDFLAGS += -g -O2
endif

ifeq ($(FLAVOR),release)
    TARGET_LDFLAGS += -g -O0
endif

LD_FILE = $(LDDIR)/eagle.app.v6.new.2048.ld



COMPONENTS_eagle.app.v6 = \
    user/libuser.a \
    http/http.a \
    dns/dns.a \
    driver/libdriver.a \
    json/libjson.a \
    platform/libplatform.a \
    libc/liblibc.a \
    util/util.a \
    spiffs/spiffs.a


LINKFLAGS_eagle.app.v6 = \
   -L../lib        \
   -nostdlib   \
    -T$(LD_FILE)   \
   -Wl,--no-check-sections   \
    -u call_user_start   \
   -Wl,-static   \
   -Wl,--start-group   \
   -lc   \
   -lgcc   \
   -lhal   \
   -lphy   \
   -lpp   \
   -lnet80211   \
   -lwpa   \
   -llwip \
   -lmain   \
   -ljson   \
   -lsmartconfig   \
   -lssl   \
   $(DEP_LIBS_eagle.app.v6)   \
   -Wl,--end-group

DEPENDS_eagle.app.v6 = \
                $(LD_FILE) \
                $(LDDIR)/eagle.rom.addr.v6.ld

#############################################################
# Configuration i.e. compile options etc.
# Target specific stuff (defines etc.) goes in here!
# Generally values applying to a tree are captured in the
#   makefile at its root level - these are then overridden
#   for a subtree within the makefile rooted therein
#

#UNIVERSAL_TARGET_DEFINES =      \

# Other potential configuration flags include:
#   -DTXRX_TXBUF_DEBUG
#   -DTXRX_RXBUF_DEBUG
#   -DWLAN_CONFIG_CCX
CONFIGURATION_DEFINES =   -D__ets__ \
         -DICACHE_FLASH   \
         -DLWIP_OPEN_SRC   \
         -DPBUF_RSV_FOR_WLAN   \
         -DEBUF_LWIP

DEFINES +=            \
   $(UNIVERSAL_TARGET_DEFINES)   \
   $(CONFIGURATION_DEFINES)

DDEFINES +=            \
   $(UNIVERSAL_TARGET_DEFINES)   \
   $(CONFIGURATION_DEFINES)


#############################################################
# Recursion Magic - Don't touch this!!
#
# Each subtree potentially has an include directory
#   corresponding to the common APIs applicable to modules
#   rooted at that subtree. Accordingly, the INCLUDE PATH
#   of a module can only contain the include directories up
#   its parent path, and not its siblings
#
# Required for each makefile to inherit from the parent
#

INCLUDES := $(INCLUDES) -I $(PDIR)include
INCLUDES += -I ./
PDIR := ../$(PDIR)
sinclude $(PDIR)Makefile


.PHONY: FORCE
FORCE:



and the main makefile, in top directory:

Code: Select all#  copyright (c) 2010 Espressif System
#
ifndef PDIR

endif

# Base directory for the compiler
XTENSA_TOOLS_ROOT ?= c:/Espressif/xtensa-lx106-elf/bin
SDK_TOOLS   ?= c:/Espressif/utils
ESPTOOL      ?= $(SDK_TOOLS)/esptool.exe

WEB_DIR      ?=web

# WIN32
# We are under windows.
   ifeq ($(XTENSA_CORE),lx106)
      # It is xcc
      AR = xt-ar
      CC = xt-xcc
      NM = xt-nm
      CPP = xt-cpp 
      OBJCOPY = xt-objcopy
      #MAKE = xt-make
      CCFLAGS += -Os --rename-section .text=.irom0.text --rename-section .literal=.irom0.literal  -std=gnu90
   else
      # It is gcc, may be cygwin
      # Can we use -fdata-sections?
      CCFLAGS += -Os -ffunction-sections -fno-jump-tables  -std=gnu90
      AR = $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-ar
      CC = $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-gcc
      NM = $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-nm
      CPP = $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-cpp
      OBJCOPY = $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-objcopy
   endif
   FIRMWAREDIR = ../bin/
   ifndef COMPORT
      ESPPORT = COM5
   else
      ESPPORT = $(COMPORT)
   endif
    ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
# ->AMD64
    endif
    ifeq ($(PROCESSOR_ARCHITECTURE),x86)
# ->IA32
    endif

#############################################################
MKFSTOOL ?= tools/mkfs.py


CSRCS ?= $(wildcard *.c)
ASRCs ?= $(wildcard *.s)
ASRCS ?= $(wildcard *.S)
SUBDIRS ?= $(patsubst %/,%,$(dir $(wildcard */Makefile)))

ODIR := .output
OBJODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/obj

OBJS := $(CSRCS:%.c=$(OBJODIR)/%.o) \
        $(ASRCs:%.s=$(OBJODIR)/%.o) \
        $(ASRCS:%.S=$(OBJODIR)/%.o)

DEPS := $(CSRCS:%.c=$(OBJODIR)/%.d) \
        $(ASRCs:%.s=$(OBJODIR)/%.d) \
        $(ASRCS:%.S=$(OBJODIR)/%.d)

LIBODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/lib
OLIBS := $(GEN_LIBS:%=$(LIBODIR)/%)

IMAGEODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/image
OIMAGES := $(GEN_IMAGES:%=$(IMAGEODIR)/%)

BINODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/bin
OBINS := $(GEN_BINS:%=$(BINODIR)/%)

CCFLAGS +=          \
   -g         \
   -O2         \
   -Wpointer-arith      \
   -Wundef         \
   -Werror         \
   -Wl,-EL         \
   -fno-inline-functions   \
   -nostdlib       \
   -mlongcalls   \
   -mtext-section-literals
#   -Wall         

CFLAGS = $(CCFLAGS) $(DEFINES) $(EXTRA_CCFLAGS) $(INCLUDES)
DFLAGS = $(CCFLAGS) $(DDEFINES) $(EXTRA_CCFLAGS) $(INCLUDES)


#############################################################
# Functions
#

define ShortcutRule
$(1): .subdirs $(2)/$(1)
endef

define MakeLibrary
DEP_LIBS_$(1) = $$(foreach lib,$$(filter %.a,$$(COMPONENTS_$(1))),$$(dir $$(lib))$$(LIBODIR)/$$(notdir $$(lib)))
DEP_OBJS_$(1) = $$(foreach obj,$$(filter %.o,$$(COMPONENTS_$(1))),$$(dir $$(obj))$$(OBJODIR)/$$(notdir $$(obj)))
$$(LIBODIR)/$(1).a: $$(OBJS) $$(DEP_OBJS_$(1)) $$(DEP_LIBS_$(1)) $$(DEPENDS_$(1))
   @mkdir -p $$(LIBODIR)
   $$(if $$(filter %.a,$$?),mkdir -p $$(EXTRACT_DIR)_$(1))
   $$(if $$(filter %.a,$$?),cd $$(EXTRACT_DIR)_$(1); $$(foreach lib,$$(filter %.a,$$?),$$(AR) xo $$(UP_EXTRACT_DIR)/$$(lib);))
   $$(AR) ru $$@ $$(filter %.o,$$?) $$(if $$(filter %.a,$$?),$$(EXTRACT_DIR)_$(1)/*.o)
   $$(if $$(filter %.a,$$?),$$(RM) -r $$(EXTRACT_DIR)_$(1))
endef

define MakeImage
DEP_LIBS_$(1) = $$(foreach lib,$$(filter %.a,$$(COMPONENTS_$(1))),$$(dir $$(lib))$$(LIBODIR)/$$(notdir $$(lib)))
DEP_OBJS_$(1) = $$(foreach obj,$$(filter %.o,$$(COMPONENTS_$(1))),$$(dir $$(obj))$$(OBJODIR)/$$(notdir $$(obj)))
$$(IMAGEODIR)/$(1).out: $$(OBJS) $$(DEP_OBJS_$(1)) $$(DEP_LIBS_$(1)) $$(DEPENDS_$(1))
   @mkdir -p $$(IMAGEODIR)
   $$(CC) $$(LDFLAGS) $$(if $$(LINKFLAGS_$(1)),$$(LINKFLAGS_$(1)),$$(LINKFLAGS_DEFAULT) $$(OBJS) $$(DEP_OBJS_$(1)) $$(DEP_LIBS_$(1))) -o $$@
endef

$(BINODIR)/%.bin: $(IMAGEODIR)/%.out
   @mkdir -p $(BINODIR)
   $(ESPTOOL) elf2image $< -o $(FIRMWAREDIR)

#############################################################
# Rules base
# Should be done in top-level makefile only
#

all: .subdirs $(OBJS) $(OLIBS) $(OIMAGES) $(OBINS) $(SPECIAL_MKTARGETS)

clean:
   $(foreach d, $(SUBDIRS), $(MAKE) -C $(d) clean;)
   $(RM) -r $(ODIR)/$(TARGET)/$(FLAVOR)

clobber: $(SPECIAL_CLOBBER)
   $(foreach d, $(SUBDIRS), $(MAKE) -C $(d) clobber;)
   $(RM) -r $(ODIR)

flash:
ifndef PDIR
   $(MAKE) -C ./app flash
else
   $(ESPTOOL) --port $(ESPPORT) write_flash 0x00000 $(FIRMWAREDIR)0x00000.bin 0x10000 $(FIRMWAREDIR)0x10000.bin
endif

html:
   $(MKFSTOOL) -s app/http/html/ -d app/http/rofs_data.c

.subdirs:
   @set -e; $(foreach d, $(SUBDIRS), $(MAKE) -C $(d);)

#.subdirs:
#   $(foreach d, $(SUBDIRS), $(MAKE) -C $(d))

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(MAKECMDGOALS),clobber)
ifdef DEPS
sinclude $(DEPS)
endif
endif
endif

$(OBJODIR)/%.o: %.c
   @mkdir -p $(OBJODIR);
   $(CC) $(if $(findstring $<,$(DSRCS)),$(DFLAGS),$(CFLAGS)) $(COPTS_$(*F)) -o $@ -c $<

$(OBJODIR)/%.d: %.c
   @mkdir -p $(OBJODIR);
   @echo DEPEND: $(CC) -M $(CFLAGS) $<
   @set -e; rm -f $@; \
   $(CC) -M $(CFLAGS) $< > $@.$$$$; \
   sed 's,\($*\.o\)[ :]*,$(OBJODIR)/\1 $@ : ,g' < $@.$$$$ > $@; \
   rm -f $@.$$$$

$(OBJODIR)/%.o: %.s
   @mkdir -p $(OBJODIR);
   $(CC) $(CFLAGS) -o $@ -c $<

$(OBJODIR)/%.d: %.s
   @mkdir -p $(OBJODIR); \
   set -e; rm -f $@; \
   $(CC) -M $(CFLAGS) $< > $@.$$$$; \
   sed 's,\($*\.o\)[ :]*,$(OBJODIR)/\1 $@ : ,g' < $@.$$$$ > $@; \
   rm -f $@.$$$$

$(OBJODIR)/%.o: %.S
   @mkdir -p $(OBJODIR);
   $(CC) $(CFLAGS) -D__ASSEMBLER__ -o $@ -c $<

$(OBJODIR)/%.d: %.S
   @mkdir -p $(OBJODIR); \
   set -e; rm -f $@; \
   $(CC) -M $(CFLAGS) $< > $@.$$$$; \
   sed 's,\($*\.o\)[ :]*,$(OBJODIR)/\1 $@ : ,g' < $@.$$$$ > $@; \
   rm -f $@.$$$$

$(foreach lib,$(GEN_LIBS),$(eval $(call ShortcutRule,$(lib),$(LIBODIR))))

$(foreach image,$(GEN_IMAGES),$(eval $(call ShortcutRule,$(image),$(IMAGEODIR))))

$(foreach bin,$(GEN_BINS),$(eval $(call ShortcutRule,$(bin),$(BINODIR))))

$(foreach lib,$(GEN_LIBS),$(eval $(call MakeLibrary,$(basename $(lib)))))

$(foreach image,$(GEN_IMAGES),$(eval $(call MakeImage,$(basename $(image)))))

#############################################################
# Recursion Magic - Don't touch this!!
#
# Each subtree potentially has an include directory
#   corresponding to the common APIs applicable to modules
#   rooted at that subtree. Accordingly, the INCLUDE PATH
#   of a module can only contain the include directories up
#   its parent path, and not its siblings
#
# Required for each makefile to inherit from the parent
#

INCLUDES := $(INCLUDES) -I $(PDIR)include -I $(PDIR)include/$(TARGET)
PDIR := ../$(PDIR)
sinclude $(PDIR)Makefile

thanks!