青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大規(guī)模高性能網絡服務器編程 大型游戲服務器編程


大規(guī)模高性能網絡服務器編程 大型游戲服務器編程 完成端口模型 TCP UDP P2P 網絡編程

           C++博客 | 首頁 | 發(fā)新隨筆 | 發(fā)新文章 | 聯(lián)系 | 聚合 | 管理

              

vc編譯后生成的文件類型

 

1, PCH文件

預編譯頭文件(一般擴展名為.PCH),是把一個工程中較穩(wěn)定的代碼預先編譯好放在一個文件(.PCH)里.這些預先編譯好的代碼可以是任何的C/C++代碼--甚至可以是inline函數(shù),只它們在整個工程中是較為穩(wěn)定的,即在工程開發(fā)過程中不會經常被修改的代碼.

為什么需要預編譯頭文件?一言以蔽之:提高編譯速度.一般地,編譯器以文件為單位編譯,如果修改了一工程中的一個文件則所有文件都要重新編譯,包括頭文件里的所有東西(eg.Macro宏,Preprocessor預處理),而VC程序中,這些頭文件中所包括的東西往往是非常大的,編譯之將占很長的時間.但它們又不常被修改,是較穩(wěn)定的,為單獨的一個小文件而重新編譯整個工程的所有文件導致編譯效率下降,因此引入了.PCH文件.

如何使用預編譯頭文件以提高編譯速度?要使用預編譯頭文件,必須指定一個頭文件(.H),它包含我們不會經常修改的代碼和其他的頭文件,然后用這個頭文件(.H)來生成一個預編譯頭文件(.PCH)VC默認的頭文件就是StdAfx.h,因為頭文件是不能編譯的,所以我們還需要一個.CPP文件來作橋梁,VC默認的文件為StdAfx.cpp,這個文件里只有一句代碼就是:#include "StdAfx.h".接下來要用它生成.PCH文件,涉及到幾個重要的預編譯指令:/Yu,/Yc,/Yx,/Fp.簡單地說,/Yc是用來生成.PCH文件的編譯開關.在Project->setting->C/C++的Category里的Precompiled Header,然后在左邊的樹形視圖中選擇用來編譯生成.PCH文件的.CPP文件(默認即StdAfx.cpp)你就可以看到/Yc這個開關,它表示這個文件編譯了以后是否生成.PCH文件(可能/Yc的c表示create)./Fp指令指定生成的.PCH文件的名字及路徑(可能/Fp的p代表path)./Yu的u即use使用,工程中只要包括了.H文件的文件都會有這個/Yu指令.如果選擇自動Automatic...的話則原來為/Yc的地方就換成了/Yx指令.如果選擇自動,則每次編譯時編譯器會看以前有沒有生成過.PCH文件,有則不現(xiàn)生成否則就再次編譯產生.PCH文件.

注意:

A,實際上,由Appzard項目向導生成的默認的頭文件及CPP文件StdAfx.h和StdAfx.cpp可以是任何名字的.原因很簡單.但如果你要這樣做就要記得修改相應的Project->setting...下的幾個預編譯指令(/Yc,/Yu,/Yx,/Fp)的參數(shù).

B.在任何一個包括了將要預編譯的頭文件而使用了.PCH文件的工程文件的開頭,一定必須要是在最開頭,你要包含那個指定生成.PCH文件的.H文件(通過.CPP文件包括,默認為StdAfx.cpp),如果沒包括將產生我最開頭產生的錯誤.如果不是在最開頭包括將產生讓你意想不到的莫名其妙錯誤,如若不信,盍為試之?

C.預編譯文件.PCH生成之很耗時間,而且生成之后它也很占磁盤空間,常在5-6M,注意項目完成之后及時清理無用的.PCH文件以節(jié)約磁盤空間.

D.如果丟了或刪了.PCH文件而以后要再修改工程文件時,可將指定的/Yc的.CPP文件(默認為StdAfx.cpp)重新編譯一次即可再次生成.PCH文件,不用傻傻的按F7或Rebuild All

 
2, NCB文件

.ncb 無編譯瀏覽文件(no compile browser)。當自動完成功能出問題時可以刪除此文件。build后會自動生成

 
3, OBJ文件

目標文件,一般是程序編譯后的二進制文件,再通過鏈接器和資源文件鏈接就成exe文件了。

OBJ只給出了程序的相對地址,而EXE是絕對地址。

 
4, PDB文件

