dlsym()을 통해 무효 포인터를 얻는 목표는 다음과 같습니다. 해당 포인터가 참조하는 함수를 호출합니다. C 스타일 캐스팅과 달리 static_cast 또는 reinterpret_cast를 사용한 캐스팅을 통한 변환 시도가 실패했습니다.
C 98/03에서는 void 포인터를 함수 포인터로 직접 변환하는 것이 허용되지 않습니다. 그러나 C 0x는 조건부 지원을 제공하므로 구현이 동작을 지시할 수 있습니다.
정의되지 않은 동작 접근 방식:
표준에 의해 정의되지 않았지만 다음 코드는 작동할 수 있습니다. 대부분의 플랫폼:
void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));
또는:
fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;
복잡하지만 이식 가능한 접근 방식:
이 방법은 함수 포인터의 주소가 객체 포인터라는 사실을 활용합니다.
// Get address as object pointer
void (**object_ptr)() = &my_ptr;
// Convert to void** (also an object pointer)
void **ppv = reinterpret_cast(object_ptr);
// Store address from 'gptr' in memory cell pointed to by 'ppv'
*ppv = gptr;
이 접근 방식은 표준에 정의되어 있지 않지만 대부분의 구현에서 합리적으로 잘 작동합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3