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

NAME

dladdr, dladdr1 - ์ฃผ์†Œ๋ฅผ ์‹ฌ๋ณผ ์ •๋ณด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

SYNOPSIS

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

DESCRIPTION

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 ์„ ์ทจ ๋ถˆ๊ฐ€๋Šฅ, ๋‚ด๋ณด์ด์ง€ ์•Š์Œ

RETURN VALUE

์„ฑ๊ณต ์‹œ ์ด ํ•จ์ˆ˜๋“ค์€ 0 ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. addr์— ์ง€์ •ํ•œ ์ฃผ์†Œ๊ฐ€ ์–ด๋–ค ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ์— ๊ฑธ๋ฆฌ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๊ทธ ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ ์•ˆ์˜ ์‹ฌ๋ณผ์— ๋“ค์–ด๋งž์ง€๋Š” ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” info->dli_sname ๋ฐ info->dli_saddr ํ•„๋“œ๊ฐ€ NULL์œผ๋กœ ์„ค์ •๋œ๋‹ค.

addr์— ์ง€์ •ํ•œ ์ฃผ์†Œ์— ๊ฑธ๋ฆฌ๋Š” ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด ์ด ํ•จ์ˆ˜๋“ค์€ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ์— dlerror(3)๋ฅผ ํ†ตํ•ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค.

VERSIONS

glibc 2.0 ๋ฐ ์ดํ›„์— dladdr()์ด ์žˆ๋‹ค. glibc 2.3.3์—์„œ dladdr1()์ด ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋‹ค.

ATTRIBUTES

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

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

CONFORMING TO

์ด ํ•จ์ˆ˜๋“ค์€ ๋น„ํ‘œ์ค€ GNU ํ™•์žฅ์ด๋ฉฐ ์†”๋ผ๋ฆฌ์Šค์—๋„ ์žˆ๋‹ค.

BUGS

๋•Œ๋•Œ๋กœ dladdr()์— ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ์ค„ ๋•Œ ์˜ˆ์ƒ ์™ธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ถ€ ์•„ํ‚คํ…์ฒ˜(ํŠนํžˆ i386๊ณผ x86-64)์—์„œ ์ธ์ž๋กœ ์ค€ ํ•จ์ˆ˜๊ฐ€ ๋ถ„๋ช… ๋™์ ์œผ๋กœ ๋งํฌ ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์™€์•ผ ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ dli_fname๊ณผ dli_fbase๊ฐ€ dladdr()์„ ํ˜ธ์ถœํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ๊ฐ’ ๊ฒฐ์ •์ด ์—ฌ์ „ํžˆ ์ปดํŒŒ์ผ ์‹œ์ ์ด ์ด๋ค„์ง€๋ฉฐ ์›๋ž˜ ์˜ค๋ธŒ์ ํŠธ์˜ plt(Procedure Linkage Table) ์„น์…˜์„ ๊ฐ€๋ฆฌํ‚ฌ ๋ฟ์ด๋ผ๋Š” ๊ฒŒ ๋ฌธ์ œ๋‹ค. (ํ˜ธ์ถœ ์˜ค๋ธŒ์ ํŠธ์—์„œ ๋™์  ๋ง์ปค์—๊ฒŒ ์‹ฌ๋ณผ ๊ฒฐ์ •์„ ์š”์ฒญํ•œ ํ›„์— ๊ทธ ํ˜ธ์ถœ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.) ์ด๊ฑธ ํ”ผํ•˜๋ ค๋ฉด ์ฝ”๋“œ๋ฅผ ์œ„์น˜ ๋…๋ฆฝ์ด ๋˜๊ฒŒ ์ปดํŒŒ์ผ ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ปดํŒŒ์ผ ์‹œ์ ์— ํฌ์ธํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฏ€๋กœ got(Global Offset Table)์—์„œ ์ตœ์ข… ์‹ฌ๋ณผ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ์— dladdr()๋กœ ์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ gcc(1)๊ฐ€ ๋งŒ๋“ค์–ด ๋‚ด๊ฒŒ ๋œ๋‹ค.

SEE ALSO

dl_iterate_phdr(3), dlinfo(3), dlopen(3), dlsym(3), ld.so(8)


2017-09-15

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