程序數(shù)據(jù)庫 (PDB) 文件保存著調試和項目狀態(tài)信息,使用這些信息可以對程序的調試配置進行增量鏈接。當以 /ZI 或 /Zi(用于 C/C++)生成時,將創(chuàng)建一個 PDB 文件。

 在 Visual C++ 中,/Fd 選項用于命名由編譯器創(chuàng)建的PDB 文件。當使用向導在Visual Studio 中創(chuàng)建項目時,/Fd 選項被設置為創(chuàng)建一個名為 project.PDB 的 PDB。

 如果使用生成文件創(chuàng)建 C/C++ 應用程序,并指定 /ZI 或 /Zi 而不指定 /Fd 時,則最終將生成兩個 PDB 文件:

 *VC80.PDB   (更籠統(tǒng)地說就是 VCx0.PDB,其中 x 表示 Visual C++ 的版本。)該文件存儲各個 OBJ 文件的所有調試信息并與項目生成文件駐留在同一個目錄中。

 *project.PDB   該文件存儲 .exe 文件的所有調試信息。對于C/C++,它駐留在 \debug 子目錄中。

每當創(chuàng)建 OBJ 文件時,C/C++ 編譯器都將調試信息合并到 VCx0.PDB 中。插入的信息包括類型信息,但不包括函數(shù)定義等符號信息。因此,即使每個源文件都包含公共頭文件(如 <windows.h>),這些頭文件中的 typedef 也只存儲一次,而不是在每個 OBJ 文件中都存在。

 鏈接器將創(chuàng)建 project.PDB,它包含項目的 EXE 文件的調試信息。project.PDB文件包含完整的調試信息(包括函數(shù)原型),而不僅僅是在 VCx0.PDB 中找到的類型信息。這兩個 PDB 文件都允許增量更新。鏈接器還在其創(chuàng)建的 .exe 或 .dll 文件中嵌入 .pdb 文件的路徑。

 Visual Studio 調試器使用 EXE 或 DLL 文件中的PDB 路徑查找 project.PDB 文件。如果調試器在該位置無法找到 PDB 文件或者如果路徑無效(例如,如果項目被移動到了另一臺計算機上),調試器將搜索包含 EXE 的路徑,即在“選項”對話框(“調試”文件夾,“符號”節(jié)點)中指定的符號路徑。調試器不會加載與所調試的二進制不匹配的 PDB。

 
5, ILK文件

在增量鏈接時,LINK 更新在第一次增量鏈接期間創(chuàng)建的 .ilk 狀態(tài)文件。該文件和 .exe文件或 .dll 文件具有相同的基名稱,并具有擴展名 .ilk。在后面的增量鏈接期間,LINK 更新 .ilk 文件。如果缺少 .ilk 文件,則 LINK 執(zhí)行完全鏈接并創(chuàng)建新的 .ilk 文件。如果 .ilk 文件無法使用,則 LINK 執(zhí)行非增量鏈接。有關增量鏈接的詳細信息,請參見漸進式鏈接(/INCREMENTAL) 選項。

 
6, MAP文件

Windows和Linux系統(tǒng)下都有map文件,map文件一般是用來保存符號的地址信息。這里的符號一般是指函數(shù)名及變量(局部、全局)。根據(jù)這個地址信息,便可以把地址翻譯成相應的符號,很多系統(tǒng)工具、debug方法都要用到這種信息。

 (一)一個程序編譯完以后內容會分成兩大類保存,一類是code,一類是data:

(1)code指程序代碼,常存在.text section

(2)data指存程序中聲明的變量,常存在.data section,未初始化的變量會被存在.bss section。

 (二)Windows

(1)單個模塊的map文件

在Windows下每一個模塊(dll/exe)對應一個map文件,只需編譯時打開相應的選項即可。

visual studio中方法:右擊工程,選擇Properties,然后選擇 Configuration Properties -Linker - Debugging,將Generate Map File項改成Yes。

編譯后在debug/release目錄里便可以找到與應用程序同名的map文件。

 如下為map文件內容:

Timestamp is4b9603e2 (Tue Mar 09 16:16:34 2010) //這個是時間戳,每次編譯都不同,后面符號對應的地址一般也不同。

 Preferred loadaddress is 00010000 //這是編譯時的預裝載地址,實際上模塊被加載的地址可能跟這個不同,所以來確定某個地址對應哪個符號信息的時候,還需要知道該模塊加載在內存的真正起始地址,然后根據(jù)偏移量來確定。

 Start         Length     Name                   Class

0001:00000000 001c3950H .text                   CODE ==》存放程序代碼

0003:000008b8000af67cH .data                   DATA ==》初始化的變量

0003:000aff40003930b1H .bss                    DATA ==》未初始化的變量

 (2)操作系統(tǒng)總的map文件:不知道有沒有。

 (3)dumpbin

