免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: landker
打印 上一主题 下一主题

[C] 请教加载的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-09-22 21:46 |只看该作者
本帖最后由 landker 于 2013-09-22 21:49 编辑
captivated 发表于 2013-09-22 20:29
回复 9# landker


你的意思是, BFD库是提供对“ELF目标文件里各种信息”的读、写等的操作接口函数,是这样吗?如何是的话,那我并没有用过, 里面的函数也是我自己写的。对于各个段的信息的获取,我是直接读取 *.o ,结合 .shstrtab 和 section header 来识别不同的段,然后再分别进行处理

不过,目前是做的比较粗糙,相同的段只是简单的合并(加在一起),对于同一个符号可能有多个,但在处理符号信息(包括重定位)时都会涉及到(即对于 L0 这个函数,有的 *.o 是 global, 有的是extern,且一般在ld中会是只有1个L0符号,但我这里会有不止一个,但都会分别进行处理。这种做法比较简单,以后再优化)

论坛徽章:
0
12 [报告]
发表于 2013-09-23 12:32 |只看该作者
有人知道吗?


   

论坛徽章:
0
13 [报告]
发表于 2013-09-23 16:23 |只看该作者
我对 *.o 的代码段“起始地址”及“对齐信息” 作了修改(主要是参照单纯使用gld编译链接时的成功信息):

1)将代码段的内容改从 0x1000(file_offset)开始,排完代码段,再到数据段....

2)更改mem_offset(主要是虚拟地址),代码段:0x8048000(不变),数据段:0x8048000 + 0x1000 + 0x910(代码段长度)

3)将每个要链接的 *.o 的大小都整合为16的整数倍,多余的填 nop。最后,整个代码段的长度变为 0x910

即如下:
  1. Elf file type is EXEC (Executable file)
  2. Entry point 0x80480c0
  3. There are 3 program headers, starting at offset 52

  4. Program Headers:
  5.   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  6.   LOAD           0x001000 0x08048000 0x08048000 0x00910 0x00910 R E 0x1000
  7.   LOAD           0x001910 0x08049910 0x08049910 0x00014 0x00014 RW  0x1000
  8.   GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x1000

  9. Section to Segment mapping:
  10.   Segment Sections...
  11.    00     .text
  12.    01     .data
  13.    02     
复制代码
结果:

执行 ./test后,系统进入 jmp $。看上去,问题似乎解决了,但其实还没有,具体如下:

1)为何数据段的起始地址不能是 0x8049000(这个是我之前的设置)?按理来说,代码段的长度才 0x910,少于0x1000,那从0x8049000处开始放置数据段应该是“可以”的,但如果那样做了,在运行程序后,系统会报”已杀死“的错误。只有将它调整为0x8049910(0x8048000 + 0x1000 + 0x910(代码段长度),这个是参考gld的)后,才可以”执行成功“。这是为何?

个人感觉,之前将数据段的起始地址设置为 0x8049000时,似乎是把代码段的信息覆盖了,不知道我的猜测是否正确?但不论我的猜测是否正确,还是想不太明白为何0x8049000这个地址不能作为数据段的起始地址....

有人知道吗?


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP