Следующее - действительно хорошая ссылка: http://www.ibm.com/developerworks/linux/library/l-dynamic-libraries/ . Он содержит библиографию в конце различных ссылок на разных уровнях. Если вы хотите узнать все подробности, вы можете перейти прямо к источнику: http://www.akkadia.org/drepper/dsohowto.pdf . (Ульрих Дреппер написал динамический компоновщик Linux.)
Вы можете получить действительно хороший обзор всех разделов вашего исполняемого файла, выполнив команду типа "objdump -h myexe" или "readelf -S myexe".
Раздел .interp содержит имя динамического загрузчика, который будет использоваться для динамического связывания символов в этом объекте. Раздел .dynamic представляет собой дистрибутив заголовка программы, отформатированный так, чтобы его можно было легко прочитать динамическому загрузчику. (Так что он имеет указатели на все остальные разделы.)
.Got (глобальная таблица смещений) и .plt (таблица связывания процедур) - это две основные структуры, которыми управляет динамический компоновщик. .Got - это таблица косвенности для переменных, а .plt - таблица косвенности для функций. Каждый исполняемый файл или библиотека (которые называются «общими объектами») имеет свои собственные .got и .plt, и это таблицы символов, на которые ссылается этот общий объект, которые фактически содержатся в каком-либо другом общем объекте.
.Dynsyn содержит всю информацию о символах в вашем общем объекте (как те, которые вы определяете, так и внешние, на которые вы должны ссылаться). .Dynsyn не содержит реальных имен символов. Они содержатся в .dynstr, а .dynsyn имеет указатели на .dynstr. .gnu.hash - это хеш-таблица, используемая для быстрого поиска символов по имени. Он также содержит только указатели (указатели на .dynstr и указатели, используемые для создания цепочек блоков).
Когда ваш общий объект разыменовывает какой-либо символ «foo», динамический компоновщик должен искать «foo» во всех динамических объектах, с которыми вы связаны, чтобы выяснить, какой из них содержит «foo», который вы ищете (и затем, что относительно адрес «foo» находится внутри этого общего объекта.) Динамический компоновщик делает это путем поиска в разделе .gnu.hash всех связанных общих объектов (или в разделе .hash для поиска старых общих объектов, у которых нет .gnu. раздел хеш.) Как только он находит правильный адрес в связанном общем объекте, он помещает его в .got или .plt вашего общего объекта.