1# DSO sorting test descriptions.
2# This file is to be processed by ../scripts/dso-ordering-test.py, see usage
3# in elf/Makefile for how it is executed.
4
5# We test both dynamic loader sorting algorithms
6tunable_option: glibc.rtld.dynamic_sort=1
7tunable_option: glibc.rtld.dynamic_sort=2
8
9# Sequence of single dependencies with no cycles.
10tst-dso-ordering1: a->b->c
11output: c>b>a>{}<a<b<c
12
13# Sequence including 2 dependent DSOs not at the end of the graph.
14tst-dso-ordering2: a->b->[cd]->e
15output: e>d>c>b>a>{}<a<b<c<d<e
16
17# Complex order with 3 "layers" of full dependencies
18tst-dso-ordering3: a->[bc]->[def]->[gh]->i
19output: i>h>g>f>e>d>c>b>a>{}<a<b<c<d<e<f<g<h<i
20
21# Sequence including 2 dependent DSOs at the end of the graph.
22# Additionally the same dependencies appear in two paths.
23tst-dso-ordering4: a->b->[de];a->c->d->e
24output: e>d>c>b>a>{}<a<b<c<d<e
25
26# Test that b->c cross link is respected correctly
27tst-dso-ordering5: a!->[bc]->d;b->c
28output: d>c>b>a>{}<a<b<c<d
29
30# First DSO fully dependent on 4 DSOs, with another DSO at the end of chain.
31tst-dso-ordering6: a->[bcde]->f
32output: f>e>d>c>b>a>{}<a<b<c<d<e<f
33
34# Sequence including 2 dependent and 3 dependent DSOs, and one of the
35# dependent DSOs is dependent on an earlier DSO.
36tst-dso-ordering7: a->[bc];b->[cde];e->f
37output: f>e>d>c>b>a>{}<a<b<c<d<e<f
38
39# Sequence where the DSO c is unerlinked and calls a function in DSO a which
40# is technically a cycle.  The main executable depends on the first two DSOs.
41# Note: This test has unspecified behavior.
42tst-dso-ordering8: a->b->c=>a;{}->[ba]
43output: c>b>a>{}<a<b<c
44
45# Generate the permutation of DT_NEEDED order between the main binary and
46# all 5 DSOs; all link orders should produce exact same init/fini ordering
47tst-dso-ordering9: a->b->c->d->e;{}!->[abcde]
48output: e>d>c>b>a>{}<a<b<c<d<e
49
50# Test if init/fini ordering behavior is proper, despite main program with
51# an soname that may cause confusion
52tst-dso-ordering10: {}->a->b->c;soname({})=c
53output: b>a>{}<a<b
54
55# Complex example from Bugzilla #15311, under-linked and with circular
56# relocation(dynamic) dependencies. While this is technically unspecified, the
57# presumed reasonable practical behavior is for the destructor order to respect
58# the static DT_NEEDED links (here this means the a->b->c->d order).
59# The older dynamic_sort=1 algorithm does not achieve this, while the DFS-based
60# dynamic_sort=2 algorithm does, although it is still arguable whether going
61# beyond spec to do this is the right thing to do.
62# The below expected outputs are what the two algorithms currently produce
63# respectively, for regression testing purposes.
64tst-bz15311: {+a;+e;+f;+g;+d;%d;-d;-g;-f;-e;-a};a->b->c->d;d=>[ba];c=>a;b=>e=>a;c=>f=>b;d=>g=>c
65output(glibc.rtld.dynamic_sort=1): {+a[d>c>b>a>];+e[e>];+f[f>];+g[g>];+d[];%d(b(e(a()))a()g(c(a()f(b(e(a()))))));-d[];-g[];-f[];-e[];-a[<a<c<d<g<f<b<e];}
66output(glibc.rtld.dynamic_sort=2): {+a[d>c>b>a>];+e[e>];+f[f>];+g[g>];+d[];%d(b(e(a()))a()g(c(a()f(b(e(a()))))));-d[];-g[];-f[];-e[];-a[<g<f<a<b<c<d<e];}
67