免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2110 | 回复: 2
打印 上一主题 下一主题

关于elf文件格式的一点疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-01 12:34 |只看该作者 |倒序浏览
最近在看elf文件格式方面的东西,有些地方有点迷惑:
1. 分段是把不同的节放到一起构成一个段,这么做的目的目是什么,有什么用吗?

2. 段里面包含相应的标志, 即程序头里面有如A E W等标志,但是因为两个段可能都包含了同一个节,那如果这个节的权限是只读,但是两个段的标注又不一样,这不就
冲突了么?如PT_LOAD段里面出了section .text还包含了只有A(ALLOCATE MEMROY)的节,那这个PT_LOAD段的标志是R(READ) + E(EXEC) 没有问题吗?

3. .section .data
output:
.ascii "Hello World\n"
.section .text
.globl _start
_start:
        movl $1, %eax
        movl $8, %ebx
        int $0x80
编译: as -o a.o main.s ; ld a.o
读取elf: readelf -S a.out:



为什么data节的虚拟地址是0x8049080, 如果data段是接在text所在的段的后面的话,那虚拟地址应该是08048074(text节的起始地址)+0xc(text节的大小) = 08048080,
而不是0x8049080,为什么要对data段的虚拟地址+0x1000?有什么规定么?


4. 看到elf 的文档里面说: 节区的虚拟地址和文件位置offset要对align取模得到的值相等,为什么要这样?

谢谢大家了~~
六一儿童节快乐^_^

论坛徽章:
0
2 [报告]
发表于 2012-06-05 22:34 |只看该作者
个人的一点简单的看法:

1. 分段是把不同的节放到一起构成一个段,这么做的目的目是什么,有什么用吗?
=> 从object的角度,中文的段为section,从exe的角度,中文说的段是segment。
=> 通过把多个不同的section组合成一个segment,这样可以让OS在加载可执行文件image时,
=> 对具有相同属性的section进行统一的管理。

2. 段里面包含相应的标志,......。
=> 不明白'两个段可能都包含了同一个节'指代什么意思。

3. data的虚拟地址为何是0x8049080。
=> 虽然Spec规定text和data需要以0x1000来进行对齐,但是这仅仅说的是虚拟地址,而不是物理地址对齐。为了节约内存,
=> OS会把楼主列出的程序的.text和.data放置在同一个物理页面,类似如下。
| ......   |
| .text  | size = 0xc
| .data | size = 0xc
| ......   |
=> 虽然.text和.data放置在同一个物理页面,但是它们的虚拟地址不同,.text会被映射到0x8048074的地方,它的长度为
=> 0xc,为此它的结束地址为0x804848080。对于.data,因为它需要以0x1000对齐,为此它的起始虚拟地址为0x8049000,
=> 而因为物理页面的前0x80字节已经被占用,为此它的起始地址为0x8049080。
=> 如果我没有描述清楚,那么可以参考<<程序员的自我修养>>6.4.4小节。

4. 对齐问题。
=> 这个为了OS加载和页映射对齐。另外,对不同的机器,MIPS,Intel需要的对齐字节数可能不同。


论坛徽章:
0
3 [报告]
发表于 2012-06-09 10:09 |只看该作者

  1. |                       |0x74             |0x80             |               |
  2. | PAGE-START 0x74 bytes | 0xc bytes(code) | 0xc bytes(data) | .... PAGE-END |
复制代码
code 和 data 物理实际上是存放在一个页面的, 布局如上.
之所以安排虚拟地址不一样, 石油原因的, 主要是出于保护的目的:
代码段不可写, 数据段可读写---- 如果虚拟地址一样(位于同一个页面中)就无法通过页表来
实现保护功能.

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP