LD_BIND_NOW=1
LD_HWCAP_MASK=0
compiling with -static
而且除了在旧机器上进行调试,我已经没有更多的想法了。
LD_BIND_NOW=1
LD_HWCAP_MASK=0
compiling with -static
libc6 (2.23-0ubuntu7)
可从https://packages.ubuntu.com/xenial/amd64/libc6下载,然后编辑文件ld-2.23.so(请先备份原文件,或将修补后的文件保存到不同路径,并修改自己的二进制文件中的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
这里有一段代码get_common_indeces: if (cpu_features->max_cpuid >= 7) __cpuid_count (7, 0, ...
,它被从__get_cpu_features
调用。根据CPUID的EAX=7 leaf,可以获得检测AVX2支持和启用它所需的所有信息,因此我跳过了带有cpuid eax=0x7,ecx=0
的片段,并通过将0x7e 0x21
更改为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。
这个补丁很愚蠢,如果您的根文件系统可能是使用不支持eax=7 cpuid leaf的CPU(早期英特尔Core CPU)启动或在模拟这样的早期英特尔Core CPU的虚拟机中,则无法全局使用已修复的文件("Pentium D 8xx/9xx",Pentium 4,Pentium 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”,或使用来自patchelf
软件包的patchelf工具:
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_program
re.sub
进行脚本二进制补丁(而不是手动二进制编辑),例如https://dev59.com/SFgQ5IYBdhLWcg3woleo。另一个解决方案:检查Mozilla为Firefox提供的RR反向调试工具https://github.com/mozilla/rr(感谢https://dev59.com/SFgQ5IYBdhLWcg3woleo#comment79266853_42451492)。 - osgx