dlopen(3) - wariua/manpages-ko GitHub Wiki

NAME

dlclose, dlopen, dlmopen - ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ ์—ด๊ณ  ๋‹ซ๊ธฐ

SYNOPSIS

#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๋กœ ๋งํฌ.

DESCRIPTION

dlopen()

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์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

dlmopen()

์ด ํ•จ์ˆ˜๋Š” ์•„๋ž˜์— ์ ์€ ์ฐจ์ด์ ๋“ค์„ ์ œ์™ธํ•˜๋ฉด 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()

dlclose() ํ•จ์ˆ˜๋Š” handle์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋™์  ์ ์žฌ ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ์˜ ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์ค„์ธ๋‹ค.

์˜ค๋ธŒ์ ํŠธ์˜ ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์œผ๋กœ ๋–จ์–ด์ง€๊ณ  ๊ทธ ์˜ค๋ธŒ์ ํŠธ์˜ ์–ด๋–ค ์‹ฌ๋ณผ๋„ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์—์„œ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ธŒ์ ํŠธ์— ์ •์˜๋œ ์†Œ๋ฉธ์ž๊ฐ€ ์žˆ์œผ๋ฉด ํ˜ธ์ถœํ•œ ๋‹ค์Œ ๊ทธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋‚ด๋ฆฐ๋‹ค. (์ด ์˜ค๋ธŒ์ ํŠธ์˜ ์‹ฌ๋ณผ์„ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์—์„œ ํ•„์š”๋กœ ํ•  ์ˆ˜๋„ ์žˆ๋Š” ๊ฒฝ์šฐ๋กœ๋Š” ๊ทธ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ RTLD_GLOBAL ํ”Œ๋ž˜๊ทธ๋กœ ์—ด๋ ธ๊ณ  ๊ทธ ์‹ฌ๋ณผ์ด ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์˜ ์žฌ๋ฐฐ์น˜๋ฅผ ์œ ๋ฐœํ–ˆ์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค.)

handle์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์˜ค๋ธŒ์ ํŠธ์— dlopen()์„ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ์ ์žฌ๋๋˜ ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๋ชจ๋‘ ์žฌ๊ท€์ ์œผ๋กœ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‹ซ๋Š”๋‹ค.

dlclose()๊ฐ€ ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•˜๋”๋ผ๋„ handle์— ์—ฐ๊ณ„๋œ ์‹ฌ๋ณผ์ด ํ˜ธ์ถœ์ž์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ์ œ๊ฑฐ๋๋‹ค๊ณ  ๋ณด์žฅ๋˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค. ๋ช…์‹œ์  dlopen() ํ˜ธ์ถœ๋กœ ์ฐธ์กฐ๋˜๋Š” ๊ฒƒ์— ๋”ํ•ด์„œ ๋‹ค๋ฅธ ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ์—์„œ์˜ ์˜์กด ๊ด€๊ณ„ ๋•Œ๋ฌธ์— ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฌต์‹œ์ ์œผ๋กœ ์ ์žฌ๋์„ ์ˆ˜๋„ (์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ ๋Š˜์—ˆ์„ ์ˆ˜๋„) ์žˆ๋‹ค. ๊ทธ ๋ชจ๋“  ์ฐธ์กฐ๊ฐ€ ํ’€๋ฆฐ ํ›„์—์•ผ ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ dlopen()๊ณผ dlmopen()์€ ์ ์žฌ๋œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ NULL ์•„๋‹Œ ํ•ธ๋“ค์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์‹œ (ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜, ์ฝ์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜, ํ˜•์‹์ด ํ‹€๋ฆฌ๊ฑฐ๋‚˜, ์ ์žฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ์œผ๋ฉด) ์ด ํ•จ์ˆ˜๋“ค์€ NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์„ฑ๊ณต ์‹œ dlclose()๋Š” 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์‹œ 0 ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด ํ•จ์ˆ˜๋“ค์ด ๋ฐ˜ํ™˜ํ•œ ์˜ค๋ฅ˜๋ฅผ dlerror(3)๋กœ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

VERSIONS

glibc 2.0 ๋ฐ ์ดํ›„์— dlopen()๊ณผ dlclose()๊ฐ€ ์žˆ๋‹ค. glibc 2.3.4์—์„œ dlmopen()์ด ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋‹ค.

ATTRIBUTES

์ด ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์€ attributes(7)๋ฅผ ๋ณด๋ผ.

์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ ๊ฐ’
dlopen(), dlmopen(), dlclose() ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ MT-Safe

CONFORMING TO

POSIX.1-2001์—์„œ dlclose()์™€ dlopen()์„ ๊ธฐ์ˆ ํ•œ๋‹ค. dlmopen() ํ•จ์ˆ˜๋Š” GNU ํ™•์žฅ์ด๋‹ค.

RTLD_NOLOAD, RTLD_NODELETE, RTLD_DEEPBIND ํ”Œ๋ž˜๊ทธ๋Š” GNU ํ™•์žฅ์ด๋‹ค. ์ด ์ค‘ ์•ž์˜ ๋‘˜์€ ์†”๋ผ๋ฆฌ์Šค์—๋„ ์žˆ๋‹ค.

NOTES

dlmopen()๊ณผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

๋งํฌ ๋งต(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์—์„œ ์œ ๋ž˜ํ•œ ๊ฒƒ์ด๋‹ค.

BUGS

glibc 2.24 ํ˜„์žฌ dlmopen() ํ˜ธ์ถœ ์‹œ RTLD_GLOBAL ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋˜ํ•œ ์ตœ์ดˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•„๋‹Œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ ์žฌ๋œ ์˜ค๋ธŒ์ ํŠธ์—์„œ dlopen()์„ ํ˜ธ์ถœํ•˜๋ฉด์„œ RTLD_GLOBAL์„ ์ง€์ •ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ ํฌ๋ž˜์‹œ(SIGSEGV)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์€ (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);
}

SEE ALSO

ld(1), ldd(1), pldd(1), dl_iterate_phdr(3),

dladdr(3), dlerror(3), dlinfo(3), dlsym(3), rtld-audit(7), ld.so(8), ldconfig(8)

gcc info ํŽ˜์ด์ง€, ld info ํŽ˜์ด์ง€


2019-08-02

โš ๏ธ **GitHub.com Fallback** โš ๏ธ