완료됨
rtld_global 함수포인터 질문
# define __rtld_lock_lock_recursive(NAME) \
GL(dl_rtld_lock_recursive) (&(NAME).mutex)
void
_dl_fini (void)
{
#ifdef SHARED
int do_audit = 0;
again:
#endif
for (Lmid_t ns = GL(dl_nns) - 1; ns >= 0; --ns)
{
/* Protect against concurrent loads and unloads. */
__rtld_lock_lock_recursive (GL(dl_load_lock));
rtld 강의중
GL(dl_rtld_lock_recursive) (&(NAME).mutex)
코드의 GL이 무슨 뜻이며 도대체 이 함수가 왜 포인터 함수인지 모르겠으며..
# define __rtld_lock_lock_recursive(NAME)
GL(dl_rtld_lock_recursive) (&(NAME).mutex)
이 매크로 함수에서 dl_load_lock을 인자로 __rtld_lock_recursive 함수를 실행시킨다는데
&(_dl_load_lock).mutex를 하면 잘못된 주소 멤버 변수를 참조하는게 되는게 아닌가요?
부탁드립니다 고수님들..
#시스템해킹
#c언어
#함수포인터
#rtld
작성자 정보
답변
1
rbtree_work
대표 업적 없음
안녕하세요,
GL
매크로에 대해서 검색해보면 다음과 같은 매크로임을 알 수 있습니다.
#ifndef SHARED
# define EXTERN extern
# define GL(name) _##name
#else
# define EXTERN
# if IS_IN (rtld)
# define GL(name) _rtld_local._##name
# else
# define GL(name) _rtld_global._##name
# endif
즉 GL(dl_rtld_lock_recursive) (&(NAME).mutex)
는 _dl_rtld_lock_recursive(&(NAME).mutex)
로 이해할 수 있습니다.
또한 해당 설명에 약간의 오해의 소지가 있는 것 같습니다. __rtld_lock_lock_recursive(NAME)
매크로는 NAME
을 인자로 받으므로 GL(dl_load_lock)
(= _dl_load_lock
)을 인자로 받는다고 할 수 있습니다. 그 내부에서 _dl_rtld_lock_recursive
가 인자로 &_dl_load_lock.mutex
를 받는 것이구요.
혹시 또 모호한 부분 있으면 질문 주시면 답변 드리겠습니다.