![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
всем привет.
в некотором коде встретил такое:
объясните плиз простыми словами, что это такое, для чего оно нужно, и как оно работает. доку читал. только добавилось больше вопросов. спасибо. Это сообщение отредактировал(а) boostcoder - 18.10.2011, 11:19 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
||||
|
||||
MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
смотри
выводит адрес
выводит (nil) т. е. weakref символу присваивается значение 0 (если, объект занимает N байт, то все N байт нулевые) если символ, на который он ссылается - не определен иначе он ссылается на символ, который определен если вместо __weakref__ заюзать __alias__, то компилятор во втором случае ругнется
работает очень просто - каждый weakref символ с т. з. формата ELF имеет атрибут WEAK и если линковщик не может найти target-объект, он _не_ ругается, а обнуляет символ область применения каждый определяет для себя сам ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
MAKCim, все понятно. спасибо
![]() |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Добавлю еще - если линковщик находит 2 одинаковых символа, и один из них weak, то он тоже не ругается, а молча использует не-weak. Используется для того, что бы сделать в библиотеке (например) функции - заглушки. По хорошему их должен реализовать пользователь библиотеки, но он может этого и не делать, такой вот сервис ![]() |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
xvr, понятно. собственно у меня segfolt именно из-за weak ссылок, потому что есть ссылка на sched_yield, реализации которой не существует. можете представить сколько крови было выпито пока я понял в чем ошибка. а без weak ссылок, я бы получил ошибку еще во время линковки.
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
подскажите, каким "инструментом" можно определить что ссылка ни на что не указывает? кроме как в рантайме вызывать каждую функцию?
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
&function == NULL как-то так -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
неее, MAKCim. это же придется писать тест, в котором проверять адрес каждой функции.
я имел ввиду другой инструмент. который, к примеру, покажет нулевые ссылки в объектнике/статической_библиотеке/динамической_библиотеке. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
есть тулзы readelf, nm
стоит посмотреть, может они что-то похожее делают если нет, видимо, только самому парсить ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
objdump -t <исполняемый файл>
В том, что выдаст, искать символы с типом U |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
boostcoder,
можно как сказал xvr, но это только если все символы должны резолвиться после линковки с shared либами точно узнать можно только так или иначе осуществив динамическую линковку -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
||||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |