#!/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.socat > libd.c << EOIint a() { return 1; }EOI# buildcompile_lib -o libd.so libd.c# create libb.socat > libb.c << EOI#define __USE_GNU#include <dlfcn.h>inta(){int (*nextA)();*(void**)&nextA = dlsym(RTLD_NEXT, "a");return (nextA != 0 ? nextA() : 0) + 2;}EOI# buildcompile_lib_dl -o libb.so libb.c ./libd.so# create liba.socat > liba.c << EOI#include <dlfcn.h>inta(){int (*nextA)();*(void**)&nextA = dlsym(RTLD_NEXT, "a");return (nextA != 0 ? nextA() : 0) + 4;}EOI# buildcompile_lib_dl -o liba.so liba.c ./libb.so# create programcat > program.c << EOI#include <dlfcn.h>inta(){int (*nextA)();*(void**)&nextA = dlsym(RTLD_NEXT, "a");return (nextA != 0 ? nextA() : 0) + 8;}intmain(){return a();}EOI# buildcompile_program_dl -o program program.c ./liba.so# runtest_run_ok ./program 15