1 /* initpri3.c -- test ctor odering when using init_array. 2 3 Copyright (C) 2011-2014 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