दिलचस्प पोस्ट
जो संग्रह स्वाभाविक रूप से IEnumerable नहीं हैं? जब एक ही कोड कहीं और काम करता है तो शैल लिपि वाक्यविन्यास त्रुटियाँ क्यों दे रहा है? SQL सर्वर में तालिका से कॉलम नाम कैसे प्राप्त कर सकते हैं? 2 स्ट्रिंग को कैसे जोड़ा जा सकता है? परिवर्तित और amp; उद्देश्य-सी में मैं C ++ में स्ट्रिंग को कैसे दोहरा सकता हूं? सी ++ सीन और कॉस आईएमजी बनाम सीएसएस पृष्ठभूमि-छवि का उपयोग कब किया जाए? एक समूह के भीतर एक उपसमूह के लिए अद्वितीय रैंक मान git index.lock फ़ाइल मौजूद है जब मैं कमिट करने का प्रयास करता हूं, लेकिन फ़ाइल को नहीं हटा सकता क्या मैं उद्देश्य-सी ब्लॉक को गुणों के रूप में उपयोग कर सकता हूं? Laravel 5 नहीं सीएसएस फ़ाइलों को खोजने Google मानचित्र – मीटर में दो बिंदुओं के बीच की दूरी कैसे प्राप्त करें? मवेन में डिबगिंग? AngularJS: मैं कैसे नियंत्रकों के बीच चर पारित कर सकता हूँ?

डेटा सेगमेंट की पता श्रेणी ढूँढना

एक प्रोग्रामिंग कवायद के रूप में, मैं सी में एक मार्क एंड स्वीप कूड़ा कलेक्टर लिख रहा हूं। मैं पॉइंटर्स को स्मृति आवंटित करने के लिए डेटा सेगमेंट (ग्लोबल, इत्यादि) को स्कैन करना चाहता हूं, लेकिन मुझे पता नहीं है कि कैसे इस सेगमेंट के पते मैं ये कैसे करूं?

Solutions Collecting From Web of "डेटा सेगमेंट की पता श्रेणी ढूँढना"

पाठ (प्रोग्राम कोड) और लिनक्स (और अन्य यूनिक्स) के लिए डेटा के लिए सीमा:

#include <stdio.h> #include <stdlib.h> /* these are in no header file, and on some systems they have a _ prepended These symbols have to be typed to keep the compiler happy Also check out brk() and sbrk() for information about heap */ extern char etext, edata, end; int main(int argc, char **argv) { printf("First address beyond:\n"); printf(" program text segment(etext) %10p\n", &etext); printf(" initialized data segment(edata) %10p\n", &edata); printf(" uninitialized data segment (end) %10p\n", &end); return EXIT_SUCCESS; } 

जहां उन प्रतीकों से आते हैं: जहां प्रतीक इत्तेफाक, ईडाटा और अंत परिभाषित किए जाते हैं?

यदि आप Windows पर काम कर रहे हैं, तो वहां विंडोज़ एपीआई है जो आपकी सहायता करेगी।

 //store the base address the loaded Module dllImageBase = (char*)hModule; //suppose hModule is the handle to the loaded Module (.exe or .dll) //get the address of NT Header IMAGE_NT_HEADERS *pNtHdr = ImageNtHeader(hModule); //after Nt headers comes the table of section, so get the addess of section table IMAGE_SECTION_HEADER *pSectionHdr = (IMAGE_SECTION_HEADER *) (pNtHdr + 1); ImageSectionInfo *pSectionInfo = NULL; //iterate through the list of all sections, and check the section name in the if conditon. etc for ( int i = 0 ; i < pNtHdr->FileHeader.NumberOfSections ; i++ ) { char *name = (char*) pSectionHdr->Name; if ( memcmp(name, ".data", 5) == 0 ) { pSectionInfo = new ImageSectionInfo(".data"); pSectionInfo->SectionAddress = dllImageBase + pSectionHdr->VirtualAddress; **//range of the data segment - something you're looking for** pSectionInfo->SectionSize = pSectionHdr->Misc.VirtualSize; break; } pSectionHdr++; } 

