TEST(dlfcn, ifunc_ctor_call_rtld_lazy) { typedef const char* (*fn_ptr)(); void* handle = dlopen("libtest_ifunc.so", RTLD_LAZY); ASSERT_TRUE(handle != nullptr) << dlerror(); fn_ptr is_ctor_called = reinterpret_cast<fn_ptr>(dlsym(handle, "is_ctor_called_irelative")); ASSERT_TRUE(is_ctor_called != nullptr) << dlerror(); ASSERT_STREQ("false", is_ctor_called()); is_ctor_called = reinterpret_cast<fn_ptr>(dlsym(handle, "is_ctor_called_jump_slot")); ASSERT_TRUE(is_ctor_called != nullptr) << dlerror(); ASSERT_STREQ("true", is_ctor_called()); dlclose(handle); }
TEST(dlfcn, ifunc_ctor_call) { typedef const char* (*fn_ptr)(); void* handle = dlopen("libtest_ifunc.so", RTLD_NOW); ASSERT_TRUE(handle != NULL) << dlerror(); fn_ptr is_ctor_called = reinterpret_cast<fn_ptr>(dlsym(handle, "is_ctor_called")); ASSERT_TRUE(is_ctor_called != NULL) << dlerror(); ASSERT_STREQ("true", is_ctor_called()); dlclose(handle); }