How to get printf() output?
Toralf Lund
toralf@procaptura.com
Thu Sep 25 10:20:00 GMT 2003
Kai Ruottu wrote:
>Toralf Lund <toralf@procaptura.com> wrote:
>
>
>
>>Ken Rose wrote:
>>
>>
>>
>>>Toralf Lund wrote:
>>>
>>>
>>>
>>>>Can someone repeat for me what I should do to get printf() to work
>>>>when linking with newlib, but not libgloss? I was under the
>>>>impression that write() would be called eventually, but it looks like
>>>>it isn't. I've tried step-tracing the printf execution via the ROM
>>>>monitor to find out what is going on, but it's a bit hard to follow...
>>>>
>>>>
>
> One can track the 'execution' even without any monitor, hardware etc., by
>simply making a disassembly output from the produced executable and then
>searching 'write', which one knows being the 'low-level I/O' routine needed.
>
>
I know how write() works, I just don't think it's called at all. And
printf() is quite hard to trace in disassembler output as the routine
doesn't go directly to write() or or anything; there are about a zillion
intermediate steps.
> The 'write()' in libgloss seems to use the 'outbyte()' which writes one
>char at a time to the serial port (via the monitor on the board):
>
>
[ ... ]
I have my own write() that does the same thing.
>
> The usual way to make a disassembly listing is to use the :
>
> m68k-elf-objdump -dr <executable-name>
>
>
Yep, I've tried that already.
>command (and redirecting it to 'less' etc.)...
>
> Instead of doing this kind of 'reverse engineering', one can also
>look at the sources (or the provided documentation) for newlib,
>here 'libgloss/write.c' :
>
>
[ ... ]
> If you didn't use the previous 'monkey-like' approach in your low-level
>I/O-implementation, ie. not using the provided 'write()' etc. and then
>writing your own 'outbyte()', 'inbyte()' etc., basically you are on your
>own. Otherwise you could simply show your 'outbyte()' and ask what is
>wrong with it...
>
>
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 ;-(
>
>
>>>If isatty() claims that stdout isn't a tty, then printf will buffer
>>>the output. The quick way to test this theory is to do fflush(0) to
>>>push all the putput out.
>>>
>>>
>>isatty() should be correct, and I've also tried fflush(0), but still no
>>output...
>>
>>
>
> I'm not that much familiar with the m68k-support, so I would use the
>'monkey-like' approach if needing to implement the I/O-routines for
>something new...
>
>
Well, like I said: The problem is not implementing the I/O routines as
such, it's figuring out if and when they are called.
> So my advice is that you would check your I/O-implementation once
>again, the bug most probably is there...
>
>
Possibly, but I'd really like to know how everything is supposed to work
on a higher level than that.
- 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