Просмотр исходного кода

ldso: Do not adjust dynamic section entries unnecessarily

Signed-off-by: Filippo Arcidiacono <filippo.arcidiacono@st.com>
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
Filippo Arcidiacono 14 лет назад
Родитель
Сommit
33cb7f0b4a
1 измененных файлов с 10 добавлено и 7 удалено
  1. 10 7
      ldso/include/dl-elf.h

+ 10 - 7
ldso/include/dl-elf.h

@@ -162,15 +162,18 @@ unsigned int __dl_parse_dynamic_info(ElfW(Dyn) *dpnt, unsigned long dynamic_info
 		if (dynamic_info[tag]) \
 			dynamic_info[tag] = (unsigned long) DL_RELOC_ADDR(load_off, dynamic_info[tag]); \
 	} while (0)
-	ADJUST_DYN_INFO(DT_HASH, load_off);
-	ADJUST_DYN_INFO(DT_PLTGOT, load_off);
-	ADJUST_DYN_INFO(DT_STRTAB, load_off);
-	ADJUST_DYN_INFO(DT_SYMTAB, load_off);
-	ADJUST_DYN_INFO(DT_RELOC_TABLE_ADDR, load_off);
-	ADJUST_DYN_INFO(DT_JMPREL, load_off);
+	/* Don't adjust .dynamic unnecessarily.  */
+	if (load_off != 0) {
+		ADJUST_DYN_INFO(DT_HASH, load_off);
+		ADJUST_DYN_INFO(DT_PLTGOT, load_off);
+		ADJUST_DYN_INFO(DT_STRTAB, load_off);
+		ADJUST_DYN_INFO(DT_SYMTAB, load_off);
+		ADJUST_DYN_INFO(DT_RELOC_TABLE_ADDR, load_off);
+		ADJUST_DYN_INFO(DT_JMPREL, load_off);
 #ifdef __LDSO_GNU_HASH_SUPPORT__
-	ADJUST_DYN_INFO(DT_GNU_HASH_IDX, load_off);
+		ADJUST_DYN_INFO(DT_GNU_HASH_IDX, load_off);
 #endif
+	}
 #undef ADJUST_DYN_INFO
 	return rtld_flags;
 }