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);
Bạn đã tìm ra lý do tại sao các .bs có bộ bit thực thi không? – cojocar