library - Gakgu/Gakgu.github.io GitHub Wiki

๊ฐœ์š”

๊ฐœ๋ฐœ์‹œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๋ชจ๋“ˆํ™” ํ•œ ํŒŒ์ผ๋“ค์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์ข…๋ฅ˜

windows

  • ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(static library) :
    XXX.lib

  • ๋™์  ๋งํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(dynamic-link library) :
    XXX.dll

linux

  • ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(static library) :
    libXXX.a

  • ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(shared library) :
    libXXX.so

Mac

  • ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(static library) :
    libXXX.a

  • ๋‹ค์ด๋‚˜๋ฏน ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(dynamic library) :
    libXXX.dylib

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒ์„ฑ(gcc)

์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ธฐ

$ gcc -c A.c B.c C.c
$ ar -rc libXXX.a A.o B.o C.o

๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ธฐ

$ gcc -c -fPIC XXX.c
$ gcc -shared -Wl,-soname,libXXX.so -o libXXX.so.x.x.x XXX.o

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

linux

  • real name :
    ์‹ค์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์ด๋‹ค. libXXX.so.major_version.minor_version.release_version๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ๋œ๋‹ค.

  • soname :
    real name์—์„œ ๋งˆ์ด๋„ˆ ๋ฒ„์ „์„ ์ œ์™ธํ•œ ์ด๋ฆ„์ด๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ ์žฌ์‹œ soname์œผ๋กœ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ๋Š”๋‹ค.

  • linker name :
    real name์—์„œ lib์™€ .so ์‚ฌ์ด์— ์žˆ๋Š” ์ด๋ฆ„์„ ๋งํ•œ๋‹ค. ๋นŒ๋“œ์‹œ ๋ง์ปค ๋„ค์ž„์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ๋Š”๋‹ค.

  • major version :
    ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜์ด ์•ˆ๋  ๊ฒฝ์šฐ ๋ฉ”์ด์ € ๋ฒ„์ „์„ ์˜ฌ๋ฆฐ๋‹ค.

  • minor version :
    ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜์ด ๋  ๊ฒฝ์šฐ ๋งˆ์ด๋„ˆ ๋ฒ„์ „์„ ์˜ฌ๋ฆฐ๋‹ค.

  • release version :
    ๋ฐฐํฌ ๋ฒ„์ „์„ ์˜๋ฏธํ•œ๋‹ค.

Mac

  • install name :
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ ์žฌ์‹œ install name์œผ๋กœ ๋‹ค์ด๋‚˜๋ฏน ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ๋Š”๋‹ค. soname๊ณผ ๋‹ฌ๋ฆฌ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

  • identification name :
    ?????

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

linux

$ ldd FILE

Mac

$ otool -L FILE

linux ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฒ•

symbolic link ๋งŒ๋“ค๊ธฐ :

soname์œผ๋กœ ๋œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์™€ ๊ฑฐ๊ธฐ์„œ ๋ฉ”์ด์ € ๋ฒ„์ „์„ ๋บ€ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋งŒ๋“ ๋‹ค.

    $ ln -s libXXX.so.0.0.0 libXXX.so.0
    $ ln -s libXXX.so libXXX.so.0

์ ์žฌํ•  ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธ์‹ :

/etc/ld.so.conf ์— ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ldconfig ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

$ echo /usr/local/lib >> /etc/ld.so.conf
$ ldconfig

mac ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฒ•

install_name_tool ์‚ฌ์šฉํ•˜๊ธฐ

  • @executable_path :
    ์‹คํ–‰ ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ

  • @loader_path :
    ๋กœ๋“œํ•œ ํŒŒ์ผ์˜ ๋””๋ ‰ํ† ๋ฆฌ ์ ˆ๋Œ€ ๊ฒฝ๋กœ

  • @rpath :
    2๊ฐœ ์ด์ƒ์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž(?)์ง€์ • ๊ฒฝ๋กœ

  • ์‹คํ–‰ํŒŒ์ผ์— ์ ์žฌ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ install name ๋ณ€๊ฒฝํ•˜๊ธฐ :

      $ install_name_tool -change <old_install_name> <new_install_name> <executable>
    
  • ๋‹ค์ด๋‚˜๋ฏน ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ identification name ๋ณ€๊ฒฝํ•˜๊ธฐ

      $ install_name_tool -id <old_install_name> < new_install_name>
    

otool ์‚ฌ์šฉํ•˜๊ธฐ

  • ์˜์กด์„ฑ ํ™•์ธ :

      $ otool -L ํŒŒ์ผ
    
  • rpath ํ™•์ธ :

      $ otool -l ํŒŒ์ผ | grep -A 2 RPATH
    
  • install name ํ™•์ธ :

      $ otool -D ํŒŒ์ผ
    
โš ๏ธ **GitHub.com Fallback** โš ๏ธ