ltrace -Sन्यूनतम उदाहरण के विश्लेषण से पता चलता है कि mmapग्लिब 2.23 में उपयोग किया जाता है
2.23, उबंटू 16.04 में glibc में, latrace -Sएक न्यूनतम प्रोग्राम पर चल रहा है जो इसके dlopenसाथ उपयोग करता है:
ltrace -S ./dlopen.out
दिखाता है:
dlopen("libcirosantilli_ab.so", 1 <unfinished ...>
SYS_open("./x86_64/libcirosantilli_ab.so", 524288, 06267650550) = -2
SYS_open("./libcirosantilli_ab.so", 524288, 06267650550) = 3
SYS_read(3, "\177ELF\002\001\001", 832) = 832
SYS_brk(0) = 0x244c000
SYS_brk(0x246d000) = 0x246d000
SYS_fstat(3, 0x7fff42f9ce30) = 0
SYS_getcwd("/home/ciro/bak/git/cpp-cheat"..., 128) = 54
SYS_mmap(0, 0x201028, 5, 2050) = 0x7f1c323fe000
SYS_mprotect(0x7f1c323ff000, 2093056, 0) = 0
SYS_mmap(0x7f1c325fe000, 8192, 3, 2066) = 0x7f1c325fe000
SYS_close(3) = 0
SYS_mprotect(0x7f1c325fe000, 4096, 1) = 0
तो हम तुरंत कि देखने के dlopenकॉल open+ mmap।
भयानक ltraceटूल लाइब्रेरी कॉल और सिस्टम कॉल दोनों का पता लगाता है, और इसलिए इस मामले में क्या चल रहा है, इसकी जांच करने के लिए एकदम सही है।
एक करीबी विश्लेषण से पता चलता है कि openफ़ाइल डिस्क्रिप्टर 3(स्टड, आउट और इरिट के बाद अगला मुफ़्त) है।
readफिर उस फाइल डिस्क्रिप्टर का उपयोग करता है, लेकिन टीओडीओ की mmapदलीलें चार तक ही सीमित हैं, और हम यह नहीं देख सकते हैं कि 5 वीं तर्क के बाद से कौन सी एफडी का उपयोग किया गया था । straceउम्मीद के मुताबिक पुष्टि करता है कि 3एक है, और ब्रह्मांड का क्रम बहाल है।
बहादुर आत्माएं ग्लिबक कोड में भी उद्यम कर सकती हैं, लेकिन मुझे mmapजल्दी जीआरपी नहीं मिला और मैं आलसी हूं।
GitHub पर बायलरप्लेट के निर्माण के साथ इस न्यूनतम उदाहरण का परीक्षण किया गया ।