LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: souldump

回 MMMIX , 我的机器码程序写出来了!

[复制链接]
发表于 2007-5-24 16:38:34 | 显示全部楼层
Linux是把整个文件映射到地址空间里的,所以你需要一个program header table entry就够了 。而且你不需要设定section header table offset,因为这个文件根本没有section header table。
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 0300 0100 0000 6080 0408 3400 0000  ........`...4...
0000020: 0000 0000 0000 0000 3400 2000 0100 0000  ........4. .....
0000030: 0000 0000 0100 0000 0000 0000 0080 0408  ................
0000040: 0080 0408 8200 0000 8200 0000 0500 0000  ................
0000050: 0001 0000 4865 6c6c 6f20 576f 726c 6421  ....Hello World!
0000060: b804 0000 00bb 0100 0000 b954 8004 08ba  ...........T....
0000070: 0c00 0000 cd80 b801 0000 00bb 0000 0000  ................
0000080: cd80                                     ..
回复 支持 反对

使用道具 举报

发表于 2007-5-24 16:44:17 | 显示全部楼层
ELF的格式很简单,gcc编译出来的ELF文件只要去掉那个symbol段,体积就能小不少。这个要手工来做。
另外你的"hello, world"这个字符串是放在数据段里的,如果放在代码段里还能少一个段,体积还能减小。

另外,如果想更深刻的了解x86的编码方式和程序的运行机理,直接看Intel的手册和看gcc,g++开了优化后编译出来的代码要更有价值,至少我认为你用现在这种方法有点绕路。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-25 13:45:58 | 显示全部楼层
我并没有设置节头表偏移啊,而且,版主说的可以使用一个段,你没看我第二次的回帖的最后一段。
回复 支持 反对

使用道具 举报

发表于 2007-5-25 14:50:15 | 显示全部楼层
你的第三行第一个word,也就是section header table的偏移,是74 00 00 00(little endian)
本没有section header table,但却设定了偏移,结果objdump认不出这是个什么文件

我看了你的回帖,不过我对中文译法不熟悉,没有一下子反应过来。确实可以做到,我上一个回帖中就是这样做的,很直观,没什么,你也可以做到。
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表