在分析linux内核编译流程的时候,看到arch/arm/boot/comPRessed/piggy.gzip.S将压缩后的Linux内核(arch/arm/boot/compressed/piggy.gzip)包含进来:
1: .section .piggydata,#alloc
2: .globl input_data
3: t_data:
4: .incbin "arch/arm/boot/compressed/piggy.gzip"
5: .globl input_data_end
6: t_data_end:
我们是不是也可以利用这种方法将一副图片作为可执行程序的一个段,然后再程序中访问这个段来达到显示图片的目的?下面是我的做法:
 
仿照piggy.gzip.S实现demo.S:
1: .section .peng
2: .incbin "./logo.jpg"
main.c
1: #include <stdio.h>
2:
3: extern unsigned int __peng_start;
4: extern unsigned int __peng_end;
5:
6: char *p = (char *)(&__peng_start);
7: //我们要获取__peng_start的存放地址,作为字符串首地址,或者数组名来使用。
8: int main(int argc, const char *argv[])
   9: {          10: int i;
11: unsigned int len = 0;
12:
13: len = (unsigned int)(&__peng_end) - (unsigned int)(&__peng_start);
14:
  15:     printf("len = %x/n", len);          16:
  17:     printf("%p/n", &__peng_start);            18:     printf("%p/n", &__peng_end);          19:
20: for(i=0; i<len; i++)
  21:     {          22: if (i % 16 == 0)
  23:         {            24:             printf("/n");          25: }
  26:         printf("%3x ", *p++&0xff);          27: }
28:
29:
30: return 0;
31: }
Makefile
1: CC=gcc -Wall
2:
3: main:main.o demo.o
4: $(CC) $^ -Tload.lds -o $@
5:
6: main.o:main.c
7:
8: demo.o:demo.S
9:
10:
11: clean:
12: $(RM) *.o main
load.lds
   1: OUTPUT_FORMAT("elf32-i386", "elf32-i386",          2: "elf32-i386")
3: OUTPUT_ARCH(i386)
4: ENTRY(_start)
   5: SEARCH_DIR("/usr/i486-linux-gnu/lib32"); SEARCH_DIR("/usr/local/lib32"); SEARCH_DIR("/lib32"); SEARCH_DIR("/usr/lib32"); SEARCH_DIR("/usr/i486-linux-gnu/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");          6: SECTIONS
   7: {          8: /* Read-only sections, merged into text segment: */
   9:   PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x08048000)); . = SEGMENT_START("text-segment", 0x08048000) + SIZEOF_HEADERS;            10:   .interp         : { *(.interp) }            11:   .note.gnu.build-id : { *(.note.gnu.build-id) }            12:   .hash           : { *(.hash) }            13:   .gnu.hash       : { *(.gnu.hash) }            14:   .dynsym         : { *(.dynsym) }            15:   .dynstr         : { *(.dynstr) }            16:   .gnu.version    : { *(.gnu.version) }            17:   .gnu.version_d  : { *(.gnu.version_d) }            18:   .gnu.version_r  : { *(.gnu.version_r) }          19: .peng :
新闻热点
疑难解答