Self-built arm-none-eabi toolchain issues

Hi all I was wondering what magic patches people use to build the CORTEX_LM3Sxxxx_Eclipse demo for Luminary Micro’s LM3S8962 development/evaluation board.  I’ve successfully built it using a demo of the CodeSourcery toolchain on my laptop at work (running Windows XP), so I know the code works, just need to sort out my toolchain (to use the CS toolchain, one just needs to point Makefile at arm-stellaris-eabi-gcc and arm-stellaris-eabi-objcopy). The host computer is a Lemote Yeeloong (MIPS-like CPU architecture… not i386 compatible), and thus, unable to run the CodeSourcery toolchain.  I don’t mind using a Win32 system to do devel at work, but at home, I like the comfort of the Linux tools. If I try to build the aforementioned demo, it bombs out at the link stage:
arm-none-eabi-gcc -g -I . -I ../../../Source/include -I ../../../Source/portable/GCC/ARM_CM3 -I ../../Common/include -D GCC_ARMCM3_LM3S102 -D inline= -mthumb -mcpu=cortex-m3 -O0 -Tstandalone.ld -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -D sprintf=usprintf -D snprintf=usnprintf -D printf=uipprintf -I ../../Common/ethernet/uIP/uip-1.0/uip -I ./webserver -ffunction-sections -fdata-sections -I ../../Common/drivers/LuminaryMicro main.o timertest.o ./ParTest/ParTest.o rit128x96x4.o osram128x64x4.o formike128x128x16.o ../../Common/drivers/LuminaryMicro/ustdlib.o ../../Common/Minimal/BlockQ.o ../../Common/Minimal/blocktim.o ../../Common/Minimal/death.o ../../Common/Minimal/integer.o ../../Common/Minimal/PollQ.o ../../Common/Minimal/semtest.o ../../Common/Minimal/GenQTest.o ../../Common/Minimal/QPeek.o ../../Common/Minimal/recmutex.o ../../Common/Minimal/IntQueue.o ./IntQueueTimer.o ./webserver/uIP_Task.o ./webserver/emac.o ./webserver/httpd.o ./webserver/httpd-cgi.o ./webserver/httpd-fs.o ./webserver/http-strings.o ../../Common/ethernet/uIP/uip-1.0/uip/uip_arp.o ../../Common/ethernet/uIP/uip-1.0/uip/psock.o ../../Common/ethernet/uIP/uip-1.0/uip/timer.o ../../Common/ethernet/uIP/uip-1.0/uip/uip.o ../../../Source/list.o ../../../Source/queue.o ../../../Source/tasks.o ../../../Source/portable/GCC/ARM_CM3/port.o ../../../Source/portable/MemMang/heap_2.o startup.o ../../Common/drivers/LuminaryMicro/arm-none-eabi-gcc/libdriver.a ../../Common/drivers/LuminaryMicro/arm-none-eabi-gcc/libgr.a -nostartfiles -Xlinker -oRTOSDemo.axf -Xlinker -M -Xlinker -Map=rtosdemo.map -Xlinker -no-gc-sections
/usr/libexec/gcc/arm-none-eabi/ld: section .eh_frame loaded at  overlaps section .data loaded at
collect2: ld returned 1 exit status
make: ***  Error 1 I have no idea where to look for possible fixes to this issue, but it seems something is not right – and it’s my toolchain because I can build it elsewhere.  Anyone struck this and know a solution they can share?

Self-built arm-none-eabi toolchain issues

Sorry – I know nothing about building GCC.  I have previously come across a problem with eh_frame that was caused by a bug in the linker script, but I didn’t understand the solution so that does not help.  You might be better off asking on a GCC forum. Regards.

Self-built arm-none-eabi toolchain issues

No worries… will do.  If I find a solution I shall report back so that others here may benefit.

Self-built arm-none-eabi toolchain issues

Okay… after a bit of investigation, it seems this is a known bug in GCC that has been fixed in recent releases. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40521 is the bug report on GCC Bugzilla.
http://www.codesourcery.com/archives/arm-gnu/msg03167.html is my query to CodeSourcery regarding the issue, where the aforementioned bug was discussed. One way around it that avoids having to recompile everything is to run: find . -type f -name \*.o -exec arm-stellaris-eabi-strip -R .eh_frame {} ; in the top-level FreeRTOS directory.  This ditches the .eh_frame section that’s causing the issue.  A second approach is to build the binaries with the -fno-dwarf2-cfi-asm option.  The third approach I am investigating now – that is adjusting the build environment when compiling gcc.  I will have an updated Makefile if this works. Regards,
Stuart Longland

