1/* initpri3.c -- test ctor odering when using init_array. 2 3 Copyright (C) 2011-2020 Free Software Foundation, Inc. 4 Written by Ian Lance Taylor <iant@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 28int i = 1; 29 30static void 31ctor1 (void) 32{ 33 assert (i == 1); 34 i = 2; 35} 36 37static void 38ctor2 (void) 39{ 40 assert (i == 2); 41 i = 3; 42} 43 44static void 45dtor1 (void) 46{ 47 assert (i == 3); 48 i = 2; 49} 50 51static void 52dtor2 (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 63void (*ctors[]) (void) 64 __attribute__ ((aligned (4), section (".ctors"))) = { 65 ctor2, 66 ctor1 67}; 68 69void (*dtors[]) (void) 70 __attribute__ ((aligned (4), section (".dtors"))) = { 71 dtor1, 72 dtor2 73}; 74 75int 76main (void) 77{ 78 assert (i == 3); 79 return 0; 80} 81