이성준 imggaibi@hotmail.com Library 만들기 이성준 imggaibi@hotmail.com
정적 library Compile 정적 라이브러리 생성 라이브러리 목차 생성 검사 Gcc –c file_name 라이브러리로 만들고자 하는 파일을 실행이 불가능한 오브젝트 파일로 만든다. 정적 라이브러리 생성 Ar crv lib&lib_name.a file_name.o 라이브러리로 데이터를 추가하기 위해 ar을 사용한다. 하나의 큰 파일 내에 포함되는 개별적인 자료들의 모음이나 집합체를 생성한다. 라이브러리 목차 생성 Ranlib lib&lib_name.a 라이브러리를 성공적으로 사용하기 위해 라이브러리 목차를 생성할 필요가 있다. GNU 소프트웨어 개발 도구를 사용할 때는 이 과정을 생략하는 것이 가능하다. 검사 Gcc –o runable_name file_name.c L. llib_name 라이브러리를 이용하기 위해 라이브러리의 위치와 이름을 명명하여 야 한다. -L : 라이브러리의 위치 표기 -l : 사용하려는 라이브러리 명 표기
동적 library Rename Compile Library 생성 링크 생성 실제 사용할 링크 생성 검사 라이브러리 경로 추가 만들고자 하는 파일의 이름을 lib&file_name.c로 변경 Compile Gcc –fPIC –Wall –g –c lib&file_name.c Library 생성 Gcc –g –shared –Wl , -soname,lib&file_name.so.0 –o lib&file_name.so.0.0 lib&file_name.o –lc 링크 생성 Ln –sf lib&file_name.so.0.0 lib&file_name.so.0 실제 사용할 링크 생성 Ln –sf lib&file_name.so.0 lib&file_name.so 검사 Gcc –o runable_filename runable_filename.c –L. –lfile_name 동작 안함 라이브러리 경로 추가 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd) Export LD_LIBRARY_PATH
시스템 콜 추가 (1) 시스템 콜 추가를 위해 할일 커널 수정 시스템 콜 번호를 할당한다. Linux2.4/include/asm/unistd.h sys_call_table에 등록한다. Linux2.4/arch/arm/kernel/calls.S 추가할 시스템콜 코드를 작성 Linux2.4/arch/arm/kernel/에 작성 커널에 포함시킨다. Linux2.4/arch/arm/kernel/Makefile 커널을 새로 컴파일한다.
시스템 콜 추가 (2) 새로운 시스템 콜을 사용하는 유저 프로그램을 작성한다. 새로운 시스템 콜을 사용하여 프로그램을 작성한다. 라이브러리를 수정한다. (ar, ranlib)
시스템 콜 추가 (3) sys_call_table syscall number : Linux2.4/include/asm/unistd.h #define __NR_SYSCALL_BASE 0x900000 #define __NR_exit (__NR_SYSCALL_BASE+ 1) #define __NR_fork (__NR_SYSCALL_BASE+ 2) #define __NR_read (__NR_SYSCALL_BASE+ 3) …. #define __NR_wrapper (__NR_SYSCALL_BASE+ 227) sys_call_table : Linux2.4/arch/arm/kernel/calls.S ENTRY(sys_call_table) .long SYMBOL_NAME(sys_ni_syscall) /* 0 */ .long SYMBOL_NAME(sys_exit) /* 1 */ .long SYMBOL_NAME(sys_fork_wrapper) /* 2 */ .long SYMBOL_NAME(sys_read) /* 3 */ .long SYMBOL_NAME(sys_wrapper) /* 227 */ .rept NR_syscalls-216 .long SYMBOL_NAME(sys_ni_syscall) .endr
시스템 콜 추가 (4) 커널 내부의 시스템 콜 코드의 일반적인 형식 asmlinkage int sys_fork(regs) /* arch/arm/kernel/sys_arm.c */ { return do_fork(..); } int do_fork(..) /* kernel/fork.c */ …. /* create new process */ asmlinkage int sys_read(fd, buf, count) /* fs/read_write.c */ ….. /* read data */
시스템 콜 추가 (5) 시스템 콜 추가 예제 (2) 3. 시스템 콜 코드 작성 (kernel/mysyscall.c) asmlinkage int sys_wrapper(int a, int b) { printk(“Hello Linux, I’m in Kernel\n”); return a * b; } 4. Makefile 수정 (kernel/Makefile) O_OBJS = sched.o fork.o exec_domain.o panic.o printk.o \ wrapper.o 5. 커널 재 컴파일
시스템 콜 추가 (6) 시스템 콜 추가 예제 (3) 6. 사용자 프로그램 작성 #include <linux/unistd.h> #include <stdio.h> _syscall2(int, wrapper); int main() { printf(“sum = %d (use wrapper())\n", wrapper(10, 10)); }