Self-built arm-none-eabi toolchain issues

Finally nailed this issue… if you recompile gcc and still strike this issue, chances are it’s the C library that’s hiding the last remnants of the .eh_frames.  You need to then recompile and reinstall newlib.  The following is the Makefile I use to generate a toolchain from CodeSourcery sources.  I’ve been using it successfully on a mipsel-unknown-linux-gnu host for a while now, and it builds many of the examples just fine, so I shall share it with everyone. Hopefully this site doesn’t mangle it too much! :-)
# CodeSourcery Toolchain version
CS_VER=2009q3-68
# Target for toolchain
TARGET=arm-stellaris-eabi
# Build host type -- this automatically detects the local host type
# use CROSS_COMPILE=foo- to set the build toolchain to use.
BUILD=$(shell $(CROSS_COMPILE)gcc -dumpmachine)
HOST=$(BUILD)
# Source tarball directory ... assumed to be same dir as Makefile
SRCDIR=$(PWD)
# Unpack directory
UNPACKDIR=$(PWD)/unpack
# Build working directory
WORKDIR=$(PWD)/build
# Toolchain prefix directory -- all components will be installed here
PREFIX=/usr/local
# Build Library Prefix -- libraries will be built here
BLPREFIX=$(PWD)/buildlibs
# Build Library Prefix -- libraries will be built here
BLPREFIX=$(PWD)/buildlibs
# Superuser access command... if needed
SUDO=
# Package naming to use (DO NOT brand your custom toolchain as "CodeSourcery")
PKGVERSION="Luminary Micro Stellaris Toolchain; Eze Corp Build"
BUGURL=http://a64/wiki/
# Package directory names
BINUTILS=binutils-stable
CLOOG=cloog-0.15
EXPAT=expat-mirror
GCC=gcc-4.4
GDB=gdb-stable
MPFR=mpfr-stable
NEWLIB=newlib-stable
PPL=ppl-0.10.2
##### Tasks begin here #####
.PHONY: all 
all: $(WORKDIR)/gdb/.install
%/.md:
    -mkdir $(@D)
    [ -f $@ ] || touch $@
$(UNPACKDIR)/$(MPFR)/.unpacked: $(SRCDIR)/mpfr-$(CS_VER).tar.bz2 $(UNPACKDIR)/.md
    tar -C $(UNPACKDIR) -xjvf $<
    [ -f $@ ] || touch $@
$(UNPACKDIR)/$(PPL)/.unpacked: $(SRCDIR)/ppl-$(CS_VER).tar.bz2 $(UNPACKDIR)/.md
    tar -C $(UNPACKDIR) -xjvf $<
    [ -f $@ ] || touch $@
$(UNPACKDIR)/$(CLOOG)/.unpacked: $(SRCDIR)/cloog-$(CS_VER).tar.bz2 $(UNPACKDIR)/.md
    tar -C $(UNPACKDIR) -xjvf $<
    [ -f $@ ] || touch $@
$(UNPACKDIR)/$(BINUTILS)/.unpacked: $(SRCDIR)/binutils-$(CS_VER).tar.bz2 $(UNPACKDIR)/.md
    tar -C $(UNPACKDIR) -xjvf $<
    [ -f $@ ] || touch $@
$(UNPACKDIR)/$(GCC)/.unpacked: $(SRCDIR)/gcc-$(CS_VER).tar.bz2 $(UNPACKDIR)/.md
    tar -C $(UNPACKDIR) -xjvf $<
    [ -f $@ ] || touch $@
$(UNPACKDIR)/$(NEWLIB)/.unpacked: $(SRCDIR)/newlib-$(CS_VER).tar.bz2 $(UNPACKDIR)/.md
    tar -C $(UNPACKDIR) -xjvf $<
    [ -f $@ ] || touch $@
$(UNPACKDIR)/$(EXPAT)/.unpacked: $(SRCDIR)/expat-$(CS_VER).tar.bz2 $(UNPACKDIR)/.md
    tar -C $(UNPACKDIR) -xjvf $<
    [ -f $@ ] || touch $@
$(UNPACKDIR)/$(GDB)/.unpacked: $(SRCDIR)/gdb-$(CS_VER).tar.bz2 $(UNPACKDIR)/.md
    tar -C $(UNPACKDIR) -xjvf $<
    [ -f $@ ] || touch $@
$(WORKDIR)/mpfr/.md: $(WORKDIR)/.md
$(WORKDIR)/mpfr.deps-installed:
    touch $@
