C/C++ 'da derleme ve bağlama işlemini anlamaya çalışıyorum. Kaynak dosyaların ilk olarak derleyici tarafından nesne dosyalarına dönüştürüldüğünü biliyorum. Bağlayıcı, daha sonra nesne dosyalarından kütüphaneler veya yürütülebilir dosyalar oluşturdu.Nesne dosyasında bulunan işlevler nasıl listelenir?
Nesne dosyalarındaki bilgileri ilk önce okumaya çalışıyorum. İşte deneme için yazdığım program.
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 Ben func.obj olsun projeyi oluşturduktan sonra. Func.obj içinde bir yerde güzel görüntü işlevi için bir referans olması gerektiğini varsadım. Ben hem hata ayıklama için aşağıya koştu ve aşağıda çıkışı
dumpbin /HEADERS func.obj > funchead.txt
func.obj
sürümlerini bırakın.ayıklama sürümü (Tam çıkış çok büyük olduğu gibi dahil değildir)
...
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
...
Yayın sürümü (Komple çıktı!) Burada
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
Ve sorulardır. Beklendiği gibi, func.obj Debug sürümünde, beautifulprint'e bir atıf var. Ama benim şaşkınlığım için, Yayın sürümünde güzel izlere atıfta bulunulmuyor mu? Bağlayıcı, bu işlevin nesne dosyasında bulunduğunu nasıl bilebilirdi.
Ayrıca, hata ayıklama nesnesi sürümü iostream'den neden işlev görür? Bunlar bu objenin yerine bazı standart kütüphanelerde bulunmamalıdır mu?
Edit: VS 2010'da Hex biçimindeki açma func.obj dosyasını doğrudan açtım. Beautifulprint ve onun sağ tarafındaki (ASCII) sütununu araştırdım. Referans mevcut olduğu anlamına gelir. Dumpbin neden göstermiyor? İnsan okunabilir formatta görüntülemek için bir araca ihtiyacım var.
Bunu zaten denedim.Çıktı sadece: "Dosyanın dökümü func.obj Dosya türü: ANONYMOUS OBJECT" – Cracker
/GL derleyici seçeneğini kullanıyor musunuz? – Les
Umm ... emin değilim. Varsayılan seçeneklerle yapıyorum. – Cracker