Для файла общей библиотеки, как преобразовать смещение файла и виртуальный адрес определения символа?
В документе ELF для символа в таблице символов
В исполняемых и общих объектных файлах
st_value
содержит виртуальный адрес. Чтобы сделать символы этих файлов более полезными для динамического компоновщика, смещение раздела (интерпретация файла) уступает место виртуальному адресу (интерпретация памяти), для которого номер раздела не имеет значения.
Но как я могу получить соответствующее смещение в файле? Или, учитывая смещение, как я могу вычислить виртуальный адрес (интерпретацию файла в интерпретацию памяти)?
Представьте себе такой сценарий. Во время выполнения процесса предположим, что он использует функцию, реализованную в разделяемой библиотеке, скажем, libx.so, и что файл библиотеки отображается в область, представленную vma
.
//addr holds the value of PC
offset = (vma->vm_pgoff << PAGE_SIZE) + addr -vma->vm_start;
Насколько я понял, теперь offset
содержит смещение инструкции в библиотечном файле. Учитывая это смещение, я хотел бы знать имя функции. Один из способов — вычислить виртуальный адрес, соответствующий offset
, и сравнить виртуальный адрес с st_value
в таблице символов. Если st_value
обрабатываются для хранения в порядке возрастания, то st_value_1 < virtual_address < st_value_2
означает, что st_name_1 — это то, что я ищу. Таким образом, проблема заключается в преобразовании.
Для справки, структура данных записи таблицы символов:
typedef struct{
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
unsigned char st_info;
unsigned char st_other;
Elf32_Half st_shndx;
}Elf32_Sym;