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 |
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 (s: "`protected1' in main and moda doesn't have same address" ); |
55 | res = 1; |
56 | } |
57 | if (&protected1 != protected1b_p ()) |
58 | { |
59 | puts (s: "`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 (s: "`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 (s: "`protected2' in main has the wrong value" ); |
74 | res = 1; |
75 | } |
76 | |
77 | /* Check `protected1' in moda. */ |
78 | if (!check_protected1 ()) |
79 | { |
80 | puts (s: "`protected1' in moda has the wrong value" ); |
81 | res = 1; |
82 | } |
83 | |
84 | /* Check `protected2' in moda. */ |
85 | if (!check_protected2 ()) |
86 | { |
87 | puts (s: "`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 (s: "`protected3' in main and moda doesn't have same address" ); |
95 | res = 1; |
96 | } |
97 | if (&protected3 == protected3b_p ()) |
98 | { |
99 | puts (s: "`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 (s: "`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 (s: "`protected3' in moda has the wrong value" ); |
114 | res = 1; |
115 | } |
116 | |
117 | /* Check `protected3' in modb. */ |
118 | if (!check_protected3b ()) |
119 | { |
120 | puts (s: "`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 (s: "`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 (s: "`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 (s: "`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 (s: "`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 (s: "`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 (s: "`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 (s: "`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 (s: "`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 (s: "`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 (s: "`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 (s: "`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 (s: "`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 (s: "`protected3' in modb has the wrong value" ); |
230 | res = 1; |
231 | } |
232 | |
233 | return res; |
234 | } |
235 | |