dumpbin是一個反匯編工具,可以輸出exe/dll文件的許多信息。

dumpbin /allyourmodulename > a.txt 可以把所有的信息保存在一個a.txt中,里面可以找到時間戳、原debug路徑信息及函數(shù)列表等。

 如下:

FILE HEADERVALUES

             1C2 machine (Thumb)

               6 number of sections

            49EC0BAE time date stamp Mon Apr 2013:44:14 2009 //時間戳

               0 file pointer to symbol table

               0 number of symbols

              E0 size of optional header

            2102 characteristics

                   Executable

                   32 bit word machine

                   DLL

 

OPTIONAL HEADERVALUES

             10B magic # (PE32)

            9.00 linker version

           53E00 size of code

           76A00size of initialized data

               0 size of uninitialized data

           502ACentry point (100502AC)

            1000 base of code

           55000 base of data

        10000000 image base (10000000 to100CDFFF)

            1000 section alignment

             200 file alignment

           5.01 operating system version

            0.00 image version

            5.01 subsystem version

               0 Win32 version

           CE000 size of image

             400 size of headers

 

其中 10000000 image base (10000000 to 100CDFFF)是重要的信息,與map file中的 Preferred load address is10000000 意義相同。

 DebugDirectories

 

        Time Type       Size     RVA Pointer

    -------- ------ -------- -------- --------

    49EC0BAE cv           81 000020FC      CFC   Format: RSDS, {A5C699F0-C26D-427E-BC54-3504731BA9B8}, 1,d:\Projects\Final\MyUsbToPc_CPL\MyUsbToPc\Windows Mobile 6 Professional SDK(ARMV4I)\Debug\MyUsbToPc.pdb //原編譯路徑

 

          Begin    End     Prolog   Excpt 32bit Fixup 【Function Name】

 0000000010001000 10001040 10001010   N     Y    Y DllMain

0000000810001040 10001064 10001050   N     Y    Y ?InitApplet@@YAHPAUHWND__@@@Z (int __cdecl InitApplet(struct HWND__*))

0000001010001064 10001068 10001064   N     Y    Y ?TermApplet@@YAXXZ (void __cdecl TermApplet(void))

0000001810001068 100013DC 10001078   N     Y    Y CPlApplet

00000020 1000141C 100014B4 10001420   N    Y     Y _DllMainCRTStartup

00000028100014B4 100014BC 100014B4   N     Y    Y GetCurrentProcess

00000030100014BC 100014F0 100014C0  N     Y     Y

00000038 100014F0 1000155C 100014F4  N     Y     Y _cinit

00000040 1000155C 10001660 10001560   N    Y     Y

0000004810001660 10001678 10001664   N     Y    Y exit

0000005010001678 10001690 1000167C   N    Y     Y _exit

0000005810001690 100016AC10001694   N     Y    Y _cexit

00000060 100016AC 100016F8 100016B0   N    Y     Y _c_exit

 

begin欄對應的地址與map里的地址是一致的,非常類似于map文件。

【注意:很多exe或dll在編譯時時將此信息隱藏的,F(xiàn)unction Name會變成空的】

 (三)Linux

(1)單個模塊的map文件

暫還不清楚,大家知道的請告知。

(2)操作系統(tǒng)總的map文件

linux系統(tǒng)編譯Image后會生成一個system.map,里面存了被編譯進內核的符號信息,不同次的編譯生成的system.map會有差異。

因為是操作系統(tǒng)的符號信息,裝載的地址都是固定的,所以不像windows單個模塊那樣靠偏移量定位,直接通過地址就可以直接找到對應的符號。

 

其內容的重要的幾個符號如下:

_stext//代碼段開始

_etext//代碼段結束

 __data_start//初始化的數(shù)據(jù)開始

_edata//初始化的數(shù)據(jù)結束

 __bss_start//未初始化數(shù)據(jù)開始

_end//全部結束

 

Linux相對windows有個很重要的不同是,linux啟動后在proc\kallsyms里也有一份類似Map文件的信息,cat命令可看到其內容,有了這個就可以得到任何一個內核的符號(變量及函數(shù)名)的地址信息,而不需要在編譯完內核后特意保存map文件,這真是一個巨大的寶藏。

而且,proc\kallsym的信息比system.map多,在最后會有module部分的符號信息,這些信息會隨著系統(tǒng)的變化而變化。

 

(3)nm命令

nm命令用來顯示某個可執(zhí)行文件的符號信息。符號信息中會包含全局變量(比如下面的xyz)和函數(shù)名(比如下面的main),還有一些編譯器插入的符號(比如下面的__data_start,__bss_start)

 第二列表示符號的屬性,其中大寫代表global,小寫代表local

 

