obj文件解读

来源:互联网 发布:c语言指针例子 编辑:程序博客网 时间:2024/05/22 03:50

在编译c和c++文件的时候,每个c或cpp文件都会被编译器编译成obj(object)文件,所有的obj文件和资源文件经链接(Link)成为可执行文件,obj文件可称为目标文件或中间文件。

另外,obj文件只输出程序的相对地址,而exe文件是绝对地址。

dumpbin工具介绍

dumpbin是在Windows平台下用于显示COFF格式文件信息的一个命令行工具。你可以使用DUMPBIN去显示COFF格式的文件信息,比如像vc编译器生成的目标文件(obj),可执行文件(exe)和动态链接库(DLLs)等。

此工具只能在命令行下使用。

语法格式:

dumpbin [options] files

或者

dumpbin fiels [options]

例如:

dumpbin main.obj /all

或者

dumpbin main.obj /section:.bss

另外,可用使用/out:filename选项将信息输出到文件中。如:

dumpbin main.obj /section:.data /out:new.txt

obj文件组成

使用/summary选项,或者将不输入任何选项,将显示出每个段的基本信息(段名和大小)。

dumpbin main.obj /headers /out:head.txt

如下所示,可以得到obj的所有节(SECTION)的描述结构,即节头:

FILE HEADER VALUES             14C machine (x86)             19B number of sections        543BC5C0 time date stamp Mon Oct 13 20:29:52 2014           14D18 file pointer to symbol table             643 number of symbols               0 size of optional header               0 characteristics

当然,还有其他头的信息,太多了,这里就不一一列举。

各节的信息

使用下面的命令可用获得各节的基本信息。

dumpbin main.obj  /out:head.txt

如下所示:

Summary    14 .CRT$XCU     E .bss    A7 .data  BB7C .debug$S    6C .debug$T   1C4 .drectve   333 .rdata   128 .rdata$r     4 .rtc$IMZ     4 .rtc$TMZ    14 .sxdata  20BD .text    CE .text$x   135 .text$yc    B4 .text$yd   13C .xdata$x

其中,左边是节的大小,右边是节名。

(.data)节

.data节用于存储已经初始化的静态(全局)变量。

如下main.cpp函数函数:

#include <iostream>int a = 1;int b = 2;int main(){    return 0;}

编译后生成main.obj文件,使用下述命令查看.data节信息:

dumpbin main.obj /section:.data

输出如下:

SECTION HEADER #6B   .data name       0 physical address       0 virtual address       8 size of raw data    9062 file pointer to raw data (00009062 to 00009069)       0 file pointer to relocation table       0 file pointer to line numbers       0 number of relocations       0 number of line numbersC0300040 flags         Initialized Data         4 byte align         Read Write

其中: 1. size of raw data : 表明为其预留的空间 2. physical address : 物理地址 3. virtual adderss : 虚拟地址 4. Initialized Data : 初始化的数据 5. 4 byte align : 4字节对齐 6. Read Write : 可读、可写

另外,从size of raw data可以看出,预留来8Byte的空间,这是因为我们在函数中定义来两个初始化的int型全局变量。 再看下面的代码:

#include <iostream>int a = 1;int b = 2;double c = 3;int main(){    static int d = 4;    return 0;}

此时的输出为:

SECTION HEADER #6B   .data name        ...       18 size of raw data        ...         8 byte align         Read Write

注意:前面的数组是十六进制,18(十六进制) = 24(十进制)。

此时的预留空间变成来24字节,而我们只定义来两个初始化的int型全局变量,一个初始化的int型静态变量,一个初始化的double型全局变量,应该占用20个字节猜对。看下面的8 byte align,原来是因为double进行的8字节对齐。

再看下面的代码:

#include <iostream>int a = 1;char *p = "abc";int main(){    return 0;}

此时的输出为:

SECTION HEADER #6B   .data name        ...       8 size of raw data        ...         8 byte align         Read Write

这是因为,只预留来一个初始化的全局指针(32位程序中一个指针占4个字节),一个初始的int型全局变量的空间。而字符串”abc”是存在.rada段的。

(.bss)节

.bss 节用于存储未初始化的静态或全局变量。

未定义未初始化的静态或全局变量时,输出如下所示:

SECTION HEADER #16E    .bss name       0 physical address       0 virtual address       2 size of raw data       0 file pointer to raw data       0 file pointer to relocation table       0 file pointer to line numbers       0 number of relocations       0 number of line numbersC0100080 flags         Uninitialized Data         1 byte align         Read Write

可见,默认预留来2Byte的空间。Uninitialized Data表示未初始化的数据。

看下面的代码:

#include <iostream>int a ;int main(){    return 0;}

此时的输出为:

SECTION HEADER #6B   .bss name        ...       6 size of raw data        ...         4 byte align         Read Write

多了一个未初始化的全局变量,所以预留的空间就多了4字节。

(.rdata)节

字符常量保存在.rdata中。

看下面的代码:

#include <iostream>char *p = "abc";int main(){    return 0;}

此时,rdata的大小为337字节。

再看下面的代码:

#include <iostream>char *p = "abcdefghi";int main(){    return 0;}

此时,rdata的大小为33D字节。

再看下面的代码:

#include <iostream>int main(){    return 0;}

此时,rdata的大小为333字节。

“abc”字符串常量占四个字节 = 337 - 333; “abcdefghi”字符串常量占十个字节 = 33D - 333;

对于最初的代码,在.rdata节中查找abc可以找到下面的部份:

SECTION HEADER #17A  .rdata name       0 physical address       0 virtual address       4 size of raw data   14797 file pointer to raw data (00014797 to 0001479A)       0 file pointer to relocation table       0 file pointer to line numbers       0 number of relocations       0 number of line numbers40301040 flags         Initialized Data         COMDAT; sym= "`string'" (??_C@_03FIKCJHKP@abc?$AA@)         4 byte align         Read Only

看的了abc吧。

(.text)节

.text 节用于存储程序代码。

看下面的代码:

#include <iostream>int main(){    return 0;}

此时,text的大小为20B6字节。

再看下面的代码:

#include <iostream>int main(){    int a = 1;    return 0;}

此时,text的大小为20BD字节,多了7个字节。

再看下面的代码:

#include <iostream>int main(){    int a = 1;    int b = 2;    return 0;}

此时,text的大小为20C4字节,又多了7个字节。

再看下面的代码:

#include <iostream>int main(){    int a = 1;    int b = 2;    double c = 3;    return 0;}

此时,text的大小为20D1字节,又多了13个字节。

0 0
原创粉丝点击