$(WORKDIR)/mpfr/.config: $(UNPACKDIR)/$(MPFR) $(WORKDIR)/mpfr/.md $(BLPREFIX)/.md $(WORKDIR)/mpfr.deps-installed
    cd $(@D) ; 
        CC_FOR_BUILD=$(CROSS_COMPILE)gcc 
        CC=$(CROSS_COMPILE)gcc 
        AR=$(CROSS_COMPILE)ar 
        RANLIB=$(CROSS_COMPILE)ranlib 
        $(UNPACKDIR)/$(MPFR)/configure 
            --build=$(BUILD) 
            --target=$(TARGET) 
            --host=$(HOST) 
            --prefix=$(BLPREFIX) 
            --disable-shared
    touch $@
$(WORKDIR)/ppl/.md: $(WORKDIR)/.md
$(WORKDIR)/ppl.deps-installed:
    touch $@
$(WORKDIR)/ppl/.config: $(UNPACKDIR)/$(PPL)/.unpacked $(WORKDIR)/ppl/.md $(BLPREFIX)/.md $(WORKDIR)/ppl.deps-installed
    cd $(@D) ; 
        CC_FOR_BUILD=$(CROSS_COMPILE)gcc 
        CC=$(CROSS_COMPILE)gcc 
        AR=$(CROSS_COMPILE)ar 
        RANLIB=$(CROSS_COMPILE)ranlib 
        $(UNPACKDIR)/$(PPL)/configure 
            --build=$(BUILD) 
            --target=$(TARGET) 
            --host=$(HOST) 
            --prefix=$(BLPREFIX) 
            --disable-shared 
            --disable-nls
    touch $@
$(WORKDIR)/cloog/.md: $(WORKDIR)/.md
$(WORKDIR)/cloog.deps-installed:    $(WORKDIR)/ppl/.install
    touch $@
$(WORKDIR)/cloog/.config: $(UNPACKDIR)/$(CLOOG)/.unpacked $(WORKDIR)/cloog/.md $(BLPREFIX)/.md $(WORKDIR)/cloog.deps-installed
    cd $(@D) ; 
        CC_FOR_BUILD=$(CROSS_COMPILE)gcc 
        CC=$(CROSS_COMPILE)gcc 
        AR=$(CROSS_COMPILE)ar 
        RANLIB=$(CROSS_COMPILE)ranlib 
        $(UNPACKDIR)/$(CLOOG)/configure 
            --build=$(BUILD) 
            --target=$(TARGET) 
            --host=$(HOST) 
            --prefix=$(BLPREFIX) 
            --disable-shared 
            --disable-nls 
            --with-ppl=$(BLPREFIX)
    touch $@
$(WORKDIR)/binutils/.md: $(WORKDIR)/.md
$(WORKDIR)/binutils.deps-installed: $(WORKDIR)/mpfr/.install $(WORKDIR)/ppl/.install $(WORKDIR)/cloog/.install
    touch $@
$(WORKDIR)/binutils/.config: $(UNPACKDIR)/$(BINUTILS)/.unpacked $(WORKDIR)/binutils/.md $(WORKDIR)/binutils.deps-installed
    cd $(@D) ; 
    CC_FOR_BUILD=$(CROSS_COMPILE)gcc 
    CC=$(CROSS_COMPILE)gcc 
    AR=$(CROSS_COMPILE)ar 
    RANLIB=$(CROSS_COMPILE)ranlib 
        $(UNPACKDIR)/$(BINUTILS)/configure 
            --build=$(BUILD) 
            --target=$(TARGET) 
            --prefix=$(PREFIX) 
            --host=$(HOST) 
            --with-pkgversion=$(PKGVERSION) 
            --with-bugurl=$(BUGURL) 
            --with-mpfr=$(BLPREFIX) 
            --with-ppl=$(BLPREFIX) 
            --with-cloog=$(BLPREFIX) 
            --disable-nls
    touch $@
$(WORKDIR)/binutils/.install: $(WORKDIR)/binutils/.build
    sudo $(MAKE) -C $(@D) 
        installdirs 
        install-host 
        install-target
    touch $@
# task [055/174] /$(CROSS_COMPILE)/toolchain/gcc_first/configure
$(WORKDIR)/gcc-s1/.md: $(WORKDIR)/.md
$(WORKDIR)/gcc-s1.deps-installed: $(WORKDIR)/binutils/.install $(WORKDIR)/mpfr/.install $(WORKDIR)/ppl/.install $(WORKDIR)/cloog/.install
    touch $@
