LINUX.ORG.RU

Использумые методы

 ,


0

2

Есть либа liba.so
В либе есть класс

//A.hpp
class A
{
public:
 A();
 void foo(double a);
private:
 void bar(double b);
}
inline void A::foo(double a) {/*...*/}
//A.cpp
A::A() {}
void A::bar(double b) {}
И есть бинарь, который линкуется с либой ( в коде подключается A.hpp)
Вопрос: можно ли получить список методов, которые использует бинарь?
Смотрел string binFile , но туда попадает приватные методы. (хотя в самом заголовке класса он только об'явлен, реализация в либе).
И инлайн методы туда не попадают.

Есть несколько десятков классов в бинаре и больше сотни в либе, перебирать руками долго будет.

Была идея передавать в опции компилятора бинаря -fno-inline -fno-inline-small-functions ; а в опции линкера -flto -fwhole-program , но не уверен насколько результат будет правильным.

UPD: попробовал с опциями, инлайн функции появились, но приватные не пропали.

★★★★

Последнее исправление: ymuv (всего исправлений: 4)

ЯННП. Ну и что, что приватные попадают? Бинарь может их вызывать, теоретически. Всё, что у тебя в A.hpp написано и не inline, всё это бинарь может потенциально вызывать, обращаясь к коду в liba.so.

uuwaan ★★
()
Ответ на: комментарий от uuwaan

Бинарь их не вызывает, вызов проходит где-то в cpp файле, то есть в либе.
К примеру, если бинарь вызовет A::A() то тогда вызывается A::bar, но это уже в либе.

Но тогда почему A::bar попадает в символы, ведь:
1. Он не вызывается в бинаре.
2. Он не вызывается из методов, которые описаны в хедере.

ymuv ★★★★
() автор топика
Ответ на: комментарий от uuwaan

Или при сборке бинаря он может «заглянуть» в либу?
Удалил все вызове метода в либе, в string binApp метод есть.
Удалил реализацию, метод пропал.

Добавил метод dummy(double) и написал реализацию (в либе конечно), метод появился в символах бинаря.

ymuv ★★★★
() автор топика
Ответ на: комментарий от ymuv

Есть такая утилита nm. Натрави на бинарь, смотри символы со значком U. Это те, которые загрузчик будет искать в динамических библиотеках, когда станет запускать твой бинарь. Если nm тебе будет выдавать имена C++ в фаршированном виде, то есть утилита c++filt.

 nm bin | c++filt | grep ' U ' | grep 'A::' 

Вот что-то примерно в таком духе. Должно показать тебе все неразрешённые символы из класса А.

uuwaan ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.