当前位置:  技术问答>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 :
……


|
程序的入口处当然是由编译器来决定的,与运行无关,在同一个平台,用同一个编译器编译的程序,其入口地址应该是一样的。当然应该有参数可以让你指定入口地址。至于080482c4这个地址是怎么来的,我想你应该看看linker的源代码
至于如何load,确实跟操作系统有关,但是操作系统也是忠实的按照ELF可执行文件的各种Section来把各种段来装入内存的,如果你真的想弄得很明白,应该参考以下内容
1. ELF文件结构
2. John R. Levine的

|
程序的入口处当然是由编译器来决定的,与运行无关,在同一个平台,用同一个编译器编译的程序,其入口地址应该是一样的。当然应该有参数可以让你指定入口地址。至于080482c4这个地址是怎么来的,我想你应该看看linker的源代码
至于如何load,确实跟操作系统有关,但是操作系统也是忠实的按照ELF可执行文件的各种Section来把各种段来装入内存的,如果你真的想弄得很明白,应该参考以下内容
1. ELF文件结构
2. John R. Levine的
(同意)

|
帮你顶

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 急寻一位熟悉Linux熟悉GTK+编程,有时间的高手做一个例程,酬劳可谈
  • php开源软件 iis7站长之家
  • 请问,哪里有可以用的aix server,我想练练,熟悉熟悉,要支持telnet的,
  • 熟悉linux
  • 小弟签约银行,想装个unix先熟悉一下!
  • 如何熟悉Exception的种类?完全通过学习API的document?
  • 有熟悉EXIM的高手高手么??
  • 熟悉Debian下dancer ircd配置的进来
  • 寻找对LINUX ORACLE熟悉的朋友
  • 熟悉CURSES的进!!!
  • 为何技术支持需要熟悉unix命令?
  • 请教熟悉JavaMail的大虾请帮帮忙,多谢了!
  • 想请教linux下开发分布式应用程序问题,期望与熟悉orbit的高手交流!
  • 寻求工作,本人熟练掌握ANSI CC++语言、熟悉UNIX
  • 我一直都是在windows上搞开发,对C非常熟悉,.........
  • 请熟悉IBM WebSphere配置者留下OICQ号
  • 紧急求助!谁熟悉websphere的配置?或关于webshpere好的网站!
  • 熟悉weblogic&ejb2.0的请进(初学者就不用看了)
  • 熟悉JAVA的请进来
  • 谁熟悉在DOS状态下上网浏览的软件。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3