Вопрос относится к C89, posix + может быть к специфическим моментам gcc / linux / BSD.
Хочу написать наипростейший статистический профайлер для программ на C, который бы мог работать в частности без перекомпиляции (и вёл статистику на всём протяжении работы программы в этом случае). Пока сделал так: имеем библиотеку с одной функцией, помеченной __attribute__((constructor)) и другой, помеченной __attribute__((destructor)). В первой функции инициализируется что-то вроде стека для семплов, устанавливается обработчик сигнала таймера и таймер запускается. Во второй результат работы записывается в файл.
Пока делаю даже без анализа стека - просто записываю в стек содержимое регистра rip в качестве семпла.
Потом хочу написать программу, анализирующую запускаемый бинарник и файл с семплами и предоставляющую отчёт, сколько семплов было в такой-то функции.
Я примерно представляю, как сделать это для функций, код которых лежит в этом бинарнике в .text. А как узнать фактический адрес, в которые загружены функции из .so библиотек? Более точнее: если у меня есть значение регистра rip, и я знаю, что исполняется код из какой-то библиотеки, можно ли узнать из какой функции именно?
Может есть другие способы отследить выполнение программы?
Делаю больше из-за удовольствия, хотя я хз, есть ли такое для FreeBSD (для linux вроде гуглил и находил).