강좌 & 팁
글 수 2,412
2011.03.03 17:45:51 (*.138.143.120)
45409
프로그램 실행에 필수적인 데이터를 파일에서 읽어 들일수도 있지만 데이타의 분실문제와
단일 파일로 관리해야 하는 필요성이 있을때 objcopy를 이용해 실행파일에 데이타를 삽입하는 방법을 소개한다.
먼저 이미지 파일을 elf32 형식의 오브젝트 파일 foo.o 로 변환하는 방법이다.
root@boggle70-desktop:tmp# objcopy -I binary -O elf32-i386 -B i386 foo.jpg foo.o
root@boggle70-desktop:tmp# ls -la foo.*
-rw-r--r-- 1 root root 14102 2010-09-16 22:38 foo.jpg
-rw-r--r-- 1 root root 14532 2011-02-26 20:28 foo.o
root@boggle70-desktop:tmp#
foo.o 를 링크한 C 프로그램에서 foo.jpg 데이타는 다음과 같은 변수명을 이용해 참조한다.
extern char _binary_foo_jpg_start[];
extern char _binary_foo_jpg_end[];
extern char _binary_foo_jpg_size[];
main.c 파일에서 사용해 봅니다.
1 #include <stdio.h>
2
3
4 extern char _binary_foo_jpg_start[];
5 extern char _binary_foo_jpg_end[];
6 extern char _binary_foo_jpg_size[];
7
8 void main(void)
9 {
10 const char *start = _binary_foo_jpg_start;
11 const char *end = _binary_foo_jpg_end;
12 int size = (int)_binary_foo_jpg_size;
13
14 printf("size of foo.jpg is %d\n", size);
15
16 printf("--- 0x%x\n", (unsigned char)start[0]);
17 printf("--- 0x%x\n", (unsigned char)start[1]);
18 printf("--- 0x%x\n", (unsigned char)start[2]);
19 printf("--- 0x%x\n", (unsigned char)start[3]);
20
21 }
22
이제 컴파일을 합니다.
root@boggle70-desktop:tmp# cc -o main.o main.c foo.o
실행해 볼까요?
root@boggle70-desktop:tmp# ./main.o
size of foo.jpg is 14102
--- 0xff
--- 0xd8
--- 0xff
--- 0xe0
정확히 파일의 크기를 가져왔습니다.
또한 데이타의 내용도 jpeg 의 Marker Code 인 ffd8 ffe0 를 가져왔습니다.
가끔가다가 유용하게 사용할만 합니다.
참고 자료 : Binary Hacks - O'REILLY