185 похожих чатов

Хотела вот уточнить такой момент касательно mapping'а библиотеки (если так

можно выразиться). Занимаюсь я просто реализацией аналогов "dlopen", "dlsym" и "dlclose" с нуля. Как я поняла, вот у shared object'а есть сегменты, и нужно сегменты с флажком "PT_LOAD" отдельно маппить в память (каждый раз отдельно вызывать "mmap") или более ничего? Или как-то иначе это работает? Не нашла, где это описывается достаточно подробно. А реализации функций в "glibc" том же крайне сложно пока прочесть и понять

14 ответов

20 просмотров

для .so надо ещё DT_DYNAMIC парсить

Viktoriia-Pashchenko Автор вопроса
disba1ancer
для .so надо ещё DT_DYNAMIC парсить

Да, это я поняла уже. А обычно принято для парсинга просто временно маппать весь файл в память временно? Или же пользовать системными I/O-функциями?

Viktoriia Pashchenko
Да, это я поняла уже. А обычно принято для парсинг...

как удобно так и делай, главное чтобы все DT_LOAD были замаплены по своим адресам со смещением

Viktoriia-Pashchenko Автор вопроса
disba1ancer
как удобно так и делай, главное чтобы все DT_LOAD ...

Если у нас 1-ый PT_LOAD-сегмент лежит по виртуальному адресу 0x0000 (как записано в файле), 2-ой - в 0x1000, 3-ий - в 0x1800, то у них, соответсвенно, должны быть по итогу адреса base + 0x0000, base + 0x1000 и base + 0x1800? Я же правильно поняла?

Viktoriia Pashchenko
Если у нас 1-ый PT_LOAD-сегмент лежит по виртуальн...

единственное, в зависимости от архитектуры может понадобится некоторые сегменты пропатчить

disba1ancer
для .so надо ещё DT_DYNAMIC парсить

Не обязательно если не нужна поддержка отладки

клюквенный сбитень
Не обязательно если не нужна поддержка отладки

обязательно там важные вещи лежат, в частности оттуда можно до таблиц символов добраться, чтобы линковать

Viktoriia Pashchenko
Да, это я поняла уже. А обычно принято для парсинг...

Делается mmap на нужный размер. Потом поверх него mnap с флажком map_fixed для маппинга rwe сегментов

Viktoriia-Pashchenko Автор вопроса
клюквенный сбитень
Делается mmap на нужный размер. Потом поверх него ...

То есть, мы подсчитываем в целом, сколько нам нужно вообще байтов в целом на все сегменты с учётом прописанных им виртуальных адресов ("p_vaddr") и размеров в памяти ("p_memsz"), делаем один большой "mmap" с этим размером, получаем базовый адрес, а затем на основе него начинаем отдельно мапать каждый сегмент с offset'ом от базового адреса, который нам теперь дан, на основе "p_vaddr" и с нужными флажками доступа? Вдруг я не так поняла

Viktoriia-Pashchenko Автор вопроса
клюквенный сбитень
Потом mremap после патча абсолютных релокаций

Несколько запуталась, на каком этапе тогда нужно патчить/релоцировать?

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
Подскажите, а есть vault lite или ченить такое?) А то нужен вольт для похода в вольт, но весит он ~500 мб) как-то многовато для парочки запросов ))
Alexandr Orloff
17
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
13
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Карта сайта