#!/bin/sh # program # <- liba.so # <- libb.so # <- libd.so # # Expected: dlsym(RTLD_NEXT) finds symbol in order liba.so, libb.so, libd.so . test_setup # create libd.so cat > libd.c << EOI int a() { return 1; } EOI # build gcc -shared -o libd.so libd.c # create libb.so cat > libb.c << EOI #define __USE_GNU #include int a() { int (*nextA)(); *(void**)&nextA = dlsym(RTLD_NEXT, "a"); return (nextA != 0 ? nextA() : 0) + 2; } EOI # build gcc -shared -o libb.so libb.c -D_GNU_SOURCE ./libd.so $libdl # create liba.so cat > liba.c << EOI #include int a() { int (*nextA)(); *(void**)&nextA = dlsym(RTLD_NEXT, "a"); return (nextA != 0 ? nextA() : 0) + 4; } EOI # build gcc -shared -o liba.so liba.c -D_GNU_SOURCE ./libb.so $libdl # create program cat > program.c << EOI #include int a() { int (*nextA)(); *(void**)&nextA = dlsym(RTLD_NEXT, "a"); return (nextA != 0 ? nextA() : 0) + 8; } int main() { return a(); } EOI # build gcc -o program program.c -D_GNU_SOURCE ./liba.so $libdl -Xlinker -rpath \ -Xlinker . # run test_run_ok ./program 15