2012-08-07 19 views
16

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.

cevap

16

Sembolleri yerine dökün. Tüm .obj dosyalarının bir sembolü tablosu vardır. Dahili olarak tanımlanan sembolleri ve çözünürlüğe ihtiyaç duyanları size gösterecektir. Gördüğünüz IO sembolleri UNDEF sembolleri olabilir, ancak sembol tablosu bunu daha net hale getirmelidir.

DUMPBIN /SYMBOLS func.obj 

nesne/GL (whole program optimization) derlendi/SEMBOLLER kullanılamaz unutmayın./GL (yanı sıra kütüphaneler) ile oluşturulan nesne modülleri, bir derleyici sürümden diğerine uyumlu olacak şekilde garanti edilmeyen bir format ile oluşturulur.

Tüm Program Optimizasyonu, optimize edicinin sadece her modülün aksine tüm modüller arasında en iyi duruma getirebileceği anlamına gelir. İşlevler "inline" ve muhtemelen çok fazla COFF uyumlu olmayan diğer hileler haline gelebilir. Tüm desteklenen derleyici sürümleri için kitaplık sağlamadığınız sürece, teslim edilebilen kitaplıkların/GL seçeneklerinin ayarlanmamış olması önerilir.

+0

Bunu zaten denedim.Çıktı sadece: "Dosyanın dökümü func.obj Dosya türü: ANONYMOUS OBJECT" – Cracker

+1

/GL derleyici seçeneğini kullanıyor musunuz? – Les

+0

Umm ... emin değilim. Varsayılan seçeneklerle yapıyorum. – Cracker

İlgili konular