+ {
+ Elf32_Rel *rel_p;
+ unsigned int old_data_addr_start;
+ unsigned int old_data_addr_end;
+ unsigned int old_data_offset;
+ unsigned int new_data_offset;
+ int i;
+
+ rel_p = (Elf32_Rel *)OLD_SECTION_H(old_rel_dyn_index).sh_addr;
+ old_data_addr_start = OLD_SECTION_H(old_data_index).sh_addr;
+ old_data_addr_end = old_data_addr_start +
+ OLD_SECTION_H(old_data_index).sh_size;
+ old_data_offset = (int)OLD_SECTION_H(old_data_index).sh_offset +
+ (unsigned int)old_base;
+ new_data_offset = (int)NEW_SECTION_H(old_data_index).sh_offset +
+ (unsigned int)new_base;
+
+#ifdef DEBUG
+ fprintf(stderr, "old_data.sh_addr= 0x%08x ... 0x%08x\n", old_data_addr_start,
+ old_data_addr_end);
+#endif /* DEBUG */
+
+ for (i = 0; i < old_rel_dyn_size/sizeof(Elf32_Rel); i++)
+ {
+#ifdef DEBUG
+ fprintf(stderr, ".rel.dyn offset= 0x%08x type= %d sym= %d\n",
+ rel_p->r_offset, ELF32_R_TYPE(rel_p->r_info), ELF32_R_SYM(rel_p->r_info));
+#endif /* DEBUG */
+
+ if (rel_p->r_offset)
+ {
+ unsigned int offset;
+
+ assert(old_data_addr_start <= rel_p->r_offset &&
+ rel_p->r_offset <= old_data_addr_end);
+
+ offset = rel_p->r_offset - old_data_addr_start;
+
+#ifdef DEBUG
+ fprintf(stderr, "r_offset= 0x%08x *r_offset= 0x%08x\n",
+ rel_p->r_offset, *((int *)(rel_p->r_offset)));
+ fprintf(stderr, "old = 0x%08x *old =0x%08x\n",
+ (old_data_offset + offset - (unsigned int)old_base),
+ *((int *)(old_data_offset + offset)));
+ fprintf(stderr, "new = 0x%08x *new =0x%08x\n",
+ (new_data_offset + offset - (unsigned int)new_base),
+ *((int *)(new_data_offset + offset)));
+#endif /* DEBUG */
+
+ *((int *)(new_data_offset + offset)) = *((int *)(old_data_offset + offset));
+ }
+
+ rel_p++;
+ }
+ }