Обычно невозможно получить весь диапазон функций.
В лучшем случае вы можете получить начальный адрес. Вот пример, он НЕ переносимый:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("fputs = %p\n", (void *)fputs);
return 0;
}
Причина, по которой это невозможно, заключается в том, что в общем случае единственная информация, которую компоновщик использует о каждом объекте, будь то функция или данные, это его адрес и его имя (и несколько бит других данных). Компоновщик просто не заботится о том, насколько он велик.
Теперь вы можете узнать, насколько велика функция, изучив данные отладки, если для данной функции имеются данные отладки. Существуют библиотеки, которые вы можете использовать для анализа данных, поскольку это может быть несколько сложным. Вот ссылка на некоторую информацию о DWARF, если вы используете этот формат:
Обратите внимание, что вы можете помещать данные отладки в любой формат, который вам нравится, когда вы компилируете программу, или полностью его исключать. STABS и DWARF распространены в Linux. Однако тот факт, что исполняемый файл или библиотека не удалены, не означает, что данные отладки есть.