`
^=^
  • 浏览: 23777 次
  • 性别: 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.”,就是说这是一个绝对值,在将来链接时也不会改变。哪位高人看到此文,希望不吝指教。

分享到:
评论

相关推荐

    Java反编译工具把.class文件转换为.java文件

    ### Java反编译工具:将.class文件转换为.java文件 #### 概述 在软件开发领域,有时我们可能需要分析第三方库或者开源项目的内部结构,这时就需要借助于反编译工具来帮助我们阅读和理解其源码。Java作为一种广泛...

    linux中把.c的文件编译成.so文件

    本文将详细介绍如何在Linux环境下将一个简单的`.c`文件编译成`.so`文件。 #### 二、编译流程详解 ##### 2.1 准备源代码文件 假设我们有一个名为`mylib.c`的源代码文件,该文件包含了我们想要编译成动态链接库的函数...

    MakeFile编译当前目录下所有CPP文件,并连接成可执行文件

    6. **`objs`**: 使用`patsubst`函数将 `src` 变量中的 `.cpp` 文件转换为对应的 `.o` 文件。 #### 规则定义解析 1. **主目标 `TARGET`**: - `TARGET`: 定义为主目标名称,这里命名为 `run`。 - 依赖项 `$(objs)`...

    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...

    jad反编译工具.rar

    3. **反编译操作**:jad会尝试将每个.class文件转换为.java源代码文件,并保存在指定的输出目录。 需要注意的是,jad虽然强大,但并不能保证完全恢复原始源代码,尤其是当原代码经过高级混淆或者优化时。此外,反...

    两种方法反编译Android的apk文件.doc

    为了满足学习与研究的需求,本文将详细介绍两种常用的反编译方法:一种是通过`dex2jar`和`jad`工具将`.apk`文件转换为可读的Java源代码;另一种则是使用`Dex2jar`和`Dedexer`工具生成更接近原始代码结构的输出。 ##...

    只使用APUE的libapue.a库文件和apue.h头文件的例程,有Makefile

    这个Makefile会根据源文件生成对应的.o目标文件,然后使用静态链接的方式将libapue.a库和目标文件链接成可执行文件。`-L.`指定了库文件的查找路径为当前目录,`-lapue`则是告诉链接器需要链接libapue库。 通过这种...

    android的apk之反编译.pdf

    2. **assets/**: 用户自定义的任意文件,如音视频、字体文件等。 3. **classes.dex**: 这是Dalvik虚拟机可执行文件,包含了应用的主要逻辑代码。 4. **lib/**: 应用依赖的本地库文件。 5. **AndroidManifest.xml**: ...

    编译crowbar 0.4.02

    3. 如果编译成功,你将在当前目录下看到一个名为`crowbar`的可执行文件。为了确认编译无误,你可以运行`./crowbar`测试一下。 4. 在实际使用Crowbar时,可以将生成的`crowbar`可执行文件复制到系统路径下的某个目录...

    Fluent UDF【8】_编译型UDF.pdf

    编译/构建过程需要一个或多个 UDF 的源文件(例如 myudf.c),并将它们编译成对象文件(例如 myudf.o 或 myudf.obj),之后将其构建成一个“共享库” (例如,libudf.dll)与目标文件。 使用 GUI 方式编译源文件时...

    Makefile教程

    例如,一个规则可能会定义如何将 .c 文件编译成 .o 文件。 3. **变量和宏**:Makefile 支持变量定义和宏展开,使得脚本更加灵活且易于维护。常见的变量包括 CC(编译器)、CFLAGS(编译选项)等。 4. **模式匹配**...

    通用makefile文件

    1. **隐含规则**:`make`内置了一些隐含规则,如将`.c`文件编译为`.o`对象文件,然后链接生成可执行文件。 2. **通配符**:`*`可以匹配任何字符,例如`*.c`表示所有以`.c`结尾的文件。 3. **模式规则**:`%`是一个...

    韦东山通用Makefile文件

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

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

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

    拆分合并任意文件

    总的来说,"拆分合并任意文件"涉及到计算机科学中的核心概念,包括文件I/O操作、二进制数据处理、文件管理以及程序设计。在实际应用中,理解这些概念对于开发高效且可靠的文件处理工具至关重要。无论是为了优化存储...

    makefile_study.rar

    它定义了目标文件、依赖文件以及将源文件编译成目标文件所需的命令。 2. **基本结构** `Makefile`通常包含目标(target)、依赖文件(dependencies)和命令(commands)。一个简单的规则形式是: ``` target : ...

    跟我写makefile.doc

    - `%.o: %.c` 使用模式规则 `%` 来匹配任意的 `.c` 文件,并将其编译成 `.o` 文件。 - `clean:` 规则用于清理编译产生的临时文件。 #### 六、Makefile 进阶技巧 - **通配符(Wildcard)**:使用 `*` 和 `?` 等...

    makefile的编写指导

    - **模式规则**: 可以定义通用的规则来处理特定类型的文件,如所有`.c`文件编译为`.o`文件。 - **隐含规则**: makefile允许定义一些默认的行为,如`.c`文件如何被编译为`.o`文件。 - **递归调用**: 有时候需要在...

    跟我一起写Makefile.pdf

    编译是将源代码转换为中间目标文件(通常为`.o`文件)的过程,而链接则是将多个目标文件以及库文件合并成最终的可执行文件。Makefile可以自动管理这些步骤,通过指定规则来决定何时编译和链接哪些文件。 2. **...

    gitignore 文件的使用规则

    上述规则将忽略所有扩展名为 `.tmp` 的文件,无论它们位于哪个目录层级。 - **排除规则**:如果希望取消之前设置的忽略规则,可以在 `.gitignore` 文件中使用感叹号(!)进行取消。例如: ```plaintext !/build/...

Global site tag (gtag.js) - Google Analytics