OSDN Git Service

Do not set the RELOCS_DONE flag until it is actually done. This order matters for...
author"Steven J. Hill" <sjhill@realitydiluted.com>
Sun, 6 Nov 2005 00:17:48 +0000 (00:17 -0000)
committer"Steven J. Hill" <sjhill@realitydiluted.com>
Sun, 6 Nov 2005 00:17:48 +0000 (00:17 -0000)
ldso/ldso/dl-elf.c

index 6c9a1fd..d7fd41e 100644 (file)
@@ -654,7 +654,6 @@ int _dl_fixup(struct dyn_elf *rpnt, int now_flag)
 #endif
        if (tpnt->dynamic_info[DT_RELOC_TABLE_ADDR] &&
            !(tpnt->init_flag & RELOCS_DONE)) {
-               tpnt->init_flag |= RELOCS_DONE;
                reloc_addr = tpnt->dynamic_info[DT_RELOC_TABLE_ADDR];
                relative_count = tpnt->dynamic_info[DT_RELCONT_IDX];
                if (relative_count) { /* Optimize the XX_RELATIVE relocations if possible */
@@ -665,6 +664,7 @@ int _dl_fixup(struct dyn_elf *rpnt, int now_flag)
                goof += _dl_parse_relocation_information(rpnt,
                                reloc_addr,
                                reloc_size);
+               tpnt->init_flag |= RELOCS_DONE;
        }
        if (tpnt->dynamic_info[DT_BIND_NOW])
                now_flag = RTLD_NOW;
@@ -672,7 +672,6 @@ int _dl_fixup(struct dyn_elf *rpnt, int now_flag)
            (!(tpnt->init_flag & JMP_RELOCS_DONE) ||
             (now_flag && !(tpnt->rtld_flags & now_flag)))) {
                tpnt->rtld_flags |= now_flag; 
-               tpnt->init_flag |= JMP_RELOCS_DONE;
                if (!(tpnt->rtld_flags & RTLD_NOW)) {
                        _dl_parse_lazy_relocation_information(rpnt,
                                        tpnt->dynamic_info[DT_JMPREL],
@@ -682,6 +681,7 @@ int _dl_fixup(struct dyn_elf *rpnt, int now_flag)
                                        tpnt->dynamic_info[DT_JMPREL],
                                        tpnt->dynamic_info[DT_PLTRELSZ]);
                }
+               tpnt->init_flag |= JMP_RELOCS_DONE;
        }
        return goof;
 }