これで頭を壁に打ちつけています。
私のプロジェクトではmmap
、マッピング(/proc/self/maps
)を使用してメモリを割り当てているときに、読み取り可能なメモリのみを要求したにもかかわらず、それが読み取り可能で実行可能な領域であることを示しています。
strace(見栄えは良かった)やその他のデバッグを調べたところ、この奇妙な問題を回避していると思われる唯一のこと、つまりプロジェクトからアセンブリファイルを削除し、純粋なCのみを残すことを特定できました(何ですか?)。
だからここに私の奇妙な例があります、私はUbunbtu 19.04とデフォルトのgccに取り組んでいます。
ターゲットの実行可能ファイルをASMファイル(空)でコンパイルするとmmap
、読み取り可能で実行可能な領域が返されます。ビルドしないと、正しく動作します。/proc/self/maps
私の例に組み込んだ出力を参照してください。
example.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;
}
example.s:空のファイルです!
アウトプット
ASM付属バージョン
VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0
ASMを含まないバージョン
VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0
-Wa,--noexecstack
。