All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] Running linux with mmu disabled on arm (AT91).
@ 2012-05-01 15:24 ` Paul Chavent
  0 siblings, 0 replies; 5+ messages in thread
From: Paul Chavent @ 2012-05-01 15:24 UTC (permalink / raw)
  To: buildroot

Hi.

I'd like to try linux on an AT91SAM9G20 (i have a linuxstamp board), with MMU disabled (the Hyok-Sung Choi & Hee-Chul Yun paper demonstrate that it could be possible).

All the code seems to be present in the kernel...
So i would like to share my experience.

(1) I had to make two little changes in the kernel code :
     - I'm not able to change the REMAP_VECTOR_TO_DRAM. I have submitted the problem to the kbuild mailing list (http://www.spinics.net/lists/linux-kbuild/msg06153.html).
     - The soc_detect code that init the at91_soc_initdata structure is never called. Later this structure is used unitialized.
     I'm currently using the joined patch as a workaround. Someone can review it please ?

(2) I used to run the module with a "classic system" based on linux + eglibc, and i needed only one toolchain (arm-xxx-linux-gnueabi) for the kernel and the userspace apps.
     I found that for the nommu case i wasn't able to build the kernel with the userspace toolchain.
     So I had to build 2 toolchain, based on binutils 2.22, gcc 4.7, uclibc 0.9.33.1 and linux 3.2.14 :
       - an arm-xxx-eabi toolchain for the kernel
       - an arm-xxx-uclinux-uclibceabi for the userspace apps
     Do you confirm that it is not possible to compile the kernel with arm-xxx-uclinux-uclibceabi ? Or, may i have misconfigured the toolchain (i join the toolchain build procedure) ?

(3) The arm-xxx-uclinux-uclibceabi with elf2flt seems to produce running bins only if it is build with the uClibc DOPIC not set.
     Is it required to disable DOPIC ?
     Moreover, i can't run bins produced with a arm-xxx-linux-uclibceabi toolchain and -Wl,-elf2flt (not uclinux one). Is it the expected behavior ?

(4) The elf2flt needs to be updated to be aware of the exidx section, and some reloc types. I join the patch i currently use.

Given these observations, i've been able to run a linux with an hello world as the /init process.

My next tests will be to run threaded programs, c++ programs, then busybox.


Thanks for your attention.

Paul.

-------------- next part --------------
diff -abBruN linux-3.2.14.orig/arch/arm/Kconfig-nommu linux-3.2.14.mod/arch/arm/Kconfig-nommu
--- linux-3.2.14.orig/arch/arm/Kconfig-nommu	2012-04-02 18:53:31.000000000 +0200
+++ linux-3.2.14.mod/arch/arm/Kconfig-nommu	2012-04-15 12:52:05.000000000 +0200
@@ -34,8 +34,7 @@
 	  used instead of the auto-probing which utilizes the register.
 
 config REMAP_VECTORS_TO_RAM
-	bool 'Install vectors to the beginning of RAM' if DRAM_BASE
-	depends on DRAM_BASE
+	bool 'Install vectors to the beginning of RAM'
 	help
 	  The kernel needs to change the hardware exception vectors.
 	  In nommu mode, the hardware exception vectors are normally
diff -abBruN linux-3.2.14.orig/arch/arm/mm/nommu.c linux-3.2.14.mod/arch/arm/mm/nommu.c
--- linux-3.2.14.orig/arch/arm/mm/nommu.c	2012-04-02 18:53:31.000000000 +0200
+++ linux-3.2.14.mod/arch/arm/mm/nommu.c	2012-04-16 15:50:47.000000000 +0200
@@ -31,12 +31,23 @@
 {
 }
 
+static void __init devicemaps_init(struct machine_desc *mdesc)
+{
+	/*
+	 * Ask the machine support to map in the statically mapped devices.
+	 */
+	if (mdesc->map_io)
+		mdesc->map_io();
+}
+
 /*
  * paging_init() sets up the page tables, initialises the zone memory
  * maps, and sets up the zero page, bad page and bad page tables.
  */
 void __init paging_init(struct machine_desc *mdesc)
 {
+	devicemaps_init(mdesc);
+
 	bootmem_init();
 }
 
-------------- next part --------------

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Running linux with mmu disabled on arm (AT91).
@ 2012-05-01 15:24 ` Paul Chavent
  0 siblings, 0 replies; 5+ messages in thread
From: Paul Chavent @ 2012-05-01 15:24 UTC (permalink / raw)
  To: linux-arm-kernel

Hi.

I'd like to try linux on an AT91SAM9G20 (i have a linuxstamp board), with MMU disabled (the Hyok-Sung Choi & Hee-Chul Yun paper demonstrate that it could be possible).

All the code seems to be present in the kernel...
So i would like to share my experience.

(1) I had to make two little changes in the kernel code :
     - I'm not able to change the REMAP_VECTOR_TO_DRAM. I have submitted the problem to the kbuild mailing list (http://www.spinics.net/lists/linux-kbuild/msg06153.html).
     - The soc_detect code that init the at91_soc_initdata structure is never called. Later this structure is used unitialized.
     I'm currently using the joined patch as a workaround. Someone can review it please ?

(2) I used to run the module with a "classic system" based on linux + eglibc, and i needed only one toolchain (arm-xxx-linux-gnueabi) for the kernel and the userspace apps.
     I found that for the nommu case i wasn't able to build the kernel with the userspace toolchain.
     So I had to build 2 toolchain, based on binutils 2.22, gcc 4.7, uclibc 0.9.33.1 and linux 3.2.14 :
       - an arm-xxx-eabi toolchain for the kernel
       - an arm-xxx-uclinux-uclibceabi for the userspace apps
     Do you confirm that it is not possible to compile the kernel with arm-xxx-uclinux-uclibceabi ? Or, may i have misconfigured the toolchain (i join the toolchain build procedure) ?

(3) The arm-xxx-uclinux-uclibceabi with elf2flt seems to produce running bins only if it is build with the uClibc DOPIC not set.
     Is it required to disable DOPIC ?
     Moreover, i can't run bins produced with a arm-xxx-linux-uclibceabi toolchain and -Wl,-elf2flt (not uclinux one). Is it the expected behavior ?

(4) The elf2flt needs to be updated to be aware of the exidx section, and some reloc types. I join the patch i currently use.

Given these observations, i've been able to run a linux with an hello world as the /init process.

My next tests will be to run threaded programs, c++ programs, then busybox.


Thanks for your attention.

Paul.

