Tôi đang cố gắng để tải một hàm thành một bộ nhớ đệm ánh xạ và gọi nó sau này vì vậy tôi đã thực hiện một trường hợp thử nghiệm để thử:sao chép chức năng hiện có vào bộ nhớ đệm
auto func() -> void{
asm(
"nop;"
"nop;"
"nop;"
"nop;"
);
}
auto main(int argc, char *argv[]) -> int{
void *exec_mem = mmap(nullptr, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
// check errors here
memcpy(exec_mem, reinterpret_cast<const void*>(func), 5); // size is known
(reinterpret_cast<void(*)()>(exec_mem))(); // function call
munmap(exec_mem, getpagesize());
}
nào hoạt động tốt, nhưng ngay sau khi tôi cố gắng làm điều gì đó thậm chí tầm thường, tôi nhận được một segfault.
tôi đã cố gắng để làm một nhiệm vụ đơn giản biến như thế này:
int x;
auto func() -> void{
x = 5;
}
và bây giờ segfaults chức năng kêu gọi của Mẹ. Tôi đã thay đổi kích thước bộ đệm một cách thích hợp và chắc chắn rằng bộ nhớ chính xác đang được ghi vào bộ đệm.
Tôi thiếu thông tin quan trọng nào ở đây? Tại sao tôi không thể làm điều này?
P.S. Xin đừng dạy tôi về mã không an toàn, đây là một bài tập học tập cá nhân đơn giản.
Bạn phải rất không an toàn trong công việc của mình ngay cả khi suy ngẫm viết loại mã này. –
@EdHeal Vâng, tôi không lập trình cho một công việc. – CoffeeandCode
Chỉ cần tò mò, cú pháp này là gì: 'auto/-> '? Chưa bao giờ thấy nó trước đây. –