Разделяемые библиотеки
Пример 5.2. Структура PLT для процессора SPARC (цитируется по [docs.sun.com 816-0559-10]).
Первые две (специальные) записи PLT до загрузки программы:
.PLT0: un imp unimp unimp.PLT1: unimp unimp unimp
Обычные записи PLT до загрузки программы:
.PLT101: sethi (.-.PLT0),%gl ba,a.PLTO пор.PLT102: sethi (.-.PLT0),%gl ba,a.PLTO nop …
Специальные записи PLT после загрузки программы:
.PLT0: save %sp,-64,°osp call runtime-linker пор .PLT1: .word identification unimp unimp …
Обычные записи PLT после настройки:
PLT101: sethi (.-.PLT0),%g1 sethi %hi(name1),%g1 jmpl %g1+%lo(namel),%g0 PLT102: sethi (.-.PLT0),%g1 sethi %hi (name2),%g1 jmpl %g1+%lo(name2),%g0
Таким образом, каждая пользовательская задача, загруженная в Unix, имеет собственное адресное пространство с собственной структурой (рис. 5.18). Некоторые участки памяти у разных задач могут совпадать, и это позволяет сэкономить ресурсы за счет их разделения. Это существенно менее глубокое разделение, чем то, что достигается в Windows, но, как мы видели в разд. "Динамические библиотеки" более глубокое и принудительное разделение кода чревато серьезными проблемами.
Рис. 5.18. Разделяемые библиотеки ELF