Bir linux sistemindeki bir C programında çalışma zamanında x86-64 kodu üretiyorum (kesin olarak 5,5 puan).gcc - bss'de yazı yazma ve yürütme - izin bayraklarının ayarlanması
char program[1024 * 1024] __attribute__((aligned (16)));
aşağıda gösterildiği ve daha sonra bir işlev işaretçisi ile içine çağrı olarak
ben küresel bir diziye benim baytkodlarına üretir.
pmap gösterdiği gibi ben, çalıştırılabilir olarak getirilmedim bss bölümünden kaynaklanmaktadır ı düşünüp ediyorum bir SIGSEGV, olsun bu
gcc -std=gnu99 parse.c -o parse -lm
gibi programı derlemek ne zaman konudur
böyle derlemek0000000000601000 4K rw--- /data/work/tmp/parse
0000000000602000 1024K rw--- [ anon ]
, çalışma sırasında
gcc -std=gnu99 parse.c empty.s -o parse -lm
(empty.s sıfır uzunluklu dosyasıdır) bss bölümleri sihirli olarak yürütme bit kümesine sahiptir ve her şey sadece harika çalışır.
0000000000601000 4K rwx-- /data/work/tmp/parse
0000000000602000 1024K rwx-- [ anon ]
Peki, bu bayraklar ELF'de nasıl ayarlanır? Ve rwx izinleri ile bir bss bölümü almak için güvenilir ve doğru bir yolu var mı?
fazla detay - yazılım versiyonları
gcc sürüm 4.1.2 20080704 (Red Hat 4.1.2-48)
Linux 2.6.18-164.15.1.el5 x86_64 GNU/Linux
Teşekkür
güncelleme - ilk olarak mmap'ın kafenin önerdiği gibi bu sorunu çözmek için kullanamayacağımı düşünmüştüm, çünkü mmap bana çok uzaktaki sayfaları veriyordu (yakınlardaki kodlara göreceli adresleme yapmak istedim). Mmap'in sizin için bununla ilgilenmesini isteyebilirsiniz. MAP_32BIT size ilk 2 GB'de bir sayfa geri verecektir.
char* program = mmap(0, 1024 * 1024, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_32BIT | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
.bss'in yürütme biti neden ayarlandığını buldunuz mu? – cojocar