๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(shared library)์™€ Linker/Loader ์ดํ•ดํ•˜๊ธฐ

์ด์ œ๋Š” ์ง์ ‘ C ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์„ ํ•  ์ผ์ด ๋งŽ์ง€ ์•Š์ง€๋งŒ C ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์„œ๋น„์Šค ์ธํ”„๋ผ์—์„œ ์ค‘์š”ํ•œ ์œ„์น˜๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


linux ๋“ฑ ์šด์˜์ฒด์ œ๊ฐ€ C ๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ฐœ๋ฐœ์„ ํ• ์ˆ˜ ์žˆ๋Š” ์ƒ์‚ฐ์„ฑ ์ข‹์€ script(ruby ๋‚˜ python, PHP ๋“ฑ..) ์–ธ์–ด์˜ ์—”์ง„๋“ค์€ ๋Œ€๋ถ€๋ถ„ C ๋กœ ์ œ์ž‘๋˜์—ˆ๊ณ  openssl, database driver ๋“ฑ์˜ ๊ธฐ๋Šฅ์€ C ๋กœ ์ž‘์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์–ธ์–ด์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šด์˜์ฒด์ œ์—์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๊ฒฌ๊ณ ํ•œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ๋Œ€์‘์„ ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜๋Š” ์ง€์‹์ด์ง€๋งŒ  ๋ฐ”์œ ์‹œ๋Œ€์—์„œ ์ด๋Ÿฐ ์ง€์‹์„ ์ฒด๊ณ„์ ์œผ๋กœ ํ•™์Šตํ•˜๊ธฐ๋Š” ์‰ฝ์ง€๊ฐ€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(shared library, ๋˜๋Š” ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.)์™€ ํ”„๋กœ๊ทธ๋žจ ๋กœ๋”์— ๋Œ€ํ•ด์„œ ๋‹ค๋ค„๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค.


๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(shared library)

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฌด์Šจ ์ผ๋“ค์„ ํ• ๊นŒ.

#include <stdio.h>
int main(int argc, char** argv)
{ 
    printf("Hello World\n");
    return 0;
}

์œ„์™€ ๊ฐ™์€ hello.c ์†Œ์Šค๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ gcc  hello.c ๋ช…๋ น์–ด๋กœ ์ปดํŒŒ์ผ์„ ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์ณ์„œ ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๊ด„ํ˜ธ ์•ˆ์— ์žˆ๋Š” ๊ฒƒ์€ gcc ์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.)


  1. C Pre Processor(cpp) ๊ฐ€ #define, #include ๊ตฌ๋ฌธ๋“ฑ์„ ์ „์ฒ˜๋ฆฌํ•˜์—ฌ hello.i ์ƒ์„ฑ

    cpp hello.c > hello.i
  2. C compiler(cc1) ๊ฐ€ ์ „์ฒ˜๋ฆฌํ•œ hello.i ์†Œ์Šค๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ hello.s ์ƒ์„ฑ

    gcc -S hello.i
  3. assembler(as) ๋Š” hello.s ๋ฅผ ์–ด์…ˆ๋ธ”ํ•˜์—ฌ object (hello.o) ์ƒ์„ฑ

    as -o hello.o hello.s
  4. linker(collect2) ๋Š” printf ๋“ฑ ์™ธ๋ถ€ library ์— ์žˆ๋Š” symbol ์„ ๋งํฌํ•ด์„œ ์ตœ์ข… ํ”„๋กœ๊ทธ๋žจ ์ƒ์„ฑ(a.out)


gcc๋Š” ์œ„์™€ ๊ณผ์ •์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” wrapper ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ -v ์˜ต์…˜์„ ์ฃผ๊ณ  ์‹คํ–‰ํ•  ๊ฒฝ์šฐ ์ด ๋ชจ๋“  ๊ณผ์ •์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcc -v hello.c


๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

printf ๊ฐ™์ด ํ”„๋กœ๊ทธ๋žจ๋งˆ๋‹ค ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์— ํฌํ•จ์‹œํ‚ฌ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ์น˜๊ฐ€ ์ปค์ง€๊ณ  ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—…๊ทธ๋ ˆ์ด๋“œ ๋์„ ๊ฒฝ์šฐ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ •์  ๋งํฌ(static linking)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.)  


๊ทธ๋ž˜์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(shared library)๋ผ๋Š” ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์–ด ๋†“๊ณ  ์ปดํŒŒ์ผ ์‹œ์ ์— ์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐ๋งŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

windows ์—์„œ๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Œ€์‹  DLL(Dynamic Link Library) ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.


์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ด ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๋ ค๋ฉด ๋ฆฌ๋ˆ…์Šค์—๋Š” file ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋ฉฐ ์•„๋ž˜๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

$ file a.out

a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped



์ •์  ๋งํฌ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

$ file a.out

a.out: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.18, not stripped


dynamic loader

๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์—ฐ๊ฒฐ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ dynamic loader๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋จผ์ € ๋™์ž‘ํ•˜์—ฌ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. dynamic link ๋œ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•„์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ
  2. entry function (C ์–ธ์–ด์ผ ๊ฒฝ์šฐ main ํ•จ์ˆ˜)๋ฅผ ์ฐพ์•„์„œ ํ˜ธ์ถœ
  3. ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰


๊ฐ ์šด์˜์ฒด์ œ์˜ ๋กœ๋” ์ด๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์šด์˜์ฒด์ œ๋กœ๋”
Linuxld.so ๋˜๋Š” ld-linux.so
Mac OS Xdyld
Solarisld.so
HP-UXdld.so


์–ด๋””์—์„œ shared library ๋ฅผ ์ฐพ์„๊นŒ?

LD_LIBRARY_PATH

loader ๋Š” program ๊ตฌ๋™์— ํ•„์š”ํ•œ shared library ๋ฅผ ์ฐพ์„ ๋•Œ LD_LIBRARY_PATH(๋ฆฌ๋ˆ…์Šค์˜ ๊ฒฝ์šฐ)์™€ ๊ฐ™์€ ๊ณ ์œ ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉฐ OS ๋งˆ๋‹ค ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์šด์˜์ฒด์ œํ™˜๊ฒฝ ๋ณ€์ˆ˜๋น„๊ณ 
WindowsPATHWindows์—์„œ DLL์„ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ ์ˆœ์„œ

Linux

LD_LIBRARY_PATHLD_LIBRARY_PATH ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•„๋„ /lib64, /usr/lib64 ํด๋”๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
Mac OS X

DYLD_LIBRARY_PATH

LD_LIBRARY_PATH ์™€ ๋™์ผ ์—ญํ• 

DYLD_FALLBACK_LIBRARY_PATH

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ชป ์ฐพ์„ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ํ•  ๊ฒฝ๋กœ.
$(HOME)/lib:/usr/local/lib:/lib:/usr/lib ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Œ


์‚ฌ์šฉํ•  ์ผ์ด ๋งŽ์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ ์ƒ์šฉ ์œ ๋‹‰์Šค์˜ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Solaris : LD_LIBRARY_PATH, 
  •  AIX: LIBPATH
  • HP-UX: SHLIB_PATH

RPATH

๋ฆฌ๋ˆ…์Šค๋Š” ELF ํ˜•์‹์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š”  rpath ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” "์‹คํ–‰์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์„ ๊ฒฝ๋กœ ์ •๋ณด"๋ฅผ ์ปดํŒŒ์ผ ์‹œ์ ์— ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ์ •๋ณด๋Š” LD_LIBRARY_PATH ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ „์— ์ฐธ๊ณ ๋ฉ๋‹ˆ๋‹ค.

rpath ์ •๋ณด๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด gcc ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ -Wl,-rpath ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

gcc -Wl,-rpath,/usr/local/lib hello.c

๋ฐ”์ด๋„ˆ๋ฆฌ์— rpath๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” readelf ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์˜ ํ—ค๋”๋ฅผ ํ™•์ธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


$ readelf -d a.out | grep RPATH


 0x000000000000000f (RPATH)              Library rpath: [/usr/local/lib]


LD_PRELOAD

LD_PRELOAD ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ›„ํ‚น(hooking)์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ด๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ์—ฌ๊ธฐ์— ์ง€์ •๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚ด ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ํ˜ธ์ถœํ•ด ์ค๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์šฉ๋„๋กœ๋Š” debugging ๋•Œ๋ฌธ์— ๊ตฌ๋™์‹œ์— ํŠน์ • ๋™์  library ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•  ๊ฒฝ์šฐ๋“ฑ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋กœ ๋ฉ”๋ชจ๋ฆฌ leak์„ ์ฐพ๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” memory debugger๋Š” runtime ์— ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•œ malloc/free ๋ฅผ debugger ๊ฐ€ ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜๋กœ ๋Œ€์ฒดํ•ด์„œ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด LD_PRELOAD ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒ„๊น…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ํ™•์ธ

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ž˜๋ชป ์„ค์ •๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜๋ฅผ ์ž˜๋ชปํ–ˆ๊ฑฐ๋‚˜ ๋“ฑ์˜ ์ด์œ ๋กœ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ "Can't load library libevent.so"์™€ ๋น„์Šทํ•œ ๋ฅ˜์˜ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ฒฝํ—˜์ด ์—†์„ ๊ฒฝ์šฐ ๋จธ๋ฆฌํ„ธ์„ ์ฅ์–ด ๋œฏ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์˜์กดํ•˜๋Š” shared library ๋Š” ๋ฌด์—‡์ด๊ณ  ๋กœ๋”๊ฐ€ ์–ด๋–ป๊ฒŒ ์ฐพ๋Š”์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ผญ ํ•„์š”ํ•œ ์ง€์‹์ž…๋‹ˆ๋‹ค.


