浏览代码

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 3 年之前
父节点
当前提交
ed5f110b40
共有 1 个文件被更改,包括 1 次插入1 次删除
  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)