如何将传递给 basic_fstream 的 std::_Ios_Openmode 映射到实际值?

逆向工程 拆卸 C++ 手臂
2021-07-09 18:06:37

我正在研究一些 ARM 反汇编。正在对文件进行操作:

0000e550  sub  r3, r11, #0x2d0
0000e554  mov  r0, r3        ; /tmp/MAC
0000e558  ldr  r1, = 0x9a60c ; 0xec04 (sub_e3a8 + 0x85c)
0000e55c  mov  r2, #0x8      ; std::basic_fstream<char,std::char_traits<char>>::basic_fstream(char const*,std::_Ios_Openmode)
0000e560  bl   _ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@PLT ; std::basic_fstream<char, std::char_traits<char> >::basic_fstream(char const*, std::_Ios_Openmode)

r0是“ this”,r1是路径( /tmp/MAC),r2是模式。可以看出,模式是0x8

根据几个来源,该模式是“实现定义的” 不幸的是,我没有得到实施的细节。

这在 ARM 上的典型实现是什么?

1个回答

您应该尝试找出正在使用的编译器/库,然后检查该编译器的规范。

假设它是gcclibstdc++(这是,如果你使用的是Android完全有可能;少在Windows RT可能的),google搜索“GCC libstd的ios_base用于openmode”产量https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-api-4.5 /a00504.html,它告诉它是在 ios_base.h 中定义的。在那里导航,你可以找到

00112   enum _Ios_Openmode 
00113     { 
00114       _S_app        = 1L << 0,
00115       _S_ate        = 1L << 1,
00116       _S_bin        = 1L << 2,
00117       _S_in         = 1L << 3,
00118       _S_out        = 1L << 4,
00119       _S_trunc      = 1L << 5,
00120       _S_ios_openmode_end = 1L << 16 
00121     };

static const openmode in =      _S_in;

所以开放模式可能是in.

但是,除非您找出使用的是哪个编译器,否则这是一个猜测,我们只能帮助您猜测。