с динамическим связыванием,
1. Ваш исполняемый файл имеет специальное место для всех внешних вызовов (таблица PLT).
2. у вашего исполняемого файла есть список библиотек, от которых зависит
Эти две вещи независимы. Невозможно сказать, какая внешняя функция находится в какой библиотеке.
Когда программа выполняет внешний вызов функции, то, что на самом деле происходит, вызывает запись в таблице PLT, которая выполняет переход в динамический загрузчик. Динамический загрузчик ищет, какая функция была вызвана (через PLT), ищет ее имя (через таблицу символов в исполняемом файле) и ищет это имя во ВСЕХ библиотеках, которые отображаются (все, от чего зависит данный исполняемый файл). Как только имя найдено, адрес соответствующей функции записывается обратно на PLT, поэтому в следующий раз вызов будет выполнен в обход динамического компоновщика.
Чтобы ответить на ваш вопрос, вы должны выполнить ту же работу, что и динамический компоновщик: получить список зависимых библиотек и найти все имена в них. Это можно сделать с помощью утилиты 'nm' или 'readelf'.
Что касается статической связи, я думаю, что все символы в данном объектном файле в libXXX.a связаны друг с другом. Например, статическая библиотека libXXX.a состоит из объектных файлов a.o, b.o и c.o. Если вам нужна функция foo (), и она находится в a.o, то a.o будет связана с вашим приложением - вместе с функцией foo () и всеми другими данными, определенными в ней. По этой причине, например, функции библиотеки C разбиты на файлы.