Адрес DL_info не совпадает с исполняемыми адресами
Я написал простую программу на C, которая использует объект DL_info для получения информации об адресе текущего фрейма функции, как показано ниже:
#include <execinfo.h>
#include <dlfcn.h>
#include <stdio.h>
int main(void) {
void* callstack[128];
int frames = backtrace(callstack, 128);
Dl_info info;
dladdr(callstack[0], &info);
printf("%s %p\n", info.dli_sname, info.dli_saddr);
return 0;
}
Запустив эту программу я получаю:
main 0x105d94ec0
Однако, изучая исполняемый файл, я обнаружил, что адрес main на самом деле:
a.out:
(__TEXT,__text) section
_main:
0000000100000ec0 pushq %rbp
Мне было интересно, почему это так? Кажется, что адрес, найденный info.dli_saddr, на самом деле является смещением 5d94000 от фактической позиции функций.