linux下把普通文件链接到可执行文件中

来源:互联网 发布:淘宝上外贸原单 编辑:程序博客网 时间:2024/05/21 10:59

    有时候,我们可能需要将一个普通文件的内容,链接到可执行程序中,便于软件发布。本文就来探讨一下在linux下如何把普通文件链接到可执行文件中,如何又怎么取出该文件内容。

    这边就用一个实例来讲述如何实现该目标,这边主要有两个文件,一个是.c文件:test.c,一个是普通文件:text.txt文件,test.txt文件内容为hello world,实例代码如下所示:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <elf.h>asm(".balign 4096");asm("_binary__module_start:");asm(".incbin \"test.txt\"");asm("_binary__module_end:");extern char _binary__module_start[];extern char _binary__module_end[];int main(int argc, char *argv[]){    int len;    char *ptr;    len = _binary__module_end - _binary__module_start;    ptr = (char *)malloc(len + 1);    if (ptr == NULL) {        return -1;    }    memset(ptr, 0, len + 1);    memcpy(ptr, _binary__module_start, len);    printf("%s.\n", ptr);    free(ptr);    return 0;}
注意:在该文件对应目录下要有test.txt文件。

    asm(".balign 4096");是说文件按照4096字节对齐,这linux的可执行文件加载到内存都是按照一个page加载到内存的,而linux默认一个page是4096字节,所以这边就按照4096字节对齐,这最好是用page相关的宏;asm("_binary__module_start:");是文件开始的标识,该标识也是文件开始指针,asm("_binary__module_end:");文件标识结束,文件结束指针;INCBIN 指令在被汇编的文件内包含一个文件。 该文件按原样包含,没有进行汇编。

       gcc -o test test.c编译源文件,生成test可执行文件,该可执行文件就已经包含了test.txt。执行该源文件,结果如下所示:

root@chen-virtual-machine:~/桌面# ./testhello world!.
    从该实例就可以知道应该怎么样把普通文件链接到可执行文件中并读取普通文件内容了。当然也可以把其它文件,如可执行的二进制文件链接到可执行文件中,然后在该可执行文件中执行该二进制可执行文件,这可以简化软件的操作流程。


水平有限,可能表述不一定正确,还望见谅!



0 0
原创粉丝点击