我有以下要为其生成调用图的小程序:
#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},
对此我能做些什么吗?当它们被粘在二进制文件上时,我如何才能看到对标准库的调用?