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

s2205209 2013-02-20 12:57:18
在win平台和linux平台
gcc编译的c代码总是有各自的系统接入口

因为我用int 0x13中断指令将c程序加载进固定内存地址
所以需要"纯"二进制机器码
用于另一个汇编文件的远程jmp

麻烦知道的大神说下 感激不尽
...全文
468 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
啥叫“纯二进制机器码”? 能调用C运行库吗? 能调用操作系统IO库函数吗? 能调用BIOS吗?
太上绝情 2013-02-24
  • 打赏
  • 举报
回复
那你似乎得绕过操作系统,系统把权限全限制了,不然不用api,什么也干不了
youqika 2013-02-22
  • 打赏
  • 举报
回复

nasm src.asm -o src.bin
gcc -nostdlib -ffreestanding
nadleeh 2013-02-22
  • 打赏
  • 举报
回复
引用 7 楼 nadleeh123 的回复:
引用 5 楼 s2205209 的回复:是这样的 我有boot.asm start.asm beg.c三个文件 boot.asm这样写的 org 0x7c00 ...;加载磁盘的所有机器码到0x9000 jmp 0x9020:star resb 510-($-$$) dw aa55 start.asm如下 star: .../……
给你个我之前写的vector入口,是arm平台的.irq就是arm中所有中断的入口,真正的c处理函数我放在0x5200000 #stubs b reset b und b swi b pre_abt b dat_abt .word 1 b irq b fiq #vector reset: und: swi: pre_abt: dat_abt: irq: mov sp, #0x52000000 mov ip, sp sub lr, lr, #4 stmfd sp!, {r0-r12, lr} sub fp, ip, #4 mov r0, #0x52000000 ldr r1, [r0] blx r1 mov sp, #0x52000000 ldmea sp, {r0-r12, pc}^ fiq:
nadleeh 2013-02-22
  • 打赏
  • 举报
回复
引用 8 楼 s2205209 的回复:
引用 7 楼 nadleeh123 的回复:引用 5 楼 s2205209 的回复:是这样的 我有boot.asm start.asm beg.c三个文件 boot.asm这样写的 org 0x7c00 ...;加载磁盘的所有机器码到0x9000 jmp 0x9020:star resb 510-($-$$) dw aa55 st……
典型的结构是:vector.s 这种结构 0x0 跳转 reset 0x4 跳转 vector1 0x8 跳转 vector2 等等 这几个跳转的指令的存放地址是物理的,而且必须和cpu体系的异常向量相符合,有些cpu异常向量不连续,中间就随便填充一段数据,跳转过去的都是标签,剩下的在标签中处理对应的异常,其实就是压栈(cpu寄存器保存) 跳转对应函数(函数首地址) 弹栈(CPU寄存器恢复). 当然你执行函数也有压栈和 弹栈,只是汇编要显式的处理.
nadleeh 2013-02-22
  • 打赏
  • 举报
回复
引用 8 楼 s2205209 的回复:
引用 7 楼 nadleeh123 的回复:引用 5 楼 s2205209 的回复:是这样的 我有boot.asm start.asm beg.c三个文件 boot.asm这样写的 org 0x7c00 ...;加载磁盘的所有机器码到0x9000 jmp 0x9020:star resb 510-($-$$) dw aa55 st……
最终用C 汇编跳转过去就行了
s2205209 2013-02-22
  • 打赏
  • 举报
回复
谢谢各位大神 好像 objcopy -O binary -S elf_file bin_file可以去掉文件信息和接入口 我在测试
赵4老师 2013-02-21
  • 打赏
  • 举报
回复
楼主可以参考《30天自制操作系统》
飞天御剑流 2013-02-20
  • 打赏
  • 举报
回复
仅编译,不要进行链接,因为链接过程会按照宿主的要求组合可运行的程序文件,当然带有宿主的上下文。同时,可能调用宿主API的函数也不能使用,例如输入输出函数、堆内存申请等等。
s2205209 2013-02-20
  • 打赏
  • 举报
回复
引用 9 楼 taodm 的回复:
说说你的原始需求。 不要在错误的问题上讨论正确解。
大四了 也没去找工作 闲着无聊 准备折腾一个微型的操作系统 系统方面的书看了不少 理论也掌握了些 可是真正写起来 才发现...够折腾
taodm 2013-02-20
  • 打赏
  • 举报
回复
说说你的原始需求。 不要在错误的问题上讨论正确解。
s2205209 2013-02-20
  • 打赏
  • 举报
回复
引用 7 楼 nadleeh123 的回复:
引用 5 楼 s2205209 的回复:是这样的 我有boot.asm start.asm beg.c三个文件 boot.asm这样写的 org 0x7c00 ...;加载磁盘的所有机器码到0x9000 jmp 0x9020:star resb 510-($-$$) dw aa55 start.asm如下 star: .../……
谢谢你的回答 可是最终还是的用c 一用c就会牵涉到这个问题 除非在自己平台写编译器
nadleeh 2013-02-20
  • 打赏
  • 举报
回复
引用 5 楼 s2205209 的回复:
是这样的 我有boot.asm start.asm beg.c三个文件 boot.asm这样写的 org 0x7c00 ...;加载磁盘的所有机器码到0x9000 jmp 0x9020:star resb 510-($-$$) dw aa55 start.asm如下 star: ...//进入实模式 jmp begc ……
vector入口程序最好是汇编,C你不知道编译器会给你搞成什么模样,不可控,汇编可以.我想不出哪个汇编器会把非伪指令给换了
Michael_g 2013-02-20
  • 打赏
  • 举报
回复
你的问法不正确,c++/c编译出来的就是器机指令了,只不过exe或so文件带有重定位信息之类的其它资源而已。win下我知道是可以编译一个.com文件,但是这是比较老的编译器才有。 你可以换一个思路,你可以用api读取你的代码段的代码,然后写到一个文件中。
s2205209 2013-02-20
  • 打赏
  • 举报
回复
是这样的 我有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那样 生成"纯"机器指令 谢谢了
nadleeh 2013-02-20
  • 打赏
  • 举报
回复
引用 2 楼 s2205209 的回复:
大哥能告诉我具体怎么操作么 需要哪些工具 win平台下和linux平台下编译的c代码总是带有各自系统的"文件头"
系统头只是有些东西的声明,说白了就是提供函数给你用。
nadleeh 2013-02-20
  • 打赏
  • 举报
回复
引用 楼主 s2205209 的回复:
在win平台和linux平台 gcc编译的c代码总是有各自的系统接入口 因为我用int 0x13中断指令将c程序加载进固定内存地址 所以需要"纯"二进制机器码 用于另一个汇编文件的远程jmp 麻烦知道的大神说下 感激不尽 c;nasm;汇编;文件;二进制
cpu体系不同,代码会不同,windows我不知道如何玩,如果是系统驱动组件,windows有内核API可以注册和调用到中断,中断是系统在管理,linux同windows,中断也是调用相关内核函数。如果是裸板下编vector入口程序最用对应cpu的汇编。 linux下如果编裸板vector程序就用 平台-gcc -c 平台-ld -Ttext 固定地址 平台-objcopy objcopy的参数会随着平台变化而有些异同,自己借助--help参数看。
s2205209 2013-02-20
  • 打赏
  • 举报
回复
大哥能告诉我具体怎么操作么 需要哪些工具 win平台下和linux平台下编译的c代码总是带有各自系统的"文件头"
帅得不敢出门 2013-02-20
  • 打赏
  • 举报
回复
需要跨平台的API 不同平台还得重新编译。

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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