$(WORKDIR)/gcc-s1/.config: $(UNPACKDIR)/$(GCC)/.unpacked $(WORKDIR)/gcc-s1/.md $(WORKDIR)/gcc-s1.deps-installed
    cd $(@D) ; 
        CC_FOR_BUILD=$(CROSS_COMPILE)gcc 
        CC=$(CROSS_COMPILE)gcc 
        AR=$(CROSS_COMPILE)ar 
        RANLIB=$(CROSS_COMPILE)ranlib 
        AR_FOR_TARGET=arm-none-eabi-ar 
        NM_FOR_TARGET=arm-none-eabi-nm 
        OBJDUMP_FOR_TARET=arm-none-eabi-objdump 
        STRIP_FOR_TARGET=arm-none-eabi-strip 
        gcc_cv_as_cfi_directive=no 
            $(UNPACKDIR)/$(GCC)/configure 
                --build=$(BUILD) 
                --host=$(HOST) 
                --target=$(TARGET) 
                --disable-libmudflap 
                --disable-libstdcxx-pch 
                --enable-extra-sgxxlite-multilibs 
                --with-gnu-as 
                --with-gnu-ld 
                '--with-specs=%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' 
                --disable-lto 
                --with-newlib 
                --with-pkgversion=$(PKGVERSION) 
                --with-bugurl=$(BUGURL) 
                --disable-nls 
                --prefix=$(PREFIX) 
                --disable-shared 
                --disable-threads 
                --disable-libssp 
                --disable-libgomp 
                --without-headers 
                --with-newlib 
                --disable-decimal-float 
                --disable-libffi 
                --enable-languages=c 
                --with-mpfr=$(PREFIX) 
                --with-ppl=$(PREFIX) 
                '--with-host-libstdcxx=-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' 
                --with-cloog=$(PREFIX) 
                --disable-libgomp
    touch $@
$(WORKDIR)/gcc-s1/.build: $(WORKDIR)/gcc-s1/.config
    gcc_cv_as_cfi_directive=no 
        $(MAKE) -C $(WORKDIR)/gcc-s1 all-gcc
    touch $@
$(WORKDIR)/gcc-s1/.install: $(WORKDIR)/gcc-s1/.build
    sudo $(MAKE) -C $(@D)/gcc 
        install-common 
        install-cpp 
        install- 
        install-driver
    touch $@
# task [059/174] /$(CROSS_COMPILE)/toolchain/newlib/configure
$(WORKDIR)/newlib/.md: $(WORKDIR)/.md
$(WORKDIR)/newlib.deps-installed: $(WORKDIR)/gcc-s1/.install
    touch $@
$(WORKDIR)/newlib/.config: $(UNPACKDIR)/$(NEWLIB)/.unpacked $(WORKDIR)/newlib/.md $(WORKDIR)/newlib.deps-installed
    cd $(@D) ; 
        CC_FOR_BUILD=$(CROSS_COMPILE)gcc 
        CC=$(CROSS_COMPILE)gcc 
        AR=$(CROSS_COMPILE)ar 
        RANLIB=$(CROSS_COMPILE)ranlib 
        CFLAGS_FOR_TARGET='-g -O2 -fno-unroll-loops -fno-dwarf2-cfi-asm' 
            $(UNPACKDIR)/$(NEWLIB)/configure 
                --build=$(BUILD) 
                --target=$(TARGET) 
                --prefix=$(PREFIX) 
                --host=$(HOST) 
                --enable-newlib-io-long-long 
                --disable-newlib-supplied-syscalls 
                --disable-libgloss 
                --disable-newlib-supplied-syscalls 
                --disable-nls
    touch $@
# task [063/174] /$(CROSS_COMPILE)/toolchain/gcc_final/configure
$(WORKDIR)/gcc-s2/.md: $(WORKDIR)/.md
$(WORKDIR)/gcc-s2.deps-installed: $(WORKDIR)/newlib/.install
    touch $@
