2009년 9월 2일 수요일

FreeBSD 공유라이브러리와 리눅스 호환

그 동안 정리가 되지 않았는데, 이제 다시 시작을 해보자구.

FreeBSD의 바이러리 형식은 aout, ELF가 존재함
aout : 이전 버전에서 사용하는 것으로 요즘에는 사용도가 낮아짐
-->/etc/rc.conf에서 ldconfig_paths_aout로 설정 가능
ELF : Executable and Linking Format
-->/etc/rc.conf에서 ld_config_paths
현재 사용하는 라이러리 목록을 알기 위해서는
sanjose# ldconfig -r
/var/run/ld-elf.so.hints:
search directories: /lib:/usr/lib:/usr/lib/compat:/usr/local/lib
0:-lc.7 => /lib/libc.so.7
1:-lcrypt.4 => /lib/libcrypt.so.4
2:-lkvm.4 => /lib/libkvm.so.4
3:-lm.5 => /lib/libm.so.5
4:-lmd.4 => /lib/libmd.so.4
5:-lncurses.7 => /lib/libncurses.so.7
6:-lncursesw.7 => /lib/libncursesw.so.7
...

내 프로그램이 필요한 라이브러리 확인 방법
sanjose# ldd /usr/local/bin/ltrace
/usr/local/bin/ltrace:
libelf.so.0 => /usr/local/lib/libelf.so.0 (0x2808b000)
libc.so.7 => /lib/libc.so.7 (0x2809f000)
libintl.so.8 => /usr/local/lib/libintl.so.8 (0x281a1000)
libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x281aa000)

다른 운영체제 응용프로그램 사용법
1) Recompiliation : 일반적인 방법 단 소스코드 필요함 --> port를 이용
2)Emulation : /usr/ports/emulators 아래의 것을 사용함, 오버헤드 발생함
3)ABI(Application Binary Interface) Implementation : 커널의 일부분으로 응용프로그램과의 통신을 담당, 프로그램 입장에서는 ABI는 운영체제라고 할 수 있음.

관련 명령어
sanjose# ldd /usr/local/bin/ltrace
/usr/local/bin/ltrace:
libelf.so.0 => /usr/local/lib/libelf.so.0 (0x2808b000)
libc.so.7 => /lib/libc.so.7 (0x2809f000)
libintl.so.8 => /usr/local/lib/libintl.so.8 (0x281a1000)
libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x281aa000)
<-- 필요한 라이브러리

sanjose# kldstat <- 현재 가동중인 커널 모듈
Id Refs Address Size Name
1 14 0xc0400000 6f7c94 kernel
2 1 0xc0af8000 85bc linprocfs.ko
3 3 0xc0b01000 287f0 linux.ko
4 1 0xc0b2a000 3074 linsysfs.ko
5 1 0xc0b2e000 6a45c acpi.ko

sanjose# brandelf /bin/sh <-어떤 O/S 공유라이브러리 사용하는지 확인
File '/bin/sh' is of brand 'FreeBSD' (9).

sanjose# brandelf /usr/compat/linux/bin/dd
File '/usr/compat/linux/bin/dd' is of brand 'Linux' (3).

댓글 없음: