Explorar o código

LibELF: Perform .relr.dyn relocations before .rel.dyn

IFUNC resolvers depend on the resolved function's address having been
relocated by the time they are called. This means that relative
relocations have to be done first.

The linker is kind enough to put R_*_RELATIVE before R_*_IRELATIVE in
.rel.dyn, but .relr.dyn contains relative relocations too.
Daniel Bertalan %!s(int64=3) %!d(string=hai) anos
pai
achega
ed5f110b40
Modificáronse 1 ficheiros con 1 adicións e 1 borrados
  1. 1 1
      Userland/Libraries/LibELF/DynamicLoader.cpp

+ 1 - 1
Userland/Libraries/LibELF/DynamicLoader.cpp

@@ -197,9 +197,9 @@ void DynamicLoader::do_main_relocations()
         }
     };
 
+    do_relr_relocations();
     m_dynamic_object->relocation_section().for_each_relocation(do_single_relocation);
     m_dynamic_object->plt_relocation_section().for_each_relocation(do_single_relocation);
-    do_relr_relocations();
 }
 
 Result<NonnullRefPtr<DynamicObject>, DlErrorMessage> DynamicLoader::load_stage_3(unsigned flags)