Найти имена функций в разделе.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
Другие вопросы по тегам