目标文件中的几个重要的段
? ? ? ? ? ? ? ? ? 今年來(lái)學(xué)習(xí)一下目標(biāo)文件。那啥是目標(biāo)文件呢?簡(jiǎn)單的說(shuō):目標(biāo)文件就是經(jīng)過(guò)編譯和匯編,但沒(méi)有經(jīng)過(guò)沒(méi)了鏈接的文件。看一段測(cè)試代碼:
#include <stdio.h>int a = 84;//已初始化的全局變量 int b;//未初始化的全局變量void func(int i) {printf("%d\n",i); }int main() {static int c = 85;//已初始化的局部靜態(tài)變量static int d;//未初始化的局部靜態(tài)變量int e = 1;//已初始化的局部變量int f;//未初始化局部變量func(c+d+e+f);return e; }筆者linux下該文件名為test.c,則直接執(zhí)行g(shù)cc -c test.c 命令,生成test.o文件。再看:
[mapan@localhost mapam]$ objdump -h test.o test.o: file format elf64-x86-64Sections: Idx Name Size VMA LMA File off Algn0 .text 00000054 0000000000000000 0000000000000000 00000040 2**2CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE1 .data 00000008 0000000000000000 0000000000000000 00000094 2**2CONTENTS, ALLOC, LOAD, DATA2 .bss 00000004 0000000000000000 0000000000000000 0000009c 2**2ALLOC3 .rodata 00000004 0000000000000000 0000000000000000 0000009c 2**0CONTENTS, ALLOC, LOAD, READONLY, DATA4 .comment 0000002e 0000000000000000 0000000000000000 000000a0 2**0CONTENTS, READONLY5 .note.GNU-stack 00000000 0000000000000000 0000000000000000 000000ce 2**0CONTENTS, READONLY6 .eh_frame 00000058 0000000000000000 0000000000000000 000000d0 2**3CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATAobjdump -h 把ELF文件的各個(gè)段的基本信息打印出來(lái)。
豎著看:
.text為代碼段,存放程序源代碼編譯后的機(jī)器指令。
.data為數(shù)據(jù)段,存放已初始化的全局變量和局部靜態(tài)變量
.bss為數(shù)據(jù)段, 存放未初始化的全局變量和局部靜態(tài)變量
.rodata為只讀數(shù)據(jù)段
.conment為注釋信息段
.note.GUN-stack為堆棧段
.eh_frame為調(diào)試信息段
橫著看:
size為段的長(zhǎng)度
File off 為段所在的位置
為了詳細(xì)了解每個(gè)段的內(nèi)容,我們需要查看反匯編。
[mapan@localhost mapam]$ objdump -s -d test.o test.o: file format elf64-x86-64Contents of section .text:0000 554889e5 4883ec10 897dfcb8 00000000 UH..H....}......0010 8b55fc89 d64889c7 b8000000 00e80000 .U...H..........0020 0000c9c3 554889e5 4883ec10 c745f801 ....UH..H....E..0030 0000008b 15000000 008b0500 0000008d ................0040 04020345 f80345fc 89c7e800 0000008b ...E..E.........0050 45f8c9c3 E... Contents of section .data:0000 54000000 55000000 T...U... Contents of section .rodata:0000 25640a00 %d.. Contents of section .comment:0000 00474343 3a202847 4e552920 342e342e .GCC: (GNU) 4.4.0010 37203230 31323033 31332028 52656420 7 20120313 (Red 0020 48617420 342e342e 372d3138 2900 Hat 4.4.7-18). Contents of section .eh_frame:0000 14000000 00000000 017a5200 01781001 .........zR..x..0010 1b0c0708 90010000 1c000000 1c000000 ................0020 00000000 24000000 00410e10 8602430d ....$....A....C.0030 065f0c07 08000000 1c000000 3c000000 ._..........<...0040 00000000 30000000 00410e10 8602430d ....0....A....C.0050 066b0c07 08000000 .k...... Disassembly of section .text:0000000000000000 <func>:0: 55 push %rbp1: 48 89 e5 mov %rsp,%rbp4: 48 83 ec 10 sub $0x10,%rsp8: 89 7d fc mov %edi,-0x4(%rbp)b: b8 00 00 00 00 mov $0x0,%eax10: 8b 55 fc mov -0x4(%rbp),%edx13: 89 d6 mov %edx,%esi15: 48 89 c7 mov %rax,%rdi18: b8 00 00 00 00 mov $0x0,%eax1d: e8 00 00 00 00 callq 22 <func+0x22>22: c9 leaveq 23: c3 retq 0000000000000024 <main>:24: 55 push %rbp25: 48 89 e5 mov %rsp,%rbp28: 48 83 ec 10 sub $0x10,%rsp2c: c7 45 f8 01 00 00 00 movl $0x1,-0x8(%rbp)33: 8b 15 00 00 00 00 mov 0x0(%rip),%edx # 39 <main+0x15>39: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 3f <main+0x1b>3f: 8d 04 02 lea (%rdx,%rax,1),%eax42: 03 45 f8 add -0x8(%rbp),%eax45: 03 45 fc add -0x4(%rbp),%eax48: 89 c7 mov %eax,%edi4a: e8 00 00 00 00 callq 4f <main+0x2b>4f: 8b 45 f8 mov -0x8(%rbp),%eax52: c9 leaveq 53: c3 retqobjdump的-s參數(shù)可以將所有段的內(nèi)容可以將所有段的內(nèi)容以十六進(jìn)制的方式打印出來(lái),-d參數(shù)可以將指令的段反匯編。
?
對(duì)于Contents of section .text:最左面一列是偏移量,中間4列是十六進(jìn)制內(nèi)容,最右面一列是.text段的ASCII碼形式。它是對(duì).text的說(shuō)明。
對(duì)于Contents of section .data:里面有2個(gè)值,54000000和55000000他們分別是示例代碼中變量a和變量c。
對(duì)于.bss:
?
2 .bss 00000004 0000000000000000 0000000000000000 0000009c 2**2它的大小是4,它存放代碼示例中變量d,而變量b沒(méi)有存放在.bss段,這是根編譯器的實(shí)現(xiàn)有關(guān)。這里的變量b存放在.comment段,但是編譯單元內(nèi)部可見(jiàn)的靜態(tài)變量是存放在.bss段的。
?
?
?
?
參考資料:程序員的自我修養(yǎng)
?
?
?
?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的目标文件中的几个重要的段的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。