.so 파일 만들 때 주의점
1. -fPIC -shared 혹은 -KPIC 등을 사용하여 재배치 가능한 obj 파일을 생성하자.
2. 컴파일되었다고 좋아하지 말고, nm -C | grep UNDEF 해서 표준 라이브러리가 아닌 것이 없도록 처리해야 할 것이다. nm 은 솔라리스에서는 /usr/ccs/bin 에 있다.
header 파일만 있어도 .so 파일을 생성할 수 있다.
3. ld 쓸 경우는 -dy 옵션을 잊지 말고, 가능하면 libtool(참조) 을 써서 전자동 처리를 하도록 하는게 편하다.
.a 의 경우
1. -fPIC, -KPIC 등을 써서 재배치 가능하게 obj 를 만들 필요가 있다.
일단 다 만들고 나서 안정성이 확인되었을 경우에는 strip 등을 써서 디버깅 정보를 지워주는 센스도 필요하다.
별도로
멀티스레드 컴파일 옵션
multithread 의 경우 -mt 옵션(거의 공통)
비트별 컴파일 옵션
솔라리스( CC )
최적화 옵션 -xO3
32비트 -xtarget=ultra2 -xarch=v8plusa
64비트 -xtarget=ultra2 -xarch=v9 혹은 -xarch=v9b
리눅스( gcc )
32비트 -m32
64비트 -m64
HP/UX( aCC )
추후... 기억이 안나넹..
AIX ( xlC )
추후... 기억이 안나넹..
정적라이브러리(또는 Archive)파일이라 불리우고 .a의 확장자를 가진다. 여러개의 오브젝트 파일들을 하나로 묶어 사용하기때문에 Archive파일이라고 부른며 컴파일 시간에 코드를 포함하여 결정하기 때문에 정적 라이브러리라고 부른다. 위의 파일을오브젝트 파일로 컴파일 한다.
# gcc -c test.c
# gcc -c app.c
test.o 파일과 app.o 파일이 생기는데 test.o 파일을 Archive로 묶어 보자. 라이브러리 파일의 작명법은 lib뒤에 이름을 붙이는 것이다.
# ar cr libtest.a test.o
libtest.a 파일이 생성되었을 것이며 이 라이브러리를 사용하여 컴파일 할려면 아래와 같이 한다. -L은 라이브러리 파일의 위치를 지정하며 -ltest가 libtest.a를 지정하게 된다.
#gcc -o app app.o -L. -ltest
2. 동적 라이브러리
실행 시간에 라이브러리 파일을 찾아 코드를 포함하기 때문에 동적라이브러리라고 부른다. 즉, 정적 라이브러리는 컴파일 시간에 코드를결정하기 때문에 소스가 변경되면 새로 컴파일 해야하지만, 동적 라이브러리의 경우 라이브러리만 교체하는 것으로도 변경이 가능하다.
# gcc -c -fPIC test.c
# gcc -c app.c
-fPIC옵션은 Position-Independent Code의 약자이며 test.o파일을 동적라이브러리로 사용하도록 컴파일 하는 옵션이다. 이렇게 컴파일된 오브젝트 파일을 .so파일로 묶으면 된다.
# gcc -shared -fPIC -o libtest.so test.o
컴파일은 아래와 같이 하면 된다.
# gcc -o app app.o -L. -ltest
만일 libtest.a 파일과 libtest.so 파일이 같이 있을 경우 gcc 컴파일러는 libtest.so 파일을 먼저 지정하게 된다. 만일 libtest.a를 사용하여 컴파일 하고 싶으면 아래와 같이 실행하면 된다.
# gcc -static -o app app.o -L. -ltest
There are a number of different ways to specify search paths used by the run-time linker. Table 4-2, 밅omparison of specifying search paths� summarizes the steps taken by the run-time linker to search for run-time loaded libraries. As soon as an appropriate library is found, the run-time linker stops searching.
Table 4-2. Comparison of specifying search paths
Order
Solaris 7
HP-UX 32-bit
HP-UX 64-bit
1
If the path contains a slash, it is used as is.
Same.
Same.
2
The LD_LIBRARY_PATHenvironment variable is used, provided that the appropriate security precautions are met.
Not applicable.
The LD_LIBRARY_PATHenvironment variable is used, provided that the appropriate security precautions are met.
3
Not applicable.
If +s is specified at link time, theSHLIB_PATH environment variable is used when set.
The SHLIB_PATH environment variable is used when set.
4
The RPATH specified with the -Roption at link time is used.
The embedded path recorded in the load module (or inherited from any parent load module) is used, but only if +b is set.
The RPATH (equivalent of the 32-bit embedded path) recorded in the load module is used.
5
/usr/lib is searched.
No default directories are searched.
The /usr/lib/pa20_64 and/usr/ccs/lib/pa20_64directories are searched.
In Table 4-2, 밅omparison of specifying search paths�, the HP-UX 64-bit column describes the HP-UX 64-bit linker +std behavior; the +compat behavior is the same as the HP-UX 32-bit linker. The HP-UX 32-bit linker embeds the full path to the shared library in the program. This means you must be cautious about moving the shared library after the program is linked.
Be careful when specifying a relative path for the Solaris and HP-UX 64-bit linkers. Recall that the program may be executed in a different file system location from where it was linked. HP recommends using either full paths or basenames with one of the previous search methods.
Linker-related tools
Table 4-3, 밐P-UX linker-related tools� and Table 4-4, 밪olaris linker-related tools� show a variety of tools that are available on either platform to analyze and modify shared libraries and executables. The HP-UXchatr tool is particularly useful to modify attributes of executables or libraries without relinking.
Table 4-3. HP-UX linker-related tools
Tool
Description
chatr
Displays or modifies internal attributes of an object file. Note the syntax differences between 32-bit and 64-bit usage.
elfdump
Displays the contents of an ELF file.
fastbind
Improves startup time of programs with shared libraries by writing binding information into the executable.
dd
64-bit linker: lists dynamic dependencies specified at link time. Is available for both the 64-bit and 32-bit linkers on HP-UX 11i v2.
order
Finds ordering relationships for libraries; you can use this information to promote one-pass linking by ld, speeding up link times.
nm
Displays the symbol table of an object; note some differences in options for SOM or ELF object files.
size
Prints the sizes of object file elements.
strip
Strips symbol and debugging information.
Table 4-4. Solaris linker-related tools
Tool
Description
dump
Displays the contents of an ELF file.
elfdump
Displays the contents of an ELF file.
ldd
Lists dynamic dependencies specified at link time.
pvs
Displays version IDs and entire hierarchies of version dependencies in a shared object.
mcs
Manipulates the comment section of an object file.
nm
Displays the symbol table of an object.
size
Prints the sizes of object file elements.
strip
Strips symbol and debugging information.
Solaris also has the following linker support libraries, which you can use to debug difficult linker problems:ld-support, rtld-support, and rtld_debugger.