dlsym(3) - wariua/manpages-ko GitHub Wiki
dlsym, dlvsym - ๊ณต์ ์ค๋ธ์ ํธ๋ ์คํ ํ์ผ ๋ด ์ฌ๋ณผ์ ์ฃผ์ ์ป๊ธฐ
#include <dlfcn.h>
void *dlsym(void *handle, const char *symbol);
#define _GNU_SOURCE
#include <dlfcn.h>
void *dlvsym(void *handle, char *symbol, char *version);
-ldl
๋ก ๋งํฌ.
dlsym()
ํจ์๋ dlopen(3)์ด ๋ฐํํ๋ ๋์ ์ ์ฌ ๊ณต์ ์ค๋ธ์ ํธ "ํธ๋ค"์ ๋ ์ข
๋ฃ ์ฌ๋ณผ ์ด๋ฆ๊ณผ ํจ๊ป ๋ฐ์์ ๊ทธ ์ฌ๋ณผ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ์ฃผ์๋ฅผ ๋ฐํํ๋ค. ์ง์ ํ ์ค๋ธ์ ํธ์์, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค๋ธ์ ํธ ์ ์ฌ ์ dlopen(3)์ ์ํด ์๋์ผ๋ก ์ ์ฌ๋ ๊ณต์ ์ค๋ธ์ ํธ๋ค ์ด๋์๋ ๊ทธ ์ฌ๋ณผ์ ์ฐพ์ง ๋ชปํ๋ฉด dlsym()
์ด NULL์ ๋ฐํํ๋ค. (dlsym()
์ ํ์์ ๊ทธ ๊ณต์ ์ค๋ธ์ ํธ๋ค์ ์์กด ๊ด๊ณ ํธ๋ฆฌ์์ ๋๋น ์ฐ์ ๋ฐฉ์์ผ๋ก ์ด๋ค์ง๋ค.)
๋๋ฌธ ๊ฒฝ์ฐ์๋ (์๋ NOTES ์ฐธ๊ณ ) ์ฌ๋ณผ์ ๊ฐ์ด ์ค์ ๋ก NULL์ผ ์๋ ์๋ค. ๋ฐ๋ผ์ dlsym()
์ด NULL์ ๋ฐํํ ๊ฒ ๊ผญ ์ค๋ฅ๋ฅผ ๋ํ๋ด๋ ๊ฑด ์๋๋ค. ์ค๋ฅ์ ๊ฐ์ด NULL์ธ ์ฌ๋ณผ์ ๊ตฌ๋ณํ๋ ์ ํํ ๋ฐฉ๋ฒ์ dlerror(3) ํธ์ถ๋ก ์ด์ ์ค๋ฅ ์กฐ๊ฑด์ ์ง์ฐ๊ณ ์ dlsym()
์ ํธ์ถํ ๋ค์ ๋ค์ dlerror(3)๋ฅผ ํธ์ถํด์ ๋ฐํ ๊ฐ์ ๋ณ์์ ์ ์ฅํ๊ณ , ๊ทธ ์ ์ฅ๋ ๊ฐ์ด NULL์ด ์๋์ง ํ์ธํ๋ ๊ฒ์ด๋ค.
handle
์ ์ง์ ํ ์ ์๋ ํน์ํ ๊ฐ์ ํธ๋ค์ด ๋ ๊ฐ์ง ์๋ค.
RTLD_DEFAULT
- ๊ธฐ๋ณธ ์ค๋ธ์ ํธ ํ์ ์์์ ๋ฐ๋ผ์ ์ํ๋ ์ฌ๋ณผ์ ์ฒซ ๋ฒ์งธ ์์น๋ฅผ ์ฐพ๋๋ค. ์คํ ํ์ผ ๋ฐ ๊ทธ ์์กด ๋์๋ค์ ์ ์ญ ์ฌ๋ณผ์ ๋ํด์
RTLD_GLOBAL
ํ๋๊ทธ๋ก ๋์ ์ผ๋ก ์ ์ฌ๋ ๊ณต์ ์ค๋ธ์ ํธ๋ค์ ์ฌ๋ณผ๋ค์ด ํ์ ๋์์ ํฌํจ๋๋ค. RTLD_NEXT
- ํ์ฌ ์ค๋ธ์ ํธ ๋ค์์์ ํ์ ์์์ ๋ฐ๋ผ์ ์ํ๋ ์ฌ๋ณผ์ ๋ค์ ์์น๋ฅผ ์ฐพ๋๋ค. ์ด๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ๊ณต์ ์ค๋ธ์ ํธ์ ํจ์๋ฅผ ๊ฐ์ธ๋ ๋ํผ๋ฅผ ์ ๊ณตํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ ์ ์ฌ๋ (ld.so(8)์
LD_PRELOAD
์ฐธ๊ณ ) ๊ณต์ ์ค๋ธ์ ํธ์ ํจ์ ์ ์์์ ๋ค๋ฅธ ๊ณต์ ์ค๋ธ์ ํธ์ ์๋ "์ง์ง" ํจ์๋ฅผ (๋๋ ์ฌ์ ์ ์ฌ๊ฐ ์ฌ๋ฌ ๋จ๊ณ๋ก ์ด๋ค์ง๋ ๊ฒฝ์ฐ์ "๋ค์" ํจ์ ์ ์๋ฅผ) ์ฐพ์์ ํธ์ถํ ์ ์๋ค.
<dlfcn.h>
์์ RTLD_DEFAULT
๋ฐ RTLD_NEXT
์ ์๋ฅผ ์ป์ผ๋ ค๋ฉด ๊ธฐ๋ฅ ํ์ธ ๋งคํฌ๋ก _GNU_SOURCE
๊ฐ ์ ์๋ผ ์์ด์ผ ํ๋ค.
dlvsym()
ํจ์๋ dlsym()
๊ณผ ๊ฐ์ ๋์์ ํ๋ ์ถ๊ฐ ์ธ์๋ก ๋ฒ์ ๋ฌธ์์ด์ ๋ฐ๋๋ค.
์ฑ๊ณต ์ ์ด ํจ์๋ค์ symbol
์ ์ฐ๊ณ๋ ์ฃผ์๋ฅผ ๋ฐํํ๋ค. ์คํจ ์ NULL์ ๋ฐํํ๋ค. dlerror(3)๋ก ์ค๋ฅ ์์ธ์ ์ง๋จํ ์ ์๋ค.
glibc 2.0 ๋ฐ ์ดํ์ dlsym()
์ด ์๋ค. glibc 2.1์์ dlvsym()
์ด ์ฒ์ ๋ฑ์ฅํ๋ค.
์ด ์ ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ค์ ๋ํ ์ค๋ช ์ attributes(7)๋ฅผ ๋ณด๋ผ.
์ธํฐํ์ด์ค | ์์ฑ | ๊ฐ |
---|---|---|
dlsym() , dlvsym()
|
์ค๋ ๋ ์์ ์ฑ | MT-Safe |
POSIX.1-2001์์ dlsym()
์ ๊ธฐ์ ํ๋ค. dlvsym()
ํจ์๋ GNU ํ์ฅ์ด๋ค.
์ ์์ ์ธ ์ปดํ์ผ ๊ฒฐ๊ณผ๋ก ๋์จ ๊ณต์ ์ค๋ธ์ ํธ๋ผ๋ฉด dlsym()
์ด ๋ฐํํ๋ ์ฌ๋ณผ์ ๊ฐ์ด ์ ๋ NULL์ด ์๋ ๊ฒ์ด๋ค. ์ ์ญ ์ฌ๋ณผ์ ์ ๋ NULL ์ฃผ์์ ์์น์ํค์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ์ง๋ง dlsym()
์ ์ด์ฉํ ๊ฒ์ ๊ฒฐ๊ณผ ์ฌ๋ณผ ๊ฐ์ผ๋ก NULL์ด ๋ฐํ๋ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด GNU ๊ฐ์ ํจ์(IFUNC) ๊ฒฐ์ ํจ์๊ฐ ๊ฒฐ์ ๊ฒฐ๊ณผ๋ก NULL์ ๋ฐํํด์ ๊ทธ๊ฒ ์ฌ๋ณผ ๊ฐ์ด ๋ ์ ์๋ค.
dlsym()
ํจ์๊ฐ ํฌํจ๋ dlopen API๋ SunOS์์ ์ ๋ํ ๊ฒ์ด๋ค. ๊ทธ ์์คํ
์ dlvsym()
์ ์๋ค.
dlopen(3) ์ฐธ๊ณ .
dl_iterate_phdr(3), dladdr(3), dlerror(3), dlinfo(3), dlopen(3), dl.so(8)
2019-03-06