symbol duplication problem with -O0
Ian Lance Taylor
iant@google.com
Fri Jun 12 21:58:00 GMT 2009
이종필 <beleief@gmail.com> writes:
> I have a question about optimization option.
> When i write/build a test code, system call symbol is different
> according to optimization option.
Yes. When optimizing, in some cases gcc will replace a call to a known
library function with a call to a different known library function.
> int main(void) {
> struct stat buf;
> if ( stat("test.txt", &buf) < 0 ) {
> printf("error\n");
> } else {
> printf("stat success\n");
> }
> return 0;
> }
>
> 1. with -O0
>
> $ gcc -O0 -c main.c
> $ nm main.o
> 0000000000000000 T main
> U puts
> U stat
> $
>
>
> 2. with -O2
> $ gcc -O2 -c main.c
> $ nm main.o
> U __xstat
> 0000000000000000 T main
> U puts
>
> I don't know why symbol results are different.
When gcc is optimizing, and sees a call to printf with a string with no
% characters ending in a newline, it changes the call to use puts
instead.
> Which gcc option in -O1/-O2 make __xstat symbol?
This one is not gcc, actually; it is glibc. When glibc is compiled with
optimization, it turns stat into an inline function which calls __xstat.
See <sys/stat.h>.
> I think using -O0 can make a problem.
>
> ex)
> main.c : stat() system call usage
> test.c : stat variable declaration(of course, it's not a good declaration).
> gcc -O0 main.c test.c
>
> In this case, stat in main.c will refer stat symbol in test.c.
> It's a problem.
> Which option prevents this problem when -O0 is used?
This code is broken, because you are trying to call a variable as a
function. Nothing prevents that problem at -O0. You will get a crash
at runtime.
Ian
More information about the Gcc-help
mailing list