Ich stoße damit meinen Kopf gegen die Wand.
Wenn ich in meinem Projekt Speicher mit mmap
dem Mapping ( /proc/self/maps
) zuordne, zeigt dies, dass es sich um einen lesbaren und ausführbaren Bereich handelt, obwohl ich nur lesbaren Speicher angefordert habe.
Nachdem ich mir strace (was gut aussah) und anderes Debugging angesehen hatte, konnte ich das einzige identifizieren, das dieses seltsame Problem zu vermeiden scheint: Baugruppendateien aus dem Projekt entfernen und nur reines C belassen (was?!)
Hier ist mein seltsames Beispiel: Ich arbeite an Ubunbtu 19.04 und Standard-GCC.
Wenn Sie die ausführbare Zieldatei mit der ASM-Datei (die leer ist) kompilieren, wird mmap
ein lesbarer und ausführbarer Bereich zurückgegeben. Wenn Sie ohne erstellen, verhält sie sich korrekt. Siehe die Ausgabe, /proc/self/maps
die ich in mein Beispiel eingebettet habe.
Beispiel.c
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
int main()
{
void* p;
p = mmap(NULL, 8192,PROT_READ,MAP_ANONYMOUS|MAP_PRIVATE,-1,0);
{
FILE *f;
char line[512], s_search[17];
snprintf(s_search,16,"%lx",(long)p);
f = fopen("/proc/self/maps","r");
while (fgets(line,512,f))
{
if (strstr(line,s_search)) fputs(line,stderr);
}
fclose(f);
}
return 0;
}
Beispiel.s : Ist eine leere Datei!
Ausgänge
Mit der in ASM enthaltenen Version
VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0
Ohne die mitgelieferte ASM-Version
VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0
-Wa,--noexecstack
.