我希望将堆栈上对象的访问属性设置为只读,但只要我调用mProtect,该进程就会崩溃.大致代码如下:
constexpr int kPageSize = 4096;
CHECK_EQ(kPageSize, sysconf(_SC_PAGE_SIZE));
volatile char padding1[kPageSize] = {0};
NetDataHead head;
volatile char padding2[kPageSize] = {0};
// ...
auto align_down_4k_ptr = steel::AlignDownPointer(&head, kPageSize);
CHECK_EQ(reinterpret_cast<std::uint64_t>(align_down_4k_ptr) % kPageSize, 0);
if (auto rc = mprotect(align_down_4k_ptr, kPageSize, PROT_READ); rc != 0) { // A
LOG_F("Failed to mprotect ptr: %p, rc: %d", align_down_4k_ptr, rc);
}
// Read-only codes ...
if (auto rc = mprotect(align_down_4k_ptr, kPageSize, PROT_READ | PROT_WRITE); rc != 0) {
LOG_F("Failed to mprotect ptr: %p, rc: %d", align_down_4k_ptr, rc);
}
程序直接在A点崩溃,A点是第一个mprotect调用的位置.
通过参考手册,这似乎不会导致Linux崩溃.有人知道为什么会发生这种事吗?
我想要使用m保护来保护堆栈上的"Head" struct .