微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我写了一个小程序添加到整数,并使用“readelf -a executable_name”,它将elf标题中的入口点地址显示为:
Entry point address: 0x8048330

即使在装载程序加载到内存中之前,我的可执行程序也可以预先知道这个地址
elf_format.pdf说这个成员给出了系统首先传输控制的虚拟地址,从而启动了进程.任何人都可以解释这个语句的含义是什么,这里的虚拟地址的含义是什么?

也让我知道,可执行文件的值从0x8048330作为入口点地址.只是为了交叉检查,我编译了另一个程序,为此,入口点地址保持相同的值0x8048330(两种情况下的.text段的偏移量为0x330).

解决方法

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

要使用具体的例子,请考虑以下几点:

% 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”是对链接编辑器和装载机相关事宜的一个很好的资源.

原文地址:https://www.jb51.cc/html/231022.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