dladdr(3) - wariua/manpages-ko GitHub Wiki
dladdr, dladdr1 - ์ฃผ์๋ฅผ ์ฌ๋ณผ ์ ๋ณด๋ก ๋ณํํ๊ธฐ
#define _GNU_SOURCE
#include <dlfcn.h>
int dladdr(void *addr, Dl_info *info);
int dladdr1(void *addr, Dl_info *info, void **extra_info, int flags);
-ldl
๋ก ๋งํฌ.
dladdr()
ํจ์๋ addr
์ ์ง์ ํ ์ฃผ์๊ฐ ํธ์ถ ์์ฉ์์ ์ ์ฌํ ๊ณต์ ์ค๋ธ์ ํธ์ ์์นํด ์๋์ง ํ์ธํ๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์ dladdr()
์ ๊ทธ ๊ณต์ ์ค๋ธ์ ํธ ๋ฐ addr
์ ๊ฑธ๋ฆฌ๋ ์ฌ๋ณผ์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐํํ๋ค. DL_info
๊ตฌ์กฐ์ฒด๋ก ๊ทธ ์ ๋ณด๊ฐ ๋ฐํ๋๋ค.
typedef struct {
const char *dli_fname; /* ์ฃผ์๊ฐ ํฌํจ๋ ๊ณต์
์ค๋ธ์ ํธ์ ๊ฒฝ๋ก๋ช
*/
void *dli_fbase; /* ๊ณต์ ์ค๋ธ์ ํธ๊ฐ ์ ์ฌ๋
๊ธฐ์ค ์ฃผ์ */
const char *dli_sname; /* addr์ ์ ์๊ฐ ๊ฑธ๋ฆฌ๋
์ฌ๋ณผ์ ์ด๋ฆ */
void *dli_saddr; /* dli_sname์ ๋์ ์๋
์ฌ๋ณผ์ ์ ํํ ์ฃผ์ */
} Dl_info;
addr
์ ๋์ํ๋ ์ฌ๋ณผ์ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ์๋ dli_sname
๊ณผ dli_saddr
์ด NULL๋ก ์ค์ ๋๋ค.
dladdr1()
ํจ์๋ dladdr()
๊ณผ ๋น์ทํ๋ extra_info
์ธ์๋ฅผ ํตํด ์ถ๊ฐ ์ ๋ณด๋ฅผ ๋ฐํํ๋ค. ๋ฐํ๋๋ ์ ๋ณด๋ flags
์ ์ง์ ํ ๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ฐ, ๋ค์ ๊ฐ๋ค ์ค ํ๋๋ฅผ ์ง์ ํ ์ ์๋ค.
RTLD_DL_LINKMAP
-
๊ฑธ๋ฆฐ ํ์ผ์ ๋งํฌ ๋งต์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค.
extra_info
์ธ์๊ฐlink_map
๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. (์ฆstruct link_map **
์ด๋ค.) ๊ทธ ๊ตฌ์กฐ์ฒด๋<link.h>
์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ผ ์๋ค.struct link_map { ElfW(Addr) l_addr; /* ELF ํ์ผ ๋ด ์ฃผ์์ ๋ฉ๋ชจ๋ฆฌ ๋ด ์ฃผ์์ ์ฐจ์ด */ char *l_name; /* ์ค๋ธ์ ํธ๋ฅผ ์ฐพ์ ์ ๋ ๊ฒฝ๋ก๋ช */ ElfW(Dyn) *l_ld; /* ๊ณต์ ์ค๋ธ์ ํธ์ dynamic ์น์ */ struct link_map *l_next, *l_prev; /* ์ ์ฌ๋ ์ค๋ธ์ ํธ๋ค์ ์ฐ๊ฒฐ */ /* ๋ํด์ ๊ตฌํ ๋ด๋ถ์ฉ ํ๋๋ค์ด ์ถ๊ฐ๋ก ์์ */ };
RTLD_DL_SYMENT
-
๋์ํ๋ ์ฌ๋ณผ์ ELF ์ฌ๋ณผ ํ ์ด๋ธ ํญ๋ชฉ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ป๋๋ค.
extra_info
์ธ์๊ฐ ์ฌ๋ณผ ํฌ์ธํฐ์ ๋ํ ํฌ์ธํฐ, ์ฆconst ElfW(Sym) **
์ด๋ค.ElfW()
๋งคํฌ๋ก๋ ๊ทธ ์ธ์๋ฅผ ํ๋์จ์ด ์ํคํ ์ฒ์ ๋ง๋ ELF ๋ฐ์ดํฐ ํ์ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ ์ค๋ค. ์๋ฅผ ๋ค์ด 64๋นํธ ํ๋ซํผ์์ElfW(Sym)
์ ๋ฐ์ดํฐ ํ์ ์ด๋ฆElf64_Sym
์ ๋ด๋๋๋ฐ, ์ด๋<elf.h>
์ ๋ค์์ฒ๋ผ ์ ์๋ผ ์๋ค.typedef struct { Elf64_Word st_name; /* ์ฌ๋ณผ ์ด๋ฆ */ unsigned char st_info; /* ์ฌ๋ณผ ํ์ ๋ฐ ๋ฐ์ธ๋ฉ */ unsigned char st_other; /* ์ฌ๋ณผ ๊ฐ์์ฑ */ Elf64_Section st_shndx; /* ์น์ ์ธ๋ฑ์ค */ Elf64_Addr st_value; /* ์ฌ๋ณผ ๊ฐ */ Elf64_Xword st_size; /* ์ฌ๋ณผ ํฌ๊ธฐ */ } Elf64_Sym;
st_name
ํ๋๋ ๋ฌธ์์ด ํ ์ด๋ธ์ ์ธ๋ฑ์ค์ด๋ค.st_info
ํ๋๋ ์ฌ๋ณผ์ ํ์ ๊ณผ ๋ฐ์ธ๋ฉ์ ๋ด๋๋ค. ๋งคํฌ๋กELF64_ST_TYPE(st_info)
์ผ๋ก (32๋นํธ ํ๋ซํผ์์๋ELF32_ST_TYPE()
์ผ๋ก) ํ์ ์ ๋ฝ์๋ผ ์ ์์ผ๋ฉฐ ๋ค์ ๊ฐ๋ค ์ค ํ๋๊ฐ ๋์จ๋ค.๊ฐ ์ค๋ช STT_NOTYPE
์ฌ๋ณผ ํ์ ์ด ์ง์ ๋ผ ์์ง ์์ STT_OBJECT
์ฌ๋ณผ์ด ๋ฐ์ดํฐ ์ค๋ธ์ ํธ์ STT_FUNC
์ฌ๋ณผ์ด ์ฝ๋ ์ค๋ธ์ ํธ์ STT_SECTION
์น์ ์ ์ฐ๊ณ๋ ์ฌ๋ณผ STT_FILE
์ฌ๋ณผ ์ด๋ฆ์ด ํ์ผ ์ด๋ฆ์ STT_COMMON
์ฌ๋ณผ์ด ๊ณต์ฉ ๋ฐ์ดํฐ ์ค๋ธ์ ํธ์ STT_TLS
์ฌ๋ณผ์ด ์ค๋ ๋ ๋ก์ปฌ ๋ฐ์ดํฐ ์ค๋ธ์ ํธ์ STT_GNU_IFUNC
์ฌ๋ณผ์ด ๊ฐ์ ์ฝ๋ ์ค๋ธ์ ํธ์ ๋งคํฌ๋ก
ELF64_ST_BIND(st_info)
๋ก (32๋นํธ ํ๋ซํผ์์๋ELF32_ST_BIND()
๋ก)st_info
ํ๋์์ ์ฌ๋ณผ ๋ฐ์ธ๋ฉ์ ๋ฝ์๋ผ ์ ์์ผ๋ฉฐ ๋ค์ ๊ฐ๋ค ์ค ํ๋๊ฐ ๋์จ๋ค.๊ฐ ์ค๋ช STB_LOCAL
์ง์ญ ์ฌ๋ณผ STB_GLOBAL
์ ์ญ ์ฌ๋ณผ STB_WEAK
์ฝํ ์ฌ๋ณผ STB_GNU_UNIQUE
์ ์ผ ์ฌ๋ณผ st_other
ํ๋๋ ์ฌ๋ณผ์ ๊ฐ์์ฑ์ ๋ด๊ณ ์๋๋ฐ ๋งคํฌ๋กELF64_ST_VISIBILITY(st_info)
๋ก (32๋นํธ ํ๋ซํผ์์๋ELF32_ST_VISIBILITY()
๋ก) ๋ฝ์๋ผ ์ ์์ผ๋ฉฐ ๋ค์ ๊ฐ๋ค ์ค ํ๋๊ฐ ๋์จ๋ค.๊ฐ ์ค๋ช STV_DEFAULT
์ฌ๋ณผ ๊ฐ์์ฑ ๊ธฐ๋ณธ ๊ท์น STV_INTERNAL
ํ๋ก์ธ์๋ณ ์จ๊ธฐ๊ธฐ ์์ค STV_HIDDEN
๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ ์ฌ๋ณผ STV_PROTECTED
์ ์ทจ ๋ถ๊ฐ๋ฅ, ๋ด๋ณด์ด์ง ์์
์ฑ๊ณต ์ ์ด ํจ์๋ค์ 0 ์๋ ๊ฐ์ ๋ฐํํ๋ค. addr
์ ์ง์ ํ ์ฃผ์๊ฐ ์ด๋ค ๊ณต์ ์ค๋ธ์ ํธ์ ๊ฑธ๋ฆฌ๊ธฐ๋ ํ์ง๋ง ๊ทธ ๊ณต์ ์ค๋ธ์ ํธ ์์ ์ฌ๋ณผ์ ๋ค์ด๋ง์ง๋ ์๋ ๊ฒฝ์ฐ์๋ info->dli_sname
๋ฐ info->dli_saddr
ํ๋๊ฐ NULL์ผ๋ก ์ค์ ๋๋ค.
addr
์ ์ง์ ํ ์ฃผ์์ ๊ฑธ๋ฆฌ๋ ๊ณต์ ์ค๋ธ์ ํธ๋ฅผ ์ฐพ์ ์ ์์ผ๋ฉด ์ด ํจ์๋ค์ 0์ ๋ฐํํ๋ค. ์ด ๊ฒฝ์ฐ์ dlerror(3)๋ฅผ ํตํด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ป์ ์ ์๋ค.
glibc 2.0 ๋ฐ ์ดํ์ dladdr()
์ด ์๋ค. glibc 2.3.3์์ dladdr1()
์ด ์ฒ์ ๋ฑ์ฅํ๋ค.
์ด ์ ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ค์ ๋ํ ์ค๋ช ์ attributes(7)๋ฅผ ๋ณด๋ผ.
์ธํฐํ์ด์ค | ์์ฑ | ๊ฐ |
---|---|---|
dladdr() , dladdr1()
|
์ค๋ ๋ ์์ ์ฑ | MT-Safe |
์ด ํจ์๋ค์ ๋นํ์ค GNU ํ์ฅ์ด๋ฉฐ ์๋ผ๋ฆฌ์ค์๋ ์๋ค.
๋๋๋ก dladdr()
์ ํจ์ ํฌ์ธํฐ๋ฅผ ์ค ๋ ์์ ์ธ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค. ์ผ๋ถ ์ํคํ
์ฒ(ํนํ i386๊ณผ x86-64)์์ ์ธ์๋ก ์ค ํจ์๊ฐ ๋ถ๋ช
๋์ ์ผ๋ก ๋งํฌ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์์ผ ํ๋ ๊ฒ์ธ๋ฐ dli_fname
๊ณผ dli_fbase
๊ฐ dladdr()
์ ํธ์ถํ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ ์๋ ์๋ค.
ํจ์ ํฌ์ธํฐ ๊ฐ ๊ฒฐ์ ์ด ์ฌ์ ํ ์ปดํ์ผ ์์ ์ด ์ด๋ค์ง๋ฉฐ ์๋ ์ค๋ธ์ ํธ์ plt(Procedure Linkage Table) ์น์
์ ๊ฐ๋ฆฌํฌ ๋ฟ์ด๋ผ๋ ๊ฒ ๋ฌธ์ ๋ค. (ํธ์ถ ์ค๋ธ์ ํธ์์ ๋์ ๋ง์ปค์๊ฒ ์ฌ๋ณผ ๊ฒฐ์ ์ ์์ฒญํ ํ์ ๊ทธ ํธ์ถ์ ์ฒ๋ฆฌํ๋ค.) ์ด๊ฑธ ํผํ๋ ค๋ฉด ์ฝ๋๋ฅผ ์์น ๋
๋ฆฝ์ด ๋๊ฒ ์ปดํ์ผ ํด ๋ณผ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ์ปดํ์ผ๋ฌ์์ ์ปดํ์ผ ์์ ์ ํฌ์ธํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ค๋นํ ์ ์๊ฒ ๋๋ฏ๋ก got(Global Offset Table)์์ ์ต์ข
์ฌ๋ณผ ์ฃผ์๋ฅผ ๊ฐ์ ธ์จ ๋ค์์ dladdr()
๋ก ์ฃผ๋ ์ฝ๋๋ฅผ gcc(1)
๊ฐ ๋ง๋ค์ด ๋ด๊ฒ ๋๋ค.
dl_iterate_phdr(3), dlinfo(3), dlopen(3), dlsym(3), ld.so(8)
2017-09-15