|  | /* Test the protected visibility when main is linked with moda and modb | 
|  | in that order: | 
|  | 1. Protected symbols, protected1, protected2 and protected3, defined | 
|  | in moda, are used in moda. | 
|  | 2. Protected symbol, protected3, defined in modb, are used in modb. | 
|  | 3. Symbol, protected1, defined in moda, is also used in main and modb. | 
|  | 4. Symbol, protected2, defined in main, is used in main. | 
|  | 5. Symbol, protected3, defined in moda, is also used in main. | 
|  |  | 
|  | Copyright (C) 2015-2016 Free Software Foundation, Inc. | 
|  | This file is part of the GNU C Library. | 
|  |  | 
|  | The GNU C Library is free software; you can redistribute it and/or | 
|  | modify it under the terms of the GNU Lesser General Public | 
|  | License as published by the Free Software Foundation; either | 
|  | version 2.1 of the License, or (at your option) any later version. | 
|  |  | 
|  | The GNU C Library is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | Lesser General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU Lesser General Public | 
|  | License along with the GNU C Library; if not, see | 
|  | <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | /* This file must be compiled as PIE to avoid copy relocation when | 
|  | accessing protected symbols defined in shared libaries since copy | 
|  | relocation doesn't work with protected symbols and linker in | 
|  | binutils 2.26 enforces this rule.  */ | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  |  | 
|  | #include "tst-protected1mod.h" | 
|  |  | 
|  | /* Prototype for our test function.  */ | 
|  | extern int do_test (void); | 
|  |  | 
|  | int protected2 = -1; | 
|  |  | 
|  | #define TEST_FUNCTION do_test () | 
|  |  | 
|  | /* This defines the `main' function and some more.  */ | 
|  | #include <test-skeleton.c> | 
|  |  | 
|  | int | 
|  | do_test (void) | 
|  | { | 
|  | int res = 0; | 
|  |  | 
|  | /* Check if we get the same address for the protected data symbol.  */ | 
|  | if (&protected1 != protected1a_p ()) | 
|  | { | 
|  | puts ("`protected1' in main and moda doesn't have same address"); | 
|  | res = 1; | 
|  | } | 
|  | if (&protected1 != protected1b_p ()) | 
|  | { | 
|  | puts ("`protected1' in main and modb doesn't have same address"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check if we get the right value for the protected data symbol.  */ | 
|  | if (protected1 != 3) | 
|  | { | 
|  | puts ("`protected1' in main and moda doesn't have same value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check if we get the right value for data defined in executable.  */ | 
|  | if (protected2 != -1) | 
|  | { | 
|  | puts ("`protected2' in main has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check `protected1' in moda.  */ | 
|  | if (!check_protected1 ()) | 
|  | { | 
|  | puts ("`protected1' in moda has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check `protected2' in moda.  */ | 
|  | if (!check_protected2 ()) | 
|  | { | 
|  | puts ("`protected2' in moda has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check if we get the same address for the protected data symbol.  */ | 
|  | if (&protected3 != protected3a_p ()) | 
|  | { | 
|  | puts ("`protected3' in main and moda doesn't have same address"); | 
|  | res = 1; | 
|  | } | 
|  | if (&protected3 == protected3b_p ()) | 
|  | { | 
|  | puts ("`protected3' in main and modb has same address"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check if we get the right value for the protected data symbol.  */ | 
|  | if (protected3 != 5) | 
|  | { | 
|  | puts ("`protected3' in main and moda doesn't have same value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check `protected3' in moda.  */ | 
|  | if (!check_protected3a ()) | 
|  | { | 
|  | puts ("`protected3' in moda has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check `protected3' in modb.  */ | 
|  | if (!check_protected3b ()) | 
|  | { | 
|  | puts ("`protected3' in modb has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Set `protected2' in moda to 30.  */ | 
|  | set_protected2 (300); | 
|  |  | 
|  | /* Check `protected2' in moda.  */ | 
|  | if (!check_protected2 ()) | 
|  | { | 
|  | puts ("`protected2' in moda has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Set `protected1' in moda to 30.  */ | 
|  | set_protected1a (30); | 
|  |  | 
|  | /* Check `protected1' in moda.  */ | 
|  | if (!check_protected1 ()) | 
|  | { | 
|  | puts ("`protected1' in moda has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check if we get the updated value for the protected data symbol.  */ | 
|  | if (protected1 != 30) | 
|  | { | 
|  | puts ("`protected1' in main doesn't have the updated value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | protected2 = -300; | 
|  |  | 
|  | /* Check `protected2' in moda.  */ | 
|  | if (!check_protected2 ()) | 
|  | { | 
|  | puts ("`protected2' in moda has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check if data defined in executable is changed.  */ | 
|  | if (protected2 != -300) | 
|  | { | 
|  | puts ("`protected2' in main is changed"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Set `protected1' in modb to 40.  */ | 
|  | set_protected1b (40); | 
|  | set_expected_protected1 (40); | 
|  |  | 
|  | /* Check `protected1' in moda.  */ | 
|  | if (!check_protected1 ()) | 
|  | { | 
|  | puts ("`protected1' in moda has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check if we get the updated value for the protected data symbol.  */ | 
|  | if (protected1 != 40) | 
|  | { | 
|  | puts ("`protected1' in main doesn't have the updated value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Set `protected3' in moda to 80.  */ | 
|  | set_protected3a (80); | 
|  |  | 
|  | /* Check `protected3' in moda.  */ | 
|  | if (!check_protected3a ()) | 
|  | { | 
|  | puts ("`protected3' in moda has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check if we get the updated value for the protected data symbol.  */ | 
|  | if (protected3 != 80) | 
|  | { | 
|  | puts ("`protected3' in main doesn't have the updated value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check `protected3' in modb.  */ | 
|  | if (!check_protected3b ()) | 
|  | { | 
|  | puts ("`protected3' in modb has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Set `protected3' in modb to 100.  */ | 
|  | set_protected3b (100); | 
|  |  | 
|  | /* Check `protected3' in moda.  */ | 
|  | if (!check_protected3a ()) | 
|  | { | 
|  | puts ("`protected3' in moda has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check if we get the updated value for the protected data symbol.  */ | 
|  | if (protected3 != 80) | 
|  | { | 
|  | puts ("`protected3' in main doesn't have the updated value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | /* Check `protected3' in modb.  */ | 
|  | if (!check_protected3b ()) | 
|  | { | 
|  | puts ("`protected3' in modb has the wrong value"); | 
|  | res = 1; | 
|  | } | 
|  |  | 
|  | return res; | 
|  | } |