diff options
-rw-r--r-- | apps/examples/README.txt | 8 | ||||
-rw-r--r-- | apps/examples/elf/elf_main.c | 2 | ||||
-rw-r--r-- | apps/examples/nxflat/nxflat_main.c | 2 | ||||
-rw-r--r-- | nuttx/ChangeLog | 2 | ||||
-rw-r--r-- | nuttx/arch/arm/include/elf.h | 2 | ||||
-rw-r--r-- | nuttx/arch/sim/src/up_elf.c | 2 | ||||
-rw-r--r-- | nuttx/arch/x86/src/common/up_elf.c | 2 | ||||
-rw-r--r-- | nuttx/binfmt/elf.c | 2 | ||||
-rw-r--r-- | nuttx/binfmt/libelf/gnu-elf.ld | 138 | ||||
-rw-r--r-- | nuttx/binfmt/libelf/libelf.h | 2 | ||||
-rw-r--r-- | nuttx/binfmt/libelf/libelf_bind.c | 2 | ||||
-rw-r--r-- | nuttx/binfmt/libelf/libelf_init.c | 2 | ||||
-rw-r--r-- | nuttx/binfmt/libelf/libelf_load.c | 2 | ||||
-rw-r--r-- | nuttx/binfmt/libelf/libelf_read.c | 2 | ||||
-rw-r--r-- | nuttx/binfmt/libelf/libelf_symbols.c | 2 | ||||
-rw-r--r-- | nuttx/include/elf32.h (renamed from nuttx/include/elf.h) | 8 | ||||
-rw-r--r-- | nuttx/include/nuttx/binfmt/elf.h | 2 |
17 files changed, 66 insertions, 116 deletions
diff --git a/apps/examples/README.txt b/apps/examples/README.txt index fa97bd64e..95d49a3fb 100644 --- a/apps/examples/README.txt +++ b/apps/examples/README.txt @@ -344,6 +344,14 @@ examples/elf If you really want to do this, you can create a NuttX x86 buildroot toolchain and use that be build the ELF executables for the ROMFS file system. + 5. Linker scripts. You might also want to use a linker scripts to combine + sections better. An example linker script is at nuttx/binfmt/libelf/gnu-elf.ld. + That example might have to be tuned for your particular linker output to + position additional sections correctly. The GNU LD LDELFFLAGS then might + be: + + LDELFFLAGS = -r -e main -T$(TOPDIR)/binfmt/libelf/gnu-elf.ld + examples/ftpc ^^^^^^^^^^^^^ diff --git a/apps/examples/elf/elf_main.c b/apps/examples/elf/elf_main.c index 5699dd284..3a6eae9d9 100644 --- a/apps/examples/elf/elf_main.c +++ b/apps/examples/elf/elf_main.c @@ -174,7 +174,7 @@ int elf_main(int argc, char *argv[]) /* Create a ROM disk for the ROMFS filesystem */ message("Registering romdisk at /dev/ram%d\n", CONFIG_EXAMPLES_ELF_DEVMINOR); - ret = romdisk_register(CONFIG_EXAMPLES_ELF_DEVMINOR, romfs_img, + ret = romdisk_register(CONFIG_EXAMPLES_ELF_DEVMINOR, (FAR uint8_t *)romfs_img, NSECTORS(romfs_img_len), SECTORSIZE); if (ret < 0) { diff --git a/apps/examples/nxflat/nxflat_main.c b/apps/examples/nxflat/nxflat_main.c index 2c0030c60..638e960a0 100644 --- a/apps/examples/nxflat/nxflat_main.c +++ b/apps/examples/nxflat/nxflat_main.c @@ -167,7 +167,7 @@ int nxflat_main(int argc, char *argv[]) /* Create a ROM disk for the ROMFS filesystem */ message("Registering romdisk\n"); - ret = romdisk_register(0, romfs_img, NSECTORS(romfs_img_len), SECTORSIZE); + ret = romdisk_register(0, (FAR uint8_t *)romfs_img, NSECTORS(romfs_img_len), SECTORSIZE); if (ret < 0) { err("ERROR: romdisk_register failed: %d\n", ret); diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index 2006fcc21..f1f048a35 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -3515,4 +3515,6 @@ include/nuttx/binfmt/. * arch/sim/src/up_elf.c and arch/x86/src/common/up_elf.c: Add for ELF modules. + * arch/arm/include/elf.h: Added ARM ELF header file. + * include/elf32.h: Renamed elf.h to elf32.h. diff --git a/nuttx/arch/arm/include/elf.h b/nuttx/arch/arm/include/elf.h index d85385380..21b2c1c2c 100644 --- a/nuttx/arch/arm/include/elf.h +++ b/nuttx/arch/arm/include/elf.h @@ -50,7 +50,7 @@ * e_ident[EI_DATA] = ELFDATA2LSB (little endian) or ELFDATA2MSB (big endian) */ -#if 0 /* Defined in include/elf.h */ +#if 0 /* Defined in include/elf32.h */ #define EM_ARM 40 #endif diff --git a/nuttx/arch/sim/src/up_elf.c b/nuttx/arch/sim/src/up_elf.c index ca3b642dc..26a8971a7 100644 --- a/nuttx/arch/sim/src/up_elf.c +++ b/nuttx/arch/sim/src/up_elf.c @@ -40,7 +40,7 @@ #include <nuttx/config.h> #include <stdlib.h> -#include <elf.h> +#include <elf32.h> #include <errno.h> #include <debug.h> diff --git a/nuttx/arch/x86/src/common/up_elf.c b/nuttx/arch/x86/src/common/up_elf.c index be166b480..da3f7b993 100644 --- a/nuttx/arch/x86/src/common/up_elf.c +++ b/nuttx/arch/x86/src/common/up_elf.c @@ -40,7 +40,7 @@ #include <nuttx/config.h> #include <stdlib.h> -#include <elf.h> +#include <elf32.h> #include <errno.h> #include <debug.h> diff --git a/nuttx/binfmt/elf.c b/nuttx/binfmt/elf.c index d9c3d0b9c..9a0ac1873 100644 --- a/nuttx/binfmt/elf.c +++ b/nuttx/binfmt/elf.c @@ -42,7 +42,7 @@ #include <sys/types.h> #include <stdint.h> #include <string.h> -#include <elf.h> +#include <elf32.h> #include <debug.h> #include <errno.h> diff --git a/nuttx/binfmt/libelf/gnu-elf.ld b/nuttx/binfmt/libelf/gnu-elf.ld index 703f36981..bdf82836b 100644 --- a/nuttx/binfmt/libelf/gnu-elf.ld +++ b/nuttx/binfmt/libelf/gnu-elf.ld @@ -1,7 +1,7 @@ /**************************************************************************** - * examples/elf/gnu-elf-gotoff.ld + * examples/elf/gnu-elf.ld * - * Copyright (C) 2009, 2012 Gregory Nutt. All rights reserved. + * Copyright (C) 2012 Gregory Nutt. All rights reserved. * Author: Gregory Nutt <gnutt@nuttx.org> * * Redistribution and use in source and binary forms, with or without @@ -33,44 +33,11 @@ * ****************************************************************************/ -MEMORY -{ - ISPACE : ORIGIN = 0x0, LENGTH = 2097152 - DSPACE : ORIGIN = 0x0, LENGTH = 2097152 -} - -/**************************************************************************** - * The XFLAT program image is divided into two segments: - * - * (1) ISpace (Instruction Space). This is the segment that contains - * code (.text). Everything in the segment should be fetch-able - * machine PC instructions (jump, branch, call, etc.). - * (2) DSpace (Data Space). This is the segment that contains both - * read-write data (.data, .bss) as well as read-only data (.rodata). - * Everything in this segment should be access-able with machine - * PIC load and store instructions. - * - * Older versions of GCC (at least up to GCC 4.3.3), use GOT-relative - * addressing to access RO data. In that case, read-only data (.rodata) must - * reside in D-Space and this linker script should be used. - * - * Newer versions of GCC (at least as of GCC 4.6.3), use PC-relative - * addressing to access RO data. In that case, read-only data (.rodata) must - * reside in I-Space and this linker script should NOT be used with those - * newer tools. - * - ****************************************************************************/ - SECTIONS { .text 0x00000000 : { - /* ISpace is located at address 0. Every (unrelocated) ISpace - * address is an offset from the begining of this segment. - */ - - text_start = . ; - + _stext = . ; *(.text) *(.text.*) *(.gnu.warning) @@ -79,99 +46,72 @@ SECTIONS *(.glue_7t) *(.jcr) - /* C++ support: The .init and .fini sections contain XFLAT- - * specific logic to manage static constructors and destructors. + /* C++ support: The .init and .fini sections contain specific logic + * to manage static constructors and destructors. */ *(.gnu.linkonce.t.*) *(.init) *(.fini) - - /* 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) - _etext = . ; + } - } > ISPACE - - /* DSpace is also located at address 0. Every (unrelocated) DSpace - * address is an offset from the begining of this segment. - */ - - .data 0x00000000 : + .rodata : { - /* In this model, .rodata is access using PC-relative addressing - * and, hence, must also reside in the .text section. - */ - - __data_start = . ; + _srodata = . ; *(.rodata) *(.rodata1) *(.rodata.*) *(.gnu.linkonce.r*) + _erodata = . ; + } + .data : + { + _sdata = . ; *(.data) *(.data1) *(.data.*) *(.gnu.linkonce.d*) - *(.data1) - *(.eh_frame) - *(.gcc_except_table) - - *(.gnu.linkonce.s.*) - *(__libc_atexit) - *(__libc_subinit) - *(__libc_subfreeres) - *(.note.ABI-tag) - - /* C++ support. For each global and static local C++ object, - * GCC creates a small subroutine to construct the object. Pointers - * to these routines (not the routines themselves) are stored as - * simple, linear arrays in the .ctors section of the object file. - * Similarly, pointers to global/static destructor routines are - * stored in .dtors. - */ + _edata = . ; + } - *(.gnu.linkonce.d.*) + /* C++ support. For each global and static local C++ object, + * GCC creates a small subroutine to construct the object. Pointers + * to these routines (not the routines themselves) are stored as + * simple, linear arrays in the .ctors section of the object file. + * Similarly, pointers to global/static destructor routines are + * stored in .dtors. + */ - _ctors_start = . ; + .ctors : + { + _sctros = . ; *(.ctors) - _ctors_end = . ; - _dtors_start = . ; - *(.dtors) - _dtors_end = . ; + _edtors = . ; + } - _edata = . ; - edata = ALIGN( 0x10 ) ; - } > DSPACE + .ctors : + { + _sdtors = . ; + *(.dtors) + _edtors = . ; + } .bss : { - __bss_start = _edata ; - *(.dynsbss) - *(.sbss) - *(.sbss.*) - *(.scommon) - *(.dynbss) + _sbss = . ; *(.bss) *(.bss.*) - *(.bss*) + *(.sbss) + *(.sbss.*) *(.gnu.linkonce.b*) *(COMMON) - end = ALIGN( 0x10 ) ; - _end = ALIGN( 0x10 ) ; - } > DSPACE + _ebss = . ; + } - .got 0 : { *(.got.plt) *(.got) } - .junk 0 : { *(.rel*) *(.rela*) } /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } diff --git a/nuttx/binfmt/libelf/libelf.h b/nuttx/binfmt/libelf/libelf.h index 37a2ad872..0fb1362dc 100644 --- a/nuttx/binfmt/libelf/libelf.h +++ b/nuttx/binfmt/libelf/libelf.h @@ -43,7 +43,7 @@ #include <nuttx/config.h> #include <sys/types.h> -#include <elf.h> +#include <elf32.h> #include <nuttx/binfmt/elf.h> diff --git a/nuttx/binfmt/libelf/libelf_bind.c b/nuttx/binfmt/libelf/libelf_bind.c index e398521cc..f41b5a0b6 100644 --- a/nuttx/binfmt/libelf/libelf_bind.c +++ b/nuttx/binfmt/libelf/libelf_bind.c @@ -41,7 +41,7 @@ #include <stdint.h> #include <string.h> -#include <elf.h> +#include <elf32.h> #include <errno.h> #include <assert.h> #include <debug.h> diff --git a/nuttx/binfmt/libelf/libelf_init.c b/nuttx/binfmt/libelf/libelf_init.c index a3a320b16..f2744eae7 100644 --- a/nuttx/binfmt/libelf/libelf_init.c +++ b/nuttx/binfmt/libelf/libelf_init.c @@ -43,7 +43,7 @@ #include <stdint.h> #include <string.h> #include <fcntl.h> -#include <elf.h> +#include <elf32.h> #include <debug.h> #include <errno.h> diff --git a/nuttx/binfmt/libelf/libelf_load.c b/nuttx/binfmt/libelf/libelf_load.c index 4a1a561c3..9378661e3 100644 --- a/nuttx/binfmt/libelf/libelf_load.c +++ b/nuttx/binfmt/libelf/libelf_load.c @@ -45,7 +45,7 @@ #include <stdint.h> #include <stdlib.h> #include <unistd.h> -#include <elf.h> +#include <elf32.h> #include <assert.h> #include <errno.h> #include <debug.h> diff --git a/nuttx/binfmt/libelf/libelf_read.c b/nuttx/binfmt/libelf/libelf_read.c index 0b01cf096..da41212f2 100644 --- a/nuttx/binfmt/libelf/libelf_read.c +++ b/nuttx/binfmt/libelf/libelf_read.c @@ -43,7 +43,7 @@ #include <stdint.h> #include <unistd.h> #include <string.h> -#include <elf.h> +#include <elf32.h> #include <debug.h> #include <errno.h> diff --git a/nuttx/binfmt/libelf/libelf_symbols.c b/nuttx/binfmt/libelf/libelf_symbols.c index 05f827963..123f9f77f 100644 --- a/nuttx/binfmt/libelf/libelf_symbols.c +++ b/nuttx/binfmt/libelf/libelf_symbols.c @@ -41,7 +41,7 @@ #include <stdlib.h> #include <string.h> -#include <elf.h> +#include <elf32.h> #include <errno.h> #include <debug.h> diff --git a/nuttx/include/elf.h b/nuttx/include/elf32.h index caf0b1876..e16ae0091 100644 --- a/nuttx/include/elf.h +++ b/nuttx/include/elf32.h @@ -1,5 +1,5 @@ /**************************************************************************** - * include/elf.h + * include/elf32.h * * Copyright (C) 2012 Gregory Nutt. All rights reserved. * Author: Gregory Nutt <gnutt@nuttx.org> @@ -36,8 +36,8 @@ * ****************************************************************************/ -#ifndef __INCLUDE_ELF_H -#define __INCLUDE_ELF_H +#ifndef __INCLUDE_ELF32_H +#define __INCLUDE_ELF32_H /**************************************************************************** * Included Files @@ -349,4 +349,4 @@ typedef struct //extern Elf32_Dyn _DYNAMIC[] ; -#endif /* __INCLUDE_ELF_H */ +#endif /* __INCLUDE_ELF32_H */ diff --git a/nuttx/include/nuttx/binfmt/elf.h b/nuttx/include/nuttx/binfmt/elf.h index 6b13c1087..aa04adaf2 100644 --- a/nuttx/include/nuttx/binfmt/elf.h +++ b/nuttx/include/nuttx/binfmt/elf.h @@ -45,7 +45,7 @@ #include <sys/types.h> #include <stdint.h> #include <stdbool.h> -#include <elf.h> +#include <elf32.h> /**************************************************************************** * Pre-processor Definitions |