`
^=^
  • 浏览: 22014 次
  • 性别: Icon_minigender_1
  • 来自: 蘇州
文章分类
社区版块
存档分类
最新评论

如何将任意文件编译为.o文件?

 
阅读更多

在许多嵌入式开发的系统中,由于没有文件系统,所以对于文件的处理不太方便。如果是一个很小的文件,可以做成数组形式。可如果文件稍大该如何处理呢?有没有一种更好的办法?呵呵,办法当然是有的。

假定我们有一个文本文件(一般需要嵌入的都是图片文件或者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代码如下:


编译cc data.o test.c -o test

执行结果:

需要注意的是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.”,就是说这是一个绝对值,在将来链接时也不会改变。哪位高人看到此文,希望不吝指教。

分享到:
评论

相关推荐

    AWD WAF watch bird 文件监控 不死马下载

    2.编译waf.c生成.so文件 waf.so (已编译) 3.将waf.so,watchbird.php文件存放在/var/www/html或其他目录中(/tmp) 4 每个防护的php前加入 <?php include_once "/var/www/html/watchbird.php" ?> 5.访问任意, 如xxx...

    韦东山通用Makefile文件

    这是最复杂的部分,它的功能就是把某个目录及它的所有子目录中、需要编进程序去的文件都编译出来,打包为built-in.o 详细的讲解请看视频。 四、怎么使用这套Makefile: 1.把顶层Makefile, Makefile.build放...

    万能makefile写法详解,一步一步写一个实用的makefile

    这里指示了main.o目标依赖于哪几个源文件,我们只要把这一行的内容,通过make的include指令包含到makefile文件里,即可在其任意一个依赖文件被修改后,重新编译目标main.o。 下面详解如何生成这个.d文件。 (二) ...

    DJ Java Decompiler 3.12.12.96 老朽痴拙汉化版(JAVA反编译)

    你可以反编译class文件并且可以保存为文本文件或其它格式。 DJ非常容易使用。选择你想反编译的class文件(路径勿含中文),或者只是双击想反编译的class文件(建立关联)。 DJ同时支持在界面上拖拽的方式来反编译class...

    C语言FAQ 常见问题列表

    o 7.16 我怎样编写接受编译时宽度未知的二维数组的函数 ? o 7.17 我怎样在函数参数传递时混用静态和动态多维数组 ? o 7.18 当数组是函数的参数时, 为什么 sizeof 不能正确报告数组的大小 ? * 8. 内存分配 ...

    精通WindowsAPI.pdf

    1.2 编译代码........................................................................................................................18 1.2.1 安装Visual Studio.............................................

    socket网络间通信传送文件

    修改IP 地址和端口号,即可实现任意主机互联, 传送文件的大小和格式没有限制! 把服务器端保存为:socket_service.c 客户端:socket_client.c 编译时执行: gcc -g socket_service.c -lpthread -o server gcc -g ...

    SCON工具源码

    建造结束后,得到了二进制文件 helloscons 以及编译的过程中产生的一些以 .o 结尾的目标文件。试运行 helloscons 一下 , 会得到 : $ ./helloscons Hello, SCons! 现在让我们回过头来解析一下 helloscons ...

    精通正则表达式~~~

    表达式编译、/o修饰符、qr/···/和效率... 348 理解“原文”副本... 355 Study函数... 359 性能测试... 360 正则表达式调试信息... 361 结语... 363 第8章:Java. 365 Java的正则流派... 366 Java对\p{…...

    编译原理词法分析

    实验一 用PL/O语言编写用户源程序 (一)实验目的:  1了解运行TURBO PASCAL系统对计算机软硬件环境的要求。...2也可改编PL/O的编译程序中的词法分析程序,使之能识别含repeat语句的程序。 

    cad插件

    “源泉建筑”为免费软件,您可以使用、复制、传播本软件,但请勿修改或反编译其核心运行程序文件 yqarch.vlx,以维护知识产权。未经作者同意不能将本软件用于其他商业用途。作者对使用本程序所引起的一切后果不承担...

    HYUploadSRV20190619.rar

    器中2GB的文件上传和断点续传,支持Windows和Linux服务器平台,支持任意格式的文件上传,尤其适合大的视频网站应用。单台服务器支持1000并发上传进程,支持PC端和智能手机端主流的浏览器。 【主要特性】 1.服务器端...

    smali、baksmali 2015.10最新版

    执行成功后你会发现,tools目录下多了一个classout文件夹,里面就是smali类型的文件,里面是反编译出的代码,但是不是java代码,还是能看出变量和方法的, 我们可以用这个:...

    你必须知道的495个C语言问题

    为什么这些问题如此频繁地出现? 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 5.17 说真的,真有...

    《你必须知道的495个C语言问题》

    为什么这些问题如此频繁地出现? 60 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 60 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 60 5.17 说真的...

    编译讲义实验

    实验一 用PL/O语言编写用户源程序 (一)实验目的:  1了解运行TURBO PASCAL系统对计算机软硬件环境的要求。 2熟悉PASCAL系统中的基本语句及文件类型的使用方法。 3掌握PL/O语言源程序的结构及构成...

    Editplus 3[1].0

    ④ 模板设置文件名称为“template.ini”,如果和主程序同一路径,可以使用相对路径 罗嗦了点,不过管用 要自动创建带有某种后缀的文件,方法同上。 【9】软件技巧——提示找不到语法文件 *.stx 的解决办法 原因...

    Centos7安装PostgreSql全自动部署脚本完整版

    文件下载后解压,然后将解压后的整个目录可上传到Linux系统中的任意位置。 如何开始安装? ①使用cd命令进入主目录【postgres-main】; ②执行【chmod u+x ./run.sh】; ③执行【./run.sh】便会自动执行数据库安装 ...

Global site tag (gtag.js) - Google Analytics