+ // fill removed funcs with 'int3'
+ for (i = 0; i < sym_cnt_obj; i++) {
+ if (strncmp(syms_obj[i].name, "rm_", 3))
+ continue;
+
+ addr = syms_obj[i].addr;
+ end = (i < sym_cnt_obj - 1)
+ ? syms_obj[i + 1].addr : s_text_obj.size;
+ if (addr >= s_text_obj.size || end > s_text_obj.size) {
+ printf("addr OOR: %x-%x '%s'\n", addr, end,
+ syms_obj[i].name);
+ goto out;
+ }
+ fill_int3(s_text_obj.data + addr, end - addr);
+ }
+
+ // remove relocs
+ for (i = 0; i < s_text_obj.reloc_cnt; i++) {
+ addr = s_text_obj.relocs[i].r_vaddr;
+ sym = s_text_obj.relocs[i].r_symndx;
+ if (addr > s_text_obj.size - 4) {
+ printf("reloc addr OOR: %x\n", addr);
+ goto out;
+ }
+ if (sym >= raw_sym_cnt_obj) {
+ printf("reloc sym OOR: %d/%ld\n",
+ sym, raw_sym_cnt_obj);
+ goto out;
+ }
+#if 0
+ printf("r %08x -> %08x %s\n", base + addr,
+ raw_syms_obj[sym].addr,
+ raw_syms_obj[sym].name);
+#endif
+ t = (unsigned int *)(s_text_obj.data + addr);
+ if (t[0] == 0xcccccccc
+ || t[-1] == 0xcccccccc) { // jumptab of a func?
+ t[0] = 0xcccccccc;
+ memmove(&s_text_obj.relocs[i],
+ &s_text_obj.relocs[i + 1],
+ (s_text_obj.reloc_cnt - i - 1)
+ * sizeof(s_text_obj.relocs[0]));
+ i--;
+ s_text_obj.reloc_cnt--;
+ }
+ // note: branches/calls already linked,
+ // so only useful for dd refs
+ else if (raw_syms_obj[sym].is_text) {
+ addr2 = raw_syms_obj[sym].addr;
+ if (s_text_obj.data[addr2] == 0xcc) {
+ printf("warning: reloc %08x -> %08x "
+ "points to rm'd target '%s'\n",
+ base + addr, base + addr2,
+ raw_syms_obj[sym].name);
+ }
+ }
+ }
+
+ // patch .text
+ ret = fseek(f_obj, s_text_obj.sect_fofs, SEEK_SET);
+ my_assert(ret, 0);
+ ret = fwrite(s_text_obj.data, 1, s_text_obj.size, f_obj);
+ my_assert(ret, s_text_obj.size);
+
+ // patch relocs
+ ret = fseek(f_obj, s_text_obj.reloc_fofs, SEEK_SET);
+ my_assert(ret, 0);
+ ret = fwrite(s_text_obj.relocs, sizeof(s_text_obj.relocs[0]),
+ s_text_obj.reloc_cnt, f_obj);
+ my_assert(ret, s_text_obj.reloc_cnt);
+
+ ret = fseek(f_obj, s_text_obj.scnhdr_fofs, SEEK_SET);
+ my_assert(ret, 0);
+ ret = fread(&tmphdr, 1, sizeof(tmphdr), f_obj);
+ my_assert(ret, sizeof(tmphdr));
+
+ tmphdr.s_nreloc = s_text_obj.reloc_cnt;
+
+ ret = fseek(f_obj, s_text_obj.scnhdr_fofs, SEEK_SET);
+ my_assert(ret, 0);
+ ret = fwrite(&tmphdr, 1, sizeof(tmphdr), f_obj);
+ my_assert(ret, sizeof(tmphdr));
+
+ fclose(f_obj);
+ fclose(f_exe);
+
+ retval = 0;