diff --git a/linker/linker.cpp b/linker/linker.cpp index 9019a0d84..fda168c52 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -1689,8 +1689,6 @@ void soinfo::CallConstructors() { // DT_INIT should be called before DT_INIT_ARRAY if both are present. CallFunction("DT_INIT", init_func); CallArray("DT_INIT_ARRAY", init_array, init_array_count, false); - - resolve_ifunc_symbols(); } void soinfo::CallDestructors() { @@ -1752,12 +1750,6 @@ void soinfo::set_st_ino(ino_t ino) { } } -void soinfo::set_has_ifuncs(bool ifuncs) { - if (has_min_version(1)) { - has_ifuncs = ifuncs; - } -} - dev_t soinfo::get_st_dev() { if (has_min_version(0)) { return st_dev; @@ -2195,18 +2187,6 @@ bool soinfo::LinkImage(const android_dlextinfo* extinfo) { } #endif - // if there are ifuncs, we need to do an additional relocation pass. - // they cannot be resolved until the rest of the relocations are done - // because we need to call the resolution function which may be waiting - // on relocations. - if(get_has_ifuncs()) { -#if defined(__i386__) - soinfo_ifunc_relocate(this, plt_rel, plt_rel_count); -#elif defined(__x86_64__) - soinfo_ifunc_relocate(this, plt_rela, plt_rela_count); -#endif - } - #if defined(__mips__) if (!mips_relocate_got(this)) { return false; diff --git a/linker/linker.h b/linker/linker.h index a48a8c6c3..8afeb144d 100644 --- a/linker/linker.h +++ b/linker/linker.h @@ -214,10 +214,8 @@ struct soinfo { void set_st_dev(dev_t st_dev); void set_st_ino(ino_t st_ino); - void set_has_ifuncs(bool ifunc); ino_t get_st_ino(); dev_t get_st_dev(); - bool get_has_ifuncs(); diff --git a/tests/libs/Android.mk b/tests/libs/Android.mk index abab1ade3..c97057ceb 100644 --- a/tests/libs/Android.mk +++ b/tests/libs/Android.mk @@ -470,7 +470,7 @@ endif # ----------------------------------------------------------------------------- # Library used by ifunc tests # ----------------------------------------------------------------------------- -ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86 x86_64)) +ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),arm64 x86 x86_64)) libtest_ifunc_src_files := \ dlopen_testlib_ifunc.c @@ -478,6 +478,14 @@ ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86 x86_64)) module := libtest_ifunc build_type := target build_target := SHARED_LIBRARY + + ifeq ($(TARGET_ARCH),arm64) + libtest_ifunc_multilib := 64 + # TODO: This is a workaround - remove it once gcc + # removes its Android ifunc checks + libtest_ifunc_cflags := -mglibc + endif + include $(TEST_PATH)/Android.build.mk endif