为什么radare2为非空的main()返回空的导入列表?

时间:2018-10-17 17:54:47

标签: c++ elf radare2

我有以下小程序要为其生成调用图:

#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},

有什么我可以做的吗?将标准库粘贴到二进制文件后,如何查看它们呢?

0 个答案:

没有答案