The mempcy@GLIBC_2.14
is called a versioned symbol. Glibc uses them while other runtime libraries like musl do not.
The significance of mempcy@GLIBC_2.14
when compiling on Linux is due to Glibc changing the way memcpy
worked back in 2012. memcpy
used to copy bytes {begin → end} (low memory address to high memory address). Glibc 2.13 provided an optimized memcpy
that copied {end → begin} on some platforms. I believe "some platforms" included Intel machines with SSE4.1. Then, Glibc 2.14 provided a memcpy
that restored the {begin → end} behavior.
Some programs depended upon the {begin → end} copy. When programs used overlapping buffers then memcpy
produced undefined behavior. In this case a program should have used memmove
, but they were getting by due to a copy that occurred {begin → end}. Also see Strange sound on mp3 flash website (due to Adobe Flash), Glibc change exposing bugs (on LWN), The memcpy vs memmove saga and friends.
To fix it it looks like you can add the following to your source code:
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
Maybe something like the following. Then include the extra source file in your project.
$ cat version.c
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
memcpy
in (I'm using Eclipse), but after reading this, I think this hack can lead to crashes for the code that actually calling the oldmemcpy
. – Traitor