Chyba zepuste uClibc na TH - lvm2 i device-mapper

Paweł Sikora pluto w agmk.net
Pon, 4 Cze 2007, 08:52:09 CEST


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;
}



Więcej informacji o liście dyskusyjnej pld-devel-pl