флаг тоже не на hwcaps (эта часть может быть исправлена ​​в некоторых случаях с помощью LD_BIND_NOW = 1).

менный x86_64 linux с glibc обнаружит, что процессор поддерживает расширение AVX, и переключит многие строковые функции из общей реализацииAVX-оптимизированный версия (с помощью диспетчеров ifunc:1, 2).

Эта функция может быть хороша для производительности, но она предотвращает несколько инструментов, таких как valgrind (старые libVEXs, доValgrind-3,8) и GDB "target record"(Обратное исполнение) от правильной работы (Ubuntu "Z" 17.04 beta,GDB 7,12.50.20170207-0ubuntu2, gcc 6.3.0-8ubuntu1 20170221, Ubuntu GLIBC 2.24-7ubuntu2):

$ cat a.c
#include <string.h>
#define N 1000
int main(){
        char src[N], dst[N];
        memcpy(dst, src, N);
        return 0;
}
$ gcc a.c -o a -fno-builtin
$ gdb -q ./a
Reading symbols from ./a...(no debugging symbols found)...done.
(gdb) start
Temporary breakpoint 1 at 0x724
Starting program: /home/user/src/a

Temporary breakpoint 1, 0x0000555555554724 in main ()
(gdb) record
(gdb) c
Continuing.
Process record does not support instruction 0xc5 at address 0x7ffff7b60d31.
Process record: failed to record execution log.

Program stopped.
__memmove_avx_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:416
416             VMOVU   (%rsi), %VEC(4)
(gdb) x/i $pc
=> 0x7ffff7b60d31 <__memmove_avx_unaligned_erms+529>:   vmovdqu (%rsi),%ymm4

Есть сообщение об ошибкеProcess record does not support instruction 0xc5"из реализации GDB" целевой записи ", потому что инструкции AVX не поддерживаются механизмом записи / воспроизведения (иногда проблема обнаружена на_dl_runtime_resolve_avx функция):https://sourceware.org/ml/gdb/2016-08/msg00028.html «некоторые инструкции AVX не поддерживаются записью процесса»,https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/1573786, https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=836802, https://bugzilla.redhat.com/show_bug.cgi?id=1136403

Решение предлагается вhttps://sourceware.org/ml/gdb/2016-08/msg00028.html «Вы можете перекомпилировать libc (например, ld.so) или взломать __init_cpu_features и, таким образом, __cpu_features во время выполнения (см., Например, strcmp).» или установитьLD_BIND_NOW=1, но перекомпилированный glibc все еще имеет AVX, и ld bind-now не помогает.

Я слышал, что есть/etc/ld.so.nohwcap а такжеLD_HWCAP_MASK конфигурации в glibc. Можно ли их использовать для отключения диспетчеризации ifunc для строковых функций, оптимизированных для AVX, в glibc?

Как glibc (rtld?) Обнаруживает AVX, используяcpuid, с/proc/cpuinfo (вероятно, нет), или HWCAPОкс (LD_SHOW_AUXV=1 /bin/echo |grep HWCAP команда даетAT_HWCAP: bfebfbff)?

Ответы на вопрос(3)

Ваш ответ на вопрос