2010-09-10 21 views
9

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 derlemek
0000000000601000  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); 
+0

.bss'in yürütme biti neden ayarlandığını buldunuz mu? – cojocar

cevap

1

Muhtemelen sadece doğrudan yazılabilir, mmap() ile yürütülebilir anonim haritalama Oluşturulan makine kodunu depolamak için talep etmelidir.