Как извлечь информацию из виртуальной таблицы из общей библиотеки? - PullRequest
2 голосов
/ 17 июня 2011

Я внедряю инструмент анализа производительности.Одна вещь, которую я делаю, - это оценка стоимости вызова функции.Для этого мне нужно знать, является ли данная функция виртуальной в общей библиотеке.

Для этого у меня есть доступ к сборке общей библиотеки.У меня также есть график вызовов выполнения.Я не могу ничего сделать во время выполнения, анализ должен быть выполнен после выполнения, используя информацию, которую я могу получить из графа вызовов и общих библиотек.

Единственный способ, которым я задумался, - это извлечь vtable из библиотеки и посмотреть, есть ли моя функция в vtable, но я не нашел способа извлечь vtable класса из сборки,

Я пытался

readelf -s -W lib.so | c++filt | grep vtable

, но это только дало мне адрес хорошей таблицы (по крайней мере, я так думаю), и этот адрес никуда меня не привел.

Совместно используемая библиотека скомпилирована с gcc 4.3.5

Кто-нибудь знает способ получения этой vtable?Или, по крайней мере, кто-то знает способ узнать, является ли функция виртуальной в общей библиотеке?

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

Наконец-то мы нашли способ сделать это.Это было не так сложно.В нашем случае адреса виртуальных таблиц находятся в разделе .dynsym файла общей библиотеки ELF.И тогда содержимое виртуальной таблицы доступно в разделе .rela.dyn.Поэтому нам нужно найти адрес и размер каждой виртуальной таблицы, а затем просто прочитать раздел .rela.dyn, чтобы найти функции.

Конечно, это абсолютно не переносимо, но в нашем случае это не проблема.

0 голосов
/ 27 июня 2013

0000000000400e80 w O.rodata 0000000000000020 vtable для теста

Я использую команду "objdump -x a.out | c ++ фильт" и получаю вывод, приведенный выше, очевидно, vtable хранится в разделе только для чтения, как и ожидалось. спасибо за ваш совет.

...