Usage: nm[option(s)] [file(s)]

List symbols in[file(s)] (a.out by default).

 

示例:

 nm helo

 08049f20 d_DYNAMIC

08049ff4 d_GLOBAL_OFFSET_TABLE_

080484ec R_IO_stdin_used

         w _Jv_RegisterClasses

08049f10 d__CTOR_END__

08049f0c d__CTOR_LIST__

08049f18 D__DTOR_END__

08049f14 d__DTOR_LIST__

08048500 r__FRAME_END__

08049f1c d__JCR_END__

08049f1c d__JCR_LIST__

0804a020 A__bss_start

0804a00c D__data_start

080484a0 t __do_global_ctors_aux

08048340 t__do_global_dtors_aux

0804a010 D__dso_handle

         w __gmon_start__

0804849a T __i686.get_pc_thunk.bx

08049f0c d__init_array_end

08049f0c d__init_array_start

08048430 T__libc_csu_fini

08048440 T__libc_csu_init

         U __libc_start_main@@GLIBC_2.0

0804a020 A _edata

0804a028 A _end

080484cc T _fini

080484e8 R_fp_hw

08048298 T _init

08048310 T_start

0804a020 bcompleted.6635

0804a00c Wdata_start

0804a024 bdtor_idx.6637

080483a0 t frame_dummy

080483c4 T main

         U printf@@GLIBC_2.0

0804a014 D x

0804a018 D y

0804a01c D z

 

helo.c如下:

#include<stdio.h>

 int x = 10;

int y = 20;

int z = 30;

 extern int__data_start;//這里引用了編譯器插入的符號

 int main(void)

{

        int *ds = &__data_start;

         printf("%p\n", ds);

        printf("now x = %d\n", x);

         ds+=3;

        *ds = 100;

        printf("now x = %d\n", x);

}

7, IDB文件

The compiler savesstate information from the first compile in the project’s .IDB file     (the default name is project.IDB or VC60.IDBfor files compiled without a project).

The compiler usesthis state information to speed subsequent compiles.

 

8, SLN文件

Visual   Studio.Solution   通過為環(huán)境提供對項目、項目項和解決方案項在磁盤上位置的引用,可將它們組織到解決方案中。     比如是生成Debug模式,還是Release模式,是通用CPU還是專用的等

 

9, SUO文件

解決方案用戶選項   記錄所有將與解決方案建立關聯(lián)的選項,以便在每次打開時,它都包含您所做的自定義設置。比如你的VS布局,你的項目最后編譯的而又沒有關掉的文件(下次打開時用)

10,  

posted on 2010-08-23 10:31 iKusamba 閱讀(3019) 評論(0)  編輯 收藏 引用 所屬分類: C++技術

公告

導航

隨筆分類

