如何将任意文件编译为.o文件?
来源:互联网 发布:手机按键连发软件 编辑:程序博客网 时间:2024/06/14 11:13
在许多嵌入式开发的系统中,由于没有文件系统,所以对于文件的处理不太方便。如果是一个很小的文件,可以做成数组形式。可如果文件稍大该如何处理呢?有没有一种更好的办法?呵呵,办法当然是有的。
假定我们有一个文本文件(一般需要嵌入的都是图片文件或者bin文件,此处只是为了方便演示)data,需要把这个文件做成.o文件,并编译到最终程序中。
首先执行objcopy命令:objcopy -I binary -O pe-i386 -B i386 data data.o 由于本人是在Cygwin下测试,所以-O选择执行程序文件格式为pe-i386,-B选择架构为i386。
然后用nm命令查看生成的data.o文件:
$ nm data.o
00000241 D _binary_data_end
00000241 A _binary_data_size
00000000 D _binary_data_start
好了,我们看到data.o中有三个对象,_binary_data_end、_binary_data_size和_binary_data_start,对象生成的命名规则是固定的,所以不用nm命令也可以推测出这三个对象的名字。
好了,现在需要在代码中引用它们了,需要先声明:
extern char binary_data_start;
extern int binary_data_size;
extern char binary_data_end;
完整的C代码如下:
#include <stdio.h>extern char binary_data_start;extern int binary_data_size;extern char binary_data_end;int main(void){ printf("%s\n",&binary_data_start); printf("String length: %d\n",&binary_data_size); return 0;}
编译cc data.o test.c -o test
执行结果:
$ ./testYou Are BeautifulMy life is brilliantMy life is brilliantMy love is pureI saw an angelOf that I'm sureShe smiled at me on the subwayShe was with another manBut I won't lose no sleep on that night'Cause I've got a planYou're beautiful, you're beautifulYou're beautiful, it's tureI saw your face in a crowded placeAnd I don't know what to do'Cause I'll never be with youYes, she caught my eyeAs I walked on byShe could see from my face that I was freaking highAnd I don't think that I'll see her againBut we shared a moment that will last util the end...String length: 577需要注意的是Cygwin和Linux对于符号表的引用是不同的,Linux下nm导出的符号表和C代码中引用的变量名是一致的,Cygwin代码中引用需要去掉“_”。
另外_binary_data_size这个变量比较特殊,对它取地址可以得到文件的长度。至于它本身定义成什么类型,似乎无关紧要。本人对此有个知识盲点,即只知道这样使用是可以,但不知道该变量本身的具体意义。查看nm的man命令,对于A类型的解释是“The symbol's value is absolute, and will not be changed by further linking.”,就是说这是一个绝对值,在将来链接时也不会改变。哪位高人看到此文,希望不吝指教。
2012/4/20 补充:
后来我买过一本书,讲嵌入式整个项目的开发过程的,写的很好。作者推荐的做法是做一个头文件,头文件里有一个数组,数组内容便是要编译到系统的文件。
作者以此为例,实现了一个把任意文件转换为数组内容的C程序,进而讲述了Office Tools的重要性。
最近我刚刚发现,原来Linux已经有了这样贴心合用的工具了,xxd,一个以十六进制显示文件的工具。
比如:
xxd test.c 将以十六进制显示test.c的内容,和UltraEdit的显示类似,左边是hex,右边是ASCII。
xxd test.c -i test.h 将test.c文件转换为包含test.c文件内容的数组,数组内容为test_c。
目前只发现这两种做法,是做成.o,还是做成.h,这个看个人喜好和项目特点。
- 如何将任意文件编译为.o文件?
- 如何将py文件编译为pyc
- 如何将一个data文件变成.o
- 【GPS】批量将d文件转换为o文件
- 将任意表数据导出为CSV文件的过程
- NodeJs将任意文件转换为base64格式
- 如何将 exe程序和vb编译的exe文件 封装为一个exe文件
- 将cs文件单独编译为dll
- C#将类文件编译为dll文件
- 将.c文件(交叉)编译为.ko文件
- 将.c文件(交叉)编译为.ko文件
- o2cgrep工具搜索被编译为".o"的C文件
- o2cgrep工具搜索被编译为".o"的C文件
- 如何将ASPX 转换为静态文件。
- 如何将MATLAB文件转化为可执行文件
- 如何将Word转化为PDF文件
- 如何将CHM转换为PDF文件?
- 如何将光盘制作为iso文件
- Tomcat安装与配置
- 在oracle 9i下在线重定义表
- wizd media server for syabas-based players
- MYSQL中的auto_increment_increment和auto_increment_offset
- current_session_context_class
- 如何将任意文件编译为.o文件?
- 迷宫 DFS 递归 解法
- C/C++ 流媒体服务器
- 控制寄存器 cr0,cr2,cr3
- C语言学习笔记(8)
- 路径分析,可以拖动上面的节点,动态修改
- 有点意思的C/C++问题及解答:21-25
- 请你推理出哪位小姐养蛇。有五位小姐排成一排,她们姓,衣服颜色,喝的饮料,养的宠物,吃的水果各不相同
- 26款 流媒体服务器开源软件