मैं x86_64 सिस्टम पर लिनक्स उपयोगकर्ता स्पेस मेमोरी लेआउट के बारे में सीख रहा हूं और कुछ अनुभागों से कुछ पते प्रिंट करना चाहता हूं।मेरा जंग निष्पादन योग्य 0x400000 के बजाय ऐसे उच्च पते (ढेर के पास) क्यों मैप किया गया है?
fn main() {
let x = 3; // should be stored on stack
let s = "hello"; // should be in the .data section
println!("stack ≈ {:p}", &x);
println!(".text ≈ {:p}", main as *const());
println!(".data ≈ {:p}", s);
use std::io;
let mut f = std::fs::File::open("/proc/self/maps").unwrap();
let out = io::stdout();
io::copy(&mut f, &mut out.lock()).unwrap();
}
इस कोड को भी stdout के लिए फ़ाइल /proc/self/maps
प्रिंट: मैं इस जंग कोड का इस्तेमाल किया। मैंने rustc mem.rs
के साथ इस फ़ाइल को mem.rs
संकलित किया। यह मुद्रित:
stack ≈ 0x7ffffbf82f2c
.text ≈ 0x7f45b7c0a2b0
.data ≈ 0x7f45b7c4d35b
7f45b6800000-7f45b6c00000 rw-- 00000000 00:00 0
7f45b6de0000-7f45b6f9a000 r-x- 00000000 00:00 664435 /lib/x86_64-linux-gnu/libc-2.19.so
7f45b6f9a000-7f45b6fa2000 ---- 001ba000 00:00 664435 /lib/x86_64-linux-gnu/libc-2.19.so
[ ... more .so files]
7f45b7a22000-7f45b7a23000 r--- 00022000 00:00 663920 /lib/x86_64-linux-gnu/ld-2.19.so
7f45b7a23000-7f45b7a24000 rw-- 00023000 00:00 663920 /lib/x86_64-linux-gnu/ld-2.19.so
7f45b7a24000-7f45b7a25000 rw-- 00000000 00:00 0
7f45b7aa0000-7f45b7aa2000 rw-- 00000000 00:00 0
7f45b7ab0000-7f45b7ab2000 rw-- 00000000 00:00 0
7f45b7ac0000-7f45b7ac1000 rw-- 00000000 00:00 0
7f45b7ad0000-7f45b7ad1000 rw-- 00000000 00:00 0
7f45b7ae0000-7f45b7ae2000 rw-- 00000000 00:00 0
7f45b7c00000-7f45b7c5f000 r-x- 00000000 00:00 1134580 /home/lukas/tmp/mem
7f45b7e5e000-7f45b7e62000 r--- 0005e000 00:00 1134580 /home/lukas/tmp/mem
7f45b7e62000-7f45b7e63000 rw-- 00062000 00:00 1134580 /home/lukas/tmp/mem
7f45b7e63000-7f45b7e64000 rw-- 00000000 00:00 0
7ffffb784000-7ffffb785000 ---- 00000000 00:00 0 [stack]
7ffffb785000-7ffffbf84000 rw-- 00000000 00:00 0
7ffffc263000-7ffffc264000 r-x- 00000000 00:00 0 [vdso]
कम से कम पतों मैं अपने ही पर छपी मैच के लिए क्या maps
कहते लगते हैं।
00400000-0040b000 r-x- 00000000 00:00 107117 /bin/cat
0060a000-0060b000 r--- 0000a000 00:00 107117 /bin/cat
0060b000-0060c000 rw-- 0000b000 00:00 107117 /bin/cat
0071c000-0073d000 rw-- 00000000 00:00 0 [heap]
7f7deb933000-7f7debc30000 r--- 00000000 00:00 758714 /usr/lib/locale/locale-archive
7f7debc30000-7f7debdea000 r-x- 00000000 00:00 664435 /lib/x86_64-linux-gnu/libc-2.19.so
7f7debdea000-7f7debdf2000 ---- 001ba000 00:00 664435 /lib/x86_64-linux-gnu/libc-2.19.so
[ ... more .so files ...]
7f7dec222000-7f7dec223000 r--- 00022000 00:00 663920 /lib/x86_64-linux-gnu/ld-2.19.so
7f7dec223000-7f7dec224000 rw-- 00023000 00:00 663920 /lib/x86_64-linux-gnu/ld-2.19.so
7f7dec224000-7f7dec225000 rw-- 00000000 00:00 0
7f7dec250000-7f7dec252000 rw-- 00000000 00:00 0
7f7dec260000-7f7dec261000 rw-- 00000000 00:00 0
7f7dec270000-7f7dec272000 rw-- 00000000 00:00 0
7ffff09e8000-7ffff11e8000 rw-- 00000000 00:00 0 [stack]
7ffff1689000-7ffff168a000 r-x- 00000000 00:00 0 [vdso]
बाद परिणाम सब कुछ मैं इस विषय के बारे में पढ़ा मेल खाता है:: निष्पादन से वर्गों वर्चुअल ऐड्रेस स्पेस के निचले सिरे में मैप किया जाता है (शुरुआत लेकिन जब मैं टर्मिनल में cat /proc/self/maps
निष्पादित, मैं इस आउटपुट प्राप्त लगभग 0x400000)।
मैंने विंडोज़ के लिए लिनक्स सबसिस्टम (मूल रूप से उबंटू 14.04) में सब कुछ निष्पादित और संकलित किया। मुझे पता है, यह नया और सामान है, लेकिन मुझे पूरा यकीन है कि यह उपप्रणाली के साथ कोई मुद्दा नहीं है (कृपया मुझे बताएं कि यह है, हालांकि!)। जंग 1.14 कि मायने रखती है (मैं इसे शक),
मैं भी यही एक सी कार्यक्रम के साथ करने की कोशिश की है (बहाना मेरी शायद बुरा सी):
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv) {
FILE *test_file;
char buf[4096];
if ((test_file = fopen ("/proc/self/maps", "r")) != NULL) {
while (!feof (test_file)) {
fgets (buf, sizeof (buf), test_file);
puts (buf);
}
}
return 0;
}
यह कुछ इसी तरह आउटपुट cat
रहे हैं:
00400000-00401000 r-x- 00000000 00:00 1325490 /home/lukas/tmp/a.out
00600000-00601000 r--- 00000000 00:00 1325490 /home/lukas/tmp/a.out
00601000-00602000 rw-- 00001000 00:00 1325490 /home/lukas/tmp/a.out
जंग के निष्पादन योग्य ढेर के पास बड़े पते पर मैप किए गए क्यों हैं?
क्या इसके लायक है, एक उबंटू 16.04 डोकर छवि में अपनी जंग कोड चल रहा है, मैं 'पाने के लिए ढेर ≈ 0x7ffc2a01636c'; '.text ≈ 0x559f58ae4270'; '.डेटा ≈ 0x559f58b2735b'। यह ढेर के करीब नहीं है। – Shepmaster