怎样将C/C++程序编译成纯bin文件?

jorge 2005-03-07 09:35:28
之前搜索了一下类似问题,发现人们对“bin文件”的理解有太多的歧义,故说明如下:

我所说的纯bin文件,是指纯粹由一条接一条机器指令(当然是指x86的指令!),或者数据,串连而成的二进制文件,原封不动装载到内存的特定地址,即可直接跳转到该地址执行,说白了就是从前DOS中的.com文件,其他比如磁盘的引导记录,也是这种格式。

C/C++源程序编译后一般生成.o/.obj文件,经过链接可以生成.exe,.dll,....可是如何生成这种纯bin文件?

DOS命令exe2bin可以将某些.exe文件转化为bin文件,但有没有不用它的方法?有没有某种编译器或者链接器可以直接生成bin文件?当然,我的源代码要满足一些要求,比如足够小,不依赖库,等等。另外,要支持32位指令。
...全文
4168 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
jorge 2005-05-17
  • 打赏
  • 举报
回复 5
真不知道CSDN上的高人都到哪里去了,害我花这么长时间自己找到正解!GCC的objcopy工具可以实现这个功能,而我最喜欢的MinGW中的也可以!哈哈~~具体方法是:
先用gcc把xxx.c编译成xxx.o,记住这个xxx.c中不能有库函数调用,否则后面步骤会出错。还有没有其他的限制,本人正在试验中。
再 objcopy -O binary xxx.o xxx.bin
生成的那个xxx.bin就是我要的了,哈哈!
上面学习的关注的都给我记住了吧!分就不给你们了!quickreport(快速报告) 老兄说得比较贴边,也给我了启发,给你一些分,其他的给我哥们了,别不服哈!
jorge 2005-03-18
  • 打赏
  • 举报
回复 1
to quickreport(快速报告) :
这个电子书我有,但我没有Linux,用的是MinGW编译器,也用过Cygwin的GCC,结果出现同样的一条错误信息,跟PE格式有关的~
quickreport 2005-03-16
  • 打赏
  • 举报
回复
楼主可以参考如下文件:
http://www.nondot.org/sabre/os/files/Booting/CompilingBinaryFilesUsingACompiler.pdf
不过是英文版的,如有谁能翻译成中文,将不胜感激!
Yuna_2z 2005-03-15
  • 打赏
  • 举报
回复
帮你顶一下
tdrhsb 2005-03-15
  • 打赏
  • 举报
回复
在TORNADO下就可以生产BIN,HEX和EXE文件!
rogerk 2005-03-15
  • 打赏
  • 举报
回复
按照楼主所说的bin文件的定义,其实就是exe文件在内存中重定位好了以后的内存映像。建议楼主可以自己做一个loader,重新定位exe文件中的段。或者,写一段程序,将exe载入内存后,重新取出一个内存映像。
longsong 2005-03-15
  • 打赏
  • 举报
回复
没有系统可以执行这类文件的。
Meuck 2005-03-15
  • 打赏
  • 举报
回复
有什么用?
不就快一点,小一点,不安全一些是吧。
syz 2005-03-13
  • 打赏
  • 举报
回复
你那哥们说的很对呀. COM 已经不会再用了. 那是很不安全的. 操作系统管理进程的话.
是纯机器码不是已经不重要了. 所以那种格式的文件已经不会再有市场了.
kingofvc 2005-03-13
  • 打赏
  • 举报
回复
不懂,但是 以前有个工具叫做exe2com的 如果真的是.com文件那种类型的话,用那个工具试试。
idau7 2005-03-13
  • 打赏
  • 举报
回复
关注..学习ing
oyljerry 2005-03-13
  • 打赏
  • 举报
回复
gz
hongfeeling 2005-03-13
  • 打赏
  • 举报
回复
GZ!
偶也在写裸机上运行的东东. 现在看来只能用 汇编
如果能用C就好了.
llmsn 2005-03-13
  • 打赏
  • 举报
回复
学习啊.
jorge 2005-03-13
  • 打赏
  • 举报
回复
偶是楼主拜托大家不要讨论这种格式有没有用了,偶就是要做操作系统实验啊,又不是做Win32应用程序开发!偶写的东西是要直接由软盘引导计算机的,不需要什么OS支持啊!原来用NASM,程序大一点就郁闷透了,想转而用C,正在寻找合适的编译器。不知道MinGW有没有这个选项?正在摸索中……

顺便to dongpy(51-->ARM) :exe文件里除了机器代码还有重定位信息,可以装载到内存的随意位置执行,而com文件则除了机器代码和数据之外一无所有,一般只能在指定地址运行。……怯怯的问,回答你的问题有分么?
gentlelover 2005-03-13
  • 打赏
  • 举报
回复
楼主可能是要写一些如操作系统一样的底层应用,所以才会用到BIN格式,也称为Plain Binary格式,楼主,是吗?

其实不管是当前哪种操作系统中的哪中可执行文件格式,本质都是在Plain Binary格式的基础上加了一些额外的东西;拿PE文件格式来说吧,楼主可以自己写程序,将TEXT段中的代码自己搬移,形成32位的Plain Binary,这是完全可行的。
playmud 2005-03-11
  • 打赏
  • 举报
回复
你平时编译出来的东西不是这样的吗?
难道你说的是linux里面那种可以加载的内核的模块?
TangChin 2005-03-11
  • 打赏
  • 举报
回复
同意piaozi2003() 的观点
这跟操作系统密不可分的,window,linux用户态都是工作在保护模式下的,都采用的是虚拟地址。像我们一般用的编译器生成的可执行文件,里面记载都是虚拟地址,操作系统在加载的时候创建进程页表将他们映射的物理地址中,这是一个很复杂的过程。
要是在window ,linux下直截生成你说的二进制文件,很难。就算生成了,也要通过额外的软件来构造一个虚拟环境才能用。
galanz 2005-03-11
  • 打赏
  • 举报
回复
xuexi
piaozi2003 2005-03-11
  • 打赏
  • 举报
回复
这和操作系统密切相关,在实模式下可以运行,在虚拟模式下不可能这么就运行了!否则
虚拟模式还谈什么保护!?操作系统不支持、操作系统提供的loader也就不可能支持!
加载更多回复(16)

24,852

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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