当前位置: 技术问答>linux和unix
熟悉編譯器的同志進來幫一下忙阿?(高分求助)
来源: 互联网 发布时间:2015-06-14
本文导语: 首先如下圖所示,main函數在link後的地址是地址00000000(在重定位之前); $ objdump -dx m.o Disassembly of section .text: 00000000 : 0: 55 push %ebp 1: 89 e5 mov ...
首先如下圖所示,main函數在link後的地址是地址00000000(在重定位之前);
$ objdump -dx m.o
Disassembly of section .text:
00000000 :
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 04 sub $0x4,%esp
6: a1 00 00 00 00 mov 0x0,%eax
7: R_386_32 j
b: 50 push %eax
c: a1 00 00 00 00 mov 0x0,%eax
d: R_386_32 i
11: 50 push %eax
12: e8 fc ff ff ff call 13
13: R_386_PC32 sum
17: 83 c4 08 add $0x8,%esp
1a: 89 c0 mov %eax,%eax
1c: 89 45 fc mov %eax,0xfffffffc(%ebp)
1f: c9 leave
20: c3 ret
接下來如下圖 所示,此時完成了重定位的工作,main的地址變為080482c4,這個地址我想是在原來的00000000地址加上來的,
因此我有以下疑問:
1. 我不太明白這個地址是以甚麼為標準加進來的,這個程序是運行在保護模式下的用戶態中的,那麼它的虛擬地址應該在0~3G(linux下),可是為甚麼加的是080482c4而不是別的處於0~3G的地址呢.
2. 另外這個地址080482c4是編譯器在link&load時候就加進來的,還是屬於操作系統所做的工作.那麼操作系統又是怎麼樣做的呢.要是操作系統所做的,那麼是不是編譯完後的代碼的main地址都是000000開始的而沒有做任何操作.
3.另外這些地址在編譯完後一個裸的二進制代碼文件中是怎麼存儲的.
$ gcc m.o f.o
$ objdump -dj .text a.out | less
Disassembly of section .text:
……
080482c4 :
……
80482d6: e8 0d 00 00 00 call 80482e8
80482db: 83 c4 08 add $0x8,%esp
……
080482e8 :
……
$ objdump -dx m.o
Disassembly of section .text:
00000000 :
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 04 sub $0x4,%esp
6: a1 00 00 00 00 mov 0x0,%eax
7: R_386_32 j
b: 50 push %eax
c: a1 00 00 00 00 mov 0x0,%eax
d: R_386_32 i
11: 50 push %eax
12: e8 fc ff ff ff call 13
13: R_386_PC32 sum
17: 83 c4 08 add $0x8,%esp
1a: 89 c0 mov %eax,%eax
1c: 89 45 fc mov %eax,0xfffffffc(%ebp)
1f: c9 leave
20: c3 ret
接下來如下圖 所示,此時完成了重定位的工作,main的地址變為080482c4,這個地址我想是在原來的00000000地址加上來的,
因此我有以下疑問:
1. 我不太明白這個地址是以甚麼為標準加進來的,這個程序是運行在保護模式下的用戶態中的,那麼它的虛擬地址應該在0~3G(linux下),可是為甚麼加的是080482c4而不是別的處於0~3G的地址呢.
2. 另外這個地址080482c4是編譯器在link&load時候就加進來的,還是屬於操作系統所做的工作.那麼操作系統又是怎麼樣做的呢.要是操作系統所做的,那麼是不是編譯完後的代碼的main地址都是000000開始的而沒有做任何操作.
3.另外這些地址在編譯完後一個裸的二進制代碼文件中是怎麼存儲的.
$ gcc m.o f.o
$ objdump -dj .text a.out | less
Disassembly of section .text:
……
080482c4 :
……
80482d6: e8 0d 00 00 00 call 80482e8
80482db: 83 c4 08 add $0x8,%esp
……
080482e8 :
……
|
程序的入口处当然是由编译器来决定的,与运行无关,在同一个平台,用同一个编译器编译的程序,其入口地址应该是一样的。当然应该有参数可以让你指定入口地址。至于080482c4这个地址是怎么来的,我想你应该看看linker的源代码
至于如何load,确实跟操作系统有关,但是操作系统也是忠实的按照ELF可执行文件的各种Section来把各种段来装入内存的,如果你真的想弄得很明白,应该参考以下内容
1. ELF文件结构
2. John R. Levine的
至于如何load,确实跟操作系统有关,但是操作系统也是忠实的按照ELF可执行文件的各种Section来把各种段来装入内存的,如果你真的想弄得很明白,应该参考以下内容
1. ELF文件结构
2. John R. Levine的
|
程序的入口处当然是由编译器来决定的,与运行无关,在同一个平台,用同一个编译器编译的程序,其入口地址应该是一样的。当然应该有参数可以让你指定入口地址。至于080482c4这个地址是怎么来的,我想你应该看看linker的源代码
至于如何load,确实跟操作系统有关,但是操作系统也是忠实的按照ELF可执行文件的各种Section来把各种段来装入内存的,如果你真的想弄得很明白,应该参考以下内容
1. ELF文件结构
2. John R. Levine的
(同意)
至于如何load,确实跟操作系统有关,但是操作系统也是忠实的按照ELF可执行文件的各种Section来把各种段来装入内存的,如果你真的想弄得很明白,应该参考以下内容
1. ELF文件结构
2. John R. Levine的
(同意)
|
帮你顶