์ํํธ์จ์ด๋ฅผ ๋ฐฐํฌํ๊ฑฐ๋ ๋ก์ปฌ ํ๊ฒฝ์์ ํน์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํ ๋, ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์์กด์ฑ)๊ฐ ๋๋ฝ๋์ด ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด ๊ธ์์๋ ์ด์์ฒด์ ๋ณ๋ก ๋ฐ์ด๋๋ฆฌ ์์กด์ฑ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค.
๐ ๋ฐ์ด๋๋ฆฌ ์์กด์ฑ์ด๋?
๋ฐ์ด๋๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฆฌ๋ ์ค์์ ์ปดํ์ผ๋ ์คํ ํ์ผ์ libc.so๋ libpthread.so ๋ฑ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ์ ์์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
์ด๋ฌํ ์ธ๋ถ ์์กด์ฑ์ ํ์ธํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ๋งค์ฐ ์ค์ํฉ๋๋ค:
- ์คํ ํ์ผ์ด ๋ค๋ฅธ ์์คํ ์์ ์๋ํ๋์ง ํ์ธํ ๋
- ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ต์ ํ ๋ฐ ๋๋ฒ๊น
- ๋ฐฐํฌ ํจํค์ง์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ชจ๋ ํฌํจํ๋์ง ๊ฒํ ํ ๋
๐ง ๋ฆฌ๋ ์ค: ldd ๋ช ๋ น์ด
ldd ./my_binary
์ด ๋ช ๋ น์ ๋ฐ์ด๋๋ฆฌ๊ฐ ๋์ ์ผ๋ก ๋งํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์์ ์ถ๋ ฅ
linux-vdso.so.1 => (0x00007ffd2a3f0000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8ad3a23000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8ad3654000)
๐ ์ฃผ์: ldd๋ ์คํ ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ์ฌ์ผ๋ง ์๋ํฉ๋๋ค. ์ ์ ๋งํฌ๋ ๋ฐ์ด๋๋ฆฌ๋ ์์กด์ฑ์ ํ์ํ์ง ์์ต๋๋ค.
๐ macOS: otool -L
macOS์์๋ otool์ ์ฌ์ฉํ์ฌ ๋ฐ์ด๋๋ฆฌ์ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
otool -L ./my_binary
์์ ์ถ๋ ฅ
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0) @rpath/libexample.dylib (compatibility version 1.0.0, current version 1.2.3)
๐ก @rpath, @loader_path, @executable_path ๋ฑ macOS ํน์ ์ ๊ฒฝ๋ก ์ง์ ๋ ํจ๊ป ํ์ธํ ์ ์์ต๋๋ค.
๐ง ํ: ์ ์ vs ๋์ ๋งํฌ ์ฌ๋ถ ํ์ธ
- ์ ์ ๋งํฌ๋ ๋ฐ์ด๋๋ฆฌ๋ ์ธ๋ถ ์์กด์ฑ์ด ๊ฑฐ์ ์์ต๋๋ค.
- ๋ฆฌ๋ ์ค์์ file ๋ช ๋ น์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค
file ./my_binary
์์
ELF 64-bit LSB executable, dynamically linked, ...