dlinfo(3) - wariua/manpages-ko GitHub Wiki
dlinfo - ๋์ ์ ์ฌ ์ค๋ธ์ ํธ์ ๋ํ ์ ๋ณด ์ป๊ธฐ
#define _GNU_SOURCE
#include <link.h>
#include <dlfcn.h>
int dlinfo(void *handle, int request, void *info);
-ldl
๋ก ๋งํฌ.
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
์์ฒญ์ ์ด์ฉํ๋ฉด ์์ฉ์์ ์ ์ ํ ํฌ๊ธฐ๋ก ๋ฒํผ๋ฅผ ๋ง๋ค ์ ์๋ค. ํธ์ถ์๊ฐ ๋ค์ ๋จ๊ณ๋ค์ ์ํํด์ผ ํ๋ค.-
RTLD_DI_SERINFOSIZE
์์ฒญ์ ์ฌ์ฉํดDl_serinfo
๊ตฌ์กฐ์ฒด์ ์ด์ด์งRTLD_DI_SERINFO
์์ฒญ์ ํ์ํ ํฌ๊ธฐ(dls_size
)๋ฅผ ์ฑ์ด๋ค. -
์ฌ๋ฐ๋ฅธ ํฌ๊ธฐ(
dls_size
)์Dl_serinfo
๋ฒํผ๋ฅผ ํ ๋นํ๋ค. -
๋ค์
RTLD_DI_SERINFOSIZE
์์ฒญ์ ์ฌ์ฉํด ์ ๋จ๊ณ์์ ํ ๋นํ ๋ฒํผ์dls_size
๋ฐdls_cnt
ํ๋๋ฅผ ์ฑ์ด๋ค. -
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์ด ๋ค์ด๊ฐ๋ค.
์ฑ๊ณต ์ dlinfo()
๋ 0์ ๋ฐํํ๋ค. ์คํจ ์ -1์ ๋ฐํํ๋ค. dlerror(3)๋ก ์ค๋ฅ ์์ธ์ ์ง๋จํ ์ ์๋ค.
glibc 2.3.3์์ dlinfo()
๊ฐ ์ฒ์ ๋ฑ์ฅํ๋ค.
์ด ์ ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ค์ ๋ํ ์ค๋ช ์ attributes(7)๋ฅผ ๋ณด๋ผ.
์ธํฐํ์ด์ค | ์์ฑ | ๊ฐ |
---|---|---|
dlinfo() |
์ค๋ ๋ ์์ ์ฑ | MT-Safe |
์ด ํจ์๋ ๊ฐ์ ์ด๋ฆ์ ์๋ผ๋ฆฌ์ค ํจ์์์ ์ ๋ํ ๊ฒ์ด๋ฉฐ ๋ช๋ช ๋ค๋ฅธ ์์คํ ์๋ ์๋ค. ๋ค์ํ ๊ตฌํ๋ค์์ ์ง์ํ๋ ์์ฒญ ์ธํธ๋ค์ ์ผ๋ถ๋ง ์๋ก ๊ฒน์น๋ค.
์๋ ํ๋ก๊ทธ๋จ์์๋ 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);
}
dl_iterate_phdr(3), dladdr(3), dlerror(3), dlopen(3), dlsym(3), ld.so(8)
2019-03-06