Найти имена функций в разделе.init_array в несжатой библиотеке
Можно ли обнаружить все случаи статической инициализации в эльфийской динамической библиотеке. Я могу вывести массив указателей на функции в разделе.init_array с помощью команды objdump следующим образом.
objdump -s -j .init_array <libname.so>
Есть ли способ сопоставить эти указатели функций обратно на имена функций. У меня есть разархивированная библиотека с отладочными символами. Я хочу максимально исключить статическую инициализацию, чтобы улучшить время загрузки библиотеки.
1 ответ
В x86-64 содержит список 8-байтовых указателей с прямым порядком байтов на статические инициализаторы/конструкторы. В приведенном ниже примере есть 4 инициализатора с адресами —
0x1160
, ,
0x1231
а также
0x12bb
:
$ objdump -s -j .init_array a.out
a.out: file format elf64-x86-64
Contents of section .init_array:
3d88 60110000 00000000 a7110000 00000000 `...............
3d98 31120000 00000000 bb120000 00000000 1...............
Вы можете найти функцию инициализатора, указав адрес из
.init_array
к
objdump
. например адрес
0x11a7
указывает на специальную функцию
_GLOBAL__sub_I_a
(статический инициализатор для глобальной переменной
a
):
$ objdump -S --start-address=0x11a7 a.out | head
a.out: file format elf64-x86-64
Disassembly of section .text:
00000000000011a7 <_GLOBAL__sub_I_a>:
11a7: f3 0f 1e fa endbr64
11ab: 55 push %rbp
11ac: 48 89 e5 mov %rsp,%rbp