DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
...
In this example, we will assume the former. Let's illustrate this using an STM32F4-Discovery configuration. We will assume that you have modified the boards/arm/stm32/stm32fdiscovery/src/stm32_bringup.c file, adding the following:
| Code Block |
|---|
#include <stdio.h> #include <nuttx/binfmt/symtab.h> |
| Code Block |
const struct symtab_s g_symtab[] = { {"printf", (FAR void *)printf} }; |
| Code Block |
int g_nsymbols = 1;
|
That is a simple symbol table containing only the symbol string "printf" whose value is the address of the function printf().
...
To keep things manageable, let's use a concrete example Suppose the ELF program that we wish to add to the release code is the since source file hello.c:
| Code Block |
|---|
#include <stdio.h>
|
| Code Block |
int main(int argc, char **argv) { printf("Hello from Add-On Program!\n"); return 0; } |
Let's say that we have a a directory called addon and contains the hello.c source file, a Makefile that will create the the ELF program, and a linker script called gnu-elf.ld needed by the Makefile.
...
This is the Makefile that I used to create ELF program:
| Code Block |
|---|
include nuttx-export-7.25/build/Make.defs
|
| Code Block |
# Long calls are need to call from RAM into FLASH
|
| Code Block |
ARCHCFLAGS += -mlong-calls ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef ARCHOPTIMIZATION = -Os -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer ARCHINCLUDES = -I. -isystem nuttx-export-7.25/include |
| Code Block |
CFLAGS = $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHINCLUDES) -pipe
|
| Code Block |
CROSSDEV CROSSDEV = arm-none-eabi- CC = $(CROSSDEV)gcc LD = $(CROSSDEV)ld STRIP = $(CROSSDEV)strip --strip-unneeded |
| Code Block |
# Setup up linker command line options
|
| Code Block |
LDELFFLAGS = -r -e main LDELFFLAGS += -T gnu-elf.ld |
| Code Block |
# This might change in a different environment
|
| Code Block |
OBJEXT ?= .o
|
| Code Block |
# This is the generated ELF program
|
| Code Block |
BIN = hello
|
| Code Block |
# These are the sources files that we use
|
| Code Block |
SRCS = hello.c OBJS = $(SRCS:.c=$(OBJEXT)) |
| Code Block |
# Build targets
|
| Code Block |
all: $(BIN) .PHONY: clean |
| Code Block |
$(OBJS): %$(OBJEXT): %.c $(CC) -c $(CFLAGS) $< -o $@ |
| Code Block |
$(BIN): $(OBJS) $(LD) $(LDELFFLAGS) -o $@ $^ $(STRIP) $(BIN) |
| Code Block |
clean: rm -f $(BIN) rm -f *.o |
The Linker Script
The linker script that I am using in this example, gnu-elf.ld, contains the following:
| Code Block |
|---|
SECTIONS { .text 0x00000000 : { _stext = . ; *(.text) |
...
*(.text.*) |
...
*(.gnu.warning) |
...
*(.stub) |
...
*(.glue_7) |
...
*(.glue_7t) |
...
*(.jcr) |
...
| Code Block |
|---|
_etext = . ;
}
|
| Code Block |
.rodata : { _srodata = . ; *(.rodata) |
...
*(.rodata1) |
...
*(.rodata.*) |
...
*(.gnu.linkonce.r*) |
...
| Code Block |
|---|
_erodata = . ;
}
|
| Code Block |
.data : { _sdata = . ; *(.data) |
...
*(.data1 |
...
) *(.data.*) |
...
*(.gnu.linkonce.d*) |
...
| Code Block |
|---|
_edata = . ;
}
|
| Code Block |
.bss : { _sbss = . ; *(.bss) |
...
*(.bss.*) |
...
*(.sbss) |
...
*(.sbss.*) |
...
*(.gnu.linkonce.b*) |
...
*(COMMON) |
...
| Code Block |
|---|
_ebss = . ;
}
|
| Code Block |
/* Stabs debugging sections. */
|
| Code Block |
.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) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_info 0 : { *(.debug_info) } .debug_line 0 : { *(.debug_line) } .debug_pubnames 0 : { *(.debug_pubnames) } .debug_aranges 0 : { *(.debug_aranges) } } |
Replacing an NSH Built-In Function
...