免费注册 查看新帖 |

Chinaunix

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

[C] 目标文件的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-08-09 20:57 |只看该作者
有一天你好像没搞清楚,文件本来就可以当作二进制码,不论是文件头还是正文
信息头作为文件格式的一部分,肯定是必须的,具体怎样跟解析这个文件的程序有关,比如linker或者loader

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
12 [报告]
发表于 2013-08-09 21:31 |只看该作者
你可能需要这样的两个东西:1.ELF规范的文档,可以在ELF格式的英文wiki上找到;2.libelf,用于生成、修改ELF文件的库。

论坛徽章:
0
13 [报告]
发表于 2013-08-10 11:16 |只看该作者
本帖最后由 landker 于 2013-08-10 11:17 编辑
zhaohongjian000 发表于 2013-08-09 21:31
你可能需要这样的两个东西:1.ELF规范的文档,可以在ELF格式的英文wiki上找到;2.libelf,用于生成、修改EL ...


对于 hello.c , 假设代码为:

void main()
{
      int c = 1;
}

1)编译生成 hello.o,并指定该目标文件(hello.o)的格式为 elf,即带elf头

2)简单编写一个入口函数(带 _start)的汇编文件,并编译成 start.o,同样为 elf 格式

3)链接(ld)生成可执行文件 hello,并指定其格式为 elf

我相信一般的编译步骤为以上的3步(当然可以更详细的),我的疑问是关于 hello.o 和 hello 之间的区别(即 第2步 和 第3步 得出的文件),个人认为:

相同点:hello.o 和 hello 都是目标文件,且都是 elf 格式的;

不同点:hello指定了入口函数(在加载时可以直接执行),而 hello.o 却没有(只能是一个“中间”文件)。


是这样吗?






论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
14 [报告]
发表于 2013-08-10 12:16 |只看该作者
回复 13# landker


    没这么简单,建议你还是先找ELF的文档看看吧,ELF格式的文件大体有三种:可重定位的,就是你上面说的hello.o;可执行的,对应你上面说的hello;共享目标文件,就是.so结尾的共享库。

论坛徽章:
0
15 [报告]
发表于 2013-08-10 12:54 来自手机 |只看该作者
虽然两者都是elf,遵循同样的格式规范,但内容不一样啊,你需要看的是链接是怎样一个步骤,我可以给你提两点,一个是区块合并,一个是地址重定向,你再去读读那本书,静态链接和动态链接,就一目了然了

论坛徽章:
0
16 [报告]
发表于 2013-08-10 13:00 来自手机 |只看该作者
理论上来说,目标文件也是可以执行的,只是目标文件不是一个完整的程序,要依赖很多运行时库,还有目标文件之间的依赖,比如全局变量,所以才要链接这一步啊,真的得认真看书,能省很多时间

论坛徽章:
0
17 [报告]
发表于 2013-08-12 14:38 |只看该作者
本帖最后由 landker 于 2013-08-12 14:47 编辑

回复 16# sqfasd
  1. // 文件1:test.asm

  2.         [BITS        32]
  3. 1)        global        L0
  4. 2)        extern        L1

  5.         [section .data]
  6. 3)        val        resb        4

  7.         [section .text]

  8. 4)        L0:
  9. 5)                mov        eax, 1
  10. 6)                mov        ebx, 2
  11. 7)                add        eax, ebx

  12. 8)                ret

  13. // 文件2:start.asm
  14.         [BITS        32]
  15.         extern        L0
  16.         [section .text]
  17.         global        _start

  18.         _start:
  19.                 ......

  20.                 push        ebx               
  21.                 push        eax               
  22.                 call        L0
  23.                 add        esp, 8               
  24.                
  25.                 ......
复制代码
按照nasm所附带的文档,一般的nasm指令格式如下:

        label:    instruction operands        ; comment

在翻译成机器码的过程中,label(如:L0, _start)会被解释成一个地址。对于上面的程序,第 1 ~ 3 句是伪指令,第 4 ~ 8 句是真正的汇编指令。在用gdb调试时(我用的不太熟练,只是设置了断点和程序反编译显示,即 b _start 和 disassemble L0/_start),发现第 4 ~ 8句是会真正对应机器码的(虽然gdb里没有看到对应的机器码,但是左边的虚拟内存地址在增加),而第 1 ~ 3 句却找不到在哪里(也许是我对gdb不太熟....)。

不过,印象中,伪指令(第1~3)是不会有对应的机器指令的。但这里就会产生一个问题,想请教一下, global/extern(第 1 句和 第 2 句),其真实的作用是什么?(如果删除了这2句,程序无法成功编译/链接)
   

论坛徽章:
0
18 [报告]
发表于 2013-08-12 16:07 |只看该作者
回复 17# landker

很好理解阿,跟c语言并没有太多区别,global表示这个符号对外可见,也就是说全局的,可以被别的模块引用
extern就表示这个符号是引用自别的模块
这俩个字其实是声明的作用,目的是告诉链接器,该怎样看待它们所声明的符号,你把它们去掉,ld认为符号是内部的,就不往别的模块找了,当然就找不到了

   

论坛徽章:
0
19 [报告]
发表于 2013-08-12 17:38 |只看该作者
sqfasd 发表于 2013-08-12 16:07
回复 17# landker

很好理解阿,跟c语言并没有太多区别,global表示这个符号对外可见,也就是说全局的, ...


谢谢你的回复。其实我的意思是nasm是如何让 ld 知道该符号(如:L0, _start)是全局的.............

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
20 [报告]
发表于 2013-08-12 18:04 |只看该作者
LZ到底想做什么?做编译器么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP