首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我的可执行文件中的入口点地址是0x8048330?(0x330是.text部分的偏移量)

为什么我的可执行文件中的入口点地址是0x8048330?(0x330是.text部分的偏移量)
EN

Stack Overflow用户
提问于 2012-09-19 11:05:32
回答 1查看 11.9K关注 0票数 22

我写了一个小程序将两个整数相加,在使用readelf -a executable_name时,它在elf报头中显示入口点地址为:

代码语言:javascript
复制
Entry point address: 0x8048330

我的可执行文件是如何在加载程序将其加载到内存之前就知道这个地址的呢?elf_format.pdf说这个成员给出了系统首先将控制权转移到的虚拟地址,从而启动了进程。有人能解释一下这句话的意思吗?这里的虚拟地址是什么意思?

另外,让我知道可执行文件从哪里获得入口点地址的0x8048330的值。为了进行交叉检查,我编写了另一个程序,因此,入口点地址保持为相同的值0x8048330 (两种情况下.text部分的偏移量均为0x330 )。

EN

回答 1

Stack Overflow用户

发布于 2012-09-20 03:16:22

入口地址由链接编辑器在创建可执行文件时设置。在将控制转移到入口地址之前,加载器将程序文件映射到由ELF报头指定的地址。

要使用一个具体的示例,请考虑以下内容:

代码语言:javascript
复制
% file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, \
    for GNU/Linux 2.6.15, not stripped
% readelf -e a.out
... snip ...
Elf file type is EXEC (Executable file)
Entry point 0x8048170
There are 6 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000000 0x08048000 0x08048000 0x7cca6 0x7cca6 R E 0x1000
  LOAD           0x07cf98 0x080c5f98 0x080c5f98 0x00788 0x022fc RW  0x1000
... snip ...

第一个程序头指定文件偏移量0处的文件内容应映射到虚拟地址0x08048000。此段的文件和内存大小为0x7cca6字节。这段代码将映射为可读和可执行,但不可写(它包含程序的代码)。

ELF报头中指定的入口点地址为0x8048170,它位于包含程序代码的区域内。

John Levine的"Linkers and Loaders“这本书是一个很好的参考资料,可以参考有关链接编辑器和加载器的问题。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12488010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档