(root)/
binutils-2.41/
gold/
testsuite/
initpri3.c
       1  /* initpri3.c -- test ctor odering when using init_array.
       2  
       3     Copyright (C) 2011-2023 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  
      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  }