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

时间:2021-06-18 10:03:11
之前搜索了一下类似问题,发现人们对“bin文件”的理解有太多的歧义,故说明如下:

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

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

DOS命令exe2bin可以将某些.exe文件转化为bin文件,但有没有不用它的方法?有没有某种编译器或者链接器可以直接生成bin文件?当然,我的源代码要满足一些要求,比如足够小,不依赖库,等等。另外,要支持32位指令。

36 个解决方案

#1


你说的机器指令是。。。。。。。?
你是说的-S参数?

#2


GCC的 -S 参数只是生成汇编语言源文件(文本),还不是直接可以运行的二进制文件啊

#3


这个东西真的不懂,帮你顶,学习……

#4


检查了好多资料都找不到有帮助的,只能顶了,学习啦!

#5


不懂,只是感觉似乎用处不大了。不知你说的是不是.com文件,那种文件只允许有一个段,即64KB的限制,这个限止是致命的。另外他的安全性也是很成问题的,现代的NT类系统不知还能否支持这种危险性极高的可执行文件。就算支持估计也是在16位模拟器中运行的。

#6


e5022你个白痴,我在学操作系统!

不好意思吓到大家,这个淫是偶哥们,平时不骂两句难受^_^

#7


干你肚脐上的洞洞,我不知道,你可以试试把那个.exe文件的扩展名改成.com试试。

#8


关注
学习

#9


这么有深度的问题,关注了

#10


GZ

#11


没碰到过,难

#12


请问:

exe文件里放的不是指令的机器码吗?

#13


记得以前在DOS下编程的时候, TC2.0的编译选项里有一项可以编译为com的。实际上也就是简单的编译选项的问题而已

#14


gcc应该可以

#15


不懂,顶一顶

#16


用gcc编译器是可以的阿
其实msc7也可以吧
自己写操作系统的时候不就要编译成纯二进制文件吗?

#17


这和操作系统密切相关,在实模式下可以运行,在虚拟模式下不可能这么就运行了!否则
虚拟模式还谈什么保护!?操作系统不支持、操作系统提供的loader也就不可能支持!

#18


xuexi

#19


同意piaozi2003() 的观点
这跟操作系统密不可分的,window,linux用户态都是工作在保护模式下的,都采用的是虚拟地址。像我们一般用的编译器生成的可执行文件,里面记载都是虚拟地址,操作系统在加载的时候创建进程页表将他们映射的物理地址中,这是一个很复杂的过程。
要是在window ,linux下直截生成你说的二进制文件,很难。就算生成了,也要通过额外的软件来构造一个虚拟环境才能用。

#20


你平时编译出来的东西不是这样的吗?
难道你说的是linux里面那种可以加载的内核的模块?

#21


偶是楼主拜托大家不要讨论这种格式有没有用了,偶就是要做操作系统实验啊,又不是做Win32应用程序开发!偶写的东西是要直接由软盘引导计算机的,不需要什么OS支持啊!原来用NASM,程序大一点就郁闷透了,想转而用C,正在寻找合适的编译器。不知道MinGW有没有这个选项?正在摸索中……

顺便to dongpy(51-->ARM) :exe文件里除了机器代码还有重定位信息,可以装载到内存的随意位置执行,而com文件则除了机器代码和数据之外一无所有,一般只能在指定地址运行。……怯怯的问,回答你的问题有分么?

#22


GZ!
 偶也在写裸机上运行的东东. 现在看来只能用 汇编
如果能用C就好了.

#23


不懂,但是  以前有个工具叫做exe2com的   如果真的是.com文件那种类型的话,用那个工具试试。

#24


你那哥们说的很对呀. COM 已经不会再用了. 那是很不安全的. 操作系统管理进程的话.
是纯机器码不是已经不重要了. 所以那种格式的文件已经不会再有市场了.

#25


楼主可能是要写一些如操作系统一样的底层应用,所以才会用到BIN格式,也称为Plain Binary格式,楼主,是吗?

其实不管是当前哪种操作系统中的哪中可执行文件格式,本质都是在Plain Binary格式的基础上加了一些额外的东西;拿PE文件格式来说吧,楼主可以自己写程序,将TEXT段中的代码自己搬移,形成32位的Plain Binary,这是完全可行的。

#26


学习啊.

#27


gz

#28


关注..学习ing

#29


有什么用?
不就快一点,小一点,不安全一些是吧。

#30


按照楼主所说的bin文件的定义,其实就是exe文件在内存中重定位好了以后的内存映像。建议楼主可以自己做一个loader,重新定位exe文件中的段。或者,写一段程序,将exe载入内存后,重新取出一个内存映像。

#31


在TORNADO下就可以生产BIN,HEX和EXE文件!

#32


帮你顶一下

#33


没有系统可以执行这类文件的。

#34


楼主可以参考如下文件:
http://www.nondot.org/sabre/os/files/Booting/CompilingBinaryFilesUsingACompiler.pdf
不过是英文版的,如有谁能翻译成中文,将不胜感激!

#35


to quickreport(快速报告) :
这个电子书我有,但我没有Linux,用的是MinGW编译器,也用过Cygwin的GCC,结果出现同样的一条错误信息,跟PE格式有关的~

#36


真不知道CSDN上的高人都到哪里去了,害我花这么长时间自己找到正解!GCC的objcopy工具可以实现这个功能,而我最喜欢的MinGW中的也可以!哈哈~~具体方法是:
先用gcc把xxx.c编译成xxx.o,记住这个xxx.c中不能有库函数调用,否则后面步骤会出错。还有没有其他的限制,本人正在试验中。
再 objcopy -O binary xxx.o xxx.bin
生成的那个xxx.bin就是我要的了,哈哈!
上面学习的关注的都给我记住了吧!分就不给你们了!quickreport(快速报告) 老兄说得比较贴边,也给我了启发,给你一些分,其他的给我哥们了,别不服哈!

