2010-09-10 30 views
9

Tôi đang tạo mã x86-64 khi chạy trong chương trình C trên hệ thống Linux (chính xác là 5.4).gcc - viết và thực thi mã trong bss - thiết lập cờ cho phép

tôi tạo ra bytecode của tôi vào một mảng toàn cầu như hình dưới đây

char program[1024 * 1024] __attribute__((aligned (16))); 

và sau đó gọi vào nó thông qua một con trỏ hàm.

Vấn đề của tôi là, khi tôi biên dịch chương trình như thế này

gcc -std=gnu99 parse.c -o parse -lm 

tôi nhận được một SIGSEGV, mà tôi đang surmising là do phần bss không được thiết lập như là thực thi, như thể hiện bởi pmap

0000000000601000  4K rw--- /data/work/tmp/parse 
0000000000602000 1024K rw--- [ anon ] 

khi tôi biên dịch nó như thế này, (empty.s là một file zero-length)

gcc -std=gnu99 parse.c empty.s -o parse -lm 

trong thời gian chạy , các phần bss kỳ diệu có bộ bit thực thi, và mọi thứ hoạt động rất tốt.

0000000000601000  4K rwx-- /data/work/tmp/parse 
0000000000602000 1024K rwx-- [ anon ] 

Vậy, các cờ này được thiết lập như thế nào trong ELF? Và là có một cách đáng tin cậy, chính xác để có được một phần bss với quyền rwx?

Thông tin chi tiết - phiên bản phần mềm

phiên bản gcc 4.1.2 20.080.704 (Red Hat 4.1.2-48)
Linux 2.6.18-164.15.1.el5 x86_64 GNU/Linux

Thankyou

cập nhật - lúc đầu tôi nghĩ tôi không thể sử dụng mmap để giải quyết vấn đề này như quán cà phê được đề xuất, bởi vì mmap đã cho tôi các trang quá xa (tôi muốn nhảy vào mã gần đó với địa chỉ tương đối). Nó chỉ ra rằng bạn có thể yêu cầu mmap để chăm sóc này cho bạn, như vậy - MAP_32BIT sẽ cung cấp cho bạn trở lại một trang trong 2GB đầu tiên.

char* program = mmap(0, 1024 * 1024, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_32BIT | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 
+0

Bạn đã tìm ra lý do tại sao các .bs có bộ bit thực thi không? – cojocar

Trả lời

1

Bạn có thể chỉ cần trực tiếp yêu cầu ánh xạ ẩn danh có thể ghi, thực thi với mmap() để lưu trữ mã máy được tạo của bạn.

Các vấn đề liên quan