Jakub Bogusz pisze: > On Mon, Jun 04, 2007 at 07:20:20AM +0200, Paweł Sikora wrote: >> On Sunday 03 of June 2007 22:35:43 Jakub Bogusz wrote: >> >>> if (likely(_stdio_init != NULL)) >>> _stdio_init(); >>> >>> ten warunek jakoś się optymalizuje do true, przez co bezwarunkowo >>> wywołuje _stdio_init(), >> the address of ???_stdio_init??? will always evaluate as ???true???. > > Co tak pisze? Bo nie gcc 4.1.2 ani 4.2.0 przy kompilacji uClibc. > -Wall jest w użyciu. > Bez __attribute__((weak)) dla _stdio_init() by miał do tego prawo (choć > też nie zgłasza, optymalizuje po cichu). > >> tam trzeba uzyc wskaznika do funkcji, zeby to dzialalo poprawnie. > > Do tej pory to była działająca konstrukcja do sprawdzania, czy symbol > z atrybutem "weak" został rozwiązany.
i z weak nadal dziala: extern void _f() __attribute__((visibility("hidden"))); void f() { if ( _f ) _f(); } extern void _g() __attribute__((weak)); void g() { if ( _g ) _g(); } $ gcc -Wall t.c -O2 -S -fdump-tree-optimized t.c: In function 'f': t.c:4: warning: the address of '_f' will always evaluate as 'true' $ cat t.c.099t.optimized g () { if (_g != 0B) goto <L0>; else goto <L1>; <L0>:; _g () [tail call]; <L1>:; return; } f () { _f () [tail call]; return; } _______________________________________________ pld-devel-pl mailing list pld-devel-pl@lists.pld-linux.org http://lists.pld-linux.org/mailman/listinfo/pld-devel-pl