mempcy@GLIBC_2.14
называется версионным символом. Glibc использует их, в то время как другие библиотеки времени выполнения, такие как musl, не используют.
Значение mempcy@GLIBC_2.14
при компиляции в Linux связано с тем, что Glibc изменил способ работы memcpy
еще в 2012 году. memcpy
использовалось для копирования байтов {начало → конец} (младший адрес памяти в старший адрес памяти). Glibc 2.13 предоставил оптимизированный memcpy
, который копировал {end → begin} на некоторых платформах. Я считаю, что «некоторые платформы» включали машины Intel с SSE4.1. Затем Glibc 2.14 предоставил memcpy
, который восстановил поведение {begin → end}.
Некоторые программы зависели от копии {begin → end}. Когда программы использовали перекрывающиеся буферы, memcpy
приводило к неопределенному поведению. В этом случае программа должна была использовать memmove
, но они справлялись из-за того, что произошло копирование {begin → end}. См. также странный звук на сайте mp3 flash (из-за Adobe Flash), Изменение Glibc, выявляющее ошибки (на LWN), Сага о memcpy и memmove и друзья.
Чтобы исправить это, вы можете добавить в исходный код следующее:
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
Может быть, что-то вроде следующего. Затем включите дополнительный исходный файл в свой проект.
$ cat version.c
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
person
jww
schedule
21.02.2019