#!/bin/sh# program## dlopen():# libb.so# <- libb_dependency.so# liba.so## Expected: Global lookup: Symbol in libb_dependency.so supersedes symbol in# liba.so.. ./test_setup# create liba.socat > liba.c << EOIint a() { return 1; }EOI# buildcompile_lib -o liba.so liba.c# create libb_dependency.socat > libb_dependency.c << EOIint a() { return 2; }EOI# buildcompile_lib -o libb_dependency.so libb_dependency.c# create libb.socat > libb.c << EOIint b() { return 1; }EOI# buildcompile_lib -o libb.so libb.c ./libb_dependency.so# create programcat > program.c << EOI#include <dlfcn.h>#include <stdio.h>#include <stdlib.h>intmain(){void* liba;void* libb;void* self;int (*a)();libb = dlopen("./libb.so", RTLD_NOW | RTLD_GLOBAL);if (libb == NULL) {fprintf(stderr, "Error opening libb.so: %s\n", dlerror());exit(117);}liba = dlopen("./liba.so", RTLD_NOW | RTLD_GLOBAL);if (liba == NULL) {fprintf(stderr, "Error opening liba.so: %s\n", dlerror());exit(117);}self = dlopen(NULL, RTLD_NOW | RTLD_GLOBAL);if (self == NULL) {fprintf(stderr, "Error opening self: %s\n", dlerror());exit(117);}a = (int (*)())dlsym(self, "a");if (a == NULL) {fprintf(stderr, "Error getting symbol a: %s\n", dlerror());exit(116);}return a();}EOI# buildcompile_program_dl -o program program.c# runtest_run_ok ./program 2