본문 바로가기

IT/프로그래밍

[Linux] 공유 라이브러리 생성

728x90

원글(이글루): 2009-12-29 20:46:11

gcc -fPIC -c file1.c file2.c

# -fPIC 옵션은 cc1 컴파일러에게 위치에 관계 없이 수행되는 코드로 컴파일 하라는 옵션임
#   file1.o file2.o 가 만들어짐

gcc -shared -Wl,-soname,libmy.so.0 -o libmy.so.0.0.0 file1.o file2.o

# -shared : file1.o file2.o 를 링크할때 정적 라이브러리와 동적 라이브러리가 같이 있다면 동적 라이브러리를 사용하여 링크하라
# -W1 옵션 : 뒤에 오는 옵션은 링크(collect2)에게 gcc를 거치지 않고 바로 전달하라
# -soname 옵션 : 공유라이브러리의 soname을 정하는 것. 파일명과는 틀린 개념으로 지금 처럼 soname을 libmy.so.0 라고 이름 지어주고 파일명이 libmy.so.0.0.0인 공유 라이브러리를 만들어냈다면, 이후 libmy.so (나중에 만드는 libmy.os.0.0.0의 심볼릭 링크 파일)를 링크해서 컴파일되는 모든 실행 파일들은 시행 될 때, 동적 링크(/lib/ld-linux.so.2)가 공유 라이브러리르 찾을 때 libmy.so.0.0.0을 찾는것이 아니라 soname인 libmy.so.0 (libmy.so.0.0.0의 심볼릭 링크)를 찾아서 링크하게된다.

ln -s libmy.so.0.0.0 libmy.so
# gcc 링크를 위한 파일
ln -s libmy.so.0.0.0 libmy.so.0
# 동적 링크를 위한 파일

echo `pwd` >> /etc/ld.so.conf
# 라이브러리 디렉토리 저장

ldconfig
# 공유라이브러리 캐시 갱신 (/etc/ld.so.conf를 읽어서 /etc/ld.so.cache 파일 갱신)

gcc -o lll libtest.c  -L./ -lmy
#컴파일

[root@test ]# ldd lll
        linux-gate.so.1 =>  (0xffffe000)
        libmy.so.0 => /root/CodeTest/lib_shared/libmy.so.0 (0xb7fdd000)
        libc.so.6 => /lib/tls/libc.so.6 (0xb7eb3000)
        /lib/ld-linux.so.2 (0xb7feb000)
[root@test ]#
# 확인 제대로 안된 경우 libmy.so.0 => Not Found 형태로 나타난다.

728x90