Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Программирование под Unix/Linux > объясните плиз __attribute__ и __weakref__ |
Автор: boostcoder 17.10.2011, 15:10 | ||
всем привет. в некотором коде встретил такое:
объясните плиз простыми словами, что это такое, для чего оно нужно, и как оно работает. доку читал. только добавилось больше вопросов. спасибо. |
Автор: boostcoder 17.10.2011, 16:02 |
дока: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html смотреть с конца. |
Автор: MAKCim 18.10.2011, 14:28 | ||||||
смотри
выводит адрес
выводит (nil) т. е. weakref символу присваивается значение 0 (если, объект занимает N байт, то все N байт нулевые) если символ, на который он ссылается - не определен иначе он ссылается на символ, который определен если вместо __weakref__ заюзать __alias__, то компилятор во втором случае ругнется
работает очень просто - каждый weakref символ с т. з. формата ELF имеет атрибут WEAK и если линковщик не может найти target-объект, он _не_ ругается, а обнуляет символ область применения каждый определяет для себя сам ![]() |
Автор: boostcoder 18.10.2011, 14:42 |
MAKCim, все понятно. спасибо ![]() |
Автор: boostcoder 18.10.2011, 16:38 |
xvr, понятно. собственно у меня segfolt именно из-за weak ссылок, потому что есть ссылка на sched_yield, реализации которой не существует. можете представить сколько крови было выпито пока я понял в чем ошибка. а без weak ссылок, я бы получил ошибку еще во время линковки. |
Автор: boostcoder 30.10.2011, 15:54 |
подскажите, каким "инструментом" можно определить что ссылка ни на что не указывает? кроме как в рантайме вызывать каждую функцию? |
Автор: MAKCim 30.10.2011, 16:14 | ||
&function == NULL как-то так |
Автор: boostcoder 30.10.2011, 18:53 |
неее, MAKCim. это же придется писать тест, в котором проверять адрес каждой функции. я имел ввиду другой инструмент. который, к примеру, покажет нулевые ссылки в объектнике/статической_библиотеке/динамической_библиотеке. |
Автор: MAKCim 31.10.2011, 14:08 |
есть тулзы readelf, nm стоит посмотреть, может они что-то похожее делают если нет, видимо, только самому парсить ![]() |
Автор: xvr 31.10.2011, 14:55 |
objdump -t <исполняемый файл> В том, что выдаст, искать символы с типом U |
Автор: MAKCim 31.10.2011, 15:32 |
boostcoder, можно как сказал xvr, но это только если все символы должны резолвиться после линковки с shared либами точно узнать можно только так или иначе осуществив динамическую линковку |
Автор: boostcoder 31.10.2011, 15:37 | ||
да. понял, уже после того как написал) xvr, чуть позже опробую. |
Автор: xvr 31.10.2011, 15:40 | ||
Угу, для них можно попробовать ldd -d -r -v <file> |