У меня есть следующая маленькая программа, для которой я хочу сгенерировать граф вызовов:
#include <string>
int main() {
auto s = std::string("hello");
s += " welt";
return 0;
}
Я скомпилировал его таким образом, который, я надеюсь, сохранит всю информацию, чтобы быть уверенным, что все необходимые символы могут быть найдены в двоичном файле:
g++ foo.cpp -O0 -fno-function-cse -fomit-frame-pointer
Тогда я бегу radare2
чтобы сгенерировать граф вызовов, отформатируйте его, используя Python pprint
и искать sym.main
:
radare2 -qAc 'agCj' a.out \
| python3 -c "import sys, json, pprint; pprint.pprint(json.load(sys.stdin))" \
| grep -C 5 sym.main
Вывод содержит:
{'imports': ['sym.std::allocator_char_::allocator',
'sym.std::__cxx11::basic_string_char_std::char_traits_char__std::allocator_char__::basic_string_charconst__std::allocator_char_const',
'sym.std::allocator_char_::_allocator',
'sym.std::__cxx11::basic_string_char_std::char_traits_char__std::allocator_char__::operator___charconst',
'sym.std::__cxx11::basic_string_char_std::char_traits_char__std::allocator_char__::_basic_string'],
'name': 'sym.main',
'size': 88}
Что означает (по крайней мере, я так думаю), что main()
содержит вызовы на перечисленные символы.
Когда я сейчас все повторяю, кроме добавления -static
к g++
вызов, sym.main
запись больше не содержит символов:
g++ foo.cpp -O0 -g -static -fno-function-cse -fomit-frame-pointer
результаты в
{'imports': [], 'name': 'sym.main', 'size': 92},
Что я могу с этим поделать? Как я могу видеть обращения к стандартным библиотекам, когда они приклеены к двоичному файлу?
Задача ещё не решена.
Других решений пока нет …