-------------- next part --------------
diff -abBruN linux-3.2.14.orig/arch/arm/Kconfig-nommu linux-3.2.14.mod/arch/arm/Kconfig-nommu
--- linux-3.2.14.orig/arch/arm/Kconfig-nommu	2012-04-02 18:53:31.000000000 +0200
+++ linux-3.2.14.mod/arch/arm/Kconfig-nommu	2012-04-15 12:52:05.000000000 +0200
@@ -34,8 +34,7 @@
 	  used instead of the auto-probing which utilizes the register.
 
 config REMAP_VECTORS_TO_RAM
-	bool 'Install vectors to the beginning of RAM' if DRAM_BASE
-	depends on DRAM_BASE
+	bool 'Install vectors to the beginning of RAM'
 	help
 	  The kernel needs to change the hardware exception vectors.
 	  In nommu mode, the hardware exception vectors are normally
diff -abBruN linux-3.2.14.orig/arch/arm/mm/nommu.c linux-3.2.14.mod/arch/arm/mm/nommu.c
--- linux-3.2.14.orig/arch/arm/mm/nommu.c	2012-04-02 18:53:31.000000000 +0200
+++ linux-3.2.14.mod/arch/arm/mm/nommu.c	2012-04-16 15:50:47.000000000 +0200
@@ -31,12 +31,23 @@
 {
 }
 
+static void __init devicemaps_init(struct machine_desc *mdesc)
+{
+	/*
+	 * Ask the machine support to map in the statically mapped devices.
+	 */
+	if (mdesc->map_io)
+		mdesc->map_io();
+}
+
 /*
  * paging_init() sets up the page tables, initialises the zone memory
  * maps, and sets up the zero page, bad page and bad page tables.
  */
 void __init paging_init(struct machine_desc *mdesc)
 {
+	devicemaps_init(mdesc);
+
 	bootmem_init();
 }
 
-------------- next part --------------
>From bd2014eb59dea812e396a5f299f53ed03629bdad Mon Sep 17 00:00:00 2001
From: Paul Chavent <pchavent@wdcsd911h.onecert.fr>
Date: Fri, 27 Apr 2012 10:09:20 +0200
Subject: [PATCH] Update arm support.

---
 .gitignore     |    1 +
 Makefile.in    |    2 +-
 arm-elf2flt.ld |  221 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 elf2flt.c      |   27 +++++++
 4 files changed, 250 insertions(+), 1 deletions(-)
 create mode 100644 arm-elf2flt.ld

diff --git a/.gitignore b/.gitignore
index 92ff5f6..e0e0bd5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,4 @@ elf2flt
 elf2flt.ld
 flthdr
 ld-elf2flt
+ld-elf2flt.sh
\ No newline at end of file
diff --git a/Makefile.in b/Makefile.in
index 81e1afc..f98421e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -42,7 +42,7 @@ ifneq ($(strip $(shell gcc -v 2>&1 | grep "cygwin")),)
 endif
 
 LDFILE= elf2flt.ld
-ifeq ($(strip $(CPU)),e1)
+ifeq ($(filter-out e1 arm,$(CPU)),)
 SRC_LDFILE= $(srcdir)/$(CPU)-elf2flt.ld
 else 
 SRC_LDFILE= elf2flt.ld
