Почему radare2 возвращает пустой список импорта для непустого main ()? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть следующая небольшая программа, для которой я хочу сгенерировать граф вызовов:

#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's 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++ call, запись sym.main больше не содержит символов:

g++ foo.cpp -O0 -g -static -fno-function-cse -fomit-frame-pointer

приводит к

{'imports': [], 'name': 'sym.main', 'size': 92},

Могу ли я что-нибудь сделать с этим?Как я могу увидеть обращения к стандартным библиотекам, когда они приклеены к двоичному файлу?

...