#1


你说的机器指令是。。。。。。。?
你是说的-S参数?

#2


GCC的 -S 参数只是生成汇编语言源文件(文本),还不是直接可以运行的二进制文件啊

#3


这个东西真的不懂,帮你顶,学习……

#4


检查了好多资料都找不到有帮助的,只能顶了,学习啦!

#5


不懂,只是感觉似乎用处不大了。不知你说的是不是.com文件,那种文件只允许有一个段,即64KB的限制,这个限止是致命的。另外他的安全性也是很成问题的,现代的NT类系统不知还能否支持这种危险性极高的可执行文件。就算支持估计也是在16位模拟器中运行的。

#6


e5022你个白痴,我在学操作系统!

不好意思吓到大家,这个淫是偶哥们,平时不骂两句难受^_^

#7


干你肚脐上的洞洞,我不知道,你可以试试把那个.exe文件的扩展名改成.com试试。

#8


关注
学习

#9


这么有深度的问题,关注了

#10


GZ

#11


没碰到过,难

#12


请问:

exe文件里放的不是指令的机器码吗?

#13


记得以前在DOS下编程的时候, TC2.0的编译选项里有一项可以编译为com的。实际上也就是简单的编译选项的问题而已

#14


gcc应该可以

#15


不懂,顶一顶

#16


用gcc编译器是可以的阿
其实msc7也可以吧
自己写操作系统的时候不就要编译成纯二进制文件吗?

#17


这和操作系统密切相关,在实模式下可以运行,在虚拟模式下不可能这么就运行了!否则
虚拟模式还谈什么保护!?操作系统不支持、操作系统提供的loader也就不可能支持!

#18


xuexi

#19


同意piaozi2003() 的观点
这跟操作系统密不可分的,window,linux用户态都是工作在保护模式下的,都采用的是虚拟地址。像我们一般用的编译器生成的可执行文件,里面记载都是虚拟地址,操作系统在加载的时候创建进程页表将他们映射的物理地址中,这是一个很复杂的过程。
要是在window ,linux下直截生成你说的二进制文件,很难。就算生成了,也要通过额外的软件来构造一个虚拟环境才能用。

#20


你平时编译出来的东西不是这样的吗?
难道你说的是linux里面那种可以加载的内核的模块?

#21


偶是楼主拜托大家不要讨论这种格式有没有用了,偶就是要做操作系统实验啊,又不是做Win32应用程序开发!偶写的东西是要直接由软盘引导计算机的,不需要什么OS支持啊!原来用NASM,程序大一点就郁闷透了,想转而用C,正在寻找合适的编译器。不知道MinGW有没有这个选项?正在摸索中……

顺便to dongpy(51-->ARM) :exe文件里除了机器代码还有重定位信息,可以装载到内存的随意位置执行,而com文件则除了机器代码和数据之外一无所有,一般只能在指定地址运行。……怯怯的问,回答你的问题有分么?

#22


GZ!
 偶也在写裸机上运行的东东. 现在看来只能用 汇编
如果能用C就好了.

#23


不懂,但是  以前有个工具叫做exe2com的   如果真的是.com文件那种类型的话,用那个工具试试。

#24


你那哥们说的很对呀. COM 已经不会再用了. 那是很不安全的. 操作系统管理进程的话.
是纯机器码不是已经不重要了. 所以那种格式的文件已经不会再有市场了.

#25


楼主可能是要写一些如操作系统一样的底层应用,所以才会用到BIN格式,也称为Plain Binary格式,楼主,是吗?

其实不管是当前哪种操作系统中的哪中可执行文件格式,本质都是在Plain Binary格式的基础上加了一些额外的东西;拿PE文件格式来说吧,楼主可以自己写程序,将TEXT段中的代码自己搬移,形成32位的Plain Binary,这是完全可行的。

#26


学习啊.

#27


gz

#28


关注..学习ing

#29


有什么用?
不就快一点,小一点,不安全一些是吧。

#30


按照楼主所说的bin文件的定义,其实就是exe文件在内存中重定位好了以后的内存映像。建议楼主可以自己做一个loader,重新定位exe文件中的段。或者,写一段程序,将exe载入内存后,重新取出一个内存映像。

#31


在TORNADO下就可以生产BIN,HEX和EXE文件!

#32


帮你顶一下

#33


没有系统可以执行这类文件的。

#34


楼主可以参考如下文件:
http://www.nondot.org/sabre/os/files/Booting/CompilingBinaryFilesUsingACompiler.pdf
不过是英文版的,如有谁能翻译成中文,将不胜感激!

#35


to quickreport(快速报告) :
这个电子书我有,但我没有Linux,用的是MinGW编译器,也用过Cygwin的GCC,结果出现同样的一条错误信息,跟PE格式有关的~

#36


真不知道CSDN上的高人都到哪里去了,害我花这么长时间自己找到正解!GCC的objcopy工具可以实现这个功能,而我最喜欢的MinGW中的也可以!哈哈~~具体方法是:
先用gcc把xxx.c编译成xxx.o,记住这个xxx.c中不能有库函数调用,否则后面步骤会出错。还有没有其他的限制,本人正在试验中。
再 objcopy -O binary xxx.o xxx.bin
生成的那个xxx.bin就是我要的了,哈哈!
上面学习的关注的都给我记住了吧!分就不给你们了!quickreport(快速报告) 老兄说得比较贴边,也给我了启发,给你一些分,其他的给我哥们了,别不服哈!