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

NAME

dlinfo - ๋™์  ์ ์žฌ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด ์–ป๊ธฐ

SYNOPSIS

#define _GNU_SOURCE
#include <link.h>
#include <dlfcn.h>

int dlinfo(void *handle, int request, void *info);

-ldl๋กœ ๋งํฌ.

DESCRIPTION

dlinfo() ํ•จ์ˆ˜๋Š” (๋ณดํ†ต ์•ž์„  dlopen(3) ๋‚ด์ง€ dlmopen(3) ํ˜ธ์ถœ๋กœ ์–ป์€) handle์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋™์  ์ ์žฌ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์–ด ์˜จ๋‹ค. request ์ธ์ž๊ฐ€ ์–ด๋–ค ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ง€์ •ํ•œ๋‹ค. info ์ธ์ž๋Š” ํ˜ธ์ถœ์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์“ฐ๋Š” ๋ฒ„ํผ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋‹ค. request์— ๋”ฐ๋ผ ์ด ์ธ์ž์˜ ํƒ€์ž…์ด ๋‹ฌ๋ผ์ง„๋‹ค.

request์— ๋‹ค์Œ ๊ฐ’๋“ค์„ ์ง€์›ํ•œ๋‹ค. (๊ด„ํ˜ธ ์•ˆ์€ ํ•ด๋‹นํ•˜๋Š” info ํƒ€์ž…์ด๋‹ค.)

RTLD_DI_LMID (Lmid_t *)

handle์ด ์ ์žฌ๋œ ๋งํฌ ๋งต ๋ฆฌ์ŠคํŠธ(๋„ค์ž„์ŠคํŽ˜์ด์Šค)์˜ ID๋ฅผ ์–ป๋Š”๋‹ค.

RTLD_DI_LINKMAP (struct link_map **)

handle์— ๋Œ€์‘ํ•˜๋Š” link_map ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์–ป๋Š”๋‹ค. info ์ธ์ž๊ฐ€ <link.h<์— ๋‹ค์Œ์ฒ˜๋Ÿผ ์ •์˜๋œ link_map ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

struct link_map {
    ElfW(Addr) l_addr;  /* ELF ํŒŒ์ผ ๋‚ด ์ฃผ์†Œ์™€
                           ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์ฃผ์†Œ์˜ ์ฐจ์ด */
    char      *l_name;  /* ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐพ์€
                           ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ช… */
    ElfW(Dyn) *l_ld;    /* ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ์˜
                           dynamic ์„น์…˜ */
    struct link_map *l_next, *l_prev;
                        /* ์ ์žฌ๋œ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ์—ฐ๊ฒฐ */

    /* ๋”ํ•ด์„œ ๊ตฌํ˜„ ๋‚ด๋ถ€์šฉ ํ•„๋“œ๋“ค์ด
       ์ถ”๊ฐ€๋กœ ์žˆ์Œ */
};
RTLD_DI_ORIGIN (char *)

handle์— ๋Œ€์‘ํ•˜๋Š” ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ์˜ ์ถœ๋ฐœ์ (origin) ๊ฒฝ๋กœ๋ช…์„ info๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜๋กœ ๋ณต์‚ฌํ•œ๋‹ค.

