Home | History | Annotate | Download | only in testsuite
      1 /* initpri3.c -- test ctor odering when using init_array.
      2 
      3    Copyright (C) 2011-2016 Free Software Foundation, Inc.
      4    Written by Ian Lance Taylor <iant (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 tests that the linker correctly orders .ctor entries when
     24    putting them into .init_array, as is the default.  */
     25 
     26 #include <assert.h>
     27 
     28 int i = 1;
     29 
     30 static void
     31 ctor1 (void)
     32 {
     33   assert (i == 1);
     34   i = 2;
     35 }
     36 
     37 static void
     38 ctor2 (void)
     39 {
     40   assert (i == 2);
     41   i = 3;
     42 }
     43 
     44 static void
     45 dtor1 (void)
     46 {
     47   assert (i == 3);
     48   i = 2;
     49 }
     50 
     51 static void
     52 dtor2 (void)
     53 {
     54   assert (i == 2);
     55   i = 1;
     56 }
     57 
     58 /* The .ctors section is run in reverse order, the .dtors section in
     59    run in forward order.  We give these arrays the "aligned" attribute
     60    because the x86_64 ABI would otherwise give them a 16-byte
     61    alignment, which may leave a hole in the section.  */
     62 
     63 void (*ctors[]) (void)
     64   __attribute__ ((aligned (4), section (".ctors"))) = {
     65   ctor2,
     66   ctor1
     67 };
     68 
     69 void (*dtors[]) (void)
     70   __attribute__ ((aligned (4), section (".dtors"))) = {
     71   dtor1,
     72   dtor2
     73 };
     74 
     75 int
     76 main (void)
     77 {
     78   assert (i == 3);
     79   return 0;
     80 }
     81