About my test-case, it was depending on a cached .build-id debug info. Complete reproducer also needs extraction of debug info and stripping of a section so that symbol index is our of range: $ cat cmd g++ -shared -O2 -g -fPIC -flto foo.c -o libfoo.so gcc main.cpp -g -lfoo -L. objcopy --only-keep-debug libfoo.so x.so strip --strip-debug --strip-unneeded libfoo.so objcopy --add-gnu-debuglink=x.so libfoo.so # remove a section in order to break one symbol index objcopy --remove-section .hash libfoo.so LD_LIBRARY_PATH=. perf record -g ./a.out LD_LIBRARY_PATH=. /home/marxin/Programming/linux/tools/perf/perf report --stdio