Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > объясните плиз __attribute__ и __weakref__


Автор: boostcoder 17.10.2011, 15:10
всем привет.

в некотором коде встретил такое:
Код

static __typeof(sched_yield) __gthrw_sched_yield __attribute__ ((__weakref__("sched_yield")));

объясните плиз простыми словами, что это такое, для чего оно нужно, и как оно работает.
доку читал. только добавилось больше вопросов.

спасибо.

Автор: boostcoder 17.10.2011, 16:02
дока: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
смотреть с конца.

Автор: MAKCim 18.10.2011, 14:28
смотри

Код

#include <unistd.h>
#include <stdio.h>

__attribute__((__weakref__("close")))
static __typeof__(close) my_close;

int main()
{
    printf("%p\n", &my_close);
    return 0;
}

выводит адрес

Код

#include <unistd.h>
#include <stdio.h>

__attribute__((__weakref__("reference_to_undefined_function")))
static __typeof__(close) my_close;

int main()
{
    printf("%p\n", &my_close);
    return 0;
}

выводит (nil)

т. е. weakref символу присваивается значение 0 (если, объект занимает N байт, то все N байт нулевые)
если символ, на который он ссылается - не определен
иначе он ссылается на символ, который определен

если вместо __weakref__ заюзать __alias__, то компилятор во втором случае ругнется
Цитата

‘my_close’ aliased to undefined symbol ‘close’


работает очень просто - каждый weakref символ с т. з. формата ELF имеет атрибут WEAK
и если линковщик не может найти target-объект, он _не_ ругается, а обнуляет символ

область применения каждый определяет для себя сам  smile 

Автор: boostcoder 18.10.2011, 14:42
MAKCim, все понятно. спасибо smile 

Автор: xvr 18.10.2011, 16:20
Цитата(MAKCim @  18.10.2011,  14:28 Найти цитируемый пост)
работает очень просто - каждый weakref символ с т. з. формата ELF имеет атрибут WEAK
и если линковщик не может найти target-объект, он _не_ ругается, а обнуляет символ

Добавлю еще - если линковщик находит 2 одинаковых символа, и один из них weak, то он тоже не ругается, а молча использует не-weak. 
Используется для того, что бы сделать в библиотеке (например) функции - заглушки. По хорошему их должен реализовать пользователь библиотеки, но он может этого и не делать, такой вот сервис  smile 

Автор: boostcoder 18.10.2011, 16:38
xvr, понятно. собственно у меня segfolt именно из-за weak ссылок, потому что есть ссылка на sched_yield, реализации которой не существует. можете представить сколько крови было выпито пока я понял в чем ошибка. а без weak ссылок, я бы получил ошибку еще во время линковки.

Автор: boostcoder 30.10.2011, 15:54
подскажите, каким "инструментом" можно определить что ссылка ни на что не указывает? кроме как в рантайме вызывать каждую функцию?

Автор: MAKCim 30.10.2011, 16:14
Цитата(boostcoder @  30.10.2011,  15:54 Найти цитируемый пост)
подскажите, каким "инструментом" можно определить что ссылка ни на что не указывает? кроме как в рантайме вызывать каждую функцию? 

&function == NULL

как-то так

Автор: boostcoder 30.10.2011, 18:53
неее, MAKCim. это же придется писать тест, в котором проверять адрес каждой функции.
я имел ввиду другой инструмент. который, к примеру, покажет нулевые ссылки в объектнике/статической_библиотеке/динамической_библиотеке.

Автор: MAKCim 31.10.2011, 14:08
есть тулзы readelf, nm
стоит посмотреть, может они что-то похожее делают
если нет, видимо, только самому парсить  smile 

Автор: xvr 31.10.2011, 14:55
objdump -t <исполняемый файл>
В том, что выдаст, искать символы с типом U

Автор: MAKCim 31.10.2011, 15:32
boostcoder
можно как сказал xvr
но это только если все символы должны резолвиться после линковки
с shared либами точно узнать можно только так или иначе осуществив динамическую линковку

Автор: boostcoder 31.10.2011, 15:37
Цитата(MAKCim @  31.10.2011,  15:32 Найти цитируемый пост)
с shared либами точно узнать можно только так или иначе осуществив динамическую линковку

да. понял, уже после того как написал)

xvr, чуть позже опробую.

Автор: xvr 31.10.2011, 15:40
Цитата(MAKCim @  31.10.2011,  15:32 Найти цитируемый пост)
с shared либами точно узнать можно только так или иначе осуществив динамическую линковку 

Угу, для них можно попробовать ldd -d -r -v <file> 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)