How to get printf() output?

Toralf Lund toralf@procaptura.com
Thu Sep 25 14:21:00 GMT 2003


Kai Ruottu wrote:

>Toralf Lund <toralf@procaptura.com>
>
>  
>
>>It works. I'm 100% sure about that. write() could be incorrect, as I 
>>haven't tested its functionality thoroughly - I've been focusing on 
>>checking whether it is called or not, and I think it isn't ;-(
>>    
>>
>
> I produced my test executable with gcc-2.95.3 when the 'specs' in my
>gcc-3.3.1 hadn't any default target board edited into it...
>
> The peculiar thing with gcc-3.x has been that it magically replaces
>'printf()'s with 'puts()', ie. "printf("Hello World");" will be changed
>to be "puts("Hello World");". Producing the assembly file shows this:
>  
>

[ ... ]

>
>when gcc-2.95.3 still didn't edit whole functions away...
>  
>
That's fun ;-)

I'm using gcc-2.95.3, though, as the code doesn't compile yet with 
gcc-3.1 and/or I didn't find out how to disable some of the strict 
checking that causes the failure...

> So maybe you even haven't the 'printf()' in your executable but
>something else and that really doesn't output via 'write()' at all...
>
> In this "Hello World" case the 'replaced printf()'s, also output'ed
>via '_write_r()' and then via 'write()', ie. these were linked into
>the executable, so replacing 'printf()'s with 'puts()'s isn't the
>reason for your problem...
>
> Looking at the assembly output for the C code and seeing whether those
>printf()'s are replaced with something else, can be one way to find
>some sanity... In my "Hello World" case one looking at the disassembly
>listing and trying to find the call to 'printf()' from it, could lead
>into one soon going up the walls ;-)
>  
>
A bit like looking at the source code of printf and its friends and try 
to figure out how it all works, or try to trace its functionality via 
the disassembler output, I guess...

Anyhow: I just figured it out. I had by mistake left the following 
function around in one of the C files:

int fflush(fp)
int fp;                /* dummy argument */
{
  /* do nothing */

  return 0;
}

This was required earlier when using a different clib.c. When removing 
this, everything works fine. Don't ask me why. Stranger still, it turned 
out that the printf() didn't fail completely in the original version, 
but would somehow mimic the sprintf() behaviour, so I could get my 
output by sticking a character buffer in front of the format string, and 
subsequently write this to the TTY.

- Toralf


------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com



More information about the crossgcc mailing list