将一个普通文件的内容链接到可执行程序中
2014-02-10 15:55
351 查看
有时候,我们可能需要将一个普通文件的内容,链接到可执行程序中。
本文就来说说如何实现这个目标。
我们将制作一个简单的hello_world可执行程序,该程序中包含了另一个文件haha.txt的内容,hello_world程序运行后将打印他所包含的文件haha.txt的内容。
其中,haha.txt内容如下:
I am a file who will be linked into a exe file.
注意,本文之所以用文本文件haha.txt,仅仅是为了便于说明问题。
实际上,本文的方法适用于将任意类型的文件链接到可执行程序中。
好了,现在就来看看具体的实现方法。
首先交待一下,我们接下来的工作,所用到的全部文件,全部位于同一个目录下。
这个目录,就是我们的工作目录。
我们所执行的所有命令,也都是在此目录下执行的。
一. 创建haha.o
haha.o是elf文件,创建他的目的,就是为了将他作为一个容器,用以包含haha.txt的内容。这样好和后面的hello_world.o进行链接。
创建haha.o的过程如下:
a)创建一个汇编语言源文件haha.S。
如果是Linux平台,gcc工具链,则内容如下:
.section .data
.globl
file_data_begin
.align 32
.type file_data_begin, @object
.size file_data_begin, file_data_end-file_data_begin
file_data_begin:
.incbin
"./haha.txt"
.globl
file_data_end
.align 1
.type file_data_end, @object
.size file_data_end, 0
file_data_end:
如果是windows平台,mingw工具链,[b]则内容如下:[/b]
.globl
_file_data_begin
.data
.align 32
_file_data_begin:
.incbin
"./haha.txt"
.globl
_file_data_end
.data
.align 1
_file_data_end:
.space 0
b) 编译haha.S生成haha.o
gcc -c haha.S
二、创建hello_world.o
a)创建一个C源文件hello_world.c,内容如下:
#include <stdio.h>
#include <string.h>
extern char file_data_begin[];
extern char file_data_end[];
int main(int argc, char *argv[])
{
int data_len = file_data_end - file_data_begin;
char data_tmp[data_len+1];
memcpy(data_tmp, file_data_begin, data_len);
data_tmp[data_len]=0;
printf("I contais a file with %d bytes data\n", data_len);
printf("its contents is as bellow:\n %s", data_tmp);
return 0;
}
b) 编译hello_world.c生成[b]hello_world.o[/b]
gcc -c hello_world.c
三、生成最终的hello_world.exe
gcc -o hello_world.exe hello_world.o haha.o
四、运行效果
# ./hello_world.exe
I contais a file with 47 bytes data
its contents is as bellow:
I am a file who will be linked into a exe file.
本文就来说说如何实现这个目标。
我们将制作一个简单的hello_world可执行程序,该程序中包含了另一个文件haha.txt的内容,hello_world程序运行后将打印他所包含的文件haha.txt的内容。
其中,haha.txt内容如下:
I am a file who will be linked into a exe file.
注意,本文之所以用文本文件haha.txt,仅仅是为了便于说明问题。
实际上,本文的方法适用于将任意类型的文件链接到可执行程序中。
好了,现在就来看看具体的实现方法。
首先交待一下,我们接下来的工作,所用到的全部文件,全部位于同一个目录下。
这个目录,就是我们的工作目录。
我们所执行的所有命令,也都是在此目录下执行的。
一. 创建haha.o
haha.o是elf文件,创建他的目的,就是为了将他作为一个容器,用以包含haha.txt的内容。这样好和后面的hello_world.o进行链接。
创建haha.o的过程如下:
a)创建一个汇编语言源文件haha.S。
如果是Linux平台,gcc工具链,则内容如下:
.section .data
.globl
file_data_begin
.align 32
.type file_data_begin, @object
.size file_data_begin, file_data_end-file_data_begin
file_data_begin:
.incbin
"./haha.txt"
.globl
file_data_end
.align 1
.type file_data_end, @object
.size file_data_end, 0
file_data_end:
如果是windows平台,mingw工具链,[b]则内容如下:[/b]
.globl
_file_data_begin
.data
.align 32
_file_data_begin:
.incbin
"./haha.txt"
.globl
_file_data_end
.data
.align 1
_file_data_end:
.space 0
b) 编译haha.S生成haha.o
gcc -c haha.S
二、创建hello_world.o
a)创建一个C源文件hello_world.c,内容如下:
#include <stdio.h>
#include <string.h>
extern char file_data_begin[];
extern char file_data_end[];
int main(int argc, char *argv[])
{
int data_len = file_data_end - file_data_begin;
char data_tmp[data_len+1];
memcpy(data_tmp, file_data_begin, data_len);
data_tmp[data_len]=0;
printf("I contais a file with %d bytes data\n", data_len);
printf("its contents is as bellow:\n %s", data_tmp);
return 0;
}
b) 编译hello_world.c生成[b]hello_world.o[/b]
gcc -c hello_world.c
三、生成最终的hello_world.exe
gcc -o hello_world.exe hello_world.o haha.o
四、运行效果
# ./hello_world.exe
I contais a file with 47 bytes data
its contents is as bellow:
I am a file who will be linked into a exe file.
相关文章推荐
- 将普通文件链接到可执行程序中
- 1.2.在linux环境实践,使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。并熟悉相关指令。
- 一个简单的 C 程序文件,经过 0、编写,1、预处理,2、编译,3、链接,终于生成了一个可执行文件
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- ffmpeg 实现转码一个普通视频文件为视频mpeg4,音频mp3的功能的程序(摘)
- 把一个shell程序编译成二进制可执行文件
- 实现一个可以加载资源中隐藏的.exe可执行文件的程序
- win7中右击“计算机”点“管理” 则出现“该文件没有与之关联的程序来执行操作。请安装一个程序,或者,如果已安装程序,请在‘默认程序’控制面板中创建关联。”
- Cygwin链接可执行程序的一个坑
- 将Java程序变成可执行文件的一个简单方法
- GCC & ELF文件格式 &linux内核如何加载和启动一个可执行程序
- 查看文件内容- 删除某个运行程序的所有进程-nohup后台执行程序
- 两台硬件和软件配置完全相同的机器A和B,现在要用系统自带的Copy功能把A上的一个文件,复制到B上。在哪台机器上执行程序,效率更高?
- linux: 将32位.o文件和64位.o文件链接成64位的可执行程序
- 浅谈一个程序如何生成一个可执行文件
- 给朋友写了一个从脚本文件逐行加载执行SQL语句的程序,现在分享给将来需要的朋友们参考
- ILMerge将winform程序打包成一个单文件可执行exe
- ffmpeg 实现转码一个普通视频文件为视频mpeg4,音频mp3的功能的程序(摘)
- 用VS2010创建程序安装时执行一个exe文件
- python读取 .txt 文本内容以及将程序执行结果写入txt文件