मैं सी/सी ++ में संकलन और लिंकिंग प्रक्रिया को समझने की कोशिश कर रहा हूं। मुझे पता है कि स्रोत फ़ाइलों को पहले संकलक द्वारा ऑब्जेक्ट फ़ाइलों में परिवर्तित कर दिया जाता है। लिंकर ने ऑब्जेक्ट फ़ाइलों से पुस्तकालयों या निष्पादन योग्य उत्पन्न किए।ऑब्जेक्ट फ़ाइल में मौजूद फ़ंक्शंस को कैसे सूचीबद्ध करें?
मैं ऑब्जेक्ट फ़ाइलों में पहली बार जानकारी पढ़ने की कोशिश कर रहा हूं। यहां कार्यक्रम है जिसे मैंने प्रयोग के लिए लिखा है।
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) कॉलम पर मौजूद की खोज की। इसका मतलब है कि संदर्भ मौजूद है। डंपबिन क्यों नहीं दिखाता है? मुझे मानव पठनीय प्रारूप में इसे देखने के लिए कुछ टूल चाहिए।
मैंने पहले से ही कोशिश की है।आउटपुट बस है: "फ़ाइल fun.obj फ़ाइल का प्रकार: ANONYMOUS ऑब्जेक्ट" – Cracker
क्या आप/जीएल कंपाइलर विकल्प का उपयोग कर रहे हैं? – Les
उम्म ... सुनिश्चित नहीं है। मैं डिफ़ॉल्ट विकल्पों के साथ निर्माण कर रहा हूँ। – Cracker