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 पर बायलरप्लेट के निर्माण के साथ इस न्यूनतम उदाहरण का परीक्षण किया गया ।