์šด์˜์ฒด์ œ ๋ณ„๋กœ ์˜์กดํ•˜๋Š” shared library๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Windows

Dependency Walker ๊ฐ€ 32/64 Windows์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ณต๊ฐœ์ด๋ฉฐ ์œ ์šฉํ•˜๋‹ˆ ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์˜์กด์„ฑ์„ ํ™•์ธํ•˜์„ธ์š”. 

Linux

ํŠน์ • ํ”„๋กœ๊ทธ๋žจ์ด ์ฐธ๊ณ ํ•˜๋Š” shared library๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ldd ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

$ ldd /usr/bin/vim


 linux-vdso.so.1 =>  (0x00007ffd9167b000)
 libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd8375d5000)
 libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fd8373ac000)
 libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fd837189000)
 libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007fd836f81000)
 libgpm.so.2 => /usr/lib/x86_64-linux-gnu/libgpm.so.2 (0x00007fd836d7a000)


์ขŒ์ธก์— ์žˆ๋Š” ํ•ญ๋ชฉ(์˜ˆ: libm.so.6) ์ด ์˜์กดํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์ด๋ฉฐ ์šฐ์ธก์— ์žˆ๋Š” ํ•ญ๋ชฉ์ด ๋กœ๋”ฉํ•  ์‹ค์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: /lib/x86_64-linux-gnu/libm.so.6) ์ž…๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†๋‹ค๋ฉด ์šฐ์ธก ํ•ญ๋ชฉ์—๋Š” ๋Œ€์‹  "not found" ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์ด ๊ฒฝ์šฐ /lib64, /usr/lib64 ์— ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ํ›„์—

์—†์„ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ LD_LIBRARY_PATH ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ํ•ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/myprog/lib


Mac OS X

OS X ๋Š” otool (object file displaying tool) ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ  -L ์˜ต์…˜์„ ์ฃผ๊ณ  ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜์กด์„ฑ ์žˆ๋Š” ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

otool -L /usr/bin/afplay 
/usr/bin/afplay:
        /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox (compatibility version 1.0.0, current version 1.0.0)
        /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 550.42.0)
        /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit (compatibility version 1.0.0, current version 1.0.0)
        /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
        /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 44.0.0)
        /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 268.0.1)
        /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.10)

์ฝ˜์†”์—์„œ๋Š” ์ž˜ ๋˜๋Š”๋ฐ cron ์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ์ด์œ 

cron์€ ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ์‹คํ–‰์‹œ ์‰˜์˜ ์ดˆ๊ธฐํ™” ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๊ณ„์ •์œผ๋กœ๋Š” ์ž˜ ์‹คํ–‰๋˜๋Š”๋ฐ cron ์— ๋“ฑ๋กํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ ์ œ๋Œ€๋กœ ์‹คํ–‰์ด ์•ˆ ๋œ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์›์ธ์€ ๋ฐ”๋กœ ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ชป ์ฐพ์•„์„œ์ž…๋‹ˆ๋‹ค.


์ด๋Ÿด ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ ๋ฐฉ์•ˆ์€ cron์—์„œ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋ณ„๋„์˜ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด์„œ ๊ตฌ๋™ํ•˜๊ณ  ๊ทธ ์•ˆ์—์„œ PATH, LD_LIBRARY_PATH ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

#!/bin/bash
 
export PATH=$PATH:/opt/prog/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/prog/bin
 
myprog --option

cron์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ "๋ฆฌ๋ˆ…์Šค๋ฅผ ํ™œ์šฉํ•œ ํšŒ์‚ฌ ์ธํ”„๋ผ ๊ตฌ์ถ•์˜ ๋ชจ๋“  ๊ฒƒ"์ค‘ cron ์‚ฌ์šฉ๋ฒ• ํ•ญ๋ชฉ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ํ”„๋กœ๊ทธ๋žจ์—์„œ dynamic link๋ฅผ ํ•˜๋ ค๋ฉด?

ํ”„๋กœ๊ทธ๋žจ๋‚ด์—์„œ๋„ ๋Ÿฐํƒ€์ž„์— ์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ์ˆ˜๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

windows ์—์„œ๋Š” LoadLibrary ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ dll ์„ ๋กœ๋”ฉํ•œ ํ›„์— GetProcAddress ๋กœ ์‹คํ–‰ํ•˜๋ ค๋Š” ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์–ป์€ ํ›„์— ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฆฌ๋ˆ…์Šค๋Š” dlopen, dlsym ํ•จ์ˆ˜๋ฅผ  ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ฐ ์šด์˜์ฒด์ œ๋งˆ๋‹ค dynamic link๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜์™€ ํ˜ธ์ถœ ๋ฐฉ์‹์ด ์ƒ์ดํ•˜๋ฏ€๋กœ ์ด์‹์„ฑ ์ข‹์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด GNU์˜ libtool์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” libltdl ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Ref