RTLD_DI_SERINFO (Dl_serinfo *

handle์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒ์ƒ‰ ๊ฒฝ๋กœ ๋ชฉ๋ก์„ ์–ป๋Š”๋‹ค. info ์ธ์ž๊ฐ€ ํƒ์ƒ‰ ๊ฒฝ๋กœ๋“ค์„ ๋‹ด๋Š” Dl_serinfo์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๋‹ค. ํƒ์ƒ‰ ๊ฒฝ๋กœ ์ˆ˜๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— info๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ตฌ์กฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ธฐ์ˆ ํ•˜๋Š” RTLD_DI_SERINFOSIZE ์š”์ฒญ์„ ์ด์šฉํ•˜๋ฉด ์‘์šฉ์—์„œ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ๋ฒ„ํผ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ˜ธ์ถœ์ž๊ฐ€ ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

  1. RTLD_DI_SERINFOSIZE ์š”์ฒญ์„ ์‚ฌ์šฉํ•ด Dl_serinfo ๊ตฌ์กฐ์ฒด์— ์ด์–ด์งˆ RTLD_DI_SERINFO ์š”์ฒญ์— ํ•„์š”ํ•œ ํฌ๊ธฐ(dls_size)๋ฅผ ์ฑ„์šด๋‹ค.

  2. ์˜ฌ๋ฐ”๋ฅธ ํฌ๊ธฐ(dls_size)์˜ Dl_serinfo ๋ฒ„ํผ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

  3. ๋‹ค์‹œ RTLD_DI_SERINFOSIZE ์š”์ฒญ์„ ์‚ฌ์šฉํ•ด ์•ž ๋‹จ๊ณ„์—์„œ ํ• ๋‹นํ•œ ๋ฒ„ํผ์˜ dls_size ๋ฐ dls_cnt ํ•„๋“œ๋ฅผ ์ฑ„์šด๋‹ค.

  4. RTLD_DI_SERINFO๋ฅผ ์‚ฌ์šฉํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒ์ƒ‰ ๊ฒฝ๋กœ๋“ค์„ ์–ป๋Š”๋‹ค.

Dl_serinfo ๊ตฌ์กฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ผ ์žˆ๋‹ค.

typedef struct {
    size_t dls_size;           /* Size in bytes of
                                  the whole buffer */
    unsigned int dls_cnt;      /* Number of elements
                                  in 'dls_serpath' */
    Dl_serpath dls_serpath[1]; /* Actually longer,
                                  'dls_cnt' elements */
} Dl_serinfo;

์œ„ ๊ตฌ์กฐ์ฒด์˜ dls_serpath ํ•ญ๋ชฉ ๊ฐ๊ฐ์€ ๋‹ค์Œ ํ˜•ํƒœ์˜ ๊ตฌ์กฐ์ฒด์ด๋‹ค.

typedef struct {
    char *dls_name;            /* ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒ์ƒ‰ ๊ฒฝ๋กœ
                                  ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ด๋ฆ„ */
    unsigned int dls_flags;    /* ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์–ด๋””์„œ
                                  ์™”๋Š”์ง€ ๋‚˜ํƒ€๋ƒ„ */
} Dl_serpath;

dls_flags ํ•„๋“œ๋Š” ํ˜„์žฌ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ ํ•ญ์ƒ 0์„ ๋‹ด๋Š”๋‹ค.

RTLD_DI_SERINFOSIZE (Dl_serinfo *

info๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” Dl_serinfo ๊ตฌ์กฐ์ฒด์˜ dls_size ๋ฐ dls_cnt ํ•„๋“œ๋ฅผ ์ด์–ด์งˆ RTLD_DI_SERINFO ์š”์ฒญ์— ์“ธ ๋ฒ„ํผ ํ• ๋‹น์— ์ ํ•ฉํ•œ ๊ฐ’๋“ค๋กœ ์ฑ„์šด๋‹ค.

RTLD_DI_TLS_MODID (size_t *, glibc 2.4๋ถ€ํ„ฐ)

์ด ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ์˜ TLS(์Šค๋ ˆ๋“œ ๋กœ์ปฌ ์ €์žฅ ๊ณต๊ฐ„) ์„ธ๊ทธ๋จผํŠธ์˜ TLS ์žฌ๋ฐฐ์น˜์— ์‚ฌ์šฉ๋œ ๋ชจ๋“ˆ ID๋ฅผ ์–ป๋Š”๋‹ค. ์˜ค๋ธŒ์ ํŠธ์— TLS ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์ •์˜๋ผ ์žˆ์ง€ ์•Š์œผ๋ฉด *info์— 0์ด ๋“ค์–ด๊ฐ„๋‹ค.

RTLD_DI_TLS_DATA (void **, glibc 2.4๋ถ€ํ„ฐ)

์ด ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ์˜ TLS ์„ธ๊ทธ๋จผํŠธ์— ๋Œ€์‘ํ•˜๋Š” ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ์˜ TLS ๋ธ”๋ก์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์–ป๋Š”๋‹ค. ์˜ค๋ธŒ์ ํŠธ์— PT_TLS ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์ •์˜๋ผ ์žˆ์ง€ ์•Š๊ฑฐ๋‚˜ ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ์—์„œ ๋ธ”๋ก์„ ํ• ๋‹นํ•˜์ง€ ์•Š์•˜์œผ๋ฉด *info์— NULL์ด ๋“ค์–ด๊ฐ„๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ dlinfo()๋Š” 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์‹คํŒจ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. dlerror(3)๋กœ ์˜ค๋ฅ˜ ์›์ธ์„ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

VERSIONS

glibc 2.3.3์—์„œ dlinfo()๊ฐ€ ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋‹ค.

ATTRIBUTES

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

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

NOTES

์ด ํ•จ์ˆ˜๋Š” ๊ฐ™์€ ์ด๋ฆ„์˜ ์†”๋ผ๋ฆฌ์Šค ํ•จ์ˆ˜์—์„œ ์œ ๋ž˜ํ•œ ๊ฒƒ์ด๋ฉฐ ๋ช‡๋ช‡ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—๋„ ์žˆ๋‹ค. ๋‹ค์–‘ํ•œ ๊ตฌํ˜„๋“ค์—์„œ ์ง€์›ํ•˜๋Š” ์š”์ฒญ ์„ธํŠธ๋“ค์€ ์ผ๋ถ€๋งŒ ์„œ๋กœ ๊ฒน์นœ๋‹ค.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” dlopen(3)์„ ์จ์„œ ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์—ฐ ๋‹ค์Œ RTLD_DI_SERINFOSIZE ๋ฐ RTLD_DI_SERINFO ์š”์ฒญ์„ ์ด์šฉํ•ด ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒ์ƒ‰ ๊ฒฝ๋กœ ๋ชฉ๋ก์„ ์–ป๋Š”๋‹ค. ๋‹ค์Œ์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ถœ๋ ฅ์˜ ์˜ˆ์ด๋‹ค.

$ ./a.out /lib64/libm.so.6
dls_serpath[0].dls_name = /lib64
dls_serpath[1].dls_name = /usr/lib64

ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค

#define _GNU_SOURCE
#include <dlfcn.h>
#include <link.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    void *handle;
    Dl_serinfo serinfo;
    Dl_serinfo *sip;
    int j;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s <libpath>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    /* ๋ช…๋ นํ–‰์— ์ง€์ •๋œ ๊ณต์œ  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ํ•ธ๋“ค ์–ป๊ธฐ */

    handle = dlopen(argv[1], RTLD_NOW);
    if (handle == NULL) {
        fprintf(stderr, "dlopen() failed: %s\n", dlerror());
        exit(EXIT_FAILURE);
    }

    /* RTLD_DI_SERINFO์— ์ค˜์•ผ ํ•˜๋Š” ๋ฒ„ํผ ํฌ๊ธฐ ์•Œ์•„๋‚ด๊ธฐ */

    if (dlinfo(handle, RTLD_DI_SERINFOSIZE, &serinfo) == -1) {
        fprintf(stderr, "RTLD_DI_SERINFOSIZE failed: %s\n", dlerror());
        exit(EXIT_FAILURE);
    }

    /* RTLD_DI_SERINFO์— ์“ธ ๋ฒ„ํผ ํ• ๋‹นํ•˜๊ธฐ */

    sip = malloc(serinfo.dls_size);
    if (sip == NULL) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }

    /* ์ƒˆ๋กœ ํ• ๋‹น๋œ ๋ฒ„ํผ์˜ 'dls_size' ๋ฐ 'dls_cnt' ํ•„๋“œ ์„ค์ •ํ•˜๊ธฐ */

    if (dlinfo(handle, RTLD_DI_SERINFOSIZE, sip) == -1) {
        fprintf(stderr, "RTLD_DI_SERINFOSIZE failed: %s\n", dlerror());
        exit(EXIT_FAILURE);
    }

    /* ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒ์ƒ‰ ๊ฒฝ๋กœ ๋ชฉ๋ก ์–ป์–ด ์™€์„œ ์ฐ๊ธฐ */

    if (dlinfo(handle, RTLD_DI_SERINFO, sip) == -1) {
        fprintf(stderr, "RTLD_DI_SERINFO failed: %s\n", dlerror());
        exit(EXIT_FAILURE);
    }

    for (j = 0; j < serinfo.dls_cnt; j++)
        printf("dls_serpath[%d].dls_name = %s\n",
                j, sip->dls_serpath[j].dls_name);

    exit(EXIT_SUCCESS);
}

SEE ALSO

dl_iterate_phdr(3), dladdr(3), dlerror(3), dlopen(3), dlsym(3), ld.so(8)


2019-03-06

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