1 /* Test the protected visibility when main is linked with moda and modb
2    in that order:
3    1. Protected symbols, protected1, protected2 and protected3, defined
4       in moda, are used in moda.
5    2. Protected symbol, protected3, defined in modb, are used in modb.
6    3. Symbol, protected1, defined in moda, is also used in main and modb.
7    4. Symbol, protected2, defined in main, is used in main.
8    5. Symbol, protected3, defined in moda, is also used in main.
9 
10    Copyright (C) 2015-2022 Free Software Foundation, Inc.
11    This file is part of the GNU C Library.
12 
13    The GNU C Library is free software; you can redistribute it and/or
14    modify it under the terms of the GNU Lesser General Public
15    License as published by the Free Software Foundation; either
16    version 2.1 of the License, or (at your option) any later version.
17 
18    The GNU C Library is distributed in the hope that it will be useful,
19    but WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21    Lesser General Public License for more details.
22 
23    You should have received a copy of the GNU Lesser General Public
24    License along with the GNU C Library; if not, see
25    <https://www.gnu.org/licenses/>.  */
26 
27 /* This file must be compiled as PIE to avoid copy relocation when
28    accessing protected symbols defined in shared libaries since copy
29    relocation doesn't work with protected symbols and linker in
30    binutils 2.26 enforces this rule.  */
31 
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 
36 #include "tst-protected1mod.h"
37 
38 /* Prototype for our test function.  */
39 extern int do_test (void);
40 
41 int protected2 = -1;
42 
43 /* This defines the `main' function and some more.  */
44 #include <support/test-driver.c>
45 
46 int
do_test(void)47 do_test (void)
48 {
49   int res = 0;
50 
51   /* Check if we get the same address for the protected data symbol.  */
52   if (&protected1 != protected1a_p ())
53     {
54       puts ("`protected1' in main and moda doesn't have same address");
55       res = 1;
56     }
57   if (&protected1 != protected1b_p ())
58     {
59       puts ("`protected1' in main and modb doesn't have same address");
60       res = 1;
61     }
62 
63   /* Check if we get the right value for the protected data symbol.  */
64   if (protected1 != 3)
65     {
66       puts ("`protected1' in main and moda doesn't have same value");
67       res = 1;
68     }
69 
70   /* Check if we get the right value for data defined in executable.  */
71   if (protected2 != -1)
72     {
73       puts ("`protected2' in main has the wrong value");
74       res = 1;
75     }
76 
77   /* Check `protected1' in moda.  */
78   if (!check_protected1 ())
79     {
80       puts ("`protected1' in moda has the wrong value");
81       res = 1;
82     }
83 
84   /* Check `protected2' in moda.  */
85   if (!check_protected2 ())
86     {
87       puts ("`protected2' in moda has the wrong value");
88       res = 1;
89     }
90 
91   /* Check if we get the same address for the protected data symbol.  */
92   if (&protected3 != protected3a_p ())
93     {
94       puts ("`protected3' in main and moda doesn't have same address");
95       res = 1;
96     }
97   if (&protected3 == protected3b_p ())
98     {
99       puts ("`protected3' in main and modb has same address");
100       res = 1;
101     }
102 
103   /* Check if we get the right value for the protected data symbol.  */
104   if (protected3 != 5)
105     {
106       puts ("`protected3' in main and moda doesn't have same value");
107       res = 1;
108     }
109 
110   /* Check `protected3' in moda.  */
111   if (!check_protected3a ())
112     {
113       puts ("`protected3' in moda has the wrong value");
114       res = 1;
115     }
116 
117   /* Check `protected3' in modb.  */
118   if (!check_protected3b ())
119     {
120       puts ("`protected3' in modb has the wrong value");
121       res = 1;
122     }
123 
124   /* Set `protected2' in moda to 30.  */
125   set_protected2 (300);
126 
127   /* Check `protected2' in moda.  */
128   if (!check_protected2 ())
129     {
130       puts ("`protected2' in moda has the wrong value");
131       res = 1;
132     }
133 
134   /* Set `protected1' in moda to 30.  */
135   set_protected1a (30);
136 
137   /* Check `protected1' in moda.  */
138   if (!check_protected1 ())
139     {
140       puts ("`protected1' in moda has the wrong value");
141       res = 1;
142     }
143 
144   /* Check if we get the updated value for the protected data symbol.  */
145   if (protected1 != 30)
146     {
147       puts ("`protected1' in main doesn't have the updated value");
148       res = 1;
149     }
150 
151   protected2 = -300;
152 
153   /* Check `protected2' in moda.  */
154   if (!check_protected2 ())
155     {
156       puts ("`protected2' in moda has the wrong value");
157       res = 1;
158     }
159 
160   /* Check if data defined in executable is changed.  */
161   if (protected2 != -300)
162     {
163       puts ("`protected2' in main is changed");
164       res = 1;
165     }
166 
167   /* Set `protected1' in modb to 40.  */
168   set_protected1b (40);
169   set_expected_protected1 (40);
170 
171   /* Check `protected1' in moda.  */
172   if (!check_protected1 ())
173     {
174       puts ("`protected1' in moda has the wrong value");
175       res = 1;
176     }
177 
178   /* Check if we get the updated value for the protected data symbol.  */
179   if (protected1 != 40)
180     {
181       puts ("`protected1' in main doesn't have the updated value");
182       res = 1;
183     }
184 
185   /* Set `protected3' in moda to 80.  */
186   set_protected3a (80);
187 
188   /* Check `protected3' in moda.  */
189   if (!check_protected3a ())
190     {
191       puts ("`protected3' in moda has the wrong value");
192       res = 1;
193     }
194 
195   /* Check if we get the updated value for the protected data symbol.  */
196   if (protected3 != 80)
197     {
198       puts ("`protected3' in main doesn't have the updated value");
199       res = 1;
200     }
201 
202   /* Check `protected3' in modb.  */
203   if (!check_protected3b ())
204     {
205       puts ("`protected3' in modb has the wrong value");
206       res = 1;
207     }
208 
209   /* Set `protected3' in modb to 100.  */
210   set_protected3b (100);
211 
212   /* Check `protected3' in moda.  */
213   if (!check_protected3a ())
214     {
215       puts ("`protected3' in moda has the wrong value");
216       res = 1;
217     }
218 
219   /* Check if we get the updated value for the protected data symbol.  */
220   if (protected3 != 80)
221     {
222       puts ("`protected3' in main doesn't have the updated value");
223       res = 1;
224     }
225 
226   /* Check `protected3' in modb.  */
227   if (!check_protected3b ())
228     {
229       puts ("`protected3' in modb has the wrong value");
230       res = 1;
231     }
232 
233   return res;
234 }
235