$(WORKDIR)/gcc-s2/.config: $(UNPACKDIR)/$(GCC)/.unpacked $(WORKDIR)/gcc-s2/.md $(WORKDIR)/gcc-s2.deps-installed
    cd $(@D) ; 
        CC_FOR_BUILD=$(CROSS_COMPILE)gcc 
        CC=$(CROSS_COMPILE)gcc 
        AR=$(CROSS_COMPILE)ar 
        RANLIB=$(CROSS_COMPILE)ranlib 
        AR_FOR_TARGET=arm-none-eabi-ar 
        NM_FOR_TARGET=arm-none-eabi-nm 
        OBJDUMP_FOR_TARET=arm-none-eabi-objdump 
        STRIP_FOR_TARGET=arm-none-eabi-strip 
        gcc_cv_as_cfi_directive=no 
            $(UNPACKDIR)/$(GCC)/configure 
                --build=$(BUILD) 
                --host=$(HOST) 
                --target=$(TARGET) 
                --enable-threads 
                --disable-libmudflap 
                --disable-libssp 
                --disable-libstdcxx-pch 
                --enable-extra-sgxxlite-multilibs 
                --with-gnu-as 
                --with-gnu-ld 
                '--with-specs=%{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}}}' 
                --enable-languages=c,c++ 
                --disable-shared 
                --disable-lto 
                --with-newlib 
                --with-pkgversion=$(PKGVERSION) 
                --with-bugurl=$(BUGURL) 
                --disable-nls 
                --prefix=$(PREFIX) 
                --with-headers=yes 
                --with-mpfr=$(PREFIX) 
                --with-ppl=$(PREFIX) 
                '--with-host-libstdcxx=-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' 
                --with-cloog=$(PREFIX) 
                --disable-libgomp
    touch $@
$(WORKDIR)/gcc-s2/.build: $(WORKDIR)/gcc-s2/.config
    gcc_cv_as_cfi_directive=no 
        $(MAKE) -C $(WORKDIR)/gcc-s2 all-gcc
    touch $@
$(WORKDIR)/gcc-s2/.install: $(WORKDIR)/gcc-s2/.build
    sudo $(MAKE) -C $(@D)/gcc 
        install-common 
        install-cpp 
        install- 
        install-driver
    touch $@
# task [071/174] /$(CROSS_COMPILE)/toolchain/expat/0/configure
$(WORKDIR)/expat/.md: $(WORKDIR)/.md
$(WORKDIR)/expat.deps-installed: $(WORKDIR)/gcc-s2/.install
    touch $@
$(WORKDIR)/expat/.config: $(UNPACKDIR)/$(EXPAT)/.unpacked $(WORKDIR)/expat/.md $(WORKDIR)/expat.deps-installed
    cd $(@D) ; 
        CC_FOR_BUILD=$(CROSS_COMPILE)gcc 
        CC=$(CROSS_COMPILE)gcc 
        AR=$(CROSS_COMPILE)ar 
        RANLIB=$(CROSS_COMPILE)ranlib 
            $(UNPACKDIR)/$(EXPAT)/configure 
                --build=$(BUILD) 
                --target=$(TARGET) 
                --prefix=$(PREFIX) 
                --disable-shared 
                --host=$(HOST) 
                --disable-nls
    touch $@
# task [075/174] /$(CROSS_COMPILE)/toolchain/gdb/0/configure
$(WORKDIR)/gdb/.md: $(WORKDIR)/.md
$(WORKDIR)/gdb.deps-installed: $(WORKDIR)/expat/.install
    touch $@
$(WORKDIR)/gdb/.config: $(UNPACKDIR)/$(GDB)/.unpacked $(WORKDIR)/gdb/.md $(WORKDIR)/gdb.deps-installed
    cd $(@D) ; 
        CC_FOR_BUILD=$(CROSS_COMPILE)gcc 
        CC=$(CROSS_COMPILE)gcc 
        AR=$(CROSS_COMPILE)ar 
        RANLIB=$(CROSS_COMPILE)ranlib 
            $(UNPACKDIR)/$(GDB)/configure 
                --build=$(BUILD) 
                --target=$(TARGET) 
                --prefix=$(PREFIX) 
                --host=$(HOST) 
                --with-pkgversion=$(PKGVERSION) 
                --with-bugurl=$(BUGURL) 
                --disable-nls 
                --with-libexpat-prefix=$(PREFIX)
    touch $@
$(WORKDIR)/gdb/.install: $(WORKDIR)/gdb/.build
    sudo $(MAKE) -C $(@D) 
        install-host
$(WORKDIR)/%/.build: $(WORKDIR)/%/.config $(WORKDIR)/%.deps-installed
    $(MAKE) -C $(@D)
    touch $@
$(WORKDIR)/%/.install: $(WORKDIR)/%/.build
    CC_FOR_BUILD=$(CROSS_COMPILE)gcc 
    CC=$(CROSS_COMPILE)gcc 
    AR=$(CROSS_COMPILE)ar 
    RANLIB=$(CROSS_COMPILE)ranlib 
        $(SUDO) $(MAKE) -C $(@D) install
    touch $@