| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > Как предотвратить краш при старой glibc? |
| Автор: flagist0 29.10.2007, 15:11 |
| Хелп плиз! Есть программа, использующая inotify (его поддержка появилась в glibc 2.4). На целевой системе будет запускаться уже собранный под glibc 2.5 бинарник . Если в системе более старая версия, где упадет прога - при проверке загрузчиком символов из таблицы импорта или при первом вызове функции, которой нет в библиотеке? Если первое, то есть ли возможность как-нибудь все-таки предотвратить выпад в кору и передать управление дальше? Проблема в том, что у меня нет полного доступа к опциям сборки - я делаю только с++овый класс-оболочку над inotify. То есть мой максимум - сделать проверку версий в конструкторе и корректный выход. К сожалению, у меня нет возможности ставить старую версию glibc - на системе еще работать и работать |
| Автор: JackYF 29.10.2007, 15:46 |
она просто не загрузится. На этапе проверки ld выдаст ошибку, мол, не найдена разделяемая библиотека. итого |
| Автор: MAKCim 29.10.2007, 19:09 | ||||||||||
| JackYF, ты не прав LD по-умолчанию использует lazy-стратегию разрешения ссылок на внешние символы т. е LD не парсит .rela.plt секцию исполняемого файла, чтобы поставить во взаимно-однозначное соответствие элементы секций .plt и .got.plt при первом вызове функции, определенной во внешней библиотеке, управление переходит на соответствующий этой функции элемент .plt этот элемент содержит код, первая инструкция которого - косвенный переход на адрес, записанный в соответствующем данной функции элементе .got.plt при первом вызове этот адрес - адрес второй инструкции элемента .plt далее в стек записывается дополнительная информация для того, чтобы LD мог произвести раскрутку стека и определить, к какой функции было обращение далее идет переход по адресу, записанному во 2-ом элементе .got.plt при передаче управления на _start, LD записывает туда адрес своей функции, которая при передаче управления на нее (через 2-ой элемент .got.plt исполняемого файла) записывает в элемент .got.plt исполняемого файла (который соответствует нужной функции) реальный линейный адрес этой функции к чему это я никакой ошибки не будет если не задана переменная среды LD_BIND_NOW которая отменяет lazy-стратегию и парсинг .rela.plt происходит до первого вызова функции пример
далее изменяем shared.c таким образом
запускаем main и...все работает |
| Автор: JackYF 29.10.2007, 19:34 | ||||
почему
выводит
? В таком случае - конечно, типа всё есть... Добавлено через 1 минуту и 23 секунды Кроме того... получается, что если одна из редко используемых разделяемых библиотек отсутствует, то программа может даже выполнить какую-то работу, прежде чем упасть? |
| Автор: JackYF 29.10.2007, 22:17 |
да ты же можешь у себя проверить спасибо, буду знать. Надо же... |
| Автор: MAKCim 29.10.2007, 22:23 | ||
у меня с зависимостями все в порядке |
| Автор: Бонифаций 29.10.2007, 22:37 |
| может проще статически собрать с нужным glibc? |
| Автор: JackYF 29.10.2007, 23:31 |
в смысле, что у тебя shared.so указывается в выводе ldd? |
| Автор: GrayCardinal 30.10.2007, 07:13 |
| flagist0, Может стоит dlopen(3) заюзать ? |
| Автор: MAKCim 30.10.2007, 10:25 | ||
| GrayCardinal, дело говорит
|