diff --git a/arm-elf2flt.ld b/arm-elf2flt.ld
new file mode 100644
index 0000000..b57999c
--- /dev/null
+++ b/arm-elf2flt.ld
@@ -0,0 +1,221 @@
+
+ENTRY (_start)
+
+MEMORY {
+	flatmem : ORIGIN = 0x0, LENGTH = 0x1000000
+}
+
+PHDRS {
+	text PT_LOAD ;
+	data PT_LOAD ;
+}
+
+SECTIONS {
+
+	.text 0x0 : {
+		. = ALIGN(0x4) ;
+		_stext = . ;
+		*(.text)
+		*(.text.*)
+		*(.gnu.warning)
+		*(.stub)
+		*(.gnu.linkonce.t*)
+		*(.glue_7t)
+		*(.glue_7)
+		*(.vfp11_veneer)
+		*(.jcr)
+		KEEP (*(.init))
+		KEEP (*(.fini))
+
+W_RODAT		*(.rodata)
+W_RODAT		*(.rodata1)
+W_RODAT		*(.rodata.*)
+W_RODAT		*(.gnu.linkonce.r*)
+
+                /* .ARM.extab name sections containing exception unwinding information */
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+		/* This is special code area at the end of the normal
+		   text section.  It contains a small lookup table at
+		   the start followed by the code pointed to by entries
+		   in the lookup table.  */
+		. = ALIGN (4) ;
+		PROVIDE(__ctbp = .);
+		*(.call_table_data)
+		*(.call_table_text)
+	} > flatmem :text
+
+        /* .ARM.exidx name sections containing index entries for section unwinding */
+	/* .ARM.exidx is sorted, so has to go in its own output section.  */
+	 __exidx_start = .;
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > flatmem
+	__exidx_end = .;
+
+	. = ALIGN(0x20) ;
+	_etext = . ;
+
+	.data : {
+                . = ALIGN(0x4) ;
+		_sdata = . ;
+		__data_start = . ;
+		data_start = . ;
+		*(.got.plt)
+		*(.got)
+		FILL(0) ;
+		. = ALIGN(0x20) ;
+		LONG(-1)
+		. = ALIGN(0x20) ;
+R_RODAT		*(.rodata)
+R_RODAT		*(.rodata1)
+R_RODAT		*(.rodata.*)
+R_RODAT		*(.gnu.linkonce.r*)
+		*(.data)
+		*(.data1)
+		*(.data.*)
+		*(.gnu.linkonce.d*)
+
+		/* Microblaze has .sdata and .sbss (small bss).  They must
+		   be contiguous, so please don't move any of this. JW */
+		_ssrw = . ;
+		*(.sdata)
+		*(.sdata.*)
+		*(.sbss)			/* Don't move this! */
+		*(.gnu.linkonce.sb*)
+		_essrw = . ;
+
+		_ssrw_size = _essrw - _ssrw;
+		PROVIDE(_SDA_BASE_ = _ssrw + (_ssrw_size / 2));
+
+		*(.gnu.linkonce.s.*)
+		*(__libc_atexit)
+		*(__libc_subinit)
+		*(__libc_subfreeres)
+
+		/* microblaze-specific read-only small data area
+		   and associated locating symbols */
+		_ssro = . ;
+		*(.sdata2)
+		_essro = . ;
+		_ssro_size = _essro - _ssro;
+		PROVIDE(_SDA2_BASE_ = _ssro + (_ssro_size / 2));
+
+		. = ALIGN(4) ;
+TOR:		__CTOR_LIST__ = .;
+TOR:		LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
+SINGLE_LINK:	/* gcc uses crtbegin.o to find the start of
+SINGLE_LINK:	   the constructors, so we make sure it is
+SINGLE_LINK:	   first.  Because this is a wildcard, it
+SINGLE_LINK:	   doesn't matter if the user does not
+SINGLE_LINK:	   actually link against crtbegin.o; the
+SINGLE_LINK:	   linker won't look for a file to match a
+SINGLE_LINK:	   wildcard.  The wildcard also means that it
+SINGLE_LINK:	   doesn't matter which directory crtbegin.o
+SINGLE_LINK:	   is in.  */
+SINGLE_LINK:	KEEP (*crtbegin*.o(.ctors))
+SINGLE_LINK:	/* We don't want to include the .ctor section from
+SINGLE_LINK:	   from the crtend.o file until after the sorted ctors.
+SINGLE_LINK:	   The .ctor section from the crtend file contains the
+SINGLE_LINK:	   end of ctors marker and it must be last */
+SINGLE_LINK:	KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
+SINGLE_LINK:	KEEP (*(SORT(.ctors.*)))
+		KEEP (*(.ctors))
+TOR:		LONG(0)
+TOR:		__CTOR_END__ = .;
+TOR:		__DTOR_LIST__ = .;
+TOR:		LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
+SINGLE_LINK:	KEEP (*crtbegin*.o(.dtors))
+SINGLE_LINK:	KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
+SINGLE_LINK:	KEEP (*(SORT(.dtors.*)))
+		KEEP (*(.dtors))
+TOR:		LONG(0)
+TOR:		__DTOR_END__ = .;
+
+		PROVIDE (__preinit_array_start = .);
+		KEEP (*(.preinit_array))
+		PROVIDE (__preinit_array_end = .);
+
+		PROVIDE (__init_array_start = .);
+		KEEP (*(SORT(.init_array.*)))
+		KEEP (*(.init_array))
+		PROVIDE (__init_array_end = .);
+
+		PROVIDE (__fini_array_start = .);
+		KEEP (*(.fini_array))
+		KEEP (*(SORT(.fini_array.*)))
+		PROVIDE (__fini_array_end = .);
+	} > flatmem :data
+
+	.note.ABI-tag : { *(.note.ABI-tag) } > flatmem
+	.eh_frame_hdr : { *(.eh_frame_hdr) } > flatmem
+	.eh_frame : { KEEP(*(.eh_frame)) } > flatmem
+	.gcc_except_table : {
+		KEEP(*(.gcc_except_table))
+		KEEP(*(.gcc_except_table.*))
+	} >flatmem
+
+	. = ALIGN(0x10) ;
+	_edata = . ;
+
+	.bss : {
+		. = ALIGN(0x4) ;
+		_sbss = ALIGN(0x4) ;
+		__bss_start = . ;
+		*(.dynsbss)
+		*(.sbss)
+		*(.sbss.*)
+		*(.scommon)
+		*(.dynbss)
+		*(.bss)
+		*(.bss.*)
+		*(.bss*)
+		*(.gnu.linkonce.b*)
+		*(COMMON)
+		. = ALIGN(0x10) ;
+		_ebss = . ;
+		_end = . ;
+		end = . ;
+	} > flatmem
+
+	.stack : {
+		. = ALIGN(0x4);
+		_stack_start = .;
+	}
+
+	.junk 0 : { *(.rel*) *(.rela*) }
+	/DISCARD/ : { *(.note.GNU-stack) }
+	/* Stabs debugging sections.    */
+	.stab 0 : { *(.stab) }
+	.stabstr 0 : { *(.stabstr) }
+	.stab.excl 0 : { *(.stab.excl) }
+	.stab.exclstr 0 : { *(.stab.exclstr) }
+	.stab.index 0 : { *(.stab.index) }
+	.stab.indexstr 0 : { *(.stab.indexstr) }
+	.comment 0 : { *(.comment) }
+	/* DWARF debug sections.
+	   Symbols in the DWARF debugging sections are relative to the beginning
+	   of the section so we begin them at 0.  */
+	/* DWARF 1 */
+	.debug          0 : { *(.debug) }
+	.line           0 : { *(.line) }
+	/* GNU DWARF 1 extensions */
+	.debug_srcinfo  0 : { *(.debug_srcinfo) }
+	.debug_sfnames  0 : { *(.debug_sfnames) }
+	/* DWARF 1.1 and DWARF 2 */
+	.debug_aranges  0 : { *(.debug_aranges) }
+	.debug_pubnames 0 : { *(.debug_pubnames) }
+	/* DWARF 2 */
+	.debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+	.debug_abbrev   0 : { *(.debug_abbrev) }
+	.debug_line     0 : { *(.debug_line) }
+	.debug_frame    0 : { *(.debug_frame) }
+	.debug_str      0 : { *(.debug_str) }
+	.debug_loc      0 : { *(.debug_loc) }
+	.debug_macinfo  0 : { *(.debug_macinfo) }
+	/* SGI/MIPS DWARF 2 extensions */
+	.debug_weaknames 0 : { *(.debug_weaknames) }
+	.debug_funcnames 0 : { *(.debug_funcnames) }
+	.debug_typenames 0 : { *(.debug_typenames) }
+	.debug_varnames  0 : { *(.debug_varnames) }
+}
diff --git a/elf2flt.c b/elf2flt.c
index 2fea9b5..1a7ef88 100644
--- a/elf2flt.c
+++ b/elf2flt.c
@@ -54,6 +54,8 @@ const char *elf2flt_progname;
 
 #if defined(TARGET_h8300)
 #include <elf/h8.h>      /* TARGET_* ELF support for the BFD library            */
+#elif defined(TARGET_arm)
+#include "elf/arm.h"
 #elif defined(__CYGWIN__) || defined(__MINGW32__) || defined(TARGET_nios) || defined(TARGET_nios2)
 #include "cygwin-elf.h"	/* Cygwin uses a local copy */
 #elif defined(TARGET_microblaze)
@@ -639,12 +641,16 @@ dump_symbols(symbols, number_of_symbols);
 					relocation_needed = 1;
 					break;
 				case R_ARM_REL32:
+				case R_ARM_JUMP24:
+				case R_ARM_CALL:
 				case R_ARM_THM_PC11:
 				case R_ARM_THM_PC22:
 				case R_ARM_PC24:
 				case R_ARM_PLT32:
 				case R_ARM_GOTPC:
 				case R_ARM_GOT32:
+				case R_ARM_PREL31:
+				case R_ARM_NONE:
 					relocation_needed = 0;
 					break;
 				default:
@@ -1702,6 +1708,27 @@ int main(int argc, char *argv[])
     }
   }
   
