所以我有了一个支持avx2指令集的新的高级cpu。这很好,但会破坏gdb的反向调试。在没有优化的情况下编译时,代码仍然使用共享库,例如调用memset(),然后调用memset的avx2优化版本。这很好,但是gdb记录不支持avx2。
进程记录不支持地址0x7ff690dd80处的指令0xc5。
0xc5是这里的vex前缀。
反向调试在不支持avx2的cpu上工作得很好。我如何使libc等不使用avx2优化版本的库调用,以便我可以使用gdb记录,后退等等?
我试过了
LD_BIND_NOW=1
LD_HWCAP_MASK=0
compiling with -static没有在一台旧机器上调试,我就没有想法了。
发布于 2017-06-10 01:52:40
对于您在ubuntu16.04 amd64上发布的glibc2.23,完全出于同样的原因对我的二进制拼图(1位补丁)进行了改编。软件包libc6 (2.23-0ubuntu7)是从https://packages.ubuntu.com/xenial/amd64/libc6下载的,文件ld-2.23是这样编辑的(保存原始文件的副本,或者保存到不同的路径中,并更改您自己二进制文件的INTERP部分以使用不同的路径):
83 3D 5B C9 20 00 06 cmpl $0x6, smth...
7E 21 jle some_forward_label
B8 07 00 00 00 mov $0x7, %eax
31 C9 xor %ecx,%ecx
0F A2 cpuid有从if (cpu_features->max_cpuid >= 7) __cpuid_count (7, 0, ...调用的__get_cpu_features代码。cpuid的EAX=7叶具有检测和启用AVX2支持所需的所有信息。,所以我跳过了cpuid eax=0x7,ecx=0片段,并通过更改0x7f 0x21将其结果保存到内存的某些部分。
因此,二进制补丁类似于将83 3D xx xx xx xx 06 7E xx B8 07 00 00 00 31 C9 0F A2 (其中xx可能是任何字节)替换为83 3D xx xx xx xx 06 7F xx B8 07 00 00 00 31 C9 0F A2。您可以使用任何十六进制编辑器或一些二进制差异来完成此操作。在2.23-0ubuntu7中,这段代码位于0x0193B0-0x0193B9是7e,将改为7f。
如果您的根fs可能在没有eax=7 cpuid叶支持的情况下启动(前Intel ),或者在虚拟机中模拟这种前Intel (“奔腾D 8xx/9xx",奔腾4,奔腾M-将失败),则该修补程序将不会在全局范围内使用修补文件。
您可以将修补好的文件放置在名称与/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2的原始路径相同或更短的路径上(该路径将符号链接到/lib/x86_64-linux-gnu/ld-2.23.so文件)。例如,作为/lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2。然后使用相同的十六进制编辑器将程序可执行文件(ELF)的字符串"/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2“替换为"/lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2",或者使用修补程序工具套餐。
cp /lib/x86_64-linux-gnu/ld-2.23.so /lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2
bless /lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2
# or any other hex editor
patchelf --set-interpreter /lib_x86_64-linux-gnu_ld-linux-no-AVX2.so.2 ./my_programhttps://stackoverflow.com/questions/43750603
复制相似问题