如何用gcc(或nasm,ld,其他工具也行) 将 c代码 编译成 "纯"二进制机器码

s2205209 2013-02-20 02:56:12
是这样的 我有boot.asm start.asm beg.c三个文件

boot.asm这样写的
org 0x7c00
...;加载磁盘的所有机器码到0x9000
jmp 0x9020:star
resb 510-($-$$)
dw aa55

start.asm如下
star:
...//进入实模式
jmp begc
begc:

我将boot.asm,start.asm,beg.c的机器码依次连续写入img文件中
qemu -fda img -boot a 模拟光驱启动系统
执行到begc就运行不了了
beg.c改用汇编 重写了几句能运行(但是谁用汇编写啊)
也用gcc -S beg.c看了 没有问题啊
肯定是链接的时候产生的"文件头" 系统接入口之类的东西在作祟
想知道c代码如何也能像 nasm那样 生成"纯"机器指令
谢谢了
...全文
250 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
s2205209 2013-02-21
  • 打赏
  • 举报
回复
引用 5 楼 kangear 的回复:
这个就有点像u-boot了,u-boot就是在最后有elf格式由arm-linux-objcopy工具弄成的纯bin文件,因为它运行时在开发板上是什么都没有的,在x86上可以这样:objcopy -O binary -S elf_file bin_file elf_file就是elf文件 bin_file就是纯bin文件 -O binary -S是参数 ……
我linux win双平台都用 如果是win系统 那gcc默认的应该是输出coff文件 那objcopy -O binary -S 文件名 输出文件名 也是通用么 我去试试看 多谢了
袁保康 2013-02-21
  • 打赏
  • 举报
回复
这个就有点像u-boot了,u-boot就是在最后有elf格式由arm-linux-objcopy工具弄成的纯bin文件,因为它运行时在开发板上是什么都没有的,在x86上可以这样:objcopy -O binary -S elf_file bin_file elf_file就是elf文件 bin_file就是纯bin文件 -O binary -S是参数
fdl19881 2013-02-20
  • 打赏
  • 举报
回复
引用 3 楼 s2205209 的回复:
引用 2 楼 lights_joy 的回复:先编译生ELF格式的文件,再用OBJDUMP导出需要的段 请问就一个 #include<stdio.h> int main { (printf"hello world"); } 而言 如何知道自己的哪些才是自己需要的段 没用过OBJDUMP 还请高手赐教 感谢之
动手试试就看到了
s2205209 2013-02-20
  • 打赏
  • 举报
回复
引用 2 楼 lights_joy 的回复:
先编译生ELF格式的文件,再用OBJDUMP导出需要的段
请问就一个 #include<stdio.h> int main { (printf"hello world"); } 而言 如何知道自己的哪些才是自己需要的段 没用过OBJDUMP 还请高手赐教 感谢之
嵌云阁主 2013-02-20
  • 打赏
  • 举报
回复
先编译生ELF格式的文件,再用OBJDUMP导出需要的段
alan1985 2013-02-20
  • 打赏
  • 举报
回复
一般我们用gcc编译连接出来的可文件都是运行在保护模式下的,像在linux下就是ELF格式,“纯”二进制的文件好像只能运行在实模式下,不知道gcc能不能搞,你可以找找别的编译器试试

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