Допустимые разделы .eh_frame и .eh_frame_hdr - PullRequest
0 голосов
/ 09 ноября 2018

В разделяемой библиотеке должен существовать файл .eh_frame_hdr, чтобы иметь действительный .eh_frame? Под действительным я имею в виду .eh_frame с записями.

Если я создаю общую библиотеку из стаб-файла. Я вижу, что в библиотеке есть .eh_frame, но нет .eh_frame_hdr.

gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)

г ++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)

  • Тест окурка stub_a.cpp ---> пусто

% g ++ -fPIC -O -c stub_a.cpp

% gcc -g -std = c99 -nodefaultlibs -nostdlib -shared -Wl, -Bsymbolic -Wl, -soname -Wl, libhello.so -o libhello.so stub_a.o

% objdump -h libhello.so | grep eh_frame

4 .eh_frame 00000000 0000000000000270 0000000000000270 00000270 2 ** 3

  • Тест символа создайте sym_a.cpp с кодом ниже:

    int B (void) { вернуть 0; }

    int A (пусто) { В (); }

% g ++ -fPIC -O -c sym_a.cpp

% gcc -g -std = c99 -nodefaultlibs -nostdlib -shared -Wl, -Bsymbolic -Wl, -soname -Wl, libhello.so -o libhello.so sym_a.o

% objdump -h libhello.so | grep eh_frame

5 .eh_frame_hdr 0000001c 00000000000002f4 00000000000002f4 000002f4 2 ** 2

6 .eh_frame 00000048 0000000000000310 0000000000000310 00000310 2 ** 3

Таким образом, вопрос в том, что при использовании вызовов elf_xxxx (), какой подход будет правильным, использовать или не проходить через записи в .eh_frame?

  1. получить данные из .eh_frame (если существует) и проверить "d_buf" на NULL.
  2. проверить существование .eh_frame_hdr.
...