如图所示basic_string类型初始化,看汇编代码是进行堆栈传参。
1.如果是结构体如何构造对应的结构体,查看xcode c++库代码没看到libc++.1.dylib对应的源码。
2.如何知道内容进行basic_string init后存储那在哪里。(x1存储了数组的指针,不明白为什么是x1)
1 个赞
怎么就是堆栈传参了, 明明是X0, 寄存器传的, X0是this, this就是std::string的地址, 正好放在栈顶而已 看错, 是SP+0x20
结构大概是
struct string
{
char* ptr;
uint8_t len;
char smallBuffer[16];
};
如果长度 < 16, 就放在smallBuffer里, 否则就malloc
所以你会看到他的析构函数是
if (this->ptr != this->smallBuffer) free(ptr);
感谢回复!!
打印0x13758d7b0 指向的内容确实是字符串。0x60也是长度。
(lldb) x/30 $x1
0x16fd6ded0: 0x3758d7b0 0x00000001 0x00000060 0x00000000
0x16fd6dee0: 0x00000070 0x80000000 0x616d5151 0x72506c69
请问你这个结构是怎么确定的?对应是哪个源码? 我看了basic_string的源码没对应上。。。。
看汇编啊, 不同的stl实现都不同
soga!!!
0x16fd6ded0: 0x3758d7b0 0x00000001 0x00000060 0x00000000
0x16fd6dee0: 0x00000070 0x80000000 0x616d5151 0x72506c69
从你这里看, 结构就是
struct string
{
char* ptr; // 0x00
uint32_t len; // 0x08
uint32_t pad; // 0x0C
uint32_t cap; // 0x10
uint32_t flags; // 0x14
char smallBuffer[16]; // 0x18
};
2 个赞
我猜测你要看的这部分源码应该在LLVM libcxx
大佬 太强啦. 膜膜膜