dlopen(3) - wariua/manpages-ko GitHub Wiki
dlclose, dlopen, dlmopen - ๊ณต์ ์ค๋ธ์ ํธ ์ด๊ณ ๋ซ๊ธฐ
#include <dlfcn.h>
void *dlopen(const char *filename, int flags);
int dlclose(void *handle);
#define _GNU_SOURCE
#include <dlfcn.h>
void *dlmopen (Lmid_t lmid, const char *filename, int flags);
-ldl
๋ก ๋งํฌ.
dlopen()
ํจ์๋ ๋ ์ข
๋ฃ ๋ฌธ์์ด filename
์ด ๊ฐ๋ฆฌํค๋ ๋์ ๊ณต์ ์ค๋ธ์ ํธ(๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ์ ์ฌํ๊ณ ์ ์ฌ๋ ์ค๋ธ์ ํธ์ ๋ํ ๋ถํฌ๋ช
ํ "ํธ๋ค"์ ๋ฐํํ๋ค. ๊ทธ ํธ๋ค์ dlopen API์ dlsym(3), dladdr(3), dlinfo(3), dlclose()
๊ฐ์ ๋ค๋ฅธ ํจ์๋ค์ ์ด๋ค.
filename
์ด NULL์ด๋ฉด ์ฃผ ํ๋ก๊ทธ๋จ์ ๋ํ ํธ๋ค์ ๋ฐํํ๋ค. filename
์ ์ฌ๋์("/")๊ฐ ์์ผ๋ฉด (์๋ ๋๋ ์ ๋) ๊ฒฝ๋ก๋ช
์ผ๋ก ํด์ํ๋ค. ์๋๋ฉด ๋์ ๋ง์ปค๊ฐ ๋ค์์ฒ๋ผ ์ค๋ธ์ ํธ๋ฅผ ํ์ํ๋ค. (๋ ์์ธํ ๋ด์ฉ์ ld.so(8) ์ฐธ๊ณ .)
-
(ELF ํ์ ) ํธ์ถํ๋ ํ๋ก๊ทธ๋จ์ ์คํ ํ์ผ์ DT_RPATH ํ๊ทธ๊ฐ ์์ผ๋ฉด์ DT_RUNPATH ํ๊ทธ๋ ์์ผ๋ฉด ๊ทธ DT_RPATH ํ๊ทธ์ ๋์ด๋ ๋๋ ํฐ๋ฆฌ๋ค์ ํ์ํ๋ค.
-
ํ๋ก๊ทธ๋จ ์์ ์์ ์ ์ฝค๋ง ๊ตฌ๋ถ ๋๋ ํฐ๋ฆฌ ๋ชฉ๋ก์ ๋ด์ ํ๊ฒฝ ๋ณ์
LD_LIBRARY_PATH
๊ฐ ์ ์๋ผ ์์์ผ๋ฉด ๊ทธ ๋๋ ํฐ๋ฆฌ๋ค์ ํ์ํ๋ค. (๋ณด์์ ์ํด set-user-ID ๋ฐ set-group-ID ํ๋ก๊ทธ๋จ์ ๋ํด์ ์ด ๋ณ์๋ฅผ ๋ฌด์ํ๋ค.) -
(ELF ํ์ ) ํธ์ถํ๋ ํ๋ก๊ทธ๋จ์ ์คํ ํ์ผ์ DT_RUNPATH๊ฐ ์์ผ๋ฉด ๊ทธ ํ๊ทธ์ ๋์ด๋ ๋๋ ํฐ๋ฆฌ๋ค์ ํ์ํ๋ค.
-
(
ldconfig(8)
๋ก ๊ด๋ฆฌํ๋) ์บ์ ํ์ผ/etc/ld.so.cache
๋ฅผ ํ์ธํด์filename
์ ๋ํ ํญ๋ชฉ์ด ์๋์ง ๋ณธ๋ค. -
/lib
๋ฐ/usr/lib
๋๋ ํฐ๋ฆฌ๋ฅผ (์ฐจ๋ก๋๋ก) ํ์ํ๋ค.
filename
์ผ๋ก ์ง์ ํ ์ค๋ธ์ ํธ์์ ๋ค๋ฅธ ๊ณต์ ์ค๋ธ์ ํธ์ ์์กดํ๋ ๊ฒฝ์ฐ์๋ ๋์ ๋ง์ปค์์ ๊ฐ์ ๊ท์น์ผ๋ก ๊ทธ ์ค๋ธ์ ํธ๋ค์ ์๋์ผ๋ก ์ ์ฌํ๋ค. (๊ทธ ์ค๋ธ์ ํธ๋ค์ ๋ค์ ์์กด ๊ด๊ณ๊ฐ ์๊ณ ํ๋ฉด ์ด ๊ณผ์ ์ด ์ฌ๊ท์ ์ผ๋ก ์ด๋ค์ง ์๋ ์๋ค.)
flags
์ ๋ค์ ์ค ํ ๊ฐ์ง ๊ฐ์ด ๋ค์ด๊ฐ์ผ ํ๋ค.
RTLD_LAZY
-
๊ฒ์ผ๋ฅธ ๋ฐ์ด๋ฉ์ ์ํํ๋ค. ์ฐธ์กฐํ๋ ์ฝ๋๊ฐ ์คํ๋ ๋์์์ผ ์ฌ๋ณผ์ ๊ฒฐ์ ํ๋ค. ์ฌ๋ณผ ์ฐธ์กฐ๊ฐ ์ ํ ์์ผ๋ฉด ์์ ๊ฒฐ์ ์ ํ์ง ์๋๋ค. (ํจ์ ์ฐธ์กฐ์๋ง ๊ฒ์ผ๋ฅธ ๋ฐ์ธ๋ฉ์ ์ํํ๋ค. ๋ณ์์ ๋ํ ์ฐธ์กฐ๋ ํญ์ ๊ณต์ ์ค๋ธ์ ํธ ์ ์ฌ ๋ ์ฆ์ ๋ฐ์ธ๋ ํ๋ค.) glibc 2.1.1๋ถํฐ ํ๊ฒฝ ๋ณ์
LD_BIND_NOW
ํจ๋ ฅ์ด ์ด ํ๋๊ทธ๋ณด๋ค ์ฐ์ ์๋๋ค. RTLD_NOW
-
์ด ๊ฐ์ ์ง์ ํ๊ฑฐ๋ ํ๊ฒฝ ๋ณ์
LD_BIND_NOW
๊ฐ ๋น์ด ์์ง ์์ ๋ฌธ์์ด๋ก ์ค์ ๋ผ ์์ผ๋ฉด ๊ณต์ ์ค๋ธ์ ํธ ๋ด์ ์ ์ ์ ๋ ์ฌ๋ณผ๋ค์ ๋ชจ๋ ๊ฒฐ์ ํ ๋ค์์dlopen()
์ด ๋ฐํํ๋ค. ๊ทธ๋ด ์ ์์ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค.
flags
์ ๋ค์ ๊ฐ์ 0๊ฐ ์ด์ OR ํ ์๋ ์๋ค.
RTLD_GLOBAL
-
์ด ๊ณต์ ์ค๋ธ์ ํธ์์ ์ ์ํ๋ ์ฌ๋ณผ๋ค์ด ์ดํ ์ ์ฌ๋๋ ๊ณต์ ์ค๋ธ์ ํธ๋ค์ ์ฌ๋ณผ ๊ฒฐ์ ์ ์ฐ์ผ ์ ์๊ฒ ํ๋ค.
RTLD_LOCAL
-
RTLD_GLOBAL
์ ๋ฐ๋์ด๋ฉฐ ์ด๋ ์ชฝ ํ๋๊ทธ๋ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ์ ๊ธฐ๋ณธ๊ฐ์ด๋ค. ์ด ๊ณต์ ์ค๋ธ์ ํธ์์ ์ ์ํ๋ ์ฌ๋ณผ๋ค์ด ์ดํ ์ ์ฌ๋๋ ๊ณต์ ์ค๋ธ์ ํธ๋ค์ ์ฌ๋ณผ ์ฐพ๊ธฐ์ ์ฐ์ด์ง ์๋๋ค. -
RTLD_NODELETE
(glibc 2.2๋ถํฐ) -
dlclose()
์์ ๊ณต์ ์ค๋ธ์ ํธ๋ฅผ ๋ด๋ฆฌ์ง ์๋๋ค. ๊ทธ๋์ ์ดํdlopen()
์ผ๋ก ๊ทธ ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ ์ฌํ๋ ๊ฒฝ์ฐ์ ์ค๋ธ์ ํธ์ ์ ์ ๋ณ์ ๋ฐ ์ ์ญ ๋ณ์๋ค์ด ๋ค์ ์ด๊ธฐํ๋์ง ์๋๋ค. -
RTLD_NOLOAD
(glibc 2.2๋ถํฐ) -
๊ณต์ ์ค๋ธ์ ํธ๋ฅผ ์ ์ฌํ์ง ์๋๋ค. ๊ทธ ์ค๋ธ์ ํธ๊ฐ ์ด๋ฏธ ์ฌ๋ผ๊ฐ ์๋์ง ํ์ธํ๋ ๋ฐ ์ธ ์ ์๋ค. (์ฌ๋ผ๊ฐ ์์ง ์์ผ๋ฉด
dlopen()
์ด NULL์ ๋ฐํํ๊ณ ์ฌ๋ผ๊ฐ ์์ผ๋ฉด ์ค๋ธ์ ํธ ํธ๋ค์ ๋ฐํํ๋ค.) ๋ ์ด๋ฏธ ์ ์ฌ๋ ๊ณต์ ์ค๋ธ์ ํธ์ ํ๋๊ทธ๋ฅผ ์น๊ฒฉ์ํค๋ ๋ฐ์๋ ์ธ ์ ์๋ค. ์๋ฅผ ๋ค์ดRTLD_LOCAL
๋ก ์ฌ๋ผ๊ฐ ์๋ ๊ณต์ ์ค๋ธ์ ํธ๋ฅผRTLD_NOLOAD | RTLD_GLOBAL
๋ก ๋ค์ ์ด ์ ์๋ค. -
RTLD_DEEPBIND
(glibc 2.3.4๋ถํฐ) -
์ด ๊ณต์ ์ค๋ธ์ ํธ ๋ด ์ฌ๋ณผ๋ค์ ๋ํ ํ์ ๊ธฐํ๋ฅผ ์ ์ญ๋ณด๋ค ์ฐ์ ์ํ๋ค. ์ฆ ์ค๋ธ์ ํธ ์์ฒด์ ์ฌ๋ณผ ์ ์๊ฐ ์๋ค๋ฉด ์ด๋ฏธ ์ ์ฌ๋ ๋ค๋ฅธ ์ค๋ธ์ ํธ์ ๋ด๊ธด ๊ฐ์ ์ด๋ฆ์ ์ ์ญ ์ฌ๋ณผ ๋์ ์๊ธฐ ์ฌ๋ณผ์ ์ฐ๊ฒ ๋๋ค๋ ๊ฒ์ด๋ค.
filename
์ด NULL์ด๋ฉด ์ฃผ ํ๋ก๊ทธ๋จ์ ๋ํ ํธ๋ค์ ๋ฐํํ๋ค. ๊ทธ ํธ๋ค์ dlsym(3)์ ์ฃผ๋ฉด ๋จผ์ ๋ฉ์ธ ํ๋ก๊ทธ๋จ์์ ์ฌ๋ณผ์ ์ฐพ์๋ณด๊ณ , ๋ค์์ ํ๋ก๊ทธ๋จ ์์ ๋ ์ ์ฌํ ๊ณต์ ์ค๋ธ์ ํธ๋ค ์ ์ฒด์์, ๊ทธ๋ฆฌ๊ณ ๋ค์์ผ๋ก RTLD_GLOBAL
ํ๋๊ทธ๋ฅผ ์จ์ dlopen()
์ผ๋ก ์ ์ฌํ ๊ณต์ ์ค๋ธ์ ํธ๋ค ์ ์ฒด์์ ํ์ํ๋ค.
๊ณต์ ์ค๋ธ์ ํธ ๋ด ์ฌ๋ณผ ์ฐธ์กฐ ๊ฒฐ์ ์ ๋ฉ์ธ ํ๋ก๊ทธ๋จ ๋ฐ ์์กด ๋์๋ค์ ์ํด ์ ์ฌํ ์ค๋ธ์ ํธ๋ค์ ๋งํฌ ๋งต์ ์๋ ์ฌ๋ณผ, ์์ RTLD_GLOBAL
์ ์ด dlopen()
์ผ๋ก ์ฐ ๊ณต์ ์ค๋ธ์ ํธ(์ ์์กด ๋์๋ค)์ ์ฌ๋ณผ, ๊ณต์ ์ค๋ธ์ ํธ ์์ฒด(์ ๊ทธ ์ค๋ธ์ ํธ๋ฅผ ์ํด ์ ์ฌ๋ ์์กด ๋์๋ค) ๋ด์ ์ ์๋ฅผ ์ฐจ๋ก๋ก ์ด์ฉํด ์ด๋ค์ง๋ค.
์คํ ํ์ผ์ ์ ์ญ ์ฌ๋ณผ ์ค์ ld(1)
์์ ๋์ ์ฌ๋ณผ ํ
์ด๋ธ์ ์ง์ด๋ฃ์ ๊ฒ ์์ผ๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ ์ ์ฌ ๊ณต์ ์ค๋ธ์ ํธ์ ์ฐธ์กฐ ๊ฒฐ์ ์ ์ด์ฉ๋ ์ ์๋ค. ์ฌ๋ณผ์ด ๋์ ์ฌ๋ณผ ํ
์ด๋ธ์ ๋ค์ด๊ฐ๋ ๊ฑด ์คํ ํ์ผ์ "-rdynamic" (๋๋ ๊ฐ์ ์๋ฏธ์ "--export-dynamic") ํ๋๊ทธ๋ก ๋งํฌํด์์ผ ์๋ ์๊ณ (๊ทธ ๊ฒฝ์ฐ ์คํ ํ์ผ์ ์ ์ญ ์ฌ๋ณผ ๋ชจ๋๊ฐ ๋์ ์ฌ๋ณผ ํ
์ด๋ธ์ ๋ค์ด๊ฐ๋ค.) ld(1)
๊ฐ ์ ์ ๋งํฌ ์ค์ ๋ค๋ฅธ ์ค๋ธ์ ํธ์ ์๋ ์ฌ๋ณผ์ ๋ํ ์์กด์ฑ์ ์ฃผ๋ชฉํด์์ผ ์๋ ์๋ค.
dlopen()
์ผ๋ก ๊ฐ์ ๊ณต์ ์ค๋ธ์ ํธ๋ฅผ ๋ค์ ์ด๋ฉด ๊ฐ์ ์ค๋ธ์ ํธ ํธ๋ค์ด ๋ฐํ๋๋ค. ๋์ ๋ง์ปค์์ ์ค๋ธ์ ํธ ํธ๋ค๋ณ๋ก ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ด๋ฆฌํด์ ์ฑ๊ณต์ ์ผ๋ก dlopen()
ํ ํ์๋งํผ dlclose()
๋ฅผ ํธ์ถํ ๋๊น์ง๋ ๋์ ์ ์ฌ ๊ณต์ ์ค๋ธ์ ํธ๊ฐ ํด์ ๋์ง ์๋๋ก ํ๋ค. ์์ฑ์(์๋ ์ฐธ๊ณ )๋ ์ค๋ธ์ ํธ๊ฐ ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ ์ฌ๋ ๋๋ง (์ฆ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 1๋ก ์ฆ๊ฐํ ๋๋ง) ํธ์ถ๋๋ค.
ํ์ dlopen()
ํธ์ถ์์ ๊ฐ์ ๊ณต์ ์ค๋ธ์ ํธ๋ฅผ RTLD_NOW
๋ก ์ ์ฌํด์ ์์ RTLD_LAZY
๋ก ์ ์ฌ๋ ๊ณต์ ์ค๋ธ์ ํธ์ ๋ํ ์ฌ๋ณผ ๊ฒฐ์ ์ ๊ฐ์ ํ ์ ์๋ค. ๊ทธ์ ๋น์ทํ๊ฒ ์์ RTLD_LOCAL
๋ก ์ด๋ฆฐ ์ค๋ธ์ ํธ๊ฐ ํ์ dlopen()
์์ RTLD_GLOBAL
๋ก ์น๊ฒฉ๋ ์ ์๋ค.
์ด๋ค ์ด์ ๋ก๋ dlopen()
์ด ์คํจํ๋ฉด NULL์ ๋ฐํํ๋ค.
์ด ํจ์๋ ์๋์ ์ ์ ์ฐจ์ด์ ๋ค์ ์ ์ธํ๋ฉด dlopen()
๊ณผ ๊ฐ์ ์์
์ ์ํํ๋ฉฐ filename
๊ณผ flags
์ธ์๋ฟ ์๋๋ผ ๋ฐํ ๊ฐ์ด ๋์ผํ๋ค.
dlmopen()
ํจ์๊ฐ dlopen()
๊ณผ ๋ค๋ฅธ ์ ์ ์ถ๊ฐ ์ธ์ lmid
๊ฐ ์์ด์ ๊ณต์ ์ค๋ธ์ ํธ๋ฅผ ์ ์ฌํด์ผ ํ ๋งํฌ ๋งต ๋ฆฌ์คํธ(๋ค์์คํ์ด์ค๋ผ๊ณ ๋ ๋ถ๋ฆ)๋ฅผ ์ง์ ํ๋ค๋ ๊ฒ์ด๋ค. (๋ฐ๋ฉด dlopen()
์์๋ ๋์ ์ผ๋ก ์ ์ฌํ ๊ณต์ ์ค๋ธ์ ํธ๋ฅผ dlopen()
ํธ์ถ์ ํ ๊ณต์ ์ค๋ธ์ ํธ์ ๊ฐ์ ๋ค์์คํ์ด์ค์ ์ถ๊ฐํ๋ค.) Lmid_t
ํ์
์ ๋ค์์คํ์ด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ถํฌ๋ช
ํ ํธ๋ค์ด๋ค.
lmid
์ธ์๋ ๊ธฐ์กด ๋ค์์คํ์ด์ค์ ID(dlinfo(3) RTLD_DI_DMID
์์ฒญ์ผ๋ก ์ป์ ์ ์์)์ด๊ฑฐ๋ ๋ค์ ํน์ ๊ฐ๋ค ์ค ํ๋์ด๋ค.
LM_ID_BASE
-
์ต์ด ๋ค์์คํ์ด์ค์ (์ฆ ์์ฉ์ ๋ค์์คํ์ด์ค์) ๊ณต์ ์ค๋ธ์ ํธ๋ฅผ ์ ์ฌํ๋ค.
LM_ID_NEWLM
-
์ ๋ค์์คํ์ด์ค๋ฅผ ๋ง๋ค๊ณ ๊ทธ ๋ค์์คํ์ด์ค์ ๊ณต์ ์ค๋ธ์ ํธ๋ฅผ ์ ์ฌํ๋ค. ์ ๋ค์์คํ์ด์ค๊ฐ ์ฒ์์๋ ๋น์ด ์์ผ๋ฏ๋ก ์ค๋ธ์ ํธ์์ ํ์๋ก ํ๋ ๋ค๋ฅธ ๊ณต์ ์ค๋ธ์ ํธ๋ค์ ๋ชจ๋ ์ฐธ์กฐํ๋๋ก ์ค๋ธ์ ํธ๊ฐ ์ ๋๋ก ๋งํฌ ๋ผ ์์ด์ผ ํ๋ค.
filename
์ด NULL์ธ ๊ฒฝ์ฐ์๋ lmid
์ LM_ID_BASE
๊ฐ๋ง ํ์ฉ๋๋ค.
dlclose()
ํจ์๋ handle
์ด ๊ฐ๋ฆฌํค๋ ๋์ ์ ์ฌ ๊ณต์ ์ค๋ธ์ ํธ์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ค์ธ๋ค.
์ค๋ธ์ ํธ์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ผ๋ก ๋จ์ด์ง๊ณ ๊ทธ ์ค๋ธ์ ํธ์ ์ด๋ค ์ฌ๋ณผ๋ ๋ค๋ฅธ ์ค๋ธ์ ํธ์์ ํ์๋ก ํ์ง ์์ผ๋ฉด ์ค๋ธ์ ํธ์ ์ ์๋ ์๋ฉธ์๊ฐ ์์ผ๋ฉด ํธ์ถํ ๋ค์ ๊ทธ ์ค๋ธ์ ํธ๋ฅผ ๋ด๋ฆฐ๋ค. (์ด ์ค๋ธ์ ํธ์ ์ฌ๋ณผ์ ๋ค๋ฅธ ์ค๋ธ์ ํธ์์ ํ์๋ก ํ ์๋ ์๋ ๊ฒฝ์ฐ๋ก๋ ๊ทธ ์ค๋ธ์ ํธ๊ฐ RTLD_GLOBAL
ํ๋๊ทธ๋ก ์ด๋ ธ๊ณ ๊ทธ ์ฌ๋ณผ์ด ๋ค๋ฅธ ์ค๋ธ์ ํธ์ ์ฌ๋ฐฐ์น๋ฅผ ์ ๋ฐํ์ ๋๊ฐ ์๋ค.)
handle
์ด ๊ฐ๋ฆฌํค๋ ์ค๋ธ์ ํธ์ dlopen()
์ ํธ์ถํ์ ๋ ์๋์ผ๋ก ์ ์ฌ๋๋ ๊ณต์ ์ค๋ธ์ ํธ๋ค์ ๋ชจ๋ ์ฌ๊ท์ ์ผ๋ก ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ซ๋๋ค.
dlclose()
๊ฐ ์ฑ๊ณต์ ๋ฐํํ๋๋ผ๋ handle
์ ์ฐ๊ณ๋ ์ฌ๋ณผ์ด ํธ์ถ์์ ์ฃผ์ ๊ณต๊ฐ์์ ์ ๊ฑฐ๋๋ค๊ณ ๋ณด์ฅ๋๋ ๊ฑด ์๋๋ค. ๋ช
์์ dlopen()
ํธ์ถ๋ก ์ฐธ์กฐ๋๋ ๊ฒ์ ๋ํด์ ๋ค๋ฅธ ๊ณต์ ์ค๋ธ์ ํธ์์์ ์์กด ๊ด๊ณ ๋๋ฌธ์ ๊ณต์ ์ค๋ธ์ ํธ๊ฐ ๋ฌต์์ ์ผ๋ก ์ ์ฌ๋์ ์๋ (์ฐธ์กฐ ์นด์ดํธ๊ฐ ๋์์ ์๋) ์๋ค. ๊ทธ ๋ชจ๋ ์ฐธ์กฐ๊ฐ ํ๋ฆฐ ํ์์ผ ๊ณต์ ์ค๋ธ์ ํธ๋ฅผ ์ฃผ์ ๊ณต๊ฐ์์ ์ ๊ฑฐํ ์ ์๋ค.
์ฑ๊ณต ์ dlopen()
๊ณผ dlmopen()
์ ์ ์ฌ๋ ์ค๋ธ์ ํธ์ ๋ํ NULL ์๋ ํธ๋ค์ ๋ฐํํ๋ค. ์ค๋ฅ ์ (ํ์ผ์ ์ฐพ์ ์ ์๊ฑฐ๋, ์ฝ์ ์ ์๊ฑฐ๋, ํ์์ด ํ๋ฆฌ๊ฑฐ๋, ์ ์ฌ ์ค ์ค๋ฅ๊ฐ ์๊ฒผ์ผ๋ฉด) ์ด ํจ์๋ค์ NULL์ ๋ฐํํ๋ค.
์ฑ๊ณต ์ dlclose()
๋ 0์ ๋ฐํํ๋ค. ์ค๋ฅ ์ 0 ์๋ ๊ฐ์ ๋ฐํํ๋ค.
์ด ํจ์๋ค์ด ๋ฐํํ ์ค๋ฅ๋ฅผ dlerror(3)๋ก ์ง๋จํ ์ ์๋ค.
glibc 2.0 ๋ฐ ์ดํ์ dlopen()
๊ณผ dlclose()
๊ฐ ์๋ค. glibc 2.3.4์์ dlmopen()
์ด ์ฒ์ ๋ฑ์ฅํ๋ค.
์ด ์ ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ค์ ๋ํ ์ค๋ช ์ attributes(7)๋ฅผ ๋ณด๋ผ.
์ธํฐํ์ด์ค | ์์ฑ | ๊ฐ |
---|---|---|
dlopen() , dlmopen() , dlclose()
|
์ค๋ ๋ ์์ ์ฑ | MT-Safe |
POSIX.1-2001์์ dlclose()
์ dlopen()
์ ๊ธฐ์ ํ๋ค. dlmopen()
ํจ์๋ GNU ํ์ฅ์ด๋ค.
RTLD_NOLOAD
, RTLD_NODELETE
, RTLD_DEEPBIND
ํ๋๊ทธ๋ GNU ํ์ฅ์ด๋ค. ์ด ์ค ์์ ๋์ ์๋ผ๋ฆฌ์ค์๋ ์๋ค.
๋งํฌ ๋งต(link-map) ๋ฆฌ์คํธ๋ ๋์ ๋ง์ปค์ ์ฌ๋ณผ ๊ฒฐ์ ์์ ๊ฒฉ๋ฆฌ๋ ๋ค์์คํ์ด์ค๋ฅผ ๋ํ๋ธ๋ค. ๋ค์์คํ์ด์ค ๋ด์์๋ ์์กดํ๋ ๊ณต์ ์ค๋ธ์ ํธ๋ค์ ์ผ๋ฐ์ ๊ท์น์ ๋ฐ๋ผ ๋ฌต์์ ์ผ๋ก ์ ์ฌํ๊ณ ์ฌ๋ณผ ์ฐธ์กฐ๋ฅผ ์ผ๋ฐ์ ๊ท์น์ ๋ฐ๋ผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฒฐ์ ํ๋ ๊ทธ ๊ฒฐ์ ์ด ๋ค์์คํ์ด์ค ๋ด๋ก (๋ช ์์ ์ผ๋ก ๋๋ ๋ฌต์์ ์ผ๋ก) ์ ์ฌ๋ ์ค๋ธ์ ํธ๋ค์์ ์ ๊ณตํ๋ ์ ์๋ค๋ก ๊ตญํ๋๋ค.
dlmopen()
ํจ์๋ฅผ ํตํด ์ค๋ธ์ ํธ ์ ์ฌ ๊ฒฉ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. ์ฆ ๊ณต์ ์ค๋ธ์ ํธ๋ฅผ ์ ๋ค์์คํ์ด์ค์ ์ฌ๋ ค์ ๊ทธ ์ ์ค๋ธ์ ํธ์์ ์ ๊ณตํ๋ ์ฌ๋ณผ๋ค์ ์์ฉ์ ๋๋จธ์ง ๋ถ๋ถ์ ๋
ธ์ถ์ํค์ง ์์ ์ ์๋ค. ์ฐธ๊ณ ๋ก RTLD_LOCAL
ํ๋๊ทธ๋ก๋ ์ถฉ๋ถ์น ์๋ค. ๊ทธ ๊ณต์ ์ค๋ธ์ ํธ์ ์ฌ๋ณผ์ ๋ค๋ฅธ ๋ชจ๋ ๊ณต์ ์ค๋ธ์ ํธ์์ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ๋์ ์ ์ฌ ๊ณต์ ์ค๋ธ์ ํธ์์ ์ ๊ณตํ๋ ์ฌ๋ณผ๋ค์ ๋ค๋ฅธ ๊ณต์ ์ค๋ธ์ ํธ๋ค(์ ์ผ๋ถ)์์ ์ธ ์ ์๊ฒ ํ๋ฉด์๋ ๊ทธ ์ฌ๋ณผ๋ค์ ์์ฉ ์ ์ฒด๋ก ๋
ธ์ถํ๊ณ ์ถ์ง๋ ์์ ์ ์๋ค. ๋ณ๋ ๋ค์์คํ์ด์ค์ RTLD_GLOBAL
ํ๋๊ทธ๋ฅผ ์ฐ๋ฉด ๊ทธ๋ ๊ฒ ํ ์ ์๋ค.
dlmopen()
ํจ์๋ฅผ ์ฐ๋ฉด RTLD_LOCAL
ํ๋๊ทธ๋ณด๋ค ๋ ๋์ ๊ฒฉ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์๋ ์๋ค. ํนํ RTLD_LOCAL
๋ก ์ ์ฌ๋ ๊ณต์ ์ค๋ธ์ ํธ๋ RTLD_GLOBAL
๋ก ์ ์ฌ๋ ๋ค๋ฅธ ๊ณต์ ์ค๋ธ์ ํธ์์ ์์กดํ๋ ๊ฒฝ์ฐ RTLD_GLOBAL
๋ก ์น๊ฒฉ๋ ์ ์๋ค. ๋ฐ๋ผ์ ๊ณต์ ์ค๋ธ์ ํธ ์์กด์ฑ ์ ์ฒด๋ฅผ ๋ช
ํํ ํต์ ํ ์ ์๋ (ํ์น ์์) ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ฉด RTLD_LOCAL
์ ์ ์ฌ๋ ๊ณต์ ์ค๋ธ์ ํธ๋ฅผ ๊ฒฉ๋ฆฌํ๊ธฐ์ ์ถฉ๋ถํ์ง ์๋ค.
dlmopen()
์ ์ธ ์ ์๋ ๊ณณ์ผ๋ก ํ๋ฌ๊ทธ์ธ์ด ์๋ค. ํ๋ฌ๊ทธ์ธ ์ ์ฌ ํ๋ ์์ํฌ ์์ฑ์๊ฐ ํ๋ฌ๊ทธ์ธ ์์ฑ์๋ค์ ์ ๋ขฐํ ์ ์์ด์ ํ๋ฌ๊ทธ์ธ ํ๋ ์์ํฌ ๋ด์ ์ ์ ์ ๋ ์ฌ๋ณผ์ด ํ๋ฌ๊ทธ์ธ ์ฌ๋ณผ๋ก ๊ฒฐ์ ๋๊ธฐ๋ฅผ ์์น ์๋ ๊ฒฝ์ฐ์ด๋ค. ๋ ๋ค๋ฅธ ์ฉ๋๋ ๊ฐ์ ์ค๋ธ์ ํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ ์ฌํ ๋์ด๋ค. dlmopen()
์ ์ฐ์ง ์๋๋ค๋ฉด ๊ณต์ ์ค๋ธ์ ํธ ํ์ผ ์ฌ๋ณธ๋ค์ ๋ฐ๋ก ๋ง๋ค์ด์ผ ํ ๊ฒ์ด๋ค. ํ์ง๋ง dlmopen()
์ ์ฐ๋ฉด ๊ฐ์ ๊ณต์ ์ค๋ธ์ ํธ ํ์ผ์ ๋ค๋ฅธ ๋ค์์คํ์ด์ค๋ก ์ฌ๋ฆฌ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
glibc ๊ตฌํ์์๋ ๋ค์์คํ์ด์ค๋ฅผ ์ต๋ 16๊ฐ๊น์ง ์ง์ํ๋ค.
๊ณต์ ์ค๋ธ์ ํธ์์ ํจ์ ์์ฑ __attribute__((constructor))
์ __attribute__((destructor))
๋ฅผ ์จ์ ํจ์๋ฅผ ๋ด๋ณด์ผ ์ ์๋ค. ์์ฑ์ ํจ์๋ dlopen()
๋ฐํ ์ ์ ์คํ๋๊ณ ์๋ฉธ์ ํจ์๋ dlclose()
๋ฐํ ์ ์ ์คํ๋๋ค. ํ ๊ณต์ ์ค๋ธ์ ํธ์์ ์์ฑ์์ ์๋ฉธ์๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ด๋ณด์ผ ์ ์์ผ๋ฉฐ ๊ฐ ํจ์์ ์ฐ์ ์์๋ฅผ ์ฐ๊ณํด์ ์คํ ์์๋ฅผ ์ ํ ์๋ ์๋ค. ๋ ์์ธํ ๋ด์ฉ์ gcc
์ธํฌ ํ์ด์ง("Function attributes")๋ฅผ ๋ณด๋ผ.
๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ (๋ถ์์ ํ๊ฒ) ์ป๋ ๊ตฌ์ ๋ฐฉ๋ฒ์ ๋ง์ปค์์ ์ธ์ํ๋ ํน์ ์ฌ๋ณผ _init
๊ณผ _fini
๋ฅผ ์ฐ๋ ๊ฒ์ด์๋ค. ๋์ ์ ์ฌ ๊ณต์ ์ค๋ธ์ ํธ์์ ์ด๋ฆ์ด _init()
์ธ ๋ฃจํด์ ๋ด๋ณด์ด๋ฉด ๊ณต์ ์ค๋ธ์ ํธ ์ ์ฌ ํ dlopen()
๋ฐํ ์ ์ ๊ทธ ์ฝ๋๊ฐ ์คํ๋๋ค. ๋ ๊ณต์ ์ค๋ธ์ ํธ์์ ์ด๋ฆ์ด _fini()
์ธ ๋ฃจํด์ ๋ด๋ณด์ด๋ฉด ์ค๋ธ์ ํธ๋ฅผ ๋ด๋ฆฌ๊ธฐ ๋ฐ๋ก ์ ์ ๊ทธ ๋ฃจํด์ด ํธ์ถ๋๋ค. ์ด ๊ฒฝ์ฐ์ ์ด ํจ์๋ค์ ๊ธฐ๋ณธ ๋ฒ์ ์ ๋ด๊ณ ์๋ ์์คํ
๊ฐ์ ํ์ผ๋ค์ ๋งํฌํ์ง ์๋๋ก ํด์ผ ํ๋ค. gcc(1)
์ ๋ช
๋ นํ ์ต์
-nostartfiles
๋ฅผ ์ฐ๋ฉด ๋๋ค.
_init
๊ณผ _fini
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ํ์ฌ ํ๊ธฐ ์์ ์ํ์ด๋ฉฐ ๋์ ์์ ์ธ๊ธํ ์์ฑ์์ ์๋ฉธ์๋ฅผ ์จ์ผ ํ๋ค. ์ฌ๋ฌ ์ฅ์ ์ด ์์ผ๋ฉฐ ๋ฌด์๋ณด๋ค ์ด๊ธฐํ ๋ฐ ๋ง๋ฌด๋ฆฌ ํจ์๋ฅผ ์ฌ๋ฌ ๊ฐ ์ ์ํ ์ ์๋ค.
glibc 2.2.3๋ถํฐ atexit(3)๋ฅผ ์ด์ฉํด ๊ณต์ ์ค๋ธ์ ํธ๊ฐ ๋ด๋ ค๊ฐ ๋ ์๋์ผ๋ก ํธ์ถ๋๋ ์ข ๋ฃ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ ์ ์๋ค.
์ด ํจ์๋ค์ด ํฌํจ๋ dlopen API๋ SunOS์์ ์ ๋ํ ๊ฒ์ด๋ค.
glibc 2.24 ํ์ฌ dlmopen()
ํธ์ถ ์ RTLD_GLOBAL
ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๋ํ ์ต์ด ๋ค์์คํ์ด์ค ์๋ ๋ค์์คํ์ด์ค์ ์ ์ฌ๋ ์ค๋ธ์ ํธ์์ dlopen()
์ ํธ์ถํ๋ฉด์ RTLD_GLOBAL
์ ์ง์ ํ๋ฉด ํ๋ก๊ทธ๋จ ํฌ๋์(SIGSEGV
)๊ฐ ๋ฐ์ํ๋ค.
์๋ ํ๋ก๊ทธ๋จ์ (glibc) ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฌํ ๋ค์ cos(3)
ํจ์ ์ฃผ์๋ฅผ ์์๋ด์ ์ฝ์ฌ์ธ 2.0์ ์ฐ๋๋ค. ๋ค์์ ํ๋ก๊ทธ๋จ ๋น๋ ๋ฐ ์คํ ์์ด๋ค.
$ cc dlopen_demo.c -ldl
$ ./a.out
-0.416147
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <gnu/lib-names.h> /* LIBM_SO ์ ์ ("libm.so.6" ๊ฐ์ ๋ฌธ์์ด) */
int
main(void)
{
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen(LIBM_SO, RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
dlerror(); /* ์ด์ ์ค๋ฅ ์ง์ฐ๊ธฐ */
cosine = (double (*)(double)) dlsym(handle, "cos");
/* ISO C ํ์ค์ ๋ฐ๋ฅด๋ฉด ์์ฒ๋ผ ํจ์ ํฌ์ธํฐ์ 'void *' ์ฌ์ด์์
์บ์คํ
์ ํด์ ๋์ค๋ ๊ฒฐ๊ณผ๊ฐ ๊ท์ ๋ผ ์์ง ์๋ค. POSIX.1-2003 ๋ฐ
POSIX.1-2008์์๋ ๊ทธ ์ํฉ์ ๋ฐ์๋ค์ฌ์ ๋ค์ ์ฐํ ๋ฐฉ๋ฒ์
์ ์ํ๋ค.
*(void **) (&cosine) = dlsym(handle, "cos");
์ด (์ด์ํ) ์บ์คํ
์ ISO C ํ์ค์ ์ค์ํ๋ ๊ฒ์ด๋ฉด์
์ปดํ์ผ๋ฌ ๊ฒฝ๊ณ ๊ฐ ๋์ค์ง ์๊ฒ ํด ์ค๋ค.
POSIX.1-2008์ 2013๋
ํ ๊ธฐ์ ์ ์คํ(์์ POSIX.1-2013)์์๋
์ค์ ๊ตฌํ์ฒด๊ฐ 'void *'์ ํจ์ ํฌ์ธํฐ ์ฌ์ด ์บ์คํ
์ ์ง์ํด์ผ
ํ๋ค๊ณ ์๊ตฌํ๋ ๊ฒ์ผ๋ก ์ํฉ์ ๊ฐ์ ํ๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ
์ผ๋ถ ์ปดํ์ผ๋ฌ๋ค์ (๊ฐ๋ น gcc์ '-pedantic' ์ต์
์ ์ฐ๋ฉด)
์ด ํ๋ก๊ทธ๋จ์์ ์ด ์บ์คํ
์ ๋ํด ๋ญ๋ผ ๋ญ๋ผ ํ ์๋ ์๋ค. */
error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}
printf("%f\n", (*cosine)(2.0));
dlclose(handle);
exit(EXIT_SUCCESS);
}
ld(1)
, ldd(1)
, pldd(1)
, dl_iterate_phdr(3),
ldconfig(8)
gcc info ํ์ด์ง, ld info ํ์ด์ง
2019-08-02