LINUX.ORG.RU

mprotect возвращает -1 в Solus Linux

 ,


0

1

Собственно проблема описана в заголовке.

Пример кода который я пытаюсь исполнить:

#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    char* code = malloc(4);
    int i = 0;
    code[i++] = 0x48;
    code[i++] = 0x89;
    code[i++] = 0xf8;
    code[i++] = 0xc3;

    printf("%i\n", mprotect(code,4,PROT_EXEC)); // напечатает -1
   
    
}

Грешил на то что виноват SELinux, но его в системе не было, что можно предпринять чтобы заставить mprotect,mmap и прочее работать?

mprotect() changes the access protections for the calling process's memory pages containing any part of the address range in the interval [addr, addr+len-1]. addr must be aligned to a page boundary.

addr must be aligned to a page boundary.

to a page boundary

Про страницы памяти сам разберёшься?

Зы, макском, убери гуглокапчу, сцуко

anonymous ()
Ответ на: комментарий от anonymous

Да я пытался передавать такое в malloc: sysconf(_SG_PAGE_SIZE) * num_pages, но это никак не решило проблемы, видимо проблема в чем то еще ибо я протестировал тот же самый код в Rust и Zig и оно заработало

red_widowmaker ()
Ответ на: комментарий от red_widowmaker

Адрес в памяти (в виде целого числа), который передаешь в mprotect должен делиться на sysconf(_SG_PAGE_SIZE) без остатка.

Посему выдели malloc-ом немного больше и смести указатель так, чтоб выполнялось это условие.

nikitos ★★ ()

А почему ты решил, что через mprotect() можно менять выделенную через malloc() память? Да и вообще mprotect() можно не использовать, можешь сразу выделять через mmap() перезаписываемую и исполняемую память, если надо

SZT ★★★ ()