W
wyse03br
Hi all,
Using GNU linker ld, I'd like to create a section .rom_code
grouping
some routines and all its dependencies, including the implicit called
ones such as math routines provided by libm.a. Going down in more
details, my intention is creating a stand-alone ROM image containing
several utility routines (with all its dependencies) that will be used
by programs loaded in RAM.
The C code is something like:
% cat test.c <<HERE
#include <stdio.h>
#include <math.h>
void _start() { main(); }
extern int main();
volatile float a, b, c;
volatile float res;
__attribute__((section(".rom_code"))) void rom_function();
void rom_function() {
c = a / b; // Use implicitely libm.a routine
res = sin(c); // Use explictly libm.a routine
}
int main() {
rom_function();
return 0;
}
HERE
% gcc -g test.c -lm -Wl,-T lib.lnk
Compiling and linking in the usual way, only the rom_function()
went to ROM, not its dependencies. These are the references
to .rom_code section, only the
rom_function() routine can be found there:
% objdump -x a.out | grep rom_code
7 .rom_code 00000070 00008000 00008000 00018000 2**2
00008000 l d .rom_code 00000000
00008000 g F .rom_code 00000070 rom_function
The sin() was placed in .text and not in .rom_code:
% objdump -x a.out | grep sin
00000000 l df *ABS* 00000000 s_sin.c
00000000 l df *ABS* 00000000 k_sin.c
00001438 g F .text 000000f8 __kernel_sin
00000514 g F .text 000000ec sin
The linker script used is:
MEMORY
{
RAM_CODE : o = 0x0000 , l = 0x8000
ROM_CODE : o = 0x8000 , l = 0x8000
}
SECTIONS
{
.bss : { *(.bss) } > RAM_CODE
.sbss : { *(.sbss) } > RAM_CODE
.rodata : { *(.rodata*) } > RAM_CODE
.got2 : { *(.got*) } > RAM_CODE
.data : { *(.data) } > RAM_CODE
.sdata : { *(.sdata*) } > RAM_CODE
.text : { *(.text .text.*) } > RAM_CODE
.rom_code : { *(.rom_code) } > ROM_CODE
}
Any ideas on how to put also the rom_function() dependencies into
ROM?
Tks
Walter
Using GNU linker ld, I'd like to create a section .rom_code
grouping
some routines and all its dependencies, including the implicit called
ones such as math routines provided by libm.a. Going down in more
details, my intention is creating a stand-alone ROM image containing
several utility routines (with all its dependencies) that will be used
by programs loaded in RAM.
The C code is something like:
% cat test.c <<HERE
#include <stdio.h>
#include <math.h>
void _start() { main(); }
extern int main();
volatile float a, b, c;
volatile float res;
__attribute__((section(".rom_code"))) void rom_function();
void rom_function() {
c = a / b; // Use implicitely libm.a routine
res = sin(c); // Use explictly libm.a routine
}
int main() {
rom_function();
return 0;
}
HERE
% gcc -g test.c -lm -Wl,-T lib.lnk
Compiling and linking in the usual way, only the rom_function()
went to ROM, not its dependencies. These are the references
to .rom_code section, only the
rom_function() routine can be found there:
% objdump -x a.out | grep rom_code
7 .rom_code 00000070 00008000 00008000 00018000 2**2
00008000 l d .rom_code 00000000
00008000 g F .rom_code 00000070 rom_function
The sin() was placed in .text and not in .rom_code:
% objdump -x a.out | grep sin
00000000 l df *ABS* 00000000 s_sin.c
00000000 l df *ABS* 00000000 k_sin.c
00001438 g F .text 000000f8 __kernel_sin
00000514 g F .text 000000ec sin
The linker script used is:
MEMORY
{
RAM_CODE : o = 0x0000 , l = 0x8000
ROM_CODE : o = 0x8000 , l = 0x8000
}
SECTIONS
{
.bss : { *(.bss) } > RAM_CODE
.sbss : { *(.sbss) } > RAM_CODE
.rodata : { *(.rodata*) } > RAM_CODE
.got2 : { *(.got*) } > RAM_CODE
.data : { *(.data) } > RAM_CODE
.sdata : { *(.sdata*) } > RAM_CODE
.text : { *(.text .text.*) } > RAM_CODE
.rom_code : { *(.rom_code) } > ROM_CODE
}
Any ideas on how to put also the rom_function() dependencies into
ROM?
Tks
Walter