Посоветуйте литературу
От: plastictown Норвегия  
Дата: 21.05.20 10:57
Оценка:
Доброго времени суток!
Давеча в очередной раз завалил собеседование в Каспера, теперь не дает покоя, да и вообще нужно знать те вещи, которые спрашивали.
Вопросы касались виртуальной памяти в ОС Linux и динамических библиотек. Сформулировано было так:

Устройство виртуальной памяти в целом, что происходит в момент загрузки .so в память, в какой момент и как виртуальный адрес транслируется в физический,
как устроен механизм, связывающий исполняемый файл с библиотекой (что находится в исполняемом файле и каким образом это позволяет вызывать нужные процедуры из библиотеки).
Я вроде бы написал много библиотек, но разобраться с этими вопросами руки не доходили.

Хочется почитать "обязательную" в таких случаях литературу. И еще один вопрос касательно механизма вызова процедуры:

Я представлял его таким образом, что caller сохраняет в стек caller-save регистры, аргументы, делает call, потом calle сохраняет calle-save регистры, и начинает работать (это если не учитывать остальные манипуляции с указателями).
Мне было сказано, что я вообще неправ и так не делается и регистры сохраняются вообще по-другому. Можно и про это хорошую книжку тоже.

Спасибо!
Re: Посоветуйте литературу
От: lpd Черногория https://vk.com/rashchupkinr
Дата: 21.05.20 17:52
Оценка: 3 (1) +1
Здравствуйте, plastictown, Вы писали:

P>Устройство виртуальной памяти в целом, что происходит в момент загрузки .so в память, в какой момент и как виртуальный адрес транслируется в физический,

P>как устроен механизм, связывающий исполняемый файл с библиотекой (что находится в исполняемом файле и каким образом это позволяет вызывать нужные процедуры из библиотеки).
P>Я вроде бы написал много библиотек, но разобраться с этими вопросами руки не доходили.

Гугли elf format и relocations.
Вообще советую создать простейший .so файл и тестовую программу. Сначала дизассемблируй тестовую программу(objdump -D или собирай gcc -S), и в местах ссылок на библиотеку ты увидишь нули или неполностью разресолвленные адреса(секции библиотеки-то могут загрузиться по любому заранее неизвестному адресу). Потом с помощью gdb загрузи и дизассемблируй уже загруженную программу с библиотекой, и ты увидишь в коде программы правильные адреса символов из библиотеки.
С помощью того же objdump -t посмотри где символы в библиотеке, с помощью objdump -r/objdump -R разберись в релокациях и прикинь как они используются загрузчиком. Там не так мало, но найти концы можно.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Отредактировано 21.05.2020 18:15 lpd . Предыдущая версия . Еще …
Отредактировано 21.05.2020 18:01 lpd . Предыдущая версия .
Отредактировано 21.05.2020 17:55 lpd . Предыдущая версия .
Отредактировано 21.05.2020 17:55 lpd . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.