Re: How to override standard printf defined in gcc library

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Andy,

Thanks a lot, it worked. On specifying -fno-builtin-fprintf and
-fno-builtin-printf, i got the results as expected. Ya, you are right  , i
should think of using pipes as otherwise I would have to provide my own
definition of all the stream O/P functions that gcc provides (and that can
be error prone and might result in inconsistent behavior with change in gcc
version)

Thanks
Rahul


Andi Hellmund wrote:
> 
> Hey Rahul,
> 
> I can't really prove my statement by quoting the gcc source code,
> because I don't know where this kind of "transformation" happens, but it
> seems that if you call printf and fprintf without variadic arguments
> (though just a string), gcc transforms this call into a cheaper call
> than (f)printf:
> 
> printf -> puts
> fprintf -> fwrite (for the prototype, just check the man page of fwrite(3)
> 
> Alternatively, you could use the gcc compiler option -fno-builtin or
> -fno-builtin-fprintf and -fno-builtin-printf. In this case, gcc doesn't
> transfrom the calls. Then you would just have to overwrite printf and
> fprintf.
> 
> As a further alternative, you might think about using a named pipe for
> example to redirect the output to the GUI. Then you wouldn't have to
> overwrite default libc functions ...
> 
> Hope that helps,
> Andi
> 
> 
> RahulJain83 wrote:
>> Hi Kai,
>>
>> Thanks for the reply, actually you are right for printfs, and my issue
>> for
>> printfs has been resolved after defining puts too.
>>
>> But issue with fprintf still remains... can you please help.. I am
>> pasting
>> here a sample application and commands to build them -
>>
>> [code]
>> /*
>> * ======================================================================
>> *        Filename:  printf.c
>> * ======================================================================
>> */
>> #include <stdio.h>
>> #include <stdarg.h>
>> extern "C" int fprintf (FILE *__restrict __stream,
>>                 __const char *__restrict __format, ...)
>> {
>>
>>     int ret_status = 0;
>>     //printf ("Called my version of fprintf\n");
>>
>>     va_list args;
>>     va_start(args,__format);
>>     ret_status = vfprintf(__stream, __format, args);
>>     va_end(args);
>>     return ret_status;
>> }
>>
>> extern "C" int fputs (__const char *__restrict __s, FILE *__restrict
>> __stream)
>> {
>>
>>     int ret_status = 0;
>>     //printf ("Called my version of fputs\n");
>>
>>     return fprintf(__stream, "%s", __s);
>> }
>>
>> extern "C" int printf (__const char *__restrict __format, ...)
>> {
>>
>>     int ret_status = 0;
>>     //printf ("Called my version of printf\n");
>>
>>     va_list args;
>>     va_start(args,__format);
>>     ret_status = vprintf(__format, args);
>>     va_end(args);
>>     return ret_status;
>> }
>>
>> extern "C" int puts (__const char *__s)
>> {
>>
>>     int ret_status = 0;
>>     //printf ("Called my version of puts\n");
>>
>>     return printf("%s\n", __s);
>> }
>>
>> /*
>> * ======================================================================
>> *        Filename:  main.c
>> * ======================================================================
>> */
>>
>> #include <stdio.h>
>> int main (int argc, char **argv)
>> {
>>     fprintf (stdout,"This is a variable argument message - %s\n", "Rahul
>> Jain");
>>     fprintf (stdout,"This is a static argument message - Rahul Jain\n");
>>
>>     printf ("This is a variable argument message - %s\n", "Rahul Jain");
>>     printf ("This is a static argument message - Rahul Jain\n");
>>     return 0;
>> }
>> [/code] 
>>
>> Build commands (with gcc 342) 
>> /usr/local/soft/gcc/3.4.2/bin/g++ -ggdb -o printf.o -c printf.c
>> /usr/local/soft/gcc/3.4.2/bin/g++ -ggdb -o main.o -c main.c
>> /usr/local/soft/gcc/3.4.2/bin/g++ -ggdb -o a.out printf.o main.o
>>
>> Build commands (with gcc 424) 
>> /usr/local/soft/gcc/4.2.4/bin/g++ -ggdb -o printf.o -c printf.c
>> /usr/local/soft/gcc/4.2.4/bin/g++ -ggdb -o main.o -c main.c
>> /usr/local/soft/gcc/4.2.4/bin/g++ -o a.out printf.o main.o
>>
>> Please see issue comes with gcc 424 and not with gcc 342. do you have any
>> idea ? Really appreciate your help ..
>>
>> Thanks
>> Rahul
>>
>>
>> Kai Ruottu-3 wrote:
>>   
>>> RahulJain83 wrote:
>>>     
>>>> Above code works fine for following fprintf calls (that pass variable
>>>> argument list to fprintf) -
>>>>
>>>> fprintf (stdout,"This is a variable argument message - %s\n", "Rahul
>>>> Jain");
>>>>
>>>> However, for following fprintf call (that is not taking any variable
>>>> arguments), it seems fprintf from libgcc is getting picked up as then
>>>> print
>>>> comes on the screen instead of our Graphical interface window -
>>>>
>>>> fprintf (stdout,"This is a variable argument message - Rahul Jain\n");
>>>>
>>>> I am not sure why this is happening. Is fprintf implemented as macro,
>>>> such
>>>> that it is working for case1 and not for case2. Can anybody help.
>>>>   
>>>>       
>>> Please check that those 'printf()'s haven't been changed to 'puts()'s 
>>> !   Sometimes I found out that
>>> GCC produces a call to 'puts()'  instead of 'printf()' with the simple 
>>> "Hello World" program... Why
>>> it does this kind of optimization, is unclear but when this happens, 
>>> doing something similar with 'puts()'
>>> could be your workaround...
>>>
>>>
>>>     
>>
>>   
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/How-to-override-standard-printf-defined-in-gcc-library-tp26083189p26089615.html
Sent from the gcc - Help mailing list archive at Nabble.com.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux