* why ld return with error?
@ 2011-01-31 5:02 ali hagigat
2011-01-31 7:17 ` Ian Lance Taylor
0 siblings, 1 reply; 4+ messages in thread
From: ali hagigat @ 2011-01-31 5:02 UTC (permalink / raw)
To: Ian Lance Taylor, binutils
I have the following files:
prog3.c
#include <stdio.h>
main(){
printf("uuuuuu\n");
}
prog3.ld
ASSERT(1,"there is not an error");
Then :
gcc -c prog3.c -o prog3.o
ld prog3.o prog3.ld -o prog3
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048074
prog3.o: In function `main':
prog3.c:(.text+0x11): undefined reference to `puts'
------------------------------------------------------------------------
I want to force gcc (or ld) to use its built-in functions as printf
and puts(not to use the standard library functions like libc.a or
libc.so). how can i do it?
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: why ld return with error?
2011-01-31 5:02 why ld return with error? ali hagigat
@ 2011-01-31 7:17 ` Ian Lance Taylor
2011-01-31 8:28 ` ali hagigat
0 siblings, 1 reply; 4+ messages in thread
From: Ian Lance Taylor @ 2011-01-31 7:17 UTC (permalink / raw)
To: ali hagigat; +Cc: binutils
ali hagigat <hagigatali@gmail.com> writes:
> I have the following files:
> prog3.c
> #include <stdio.h>
> main(){
> printf("uuuuuu\n");
> }
> prog3.ld
> ASSERT(1,"there is not an error");
> Then :
> gcc -c prog3.c -o prog3.o
> ld prog3.o prog3.ld -o prog3
>
> ld: warning: cannot find entry symbol _start; defaulting to 0000000008048074
> prog3.o: In function `main':
> prog3.c:(.text+0x11): undefined reference to `puts'
> ------------------------------------------------------------------------
> I want to force gcc (or ld) to use its built-in functions as printf
> and puts(not to use the standard library functions like libc.a or
> libc.so). how can i do it?
gcc by default optimizes printf of a string constant ending in a newline
to call puts instead. To disable that, use -fno-builtin-printf when
compiling.
I don't understand what you mean when you say that you want gcc to use
its built-in functions as printf rather than the standard library
functions. gcc has no built-in printf function.
Ian
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: why ld return with error?
2011-01-31 7:17 ` Ian Lance Taylor
@ 2011-01-31 8:28 ` ali hagigat
2011-01-31 9:00 ` Dave Korn
0 siblings, 1 reply; 4+ messages in thread
From: ali hagigat @ 2011-01-31 8:28 UTC (permalink / raw)
To: Ian Lance Taylor, binutils
Thank you for the reply. I think that GCC compiler collection has the
definitions and C code of some standard libraries. It means that the
code of printf exists inside the code of gcc and gcc does not need to
go to /usr/bin on hard disk to find libc.a and then find the defintion
and the body of printf.
Is that right? or I am mistaken?
If I am mistaken what will be the meaning of -fno-builtin then? I
think the code of built-in functions exist inside the code segment of
gcc when it is invoked.
Regards
On Mon, Jan 31, 2011 at 10:47 AM, Ian Lance Taylor <iant@google.com> wrote:
> ali hagigat <hagigatali@gmail.com> writes:
>
>> I have the following files:
>> prog3.c
>> #include <stdio.h>
>> main(){
>> printf("uuuuuu\n");
>> }
>> prog3.ld
>> ASSERT(1,"there is not an error");
>> Then :
>> gcc -c prog3.c -o prog3.o
>> ld prog3.o prog3.ld -o prog3
>>
>> ld: warning: cannot find entry symbol _start; defaulting to 0000000008048074
>> prog3.o: In function `main':
>> prog3.c:(.text+0x11): undefined reference to `puts'
>> ------------------------------------------------------------------------
>> I want to force gcc (or ld) to use its built-in functions as printf
>> and puts(not to use the standard library functions like libc.a or
>> libc.so). how can i do it?
>
> gcc by default optimizes printf of a string constant ending in a newline
> to call puts instead. To disable that, use -fno-builtin-printf when
> compiling.
>
> I don't understand what you mean when you say that you want gcc to use
> its built-in functions as printf rather than the standard library
> functions. gcc has no built-in printf function.
>
> Ian
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: why ld return with error?
2011-01-31 8:28 ` ali hagigat
@ 2011-01-31 9:00 ` Dave Korn
0 siblings, 0 replies; 4+ messages in thread
From: Dave Korn @ 2011-01-31 9:00 UTC (permalink / raw)
To: ali hagigat; +Cc: Ian Lance Taylor, binutils
On 31/01/2011 08:28, ali hagigat wrote:
> Thank you for the reply. I think that GCC compiler collection has the
> definitions and C code of some standard libraries. It means that the
> code of printf exists inside the code of gcc and gcc does not need to
> go to /usr/bin on hard disk to find libc.a and then find the defintion
> and the body of printf.
> Is that right? or I am mistaken?
> If I am mistaken what will be the meaning of -fno-builtin then? I
> think the code of built-in functions exist inside the code segment of
> gcc when it is invoked.
GCC's built-ins are an internal mechanism by which the compiler can "know"
enough about what goes on inside a function such as printf to be able to
optimise it - in some but not all cases - but ultimately they rely on the
underlying functionality of the system's C library. They're kind of synthetic
inline wrappers around the real functions, that in some cases can be
simplified during expansion. They don't actually have the functionality that
the C library supplies; you could picture the builtin printf as being
something roughly like this:
int builtin_printf (const char *fmt, ...) __attribute__ ((__always_inline__))
{
if (__builtin_constant_p (fmt)
&& (strcmp (fmt, "%s") == 0 || strchr (fmt, "%") == NULL))
{
if (strcmp (fmt, "%s") == 0)
{
str = GET_FIRST_VARARG();
}
else
{
str = fmt;
}
/* If the string was "", printf does nothing. */
if (str[0] == '\0')
return 0;
/* If the string has length of 1, call putchar. */
if (str[1] == '\0)
{
builtin_putchar (fmt[0]);
return 1;
}
/* If the string was "string\n", call puts("string"). */
. . .
/* Other optimisations etc. */
. . .
}
/* Can't optimise it if we don't know the format string at compile
time, so pass it through to the . */
return __builtin_apply (printf, __builtin_apply_args(), GET_VARARGS_SIZE());
}
When the compiler comes to inline this into a function that is calling
printf, it will end up either optimising the whole thing away into a call to
the C lib's underlying printf function, or translate it into a call with
modified args to builtin_putchar or builtin_puts, which each may also make
further transformations or just optimise away into a libcall likewise. So in
the end all the actual functionality still has to come from the C library anyway.
cheers,
DaveK
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-01-31 9:00 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-31 5:02 why ld return with error? ali hagigat
2011-01-31 7:17 ` Ian Lance Taylor
2011-01-31 8:28 ` ali hagigat
2011-01-31 9:00 ` Dave Korn
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).