| /* 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; | 
 | } |