comp.lang.c
[Top] [All Lists]

How to group objects from static library in a section?

Subject: How to group objects from static library in a section?
From:
Date: Thu, 27 Mar 2008 10:02:17 -0700 PDT
Newsgroups: comp.lang.c

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

<Prev in Thread] Current Thread [Next in Thread>
Privacy Policy