Prechádzať zdrojové kódy

Do not set the RELOCS_DONE flag until it is actually done. This order matters for NPTL libpthreads to work. Well, that was a nice waste of 3 hours.

"Steven J. Hill" 19 rokov pred
rodič
commit
df616ea88a
1 zmenil súbory, kde vykonal 2 pridanie a 2 odobranie
  1. 2 2
      ldso/ldso/dl-elf.c

+ 2 - 2
ldso/ldso/dl-elf.c

@@ -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;
 }