首页 > 学院 > 操作系统 > 正文

链接脚本使用----- 将二进制文件作为一个段

2024-06-28 13:27:23
字体:
来源:转载
供稿:网友
链接脚本使用----- 将二进制文件作为一个段

在分析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:

 

我们是不是也可以利用这种方法将一副图片作为可执行程序的一个段,然后再程序中访问这个段来达到显示图片的目的?下面是我的做法:

image

仿照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 :
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表