2017-05-03 26 views
5

Vì vậy, tôi có một cpu ưa thích mới hỗ trợ tập lệnh avx2. Điều này là rất tốt, nhưng phá vỡ gdb đảo ngược gỡ lỗi. Khi biên dịch không có mã tối ưu hóa vẫn sử dụng các thư viện được chia sẻ, ví dụ như các cuộc gọi memset() mà sau đó đi và gọi một phiên bản được tối ưu hóa của memx avx2. Điều này là tuyệt vời nhưng avx2 không được hỗ trợ bởi bản ghi gdb.gdb reverse debugging avx2

bản ghi quá trình không hỗ trợ hướng dẫn 0xc5 tại địa chỉ 0x7ffff690dd80.

0xc5 là tiền tố vex tại đây.

gỡ lỗi ngược hoạt động tốt với cpu không hỗ trợ avx2. Làm thế nào để tôi có được libc vv để không sử dụng các phiên bản tối ưu hóa avx2 của các cuộc gọi thư viện để tôi có thể sử dụng bản ghi gdb, bước lùi ...?

Tôi đã thử

LD_BIND_NOW=1 
LD_HWCAP_MASK=0 
compiling with -static 

Và ngắn gỡ lỗi trên một máy cũ, tôi ra khỏi ý tưởng.

+1

Bạn đang sử dụng phiên bản GLIBC nào? –

+1

2,23 được xuất xưởng trên ubuntu 16.04 amd64 arch. cpu là xe i7 hỗ trợ avx2 – Hal

+1

Đã được hỏi tại đây: http://stackoverflow.com/q/42451492/72178. – ks1322

Trả lời

1

Đối với glibc 2.23 của bạn khi được vận chuyển trên ubuntu 16.04 amd64, có sự thích nghi của my binary kludge (1 bit patch) được tạo chính xác vì cùng một lý do. Gói libc6 (2.23-0ubuntu7) được tải về từ https://packages.ubuntu.com/xenial/amd64/libc6 và tập tin ld-2.23.so đã được chỉnh sửa (giữ bản sao của bản gốc, hoặc lưu vá vào con đường khác nhau và thay đổi phần interp của nhị phân của riêng bạn để sử dụng con đường khác nhau):

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 

Có là mã số the get_common_indeces: if (cpu_features->max_cpuid >= 7) __cpuid_count (7, 0, ... được gọi là từ __get_cpu_features. EAX=7 leaf of cpuid has all info needed to detect AVX2 support and enable it, vì vậy tôi chỉ bỏ qua đoạn với cpuid eax=0x7,ecx=0 và lưu kết quả vào một số phần của bộ nhớ bằng cách thay đổi 0x7e 0x21 into 0x7f 0x21.

Vì vậy, bản vá nhị phân giống như thay thế 83 3D xx xx xx xx 06 7E xx B8 07 00 00 00 31 C9 0F A2 (trong đó xx có thể là bất kỳ byte nào) thành 83 3D xx xx xx xx 06 7F xx B8 07 00 00 00 31 C9 0F A2. Bạn có thể làm điều này với bất kỳ Hex Editor hoặc bởi một số khác biệt nhị phân. Trong 2,23-0ubuntu7 mã này là 0x0193B0 - 0x0193B9 là 7e được thay đổi thành 7f.

Bản vá câm và không sử dụng tệp được vá trên toàn cầu nếu fs gốc của bạn có thể được khởi động bằng CPU mà không có hỗ trợ leaf = 7 cpuid (trước Intel Core CPU) hoặc trong máy ảo mô phỏng CPU Intel Core trước đó ("Pentium D 8xx/9xx", Pentium 4, Pentium M - will fail)).

Bạn có thể đặt tệp được vá ở đường dẫn có tên bằng hoặc dài hơn theo đường dẫn ban đầu của /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 (có liên kết tượng trưng thành /lib/x86_64-linux-gnu/ld-2.23.so tệp). Ví dụ: /lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2. Sau đó sử dụng cùng một trình chỉnh sửa để thay thế chuỗi "/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2" của chương trình thực thi của bạn (ELF) thành "/ lib_x86_64-linux-gnu_ld-linux-noAVX2. so.2 ", hoặc sử dụng công cụ vá lỗi from the patchelf package:

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