Bypass:
Using the temp environment variable:
env LD_LIBRARY_PATH=/path/to/correct/libc-xxx.so SomeProblemAPP appArgs
or
LD_LIBRARY_PATH=/path/to/correct/libc-xxx.so SomeProblemAPP appArgs
Find which function cause the problem:
Check Glibc version:
objdump -p app
Find Glibc function:
nm app |grep GLIBC_2.xx
#or
objdump -T app |grep GLIBC_2.xx
#or
readelf -s app |grep GLIBC_2.xx
Linking to Older Versioned Symbols (glibc)
Using the version script feature of ld :
Suppose the odd function is realpath, then add below line into the source file:
__asm__(".symver realpath,realpath@GLIBC_2.2.5");
so the source file will look like:
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
__asm__(".symver realpath,realpath@GLIBC_2.2.5");
int main()
{
char* unresolved = "/lib64";
char resolved[PATH_MAX+1];
if(!realpath(unresolved, resolved))
{ return 1; }
printf("%s\n", resolved);
return 0;
}
ref:
http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_25.html
http://www.trevorpounds.com/blog/?tag=symbol-versioning
http://www.trevorpounds.com/blog/?p=103