Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как предотвратить краш при старой glibc? Загрузится ли прога со старой glibc? 
:(
    Опции темы
flagist0
Дата 29.10.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.10.2007

Репутация: нет
Всего: нет



Хелп плиз!
Есть программа, использующая inotify (его поддержка появилась в glibc 2.4). На целевой системе будет запускаться уже собранный под glibc  2.5 бинарник . Если в системе более старая версия, где  упадет прога - при проверке загрузчиком символов из таблицы импорта или при первом вызове функции, которой нет в библиотеке? Если первое, то есть ли возможность как-нибудь все-таки предотвратить выпад в кору и передать управление дальше? Проблема в том, что у меня нет полного доступа к опциям сборки - я делаю только с++овый класс-оболочку над inotify. То есть мой максимум - сделать проверку версий в конструкторе и корректный выход. 
К сожалению, у меня нет возможности ставить старую версию glibc - на системе еще работать и работать smile Есть какие-нибудь соображения по поводу?
PM MAIL GTalk   Вверх
JackYF
Дата 29.10.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(flagist0 @  29.10.2007,  15:11 Найти цитируемый пост)
Если в системе более старая версия

она просто не загрузится. На этапе проверки ld выдаст ошибку, мол, не найдена разделяемая библиотека.

итого
Цитата(flagist0 @  29.10.2007,  15:11 Найти цитируемый пост)
при проверке загрузчиком символов из таблицы импорта




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 29.10.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



JackYF, 
ты не прав
LD по-умолчанию использует lazy-стратегию разрешения ссылок на внешние символы
т. е LD не парсит .rela.plt секцию исполняемого файла, чтобы поставить во взаимно-однозначное соответствие элементы секций .plt и .got.plt
при первом вызове функции, определенной во внешней библиотеке, управление переходит на соответствующий этой функции элемент .plt
этот элемент содержит код, первая инструкция которого - косвенный переход на адрес, записанный в соответствующем данной функции элементе .got.plt
при первом вызове этот адрес - адрес второй инструкции элемента .plt
далее в стек записывается дополнительная информация для того, чтобы LD мог произвести раскрутку стека и определить, к какой функции было обращение
далее идет переход по адресу, записанному во 2-ом элементе .got.plt
при передаче управления на _start, LD записывает туда адрес своей функции, которая при передаче управления на нее (через 2-ой элемент .got.plt исполняемого файла) записывает в элемент .got.plt исполняемого файла (который соответствует нужной функции) реальный линейный адрес этой функции
к чему это я  smile 
никакой ошибки не будет если не задана переменная среды LD_BIND_NOW
которая отменяет lazy-стратегию и парсинг .rela.plt происходит до первого вызова функции
пример
Код

/* shared.c */

int foo() {
    return 0;
}

Код

/* main.c */
int test() {
    return foo();
}

int main() {
    return 0;
}

Код

# gcc -fPIC -c shared.c
# gcc -fPIC -shared -o libshared.so shared.o
# gcc main.c -o main -L. -lshared

далее изменяем shared.c таким образом
Код

/* shared.c */

int bar() {
    return 0;
}

Код

# gcc -fPIC -c shared.c
# gcc -fPIC -shared -o libshared.so shared.o

запускаем main и...все работает

Это сообщение отредактировал(а) MAKCim - 29.10.2007, 19:10


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 29.10.2007, 19:34 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



smile так, стоп.

почему

Цитата

ldd main.e


выводит

Цитата

linux-gate.so.1 =>  (0x0048a000)
        libc.so.6 => /lib/libc.so.6 (0x00110000)
        /lib/ld-linux.so.2 (0x00458000)

? В таком случае - конечно, типа всё есть...

Добавлено через 1 минуту и 23 секунды
Кроме того... получается, что если одна из редко используемых разделяемых библиотек отсутствует, то программа может даже выполнить какую-то работу, прежде чем упасть?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 29.10.2007, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(JackYF @  29.10.2007,  19:34 Найти цитируемый пост)
Кроме того... получается, что если одна из редко используемых разделяемых библиотек отсутствует, то программа может даже выполнить какую-то работу, прежде чем упасть?

угу
поэтому и есть LD_BIND_NOW

Добавлено через 56 секунд
Цитата(JackYF @  29.10.2007,  19:34 Найти цитируемый пост)
выводит

что такое main.e?
собранная по моей схеме программа?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 29.10.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(MAKCim @  29.10.2007,  22:06 Найти цитируемый пост)
собранная по моей схеме программа? 

да smile

ты же можешь у себя проверить smile почему этот .so не указывается как "зависимость"...


Цитата(MAKCim @  29.10.2007,  22:06 Найти цитируемый пост)
угу
поэтому и есть LD_BIND_NOW

спасибо, буду знать. Надо же...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 29.10.2007, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(JackYF @  29.10.2007,  22:17 Найти цитируемый пост)
ты же можешь у себя проверить smile почему этот .so не указывается как "зависимость"...

у меня с зависимостями все в порядке  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Бонифаций
Дата 29.10.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 1
Всего: 40



может проще статически собрать с нужным glibc?


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
JackYF
Дата 29.10.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(MAKCim @  29.10.2007,  22:23 Найти цитируемый пост)
у меня с зависимостями все в порядке  

в смысле, что у тебя shared.so указывается в выводе ldd?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
GrayCardinal
Дата 30.10.2007, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



flagist0, 
Может  стоит dlopen(3) заюзать ?


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 30.10.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



GrayCardinal, 
дело говорит
Код

static unsigned long * address, value;

static void __hook() {
    void * handle;
    if ((handle = dlopen(NULL, 0)) == NULL)
        _exit(errno);
    if (dlsym(handle, "inotify") == NULL)
        _exit(errno);
    *address = value;
    __asm__("leave ; jmp inotify");
}
...
int main() {
    unsigned int offset = *(unsigned int*)((char*)&foo + 2);
#ifdef __X64__
    address = (unsigned long*)((char*)&foo + offset + 6);
#else
    address = (unsigned long*)offset;
#endif
    value = *address;
    *address = (unsigned long)&__hook;
...
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.