2012-08-07 13 views
16

मैं सी/सी ++ में संकलन और लिंकिंग प्रक्रिया को समझने की कोशिश कर रहा हूं। मुझे पता है कि स्रोत फ़ाइलों को पहले संकलक द्वारा ऑब्जेक्ट फ़ाइलों में परिवर्तित कर दिया जाता है। लिंकर ने ऑब्जेक्ट फ़ाइलों से पुस्तकालयों या निष्पादन योग्य उत्पन्न किए।ऑब्जेक्ट फ़ाइल में मौजूद फ़ंक्शंस को कैसे सूचीबद्ध करें?

मैं ऑब्जेक्ट फ़ाइलों में पहली बार जानकारी पढ़ने की कोशिश कर रहा हूं। यहां कार्यक्रम है जिसे मैंने प्रयोग के लिए लिखा है।

func.h

#include <iostream> 

void beautifulprint(char *str); 

func.cpp

#include "stdafx.h" 
#include "func.h" 

using namespace std; 

void beautifulprint(char *str) { 
    cout << "*** " << str << " ***" << endl; 
} 

TestApp.cpp

#include "stdafx.h" 
#include "func.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    beautifulprint("Hello, world!"); 

    return 0; 
} 

VS 2010 मैं func.obj पाने में परियोजना के निर्माण के बाद। मैंने माना कि func.obj में कहीं कहीं सुन्दरप्रिंट फ़ंक्शन का संदर्भ होना चाहिए। मैं func.obj

dumpbin /HEADERS func.obj > funchead.txt 

दोनों आउटपुट के लिए नीचे डीबग और रिलीज़ संस्करणों के लिए नीचे चला गया।

डीबग संस्करण (पूर्ण उत्पादन शामिल नहीं के रूप में यह बहुत बड़ी है)

... 

SECTION HEADER #41 
    .text name 
     0 physical address 
     0 virtual address 
     78 size of raw data 
    5B94 file pointer to raw data (00005B94 to 00005C0B) 
    5C0C file pointer to relocation table 
     0 file pointer to line numbers 
     A number of relocations 
     0 number of line numbers 
60501020 flags 
     Code 
     COMDAT; sym= "void __cdecl beautifulprint(char *)" ([email protected]@[email protected]) 
     16 byte align 
     Execute Read 

SECTION HEADER #42 
.debug$S name 
     0 physical address 
     0 virtual address 
     E8 size of raw data 
    5C70 file pointer to raw data (00005C70 to 00005D57) 
    5D58 file pointer to relocation table 
     0 file pointer to line numbers 
     7 number of relocations 
     0 number of line numbers 
42101040 flags 
     Initialized Data 
     COMDAT (no symbol) 
     Discardable 
     1 byte align 
     Read Only 

... 

रिलीज संस्करण (पूरा उत्पादन!)

Microsoft (R) COFF/PE Dumper Version 10.00.30319.01 
Copyright (C) Microsoft Corporation. All rights reserved. 


Dump of file func.obj 

File Type: ANONYMOUS OBJECT 

ANON OBJECT HEADER VALUES 
       1 version 
      14C machine (x86) 
     50213733 time date stamp Tue Aug 07 16:41:39 2012 
       ClassID: {0CB3FE38-D9A5-4DAB-AC9B-D6B6222653C2} 
      2D1 size 
       0 flags 

और यहाँ मेरा सवाल कर रहे हैं। जैसा कि अपेक्षित है, func.obj डीबग संस्करण में सुंदर प्रिंट का संदर्भ है। लेकिन मेरे विस्मय के लिए रिलीज संस्करण में सुंदर प्रिंट का कोई संदर्भ नहीं है? लिंकर कैसे पता चलेगा कि यह फ़ंक्शन ऑब्जेक्ट फ़ाइल में मौजूद है।

इसके अलावा डीबग ओबीजे संस्करण में iostream से फ़ंक्शन क्यों हैं? क्या यह इस ओबीजे के बजाय कुछ मानक पुस्तकालय में मौजूद नहीं होना चाहिए?

संपादित करें: मैंने सीधे वीएस 2010 में वीएस 2010 में रिलीज func.obj को खोला। मैंने सुन्दरप्रिंट और उसके वर्तमान दाएं हाथ (ASCII) कॉलम पर मौजूद की खोज की। इसका मतलब है कि संदर्भ मौजूद है। डंपबिन क्यों नहीं दिखाता है? मुझे मानव पठनीय प्रारूप में इसे देखने के लिए कुछ टूल चाहिए।

उत्तर

16

इसके बजाए प्रतीकों को डंप करें। सभी .obj फ़ाइलों में एक प्रतीक तालिका है। यह आपको उन प्रतीकों को आंतरिक रूप से परिभाषित करेगा, और जिन्हें संकल्प की आवश्यकता है। आपके द्वारा देखे गए आईओ प्रतीक यूएनडीईएफ प्रतीक हो सकते हैं, लेकिन प्रतीक तालिका को इसे और स्पष्ट करना चाहिए।

DUMPBIN /SYMBOLS func.obj 

ध्यान रखें कि/प्रतीकों उपलब्ध जब वस्तु/जीएल (whole program optimization) के साथ संकलित किया गया है नहीं है रखें।/जीएल (साथ ही पुस्तकालयों) के साथ बनाए गए ऑब्जेक्ट मॉड्यूल एक प्रारूप के साथ बनाए जाते हैं जो एक कंपाइलर संस्करण से अगले तक संगत होने की गारंटी नहीं है।

पूरे कार्यक्रम अनुकूलन का अर्थ है कि ऑप्टिमाइज़र सभी मॉड्यूल में ऑप्टिमाइज़ कर सकता है, जैसा कि प्रत्येक मॉड्यूल के विपरीत होता है। कार्य "इनलाइन" और अन्य चालें हो सकती हैं जो संभावित रूप से बहुत सीओएफएफ संगत नहीं होती हैं। यह अनुशंसा की जाती है कि वितरित पुस्तकालयों में/जीएल विकल्प सेट न हो जब तक कि आप सभी समर्थित कंपाइलर संस्करणों के लिए पुस्तकालयों की आपूर्ति नहीं कर रहे हों।

+0

मैंने पहले से ही कोशिश की है।आउटपुट बस है: "फ़ाइल fun.obj फ़ाइल का प्रकार: ANONYMOUS ऑब्जेक्ट" – Cracker

+1

क्या आप/जीएल कंपाइलर विकल्प का उपयोग कर रहे हैं? – Les

+0

उम्म ... सुनिश्चित नहीं है। मैं डिफ़ॉल्ट विकल्पों के साथ निर्माण कर रहा हूँ। – Cracker

संबंधित मुद्दे

 संबंधित मुद्दे