Linking against older symbol version in a .so file Linking against older symbol version in a .so file c c

Linking against older symbol version in a .so file


I found the following working solution. First create file memcpy.c:

#include <string.h>/* some systems do not have newest memcpy@@GLIBC_2.14 - stay with old good one */asm (".symver memcpy, memcpy@GLIBC_2.2.5");void *__wrap_memcpy(void *dest, const void *src, size_t n){    return memcpy(dest, src, n);}

No additional CFLAGS needed to compile this file. Then link your program with -Wl,--wrap=memcpy.


Just link memcpy statically - pull memcpy.o out of libc.a ar x /path/to/libc.a memcpy.o (whatever version - memcpy is pretty much a standalone function) and include it in your final link. Note that static linking may complicate licensing issues if your project is distributed to the public and not open-source.

Alternatively, you could simply implement memcpy yourself, though the hand-tuned assembly version in glibc is likely to be more efficient

Note that memcpy@GLIBC_2.2.5 is mapped to memmove (old versions of memcpy consistently copied in a predictable direction, which led to it sometimes being misused when memmove should have been used), and this is the only reason for the version bump - you could simply replace memcpy with memmove in your code for this specific case.

Or you could go to static linking, or you could ensure that all systems on your network have the same or better version than your build machine.


I had a similar issue. A third party library we use needs the old memcpy@GLIBC_2.2.5. My solution is an extended approach @anight posted.

I also warp the memcpy command, but i had to use a slightly different approach, since the solution @anight posted did not work for me.

memcpy_wrap.c:

#include <stddef.h>#include <string.h>asm (".symver wrap_memcpy, memcpy@GLIBC_2.2.5");void *wrap_memcpy(void *dest, const void *src, size_t n) {  return memcpy(dest, src, n);}

memcpy_wrap.map:

GLIBC_2.2.5 {   memcpy;};

Build the wrapper:

gcc -c memcpy_wrap.c -o memcpy_wrap.o

Now finally when linking the program add

  • -Wl,--version-script memcpy_wrap.map
  • memcpy_wrap.o

so that you will end up with something like:

g++ <some flags> -Wl,--version-script memcpy_wrap.map <some .o files> memcpy_wrap.o <some libs>