완료됨
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
avatar
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를 받는 것이구요.

혹시 또 모호한 부분 있으면 질문 주시면 답변 드리겠습니다.

2023.10.10. 16:30