$ ar rcs libmyhello.a arith.o print.o
ar option | description |
---|---|
r | 라이브러리에 오래된 object 파일이 있으면, 새 object 파일로 교체 |
c | archive가 존재하지 않으면 생성 |
s | archive에 object file index 넣기, 이 index는 library에서 symbol-lookup 으로 컴파일러에서 사용될 것임 |
$ gcc -Wall -I./src userprog.c -lmyhello -L./lib -o userprog
-fPIC
옵션$ gcc -fPIC -c src1.c
$ gcc -fPIC -c src2.c
CFLAGS | description |
---|---|
-fPIC | Position Independent Code로 Compile. Shared library의 필수요소 |
CFLAGS | description |
---|---|
-shared | compiler에게 executable한 object에게 link를 걸어 줄 수 있는 shared object를 만든다고 set하는 것 |
linker option | description |
---|---|
-Wl,[options] | -Wl, 은 링커에게 전해주는 옵션. 뒤에 [options]에 링크 옵션을 넣는다. |
-Wl,-soname,lib[name].so.1 | 생성 하려는 shared library의 soname을 지어준다. soname에는 major 버전만 명시 |
$ gcc -L<library Path> main.c -l<library> -o main
-L
로 shared library 위치를 알려주어 Compile-l
로 shared library link컴파일 되어도, shared library는 프로그램 실행 시 dynamic으로 링크 되기 때문에,
링커가 shared library 위치를 못찾을 수 있음!!
$ gcc -I. -Wl,-rpath,/usr/bin -L. userprog.c -lmyhello -o userprog
혹은
$ gcc -I. -wl,-rpath=/usr/bin -L. userprog.c -lmyhello -o userprog
-L<path>
를 지정 했기 때문에 알아먹었지만.. 실행 시는 동적으로 찾음/lib
, /usr/lib
, /usr/local/lib
에 위치 시키지 않았다면 아래와 같이 해야 shared library 위치를 알아먹음$ export LD_LIBRARY_PATH="$HOME/somewhere"
3-1. /etc/ld.so.conf
에 직접 위치 작성 (비추천)
최근에는 ld.so.conf
파일에 아래와 같은 문구 만 있음
include /etc/ld.so.conf.d/*.conf
즉, /etc/ld.so.conf.d/
에 있는 내용을 include
함
3-2. /etc/ld.so.conf.d/
libexample.conf 파일 작성
# libexample.conf
/some/where/library/path
작성 후, /etc/ld.so.cache
를 갱신 하는 명령인 ldconfig
실행
$ ldconfig
Naming Convention | e.g. | Description |
---|---|---|
Linker name | libexample.so | 링커가 '-lexample ' 과 같이 링킹할 때 사용되는 이름libexample.so -> libexample.so.1 소프트링크 |
Soname | libexample.so.1 | 모든 shared library 가 가지고 있는 soname 'libexample.so.1' 처럼 major 버전 명시 libexample.so.1 -> libexample.so.1.2 소프트링크 |
Real Name | libexample.so.1.2 | 실제 파일 |
$ readelf -d <library>
: soname 읽기.so -> ${libdir} = /usr/lib
.h -> ${includedir} = /usr/include
S="${WORKDIR}/git" 이기 때문에, source들이 S에 unpack 된다.
bitbake -c unpack myhello
결과
bitbake -c compile myhello
결과${CC}
로 컴파일 적용, 즉 --target
용으로 컴파일 됨do_compile() {
# ${CC} -fPIC -c print.c
arm-poky-linux-gnueabi-gcc -march=armv7ve -mthumb -mfpu=neon -mfloat-abi=hard \
-fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security \
-Werror=format-security \
--sysroot=/home/dhyang/poky/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/myhello/0.7-r0/recipe-sysroot \
-fPIC -c print.c
arm-poky-linux-gnueabi-gcc -march=armv7ve -mthumb -mfpu=neon -mfloat-abi=hard \
-fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security \
-Werror=format-security \
--sysroot=/home/dhyang/poky/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/myhello/0.7-r0/recipe-sysroot \
-fPIC -c arith.c
arm-poky-linux-gnueabi-gcc -march=armv7ve -mthumb -mfpu=neon -mfloat-abi=hard \
-fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security \
-Werror=format-security \
--sysroot=/home/dhyang/poky/build/tmp/work/armv7vet2hf-neon-poky-linux-gnueabi/myhello/0.7-r0/recipe-sysroot \
-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -fstack-protector-strong -Wl,-z,relro,-z,now \
-shared -Wl,-soname,libmyhello.so.1 -o libmyhello.so.1.0 print.o arith.o
}
${WORKDIR}/image
결과${WORKDIR}/image
${WORKDIR}/package
${WORKDIR}/packages-split
do_compile() {
${CC} -c -fPIC print.c
${CC} -c -fPIC arith.c
${CC} -${LDFLAGS} -shared -o libmyhello.so print.o arith.o
}
do_install() {
install -d ${D}${libdir}
install -m 0755 libmyhello.so ${D}${libdir}
install -d ${D}${includedir}
install -m 0644 mylib.h ${D}${includedir}
}
bitbake build 하면 엄청난 ERROR 유발한다.
${WORKDIR}/packages-split
SOLIBS = ".so.*"
SOLIBDEV = ".so"
FILES_${PN} = "... ${libdir}/lib*${SOLIBS} ..."
FILES_SOLIBESDEV ?= "... ${libdir}/lib*${SOLIBSDEV} ..."
FILES_${PN}-dev = "... ${FILES_SOLIBSDEV} ..."
unversioned libraries를 패키지하기 위해, 아래와 같이 변수를 수정해야한다.
SOLIBS = ".so"
FILES_SOLIBSDEV = ""
위 수정으로 .so
가 real library가 되고 FILES_SOLIBDEV가 unset되어 그결과 PN-dev에서 어떠한 libraries들도 패키지되지 않는다.
-dev
패키지에 '심볼릭 링크가 아닌 .so
' 파일이 추가될 경우, 기본 A패키지가 A-dev패키지를 RDEPENDS 해버린다.