最新隨筆

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产农村妇女精品一二区| 久久久久久有精品国产| 久久久精品久久久久| 一区二区免费在线观看| 久久精品国产一区二区电影| 亚洲一区免费网站| 免费在线观看成人av| 久久精品欧洲| 国产日本精品| 亚洲在线视频网站| 亚洲一区二区三区高清| 欧美激情成人在线视频| 欧美激情精品久久久六区热门 | 久久免费视频这里只有精品| 一本久久知道综合久久| 欧美黄色成人网| 欧美α欧美αv大片| 在线观看日韩专区| 久久久久久网址| 久久久久久网站| 国内精品久久久久久久影视蜜臀| 亚洲一区二区三区激情| 欧美激情第4页| 欧美激情视频一区二区三区不卡| 欧美成人免费在线| 美女精品国产| 在线日韩av| 女主播福利一区| 欧美韩国一区| 日韩视频国产视频| 欧美了一区在线观看| 亚洲精品久久久蜜桃| 日韩午夜激情| 国产精品第13页| 午夜精品国产更新| 狼人社综合社区| 亚洲国产精品激情在线观看| 久久精彩免费视频| 欧美电影免费| 99精品视频一区| 国产精品麻豆va在线播放| 欧美一区=区| 欧美成人视屏| 亚洲一二三级电影| 国产日韩欧美亚洲| 欧美sm极限捆绑bd| 日韩午夜电影av| 欧美亚洲在线观看| 伊伊综合在线| 欧美日韩精品中文字幕| 亚洲一区免费网站| 蜜桃久久精品乱码一区二区| 亚洲精品在线视频| 国产欧美日韩一区| 欧美二区在线播放| 午夜精品婷婷| 最新中文字幕亚洲| 久久精品官网| 99成人免费视频| 国内精品国产成人| 欧美日韩综合| 久久久美女艺术照精彩视频福利播放| 亚洲欧美日韩中文视频| 国内精品视频在线观看| 美女黄色成人网| 亚洲五月婷婷| 亚洲高清视频一区二区| 欧美专区一区二区三区| 91久久精品日日躁夜夜躁欧美 | 久久网站热最新地址| 亚洲乱亚洲高清| 国产自产v一区二区三区c| 欧美激情第9页| 久久久精品网| 亚洲香蕉网站| 亚洲毛片av| 麻豆精品国产91久久久久久| 亚洲午夜伦理| 日韩午夜免费| 亚洲福利视频网站| 国产一区二区中文| 欧美日韩色婷婷| 卡通动漫国产精品| 久久gogo国模裸体人体| 在线一区欧美| 9i看片成人免费高清| 欧美福利小视频| 狼人社综合社区| 久久久久国产精品人| 亚洲欧美日韩国产综合在线| 日韩视频在线一区二区三区| 亚洲国产经典视频| 国产综合欧美在线看| 国产精品一区一区三区| 欧美视频日韩视频| 欧美日韩国产成人在线91| 欧美xxx成人| 蜜桃视频一区| 欧美成人一区二区在线| 久久亚洲一区| 久久综合久久综合这里只有精品| 欧美激情亚洲综合一区| 狂野欧美激情性xxxx欧美| 午夜视频在线观看一区二区| 日韩亚洲不卡在线| 日韩午夜高潮| 亚洲天堂男人| 亚洲一区二区三区中文字幕在线| 国产日韩欧美日韩大片| 国产欧美日韩在线观看| 国产精品你懂的在线| 国产精品视频观看| 国产三区精品| 好吊妞**欧美| 亚洲国产精品久久久久秋霞不卡| 欧美国产视频在线观看| 欧美精品自拍| 欧美一区二区三区免费观看 | 亚洲欧洲日本在线| 亚洲第一中文字幕| 在线欧美影院| 欧美暴力喷水在线| 亚洲精品极品| 欧美第十八页| 久久琪琪电影院| 亚洲欧美精品一区| 日韩亚洲欧美一区二区三区| 影音先锋久久精品| 国产一区二区三区在线观看免费| 亚洲女同精品视频| 亚洲精选久久| 欧美激情一区二区三区成人| 久久黄色影院| 午夜精品视频| 午夜精品久久久久久久蜜桃app| 国产精品五月天| 国产精品久久夜| 国产精品久久网站| 欧美日韩亚洲一区二区三区在线观看 | 欧美一区二区三区视频免费| 亚洲精品视频二区| 最新国产成人av网站网址麻豆| 99国产精品国产精品久久| 影音先锋一区| 亚洲高清久久网| 亚洲国产精品一区二区第一页 | 亚洲天堂黄色| 艳妇臀荡乳欲伦亚洲一区| 亚洲国产精品久久| 91久久综合亚洲鲁鲁五月天| 亚洲国产二区| 亚洲免费av网站| 亚洲色在线视频| 亚洲欧美日韩第一区| 午夜精品久久久99热福利| 性欧美videos另类喷潮| 久久国产一区二区| 久久久青草青青国产亚洲免观| 亚洲三级影院| 在线午夜精品自拍| 亚洲欧美视频在线观看| 亚洲欧美日本精品| 久久国内精品视频| 麻豆精品视频| 欧美日韩日本网| 国产欧美日韩精品在线| 精品不卡一区| av成人天堂| 欧美中文字幕在线观看| 米奇777超碰欧美日韩亚洲| 亚洲国产一区二区a毛片| 一区二区三区国产在线观看| 亚洲欧美激情四射在线日| 久久精品国产69国产精品亚洲| 99riav久久精品riav| 午夜在线播放视频欧美| 免费成人高清视频| 欧美午夜一区二区三区免费大片| 久久久久国产成人精品亚洲午夜| 亚洲另类在线一区| 国产精品99久久久久久有的能看| 亚洲电影在线观看| 一区二区三区鲁丝不卡| 久久久久久有精品国产| 欧美视频精品在线观看| 国产亚洲欧美一区| 一区二区三区回区在观看免费视频| 国产综合色在线| 99热这里只有精品8| 欧美在线视频一区二区| 亚洲电影免费观看高清| 午夜精品久久久久久久99热浪潮| 99这里有精品| 久久伊伊香蕉| 国产欧美精品日韩| 亚洲精品国精品久久99热| 欧美一区综合| 在线一区欧美| 欧美精品v日韩精品v国产精品| 欧美激情1区2区|