ImageSectionInfo को परिभाषित करें,

 struct ImageSectionInfo { char SectionName[IMAGE_SIZEOF_SHORT_NAME];//the macro is defined WinNT.h char *SectionAddress; int SectionSize; ImageSectionInfo(const char* name) { strcpy(SectioName, name); } }; 

यहां एक पूर्ण, न्यूनतम WIN32 कंसोल प्रोग्राम है जिसे आप Visual Studio में चला सकते हैं जो कि Windows API का उपयोग दर्शाता है:

 #include <stdio.h> #include <Windows.h> #include <DbgHelp.h> #pragma comment( lib, "dbghelp.lib" ) void print_PE_section_info(HANDLE hModule) // hModule is the handle to a loaded Module (.exe or .dll) { // get the location of the module's IMAGE_NT_HEADERS structure IMAGE_NT_HEADERS *pNtHdr = ImageNtHeader(hModule); // section table immediately follows the IMAGE_NT_HEADERS IMAGE_SECTION_HEADER *pSectionHdr = (IMAGE_SECTION_HEADER *)(pNtHdr + 1); const char* imageBase = (const char*)hModule; char scnName[sizeof(pSectionHdr->Name) + 1]; scnName[sizeof(scnName) - 1] = '\0'; // enforce nul-termination for scn names that are the whole length of pSectionHdr->Name[] for (int scn = 0; scn < pNtHdr->FileHeader.NumberOfSections; ++scn) { // Note: pSectionHdr->Name[] is 8 bytes long. If the scn name is 8 bytes long, ->Name[] will // not be nul-terminated. For this reason, copy it to a local buffer that's nul-terminated // to be sure we only print the real scn name, and no extra garbage beyond it. strncpy(scnName, (const char*)pSectionHdr->Name, sizeof(pSectionHdr->Name)); printf(" Section %3d: %p...%p %-10s (%u bytes)\n", scn, imageBase + pSectionHdr->VirtualAddress, imageBase + pSectionHdr->VirtualAddress + pSectionHdr->Misc.VirtualSize - 1, scnName, pSectionHdr->Misc.VirtualSize); ++pSectionHdr; } } // For demo purpopses, create an extra constant data section whose name is exactly 8 bytes long (the max) #pragma const_seg(".t_const") // begin allocating const data in a new section whose name is 8 bytes long (the max) const char const_string1[] = "This string is allocated in a special const data segment named \".t_const\"."; #pragma const_seg() // resume allocating const data in the normal .rdata section int main(int argc, const char* argv[]) { print_PE_section_info(GetModuleHandle(NULL)); // print section info for "this process's .exe file" (NULL) } 

यह पृष्ठ सहायक हो सकता है यदि आप डीबीजी सहायता पुस्तकालय के अतिरिक्त उपयोगों में रुचि रखते हैं।

आप पीई छवि प्रारूप यहां पढ़ सकते हैं, इसे विवरण में जान सकते हैं। पीई प्रारूप को समझने के बाद, आप ऊपर दिए गए कोड के साथ काम कर पाएंगे, और अपनी आवश्यकता को पूरा करने के लिए इसे संशोधित भी कर सकते हैं।

  • पीई प्रारूप

पीई के अंदर पीयर: Win32 पोर्टेबल निष्पादन योग्य फ़ाइल स्वरूप का एक दौरा

एक आंतरिक गहराई Win32 पोर्टेबल निष्पादन योग्य फ़ाइल स्वरूप, भाग 1 में देखें

एक गहराई Win32 पोर्टेबल निष्पादन योग्य फ़ाइल स्वरूप, भाग 2 में देखें

  • विंडोज़ एपीआई और संरचनाएं

IMAGE_SECTION_HEADER संरचना

ImageNtHeader फ़ंक्शन

IMAGE_NT_HEADERS संरचना

मुझे लगता है कि यह आपको बहुत हद तक मदद करेगा, और बाकी आपको अपने आप को अनुसंधान कर सकते हैं 🙂

वैसे, आप यह धागा भी देख सकते हैं, क्योंकि ये सभी इस तरह से संबंधित हैं:

परिदृश्य: DLL में ग्लोबल वैरिएबल जो कि बहु-थ्रेडेड एप्लीकेशन द्वारा उपयोग किया जाता है

चूंकि आपको संभवतः आपके कचरा कलेक्टर को पर्यावरण में जो कि कार्यक्रम चलाया जाता है, आपको इसे सीधे एल्फ फाइल से प्राप्त कर सकते हैं।

Win32 के लिए निष्पादन योग्य फ़ाइल से लोड करें और पीई हेडर पार्स करें। मुझे अन्य ओएस के बारे में पता नहीं है याद रखें कि यदि आपके कार्यक्रम में एकाधिक फ़ाइलें शामिल हैं (जैसे डीएलएल) तो आपके पास एकाधिक डेटा सेगमेंट हो सकते हैं।

आईओएस के लिए आप इस समाधान का उपयोग कर सकते हैं । यह दर्शाता है कि कैसे टेक्स्ट सेगमेंट श्रेणी को ढूंढना है लेकिन आप इसे आसानी से किसी भी खंड को ढूंढने के लिए इसे बदल सकते हैं।