Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

Re: [lpc2000] Re: Problems with sting constants and gcc -On

2005-10-18 by Robert Adsett

At 01:51 AM 10/18/05 +0000, embeddedjanitor wrote:
>--- In lpc2000@yahoogroups.com, "Guillermo Prandi" <yahoo.messenger@m
>...> wrote:
> >
> > I too gave a suspicious look at the startup code. But the thing is,
> > in order to copy the modifiable data to RAM it must be in the ROM in
> > the first place! It doesn't show in the lst file, whilst puts()
> > parameters do.
>
>They will be in a different area.

Good point.


>A constant string will be on the rommable constants area (.rodata in
>GNU talk).
>
>A modifiable string will be in the data initialisation section (.data
>in GNU talk). This is rommed, but is copied into RAM for the
>execution.
>
> >
> > I tried giving a const to the function's declaration, with no luck.
>
>No luck expected :-). consting a function just says that the function
>will not try to modify the string that it is passed. It does not
>modify the placement of the string.

But it will make a difference in this case.

Case 1:
void myfun( char *);

myfun("test");

In this case we have a pointer to a modifiable string and therefore in ram.

Case 2:

void myfun( const char *)

myfun("test");

In this case we have a pointer to a non modifiable string and which can be 
in flash.  If this isn't true then printf wouldn't work given your above 
and the OP has already stated that

printf("test");

works.

In the third case

void myfun( const char *);
void myfun2( char *);
char * f = "test";

myfun(f);
myfun2(f);

The source is the same and whether the argument is const makes no difference.

I think your diagnosis is likely right unless Case 2 above behaves 
differently then printf.  If it does something else is going on.

> > However, I narrowed down the problem to auto-inlining: if I move the
> > do_something() function to another source (I was testing with an
> > empty body on the function!), the strings do show in the .data. This
> > kinda makes sense, since the compiler realized that there was no
> > point for that constant to be in the code in the first place. What

Um, well yeah, with

static void myfunc( const char *)
{
}

func()
{
myfunc("test");
}

the compiler could quite legitimately optimize myfunc out of 
existence.  Even if it wasn't declared as a static function the compiler 
could optimize the call away and leave the hook for any external callers. I 
was sort of assuming you actually did something with the string, otherwise 
how would you notice?  Checking for a Copyright in the image maybe?

Robert


" 'Freedom' has no meaning of itself.  There are always restrictions,   be 
they legal, genetic, or physical.  If you don't believe me, try to chew a 
radio signal. "  -- Kelvin Throop, III
http://www.aeolusdevelopment.com/

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.