+  if (verbose) {
+    printf("  verbose      = %d\n"
+           "  load_to_ram  = %d\n"
+           "  ktrace       = %d\n"
+           "  docompress   = %d\n"
+           "  pfile        = \"%s\"\n"
+           "  ofile        = \"%s\"\n"
+           "  use_resolved = %d\n"
+           "  stack        = %d\n"
+           "  rel_file     = \"%s\\n",
+           verbose     ,
+           load_to_ram ,
+           ktrace      ,
+           docompress  ,
+           pfile       ,
+           ofile       ,
+           use_resolved,
+           stack       ,
+           rel_file    );
+  }
+
   /*
    * if neither the -r or -p options was given,  default to
    * a RAM load as that is the only option that makes sense.
-- 
1.6.4

-------------- next part --------------
#!/bin/bash

################################################################################
# Setup framework                                                              #
################################################################################

source env_pkg.sh

################################################################################
# Set configuration variables                                                  #
################################################################################

GMP_NAME=gmp
GMP_VERSION=5.0.4
GMP_EXTENSION=.tar.bz2
GMP_LOCATIONS=http://ftp.gnu.org/gnu/gmp

MPFR_NAME=mpfr
MPFR_VERSION=3.1.0
MPFR_EXTENSION=.tar.bz2
MPFR_LOCATIONS=http://www.mpfr.org/mpfr-current

MPC_NAME=mpc
MPC_VERSION=0.9
MPC_EXTENSION=.tar.gz
MPC_LOCATIONS=http://www.multiprecision.org/mpc/download

BINUTILS_NAME=binutils
BINUTILS_VERSION=2.22
BINUTILS_EXTENSION=.tar.bz2
BINUTILS_LOCATIONS=http://ftp.gnu.org/gnu/binutils
BINUTILS_CONFIGURE_OPTIONS=${BINUTILS_CONFIGURE_OPTIONS:-""}

ELF2FLT_NAME=elf2flt
ELF2FLT_VERSION=git
ELF2FLT_EXTENSION=.tar.bz2
ELF2FLT_LOCATIONS=git://sources.blackfin.uclinux.org/git/users/vapier/elf2flt.git
ELF2FLT_PATCHES=${ELF2FLT_PATCHES:-"arm"}

GCC_NAME=gcc
GCC_VERSION=${GCC_VERSION:-4.7.0}
GCC_EXTENSION=.tar.bz2
GCC_LOCATIONS=http://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}
GCC_STAGE_1_CONFIGURE_OPTIONS=${GCC_STAGE_1_CONFIGURE_OPTIONS:-""}
GCC_CONFIGURE_OPTIONS=${GCC_CONFIGURE_OPTIONS:-""}

UCLIBC_NAME=uClibc
UCLIBC_VERSION=${UCLIBC_VERSION:-0.9.33.1}
UCLIBC_EXTENSION=.tar.xz
UCLIBC_LOCATIONS=http://www.uclibc.org/downloads
UCLIBC_CONFIG=${UCLIBC_CONFIG:-"def.config"}

LINUX_NAME=linux
LINUX_VERSION=${LINUX_VERSION:-3.2.14}
LINUX_EXTENSION=.tar.bz2
LINUX_LOCATIONS=http://www.kernel.org/pub/linux/kernel/v3.x
LINUX_PATCHES=${LINUX_PATCHES:-""}
LINUX_CONFIG=${LINUX_CONFIG:-"def.config"}

LINUXRT_VERSION=${LINUXRT_VERSION:-""}
LINUXRT_EXTENSION=.patch.bz2
LINUXRT_LOCATIONS=http://www.kernel.org//pub/linux/kernel/projects/rt/${LINUX_VERSION%.*}{,/older}

################################################################################
# binutils                                                                     #
################################################################################
toolchain_build_binutils()
{
    # download
    pkg_source_get ${BINUTILS_NAME} ${BINUTILS_VERSION} ${BINUTILS_EXTENSION} ${BINUTILS_LOCATIONS}

    # extract
    pkg_source_extract ${BINUTILS_NAME} ${BINUTILS_VERSION} ${BINUTILS_EXTENSION}

    # build
    pkg_build_enter ${BINUTILS_NAME} ${BINUTILS_VERSION}

    CFLAGS="${CFLAGS} ${HOST_CFLAGS}" \
    ${PKG_SOURCES}/binutils-${BINUTILS_VERSION}/configure \
	--prefix=${PKG_TOOLCHAIN_PREFIX} \
	--with-sysroot=${PKG_TOOLCHAIN_SYSROOT} \
	--build=${BUILD} \
	--host=${HOST} \
	--target=${TARGET} \
        ${GCC_TARGET_CPU} \
	--disable-nls \
	--disable-multilib \
	--enable-shared \
        \
	${BINUTILS_CONFIGURE_OPTIONS} \
	\
	-v

    $MAKE configure-host

    $MAKE

    $MAKE install

    pkg_build_leave ${BINUTILS_NAME} ${BINUTILS_VERSION}
}

################################################################################
#                                                                              #
################################################################################
toolchain_build_elf2flt()
{
    # download
    pkg_source_get ${ELF2FLT_NAME} ${ELF2FLT_VERSION} ${ELF2FLT_EXTENSION} ${ELF2FLT_LOCATIONS}

    # extract
    pkg_source_extract ${ELF2FLT_NAME} ${ELF2FLT_VERSION} ${ELF2FLT_EXTENSION}

    # patch
    pkg_source_patch ${ELF2FLT_NAME} ${ELF2FLT_VERSION} ${ELF2FLT_PATCHES}

    # build for host
    pkg_build_enter ${ELF2FLT_NAME} ${ELF2FLT_VERSION}

    local binutils_src_dir=${PKG_SOURCES}/binutils-${BINUTILS_VERSION}
    local binutils_bld_dir=${PKG_BUILDS}/binutils-${BINUTILS_VERSION}

    CFLAGS="${CFLAGS} ${HOST_CFLAGS}" \
    ${PKG_SOURCES}/elf2flt-${ELF2FLT_VERSION}/configure \
	--prefix=${PKG_TOOLCHAIN_PREFIX} \
	--build=${BUILD} \
	--host=${HOST} \
	--target=${TARGET} \
        --with-binutils-include-dir=${binutils_src_dir}/include \
        --with-bfd-include-dir=${binutils_bld_dir}/bfd \
        --with-libbfd=${binutils_bld_dir}/bfd/libbfd.a \
        --with-libiberty=${binutils_bld_dir}/libiberty/libiberty.a

    $MAKE

    $MAKE install

    pkg_build_leave ${ELF2FLT_NAME} ${ELF2FLT_VERSION}
}

################################################################################
# gcc stage 1 (static without libc headers)                                    #
################################################################################
toolchain_build_gcc_stage_1()
{
    # download
    pkg_source_get ${GMP_NAME} ${GMP_VERSION} ${GMP_EXTENSION} ${GMP_LOCATIONS}
    pkg_source_get ${MPFR_NAME} ${MPFR_VERSION} ${MPFR_EXTENSION} ${MPFR_LOCATIONS}
    pkg_source_get ${MPC_NAME} ${MPC_VERSION} ${MPC_EXTENSION} ${MPC_LOCATIONS}
    #pkg_source_get ${GCC_NAME}-core ${GCC_VERSION} ${GCC_EXTENSION} ${GCC_LOCATIONS}
    pkg_source_get ${GCC_NAME} ${GCC_VERSION} ${GCC_EXTENSION} ${GCC_LOCATIONS}

    # extract
    pkg_source_extract ${GMP_NAME} ${GMP_VERSION} ${GMP_EXTENSION}
    pkg_source_extract ${MPFR_NAME} ${MPFR_VERSION} ${MPFR_EXTENSION}
    pkg_source_extract ${MPC_NAME} ${MPC_VERSION} ${MPC_EXTENSION}
    #pkg_source_extract ${GCC_NAME}-core ${GCC_VERSION} ${GCC_EXTENSION}
    pkg_source_extract ${GCC_NAME} ${GCC_VERSION} ${GCC_EXTENSION}

    # hack hack hack
    if [ ! -L ${PKG_SOURCES}/gcc-${GCC_VERSION}/gmp ]
    then
	ln -s ${PKG_SOURCES}/gmp-${GMP_VERSION} ${PKG_SOURCES}/gcc-${GCC_VERSION}/gmp
    fi
    if [ ! -L ${PKG_SOURCES}/gcc-${GCC_VERSION}/mpfr ]
    then
	ln -s ${PKG_SOURCES}/mpfr-${MPFR_VERSION} ${PKG_SOURCES}/gcc-${GCC_VERSION}/mpfr
    fi
    if [ ! -L ${PKG_SOURCES}/gcc-${GCC_VERSION}/mpc ]
    then
	ln -s ${PKG_SOURCES}/mpc-${MPC_VERSION} ${PKG_SOURCES}/gcc-${GCC_VERSION}/mpc
    fi

    # build
    pkg_build_enter ${GCC_NAME} ${GCC_VERSION}

    ASFLAGS="${ASFLAGS} ${HOST_ASFLAGS}" \
    CFLAGS="${CFLAGS} ${HOST_CFLAGS}" \
    ${PKG_SOURCES}/gcc-${GCC_VERSION}/configure \
        --prefix=${PKG_TOOLCHAIN_PREFIX} \
        --with-sysroot=${PKG_TOOLCHAIN_SYSROOT} \
	--build=${BUILD} \
	--host=${HOST} \
        --target=${TARGET} \
        ${GCC_TARGET_CPU} \
	${GCC_TARGET_TUNE} \
	${GCC_TARGET_ARCH} \
	${GCC_TARGET_FLOAT} \
        ${GCC_TARGET_ABI} \
        \
        --without-ppl \
        --without-cloog \
        --with-mpfr-include=${PKG_SOURCES}/gcc-${GCC_VERSION}/mpfr/src \
        --with-mpfr-lib=${PKG_BUILDS}/gcc-${GCC_VERSION}/mpfr/src/.libs \
	--disable-nls \
        --enable-clocale=generic \
        --enable-languages=c \
        \
	--disable-multilib \
	--disable-decimal-float \
	--disable-libquadmath \
	--disable-libmudflap \
	--disable-libssp \
	--disable-libgomp \
	\
	--disable-shared \
	--disable-threads \
	\
        --without-headers \
	--with-newlib \
        \
	${GCC_STAGE_1_CONFIGURE_OPTIONS} \
	\
	-v
    # --without-headers and --with-newlib make gcc believe that there
    # is no c library available (yet)

    $MAKE all-gcc \
	ASFLAGS_FOR_TARGET="${ASFLAGS_FOR_TARGET} ${TARGET_ASFLAGS}" \
	CFLAGS_FOR_TARGET="${CFLAGS_FOR_TARGET} ${TARGET_CFLAGS}"
    
    $MAKE install-gcc

    $MAKE all-target-libgcc \
	ASFLAGS_FOR_TARGET="${ASFLAGS_FOR_TARGET} ${TARGET_ASFLAGS}" \
	CFLAGS_FOR_TARGET="${CFLAGS_FOR_TARGET} ${TARGET_CFLAGS}"
    
    $MAKE install-target-libgcc

    PKG_BUILD_LEAVE_CLEAN="yes_follow_links" \
    pkg_build_leave ${GCC_NAME} ${GCC_VERSION}
}

################################################################################
# kernel headers                                                               #
################################################################################
toolchain_build_kernel_headers()
{
    # download
    pkg_source_get ${LINUX_NAME} ${LINUX_VERSION} ${LINUX_EXTENSION} ${LINUX_LOCATIONS}

    # extract
    pkg_source_extract ${LINUX_NAME} ${LINUX_VERSION} ${LINUX_EXTENSION}

    # patch
    pkg_source_patch ${LINUX_NAME} ${LINUX_VERSION} "${LINUX_PATCHES}"

    # build
    PKG_BUILD_ENTER_SRC_DIR="yes" \
    pkg_build_enter ${LINUX_NAME} ${LINUX_VERSION}

    # patch for rt
    if [ -n "${LINUXRT_VERSION}" ]
    then
        pkg_source_get patch ${LINUX_VERSION}${LINUXRT_VERSION} ${LINUXRT_EXTENSION} ${LINUXRT_LOCATIONS}
        cat=cat
        if [ ${LINUXRT_EXTENSION} = ".patch.bz2" ]
        then
            cat=bunzip2
        elif [ ${LINUXRT_EXTENSION} = ".patch.gz" ]
        then
            cat=gunzip
        fi
        $cat < ${PKG_DOWNLOADS}/patch-${LINUX_VERSION}${LINUXRT_VERSION}${LINUXRT_EXTENSION} | patch --dry-run -p1
 	if [ $? -eq 0 ]
        then
           $cat < ${PKG_DOWNLOADS}/patch-${LINUX_VERSION}${LINUXRT_VERSION}${LINUXRT_EXTENSION} | patch -p1
        fi
    fi

    # build headers
    $MAKE headers_check \
	ARCH=${LINUX_TARGET_ARCH} \
	CROSS_COMPILE=${TARGET}- 

    $MAKE headers_install \
	ARCH=${LINUX_TARGET_ARCH} \
	CROSS_COMPILE=${TARGET}- \
	INSTALL_HDR_PATH=${PKG_TOOLCHAIN_SYSROOT}/usr 

    #PKG_BUILD_LEAVE_CLEAN="yes" \
    pkg_build_leave ${LINUX_NAME} ${LINUX_VERSION}
}

################################################################################
# libc                                                                         #
################################################################################
toolchain_build_libc()
{
   # download
    pkg_source_get ${UCLIBC_NAME} ${UCLIBC_VERSION} ${UCLIBC_EXTENSION} ${UCLIBC_LOCATIONS}

    # extract
    pkg_source_extract ${UCLIBC_NAME} ${UCLIBC_VERSION} ${UCLIBC_EXTENSION}

    # build
    PKG_BUILD_ENTER_SRC_DIR="yes" \
    pkg_build_enter ${UCLIBC_NAME} ${UCLIBC_VERSION}

    # configure
    if [ -f ${FWK_SYSTEM_PACKAGES}/uClibc/${UCLIBC_CONFIG} ]
    then
	cp ${FWK_SYSTEM_PACKAGES}/uClibc/${UCLIBC_CONFIG} ./.config
	$MAKE ARCH=${LINUX_TARGET_ARCH} CROSS_COMPILE=${TARGET}- oldconfig
    else
        echo "${FWK_SYSTEM_PACKAGES}/uClibc/${UCLIBC_CONFIG} not found"
        exit 1
    fi

    # uclibc don't take the good kernel header 
    # and fail with, e.g., '__ARM_NR_set_tls' undeclared
    # we need to give the kernel path, see
    # http://www.linuxfromscratch.org/clfs/view/clfs-3.0/mips/cross-tools/uclibc.html
    # buildroot-yyyy.mm/toolchain/uClibc/uclibc.mk
    # http://www.avrfreaks.net/wiki/index.php/Documentation:AVR32_Linux_Toolchain_HowTo#Building_the_C_library
    #
    # SHARED_LIB_LOADER_PREFIX has been replaced by MULTILIB_DIR in uclibc >= 0.9.33
    #
    sed -i.bak \
        -e "/^CROSS_COMPILER_PREFIX/s:=.*:=\"${TARGET}-\":" \
        -e "/^TARGET_ARCH/s:=.*:=\"${LINUX_TARGET_ARCH}\":" \
	-e "/^KERNEL_HEADERS/s:=.*:=\"${PKG_TOOLCHAIN_SYSROOT}/usr/include\":" \
        -e "/^DEVEL_PREFIX/s:=.*:=\"/usr\":" \
        -e "/^RUNTIME_PREFIX/s:=.*:=\"/\":" \
        -e "/^SHARED_LIB_LOADER_PREFIX/s:=.*:=\"/lib${LIBDIRSUFFIX}\":" \
        -e "/^MULTILIB_DIR/s:=.*:=\"/lib${LIBDIRSUFFIX}\":" \
        -e "/^UCLIBC_EXTRA_CFLAGS/s:=.*:=\"${TARGET_CFLAGS} -O2\":" \
        .config
    
    $MAKE all utils \
        install install_utils \
        ARCH=${LINUX_TARGET_ARCH} \
	CROSS_COMPILE=${TARGET}- \
        PREFIX=${PKG_TOOLCHAIN_SYSROOT}

    # install host stuff 
    $MAKE hostutils \
        install_hostutils \
        ARCH=${LINUX_TARGET_ARCH} \
	CROSS_COMPILE=${TARGET}- \
        PREFIX=${PKG_TOOLCHAIN_PREFIX}

    # ${PREFIX}${DEVEL_PREFIX}bin/ldd
    if [ -f ${PKG_TOOLCHAIN_PREFIX}/usr/bin/ldd ]
    then
	ln -sf ../usr/bin/ldd ${PKG_TOOLCHAIN_PREFIX}/bin/${TARGET}-ldd
    fi
    # ${PREFIX}${RUNTIME_PREFIX}sbin/ldconfig
    if [ -f ${PKG_TOOLCHAIN_PREFIX}/sbin/ldconfig ]
    then
	ln -sf ../sbin/ldconfig ${PKG_TOOLCHAIN_PREFIX}/bin/${TARGET}-ldconfig
    fi

    pkg_build_leave ${UCLIBC_NAME} ${UCLIBC_VERSION}
}

################################################################################
# gcc                                                                          #
################################################################################
toolchain_build_gcc()
{
    # download
    pkg_source_get ${GMP_NAME} ${GMP_VERSION} ${GMP_EXTENSION} ${GMP_LOCATIONS}
    pkg_source_get ${MPFR_NAME} ${MPFR_VERSION} ${MPFR_EXTENSION} ${MPFR_LOCATIONS}
    pkg_source_get ${MPC_NAME} ${MPC_VERSION} ${MPC_EXTENSION} ${MPC_LOCATIONS}
    #pkg_source_get ${GCC_NAME}-core ${GCC_VERSION} ${GCC_EXTENSION} ${GCC_LOCATIONS}
    #pkg_source_get ${GCC_NAME}-g++ ${GCC_VERSION} ${GCC_EXTENSION} ${GCC_LOCATIONS}
    pkg_source_get ${GCC_NAME} ${GCC_VERSION} ${GCC_EXTENSION} ${GCC_LOCATIONS}

    # extract
    pkg_source_extract ${GMP_NAME} ${GMP_VERSION} ${GMP_EXTENSION}
    pkg_source_extract ${MPFR_NAME} ${MPFR_VERSION} ${MPFR_EXTENSION}
    pkg_source_extract ${MPC_NAME} ${MPC_VERSION} ${MPC_EXTENSION}
    #pkg_source_extract ${GCC_NAME}-core ${GCC_VERSION} ${GCC_EXTENSION}
    #pkg_source_extract ${GCC_NAME}-g++ ${GCC_VERSION} ${GCC_EXTENSION}
    pkg_source_extract ${GCC_NAME} ${GCC_VERSION} ${GCC_EXTENSION}

    # hack hack hack
    if [ ! -L ${PKG_SOURCES}/gcc-${GCC_VERSION}/gmp ]
    then
	ln -s ${PKG_SOURCES}/gmp-${GMP_VERSION} ${PKG_SOURCES}/gcc-${GCC_VERSION}/gmp
    fi
    if [ ! -L ${PKG_SOURCES}/gcc-${GCC_VERSION}/mpfr ]
    then
	ln -s ${PKG_SOURCES}/mpfr-${MPFR_VERSION} ${PKG_SOURCES}/gcc-${GCC_VERSION}/mpfr
    fi
    if [ ! -L ${PKG_SOURCES}/gcc-${GCC_VERSION}/mpc ]
    then
	ln -s ${PKG_SOURCES}/mpc-${MPC_VERSION} ${PKG_SOURCES}/gcc-${GCC_VERSION}/mpc
    fi

    # build
    pkg_build_enter ${GCC_NAME} ${GCC_VERSION}

    ASFLAGS="${ASFLAGS} ${HOST_ASFLAGS}" \
    CFLAGS="${CFLAGS} ${HOST_CFLAGS}" \
    ${PKG_SOURCES}/gcc-${GCC_VERSION}/configure \
        --prefix=${PKG_TOOLCHAIN_PREFIX} \
        --with-sysroot=${PKG_TOOLCHAIN_SYSROOT} \
	--build=${BUILD} \
	--host=${HOST} \
        --target=${TARGET} \
        ${GCC_TARGET_CPU} \
	${GCC_TARGET_TUNE} \
	${GCC_TARGET_ARCH} \
	${GCC_TARGET_FLOAT} \
        ${GCC_TARGET_ABI} \
        \
        --without-ppl \
        --without-cloog \
        --with-mpfr-include=${PKG_SOURCES}/gcc-${GCC_VERSION}/mpfr/src \
        --with-mpfr-lib=${PKG_BUILDS}/gcc-${GCC_VERSION}/mpfr/src/.libs \
        --disable-nls \
	--enable-clocale=generic \
        --enable-languages=c,c++ \
        \
        --enable-shared \
        --enable-threads=posix \
	--enable-tls \
	--disable-__cxa_atexit \
	\
	${GCC_CONFIGURE_OPTIONS} \
        \
	-v
       # now with shared libs and threads
       # now with c++
       # the cxa_atexit is special for eglibc

    $MAKE \
	ASFLAGS_FOR_TARGET="${ASFLAGS_FOR_TARGET} ${TARGET_ASFLAGS}" \
	CFLAGS_FOR_TARGET="${CFLAGS_FOR_TARGET} ${TARGET_CFLAGS}"

    $MAKE install

    pkg_build_leave ${GCC_NAME} ${GCC_VERSION}
}

################################################################################
#                                                                              #
################################################################################

toolchain_build_binutils
toolchain_build_elf2flt
toolchain_build_gcc_stage_1
toolchain_build_kernel_headers
toolchain_build_libc
toolchain_build_gcc

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [uClinux-dev] Running linux with mmu disabled on arm (AT91).
  2012-05-01 15:24 ` Paul Chavent
  (?)
@ 2012-05-08  4:50 ` Greg Ungerer
  2012-05-08  9:11   ` Paul Chavent
  -1 siblings, 1 reply; 5+ messages in thread
From: Greg Ungerer @ 2012-05-08  4:50 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Paul,

On 02/05/12 01:24, Paul Chavent wrote:
> I'd like to try linux on an AT91SAM9G20 (i have a linuxstamp board), with MMU disabled (the Hyok-Sung Choi&  Hee-Chul Yun paper demonstrate that it could be possible).
>
> All the code seems to be present in the kernel...
> So i would like to share my experience.
>
> (1) I had to make two little changes in the kernel code :
>       - I'm not able to change the REMAP_VECTOR_TO_DRAM. I have submitted the problem to the kbuild mailing list (http://www.spinics.net/lists/linux-kbuild/msg06153.html).

Odd. Is it because DRAM_BASE is a numerical value?


>       - The soc_detect code that init the at91_soc_initdata structure is never called. Later this structure is used unitialized.
>       I'm currently using the joined patch as a workaround. Someone can review it please ?

It looks ok to me.


> (2) I used to run the module with a "classic system" based on linux + eglibc, and i needed only one toolchain (arm-xxx-linux-gnueabi) for the kernel and the userspace apps.
>       I found that for the nommu case i wasn't able to build the kernel with the userspace toolchain.
>       So I had to build 2 toolchain, based on binutils 2.22, gcc 4.7, uclibc 0.9.33.1 and linux 3.2.14 :
>         - an arm-xxx-eabi toolchain for the kernel
>         - an arm-xxx-uclinux-uclibceabi for the userspace apps
>       Do you confirm that it is not possible to compile the kernel with arm-xxx-uclinux-uclibceabi ? Or, may i have misconfigured the toolchain (i join the toolchain build procedure) ?

I build non-mmu ARM systems with the same toolchain. What was the failure condition
when building the kernel with the arm-yyy-uclinux-uclibceabi tool chain?


> (3) The arm-xxx-uclinux-uclibceabi with elf2flt seems to produce running bins only if it is build with the uClibc DOPIC not set.
>       Is it required to disable DOPIC ?
>       Moreover, i can't run bins produced with a arm-xxx-linux-uclibceabi toolchain and -Wl,-elf2flt (not uclinux one). Is it the expected behavior ?

Is it actually producing a FLAT format binary?
Maybe it is silently ignoring the "-Wl,-elf2flt".


> (4) The elf2flt needs to be updated to be aware of the exidx section, and some reloc types. I join the patch i currently use.

You shouldn't include a whole new elft2flt.ld for this. It is generated
(via autoconf) from the elf2flt.ld.in file. You should add your new
exidx section to that. If you want to generate a new patch with doing
it that way I can add it to the elf2flt CVS on uclinux.org.


> Given these observations, i've been able to run a linux with an hello world as the /init process.
>
> My next tests will be to run threaded programs, c++ programs, then busybox.

A good start at least.

Regards
Greg


-- 
------------------------------------------------------------------------
Greg Ungerer  --  Principal Engineer        EMAIL:     gerg at snapgear.com
SnapGear Group, McAfee                      PHONE:       +61 7 3435 2888
8 Gardner Close                             FAX:         +61 7 3217 5323
Milton, QLD, 4064, Australia                WEB: http://www.SnapGear.com

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [uClinux-dev] Running linux with mmu disabled on arm (AT91).
  2012-05-08  4:50 ` [uClinux-dev] " Greg Ungerer
@ 2012-05-08  9:11   ` Paul Chavent
  2012-05-08 12:01     ` Greg Ungerer
  0 siblings, 1 reply; 5+ messages in thread
From: Paul Chavent @ 2012-05-08  9:11 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Greg

Le 05/08/2012 06:50 AM, Greg Ungerer a ?crit :
> Hi Paul,
>
> On 02/05/12 01:24, Paul Chavent wrote:
>> I'd like to try linux on an AT91SAM9G20 (i have a linuxstamp board), with MMU disabled (the Hyok-Sung Choi& Hee-Chul Yun paper demonstrate that it could be possible).
>>
>> All the code seems to be present in the kernel...
>> So i would like to share my experience.
>>
>> (1) I had to make two little changes in the kernel code :
>> - I'm not able to change the REMAP_VECTOR_TO_DRAM. I have submitted the problem to the kbuild mailing list (http://www.spinics.net/lists/linux-kbuild/msg06153.html).
>
> Odd. Is it because DRAM_BASE is a numerical value?
>
>
>> - The soc_detect code that init the at91_soc_initdata structure is never called. Later this structure is used unitialized.
>> I'm currently using the joined patch as a workaround. Someone can review it please ?
>
> It looks ok to me.
>
>
>> (2) I used to run the module with a "classic system" based on linux + eglibc, and i needed only one toolchain (arm-xxx-linux-gnueabi) for the kernel and the userspace apps.
>> I found that for the nommu case i wasn't able to build the kernel with the userspace toolchain.
>> So I had to build 2 toolchain, based on binutils 2.22, gcc 4.7, uclibc 0.9.33.1 and linux 3.2.14 :
>> - an arm-xxx-eabi toolchain for the kernel
>> - an arm-xxx-uclinux-uclibceabi for the userspace apps
>> Do you confirm that it is not possible to compile the kernel with arm-xxx-uclinux-uclibceabi ? Or, may i have misconfigured the toolchain (i join the toolchain build procedure) ?
>
> I build non-mmu ARM systems with the same toolchain. What was the failure condition
> when building the kernel with the arm-yyy-uclinux-uclibceabi tool chain?

When i build the kernel with the arm-yyy-uclinux-uclibceabi tool chain it builds without error. But the kernel don't display anything when booting (not even the "decompressing kernel" message).

>
>
>> (3) The arm-xxx-uclinux-uclibceabi with elf2flt seems to produce running bins only if it is build with the uClibc DOPIC not set.
>> Is it required to disable DOPIC ?
>> Moreover, i can't run bins produced with a arm-xxx-linux-uclibceabi toolchain and -Wl,-elf2flt (not uclinux one). Is it the expected behavior ?
>
> Is it actually producing a FLAT format binary?
> Maybe it is silently ignoring the "-Wl,-elf2flt".

Yes it produce flat binaries with the gotpic flag enabled...

>
>
>> (4) The elf2flt needs to be updated to be aware of the exidx section, and some reloc types. I join the patch i currently use.
>
> You shouldn't include a whole new elft2flt.ld for this. It is generated
> (via autoconf) from the elf2flt.ld.in file. You should add your new
> exidx section to that. If you want to generate a new patch with doing
> it that way I can add it to the elf2flt CVS on uclinux.org.

In the previous mail, i joined a patch with an arm specific ld script derived from the generic one.
I added the missing (exidx) sections, but i didn't remove other specific sections. For example, It still contains "microblaze" comments, i'm not sure what we could remove...
The patch would need some reviews.

>
>
>> Given these observations, i've been able to run a linux with an hello world as the /init process.
>>
>> My next tests will be to run threaded programs, c++ programs, then busybox.
>
> A good start at least.
>
> Regards
> Greg

Thanks.
Paul.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [uClinux-dev] Running linux with mmu disabled on arm (AT91).
  2012-05-08  9:11   ` Paul Chavent
@ 2012-05-08 12:01     ` Greg Ungerer
  0 siblings, 0 replies; 5+ messages in thread
From: Greg Ungerer @ 2012-05-08 12:01 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Paul,

On 05/08/2012 07:11 PM, Paul Chavent wrote:
> Le 05/08/2012 06:50 AM, Greg Ungerer a ??crit :
>> On 02/05/12 01:24, Paul Chavent wrote:
[snip]
>>> (2) I used to run the module with a "classic system" based on linux + eglibc, and i needed only one toolchain (arm-xxx-linux-gnueabi) for the kernel and the userspace apps.
>>> I found that for the nommu case i wasn't able to build the kernel with the userspace toolchain.
>>> So I had to build 2 toolchain, based on binutils 2.22, gcc 4.7, uclibc 0.9.33.1 and linux 3.2.14 :
>>> - an arm-xxx-eabi toolchain for the kernel
>>> - an arm-xxx-uclinux-uclibceabi for the userspace apps
>>> Do you confirm that it is not possible to compile the kernel with arm-xxx-uclinux-uclibceabi ? Or, may i have misconfigured the toolchain (i join the toolchain build procedure) ?
>>
>> I build non-mmu ARM systems with the same toolchain. What was the failure condition
>> when building the kernel with the arm-yyy-uclinux-uclibceabi tool chain?
>
> When i build the kernel with the arm-yyy-uclinux-uclibceabi tool chain it builds without error. But the kernel don't display anything when booting (not even the "decompressing kernel" message).

Can you compare the disassembled output of the code in each case?


>>> (3) The arm-xxx-uclinux-uclibceabi with elf2flt seems to produce running bins only if it is build with the uClibc DOPIC not set.
>>> Is it required to disable DOPIC ?
>>> Moreover, i can't run bins produced with a arm-xxx-linux-uclibceabi toolchain and -Wl,-elf2flt (not uclinux one). Is it the expected behavior ?
>>
>> Is it actually producing a FLAT format binary?
>> Maybe it is silently ignoring the "-Wl,-elf2flt".
>
> Yes it produce flat binaries with the gotpic flag enabled...

I would suspect that the code generation for the uclinux configured case
may be slightly different. You would need to dig into gcc and see what
it does when the target is set as uclinux.


>>> (4) The elf2flt needs to be updated to be aware of the exidx section, and some reloc types. I join the patch i currently use.
>>
>> You shouldn't include a whole new elft2flt.ld for this. It is generated
>> (via autoconf) from the elf2flt.ld.in file. You should add your new
>> exidx section to that. If you want to generate a new patch with doing
>> it that way I can add it to the elf2flt CVS on uclinux.org.
>
> In the previous mail, i joined a patch with an arm specific ld script derived from the generic one.
> I added the missing (exidx) sections, but i didn't remove other specific sections. For example, It still contains "microblaze" comments, i'm not sure what we could remove...
> The patch would need some reviews.

Well, I am reviewing it :-)
What I am saying is that it isn't really useful putting the generated
arm-elf2flt.ld in the patch. Your changes for the linker script need
to go into elf2flt.ld.in. You don't remove anything from it, it is good
for all architectures supported by elf2flt.

Regards
Greg


------------------------------------------------------------------------
Greg Ungerer  --  Principal Engineer        EMAIL:     gerg at snapgear.com
SnapGear Group, McAfee                      PHONE:       +61 7 3435 2888
8 Gardner Close,                            FAX:         +61 7 3891 3630
Milton, QLD, 4064, Australia                WEB: http://www.SnapGear.com

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-05-08 12:01 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-01 15:24 [Buildroot] Running linux with mmu disabled on arm (AT91) Paul Chavent
2012-05-01 15:24 ` Paul Chavent
2012-05-08  4:50 ` [uClinux-dev] " Greg Ungerer
2012-05-08  9:11   ` Paul Chavent
2012-05-08 12:01     ` Greg Ungerer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.