1#!/bin/sh
2
3# program
4#
5# dlopen():
6# liba.so
7# <- libb.so
8#    <- libb_dependency.so
9# <- libd.so
10#
11# Expected: liba.so lookup: Symbol in libd.so supersedes symbol in
12# libb_dependency.so.
13
14
15. ./test_setup
16
17
18# create libb_dependency.so
19cat > libb_dependency.c << EOI
20int a() { return 1; }
21EOI
22
23# build
24compile_lib -o libb_dependency.so libb_dependency.c
25
26
27# create libb.so
28cat > libb.c << EOI
29int b() { return 1; }
30EOI
31
32# build
33compile_lib -o libb.so libb.c ./libb_dependency.so
34
35
36# create liba.so
37cat > libd.c << EOI
38int a() { return 2; }
39EOI
40
41# build
42compile_lib -o libd.so libd.c
43
44
45# create liba.so
46cat > liba.c << EOI
47int c() { return 1; }
48EOI
49
50# build
51compile_lib -o liba.so liba.c ./libb.so ./libd.so
52
53
54# create program
55cat > program.c << EOI
56#include <dlfcn.h>
57#include <stdio.h>
58#include <stdlib.h>
59int
60main()
61{
62	void* liba;
63	int (*a)();
64
65	liba = dlopen("./liba.so", RTLD_NOW | RTLD_GLOBAL);
66	if (liba == NULL) {
67		fprintf(stderr, "Error opening liba.so: %s\n", dlerror());
68		exit(117);
69	}
70
71	a = (int (*)())dlsym(liba, "a");
72	if (a == NULL) {
73		fprintf(stderr, "Error getting symbol a: %s\n", dlerror());
74		exit(116);
75	}
76
77	return a();
78}
79EOI
80
81# build
82compile_program_dl -o program program.c
83
84# run
85test_run_ok ./program 2
86