Home | History | Annotate | Download | only in testsuite
      1 // weak_undef_test_2.cc -- test handling of weak undefined symbols for gold
      2 
      3 // Copyright (C) 2014-2016 Free Software Foundation, Inc.
      4 // Written by Cary Coutant <ccoutant (at) google.com>.
      5 
      6 // This file is part of gold.
      7 
      8 // This program is free software; you can redistribute it and/or modify
      9 // it under the terms of the GNU General Public License as published by
     10 // the Free Software Foundation; either version 3 of the License, or
     11 // (at your option) any later version.
     12 
     13 // This program is distributed in the hope that it will be useful,
     14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 // GNU General Public License for more details.
     17 
     18 // You should have received a copy of the GNU General Public License
     19 // along with this program; if not, write to the Free Software
     20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21 // MA 02110-1301, USA.
     22 
     23 // This file tests that we correctly deal with weak undefined symbols
     24 // when searching archive libraries.  If we have a weak undefined symbol,
     25 // it should not cause us to link an archive library member that defines
     26 // that symbol.  However, if the symbol is also listed in a -u option on
     27 // the command line, it should cause the archive member to be linked.
     28 
     29 
     30 #include <cstdio>
     31 
     32 // This symbol is defined in weak_undef_file3.cc, but we should
     33 // not load it from the library.
     34 extern int weak_undef_1 __attribute__ ((weak));
     35 
     36 // This symbol is defined in weak_undef_file4.cc, but is also
     37 // listed in a -u option on the link command, so we should
     38 // load it from the library.
     39 extern int weak_undef_2 __attribute__ ((weak));
     40 
     41 int *p1 = &weak_undef_1;
     42 
     43 int *p2 = &weak_undef_2;
     44 
     45 int
     46 main()
     47 {
     48   int status = 0;
     49 
     50   if (&weak_undef_1 != NULL)
     51     {
     52       fprintf(stderr, "FAILED weak undef test 1: %s\n",
     53               "&weak_undef_1 is not NULL");
     54       status = 1;
     55     }
     56 
     57   if (&weak_undef_2 == NULL)
     58     {
     59       fprintf(stderr, "FAILED weak undef test 2: %s\n",
     60               "&weak_undef_2 is NULL");
     61       status = 1;
     62     }
     63 
     64   if (p1 != NULL)
     65     {
     66       fprintf(stderr, "FAILED weak undef test 3: %s\n",
     67               "p1 is not NULL");
     68       status = 1;
     69     }
     70 
     71   if (p2 == NULL)
     72     {
     73       fprintf(stderr, "FAILED weak undef test 4: %s\n",
     74               "p2 is NULL");
     75       status = 1;
     76     }
     77 
     78   return status;
     79 }
     80