elf 段到段映射不匹配

elf segment to section mapping mismatch

我在重写 ELF 二进制文件后遇到了一个非常神秘的问题。我已经使用 libelf 库重写了一个二进制文件。基本上我只是用相同数量的 NOP 替换 .text 中的一些指令。这不会改变任何部分的大小,readelf 输出也很明显。然而,相对于原始文件,重写后段到节的映射存在一些奇怪的不匹配。

readelf -l 重写前的输出:

Elf file type is EXEC (Executable file)
Entry point 0x202a0
There are 8 program headers, starting at offset 52

Program Headers:
Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
EXIDX          0x000964 0x10020964 0x10020964 0x00230 0x00230 R   0x4
LOAD           0x010000 0x00020000 0x00020000 0x20000 0x20000 R E 0x10000
LOAD           0x000000 0x10020000 0x10020000 0x00c1c 0x00c1c R   0x10000
LOAD           0x000c20 0x10030c20 0x10030c20 0x00b18 0x010b4 RW  0x10000
NOTE           0x000134 0x10020134 0x10020134 0x0003c 0x0003c R   0x4
TLS            0x000c20 0x10030c20 0x10030c20 0x00478 0x00478 R   0x8
GNU_EH_FRAME   0x000b94 0x10020b94 0x10020b94 0x00014 0x00014 R   0x4
GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x10

Section to Segment mapping:
Segment Sections...
00     .ARM.exidx 
01     .init .text .fini 
02     .note.NaCl.ABI.arm .note.gnu.build-id .rodata .ARM.extab .ARM.exidx
   .eh_frame_hdr .eh_frame 
03     .tdata .init_array .fini_array .jcr .got .data .bss 
04     .note.NaCl.ABI.arm .note.gnu.build-id 
05     .tdata 
06     .eh_frame_hdr 
07    

readelf -l 重写后:

Elf file type is EXEC (Executable file)
Entry point 0x202a0
There are 8 program headers, starting at offset 52

Program Headers:
Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
EXIDX          0x000964 0x10020964 0x10020964 0x00230 0x00230 R   0x4
LOAD           0x010000 0x00020000 0x00020000 0x20000 0x20000 R E 0x10000
LOAD           0x000000 0x10020000 0x10020000 0x00c1c 0x00c1c R   0x10000
LOAD           0x000c20 0x10030c20 0x10030c20 0x00b18 0x010b4 RW  0x10000
NOTE           0x000134 0x10020134 0x10020134 0x0003c 0x0003c R   0x4
TLS            0x000c20 0x10030c20 0x10030c20 0x00478 0x00478 R   0x8
GNU_EH_FRAME   0x000b94 0x10020b94 0x10020b94 0x00014 0x00014 R   0x4
GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x10

Section to Segment mapping:
Segment Sections...
00     
01     .fini .comment .ARM.attributes .debug_aranges .debug_info   
.debug_abbrev 
02     
03     .bss 
04     
05     
06     
07 

这背后的原因可能是什么?

What might be the reason behind this?

最可能的原因是您使用的任何工具都覆盖了 .text 中的一些指令。

特别是,它似乎覆盖了您的部分 table。您可以比较 readelf -WS 的 before/after 输出来确认这一点,甚至可以 readelf -W --all 查看 else 可能被覆盖的内容。