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