#!/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.so cat > liba.c << EOI int a() { return 1; } EOI # build compile_lib -o liba.so liba.c # create libb_dependency.so cat > libb_dependency.c << EOI int a() { return 2; } EOI # build compile_lib -o libb_dependency.so libb_dependency.c # create libb.so cat > libb.c << EOI int b() { return 1; } EOI # build compile_lib -o libb.so libb.c ./libb_dependency.so # create program cat > program.c << EOI #include #include #include int main() { 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 # build compile_program_dl -o program program.c # run test_run_ok ./program 2