| 1 | /* script_test_12a.c -- a test case for gold |
| 2 | |
| 3 | Copyright (C) 2015-2019 Free Software Foundation, Inc. |
| 4 | Written by Cary Coutant <ccoutant@gmail.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 linker script behavior, that gold distinguishes correctly |
| 24 | between |
| 25 | *(.x1) *(.x2) *(.x3) |
| 26 | and |
| 27 | *(.x1 .x2 .x3) |
| 28 | in an input section spec. In the first case, the output section |
| 29 | should contain all .x1 sections, followed by all .x2 sections, |
| 30 | then all .x3 sections; i.e.: |
| 31 | script_test_12a.o(.x1) |
| 32 | script_test_12b.o(.x1) |
| 33 | script_test_12a.o(.x2) |
| 34 | script_test_12b.o(.x2) |
| 35 | script_test_12a.o(.x3) |
| 36 | script_test_12b.o(.x3) |
| 37 | |
| 38 | In the second case, the output section should interleave the |
| 39 | .x1, .x2, and .x3 sections in the order seen; i.e.: |
| 40 | script_test_12a.o(.x1) |
| 41 | script_test_12a.o(.x2) |
| 42 | script_test_12a.o(.x3) |
| 43 | script_test_12b.o(.x1) |
| 44 | script_test_12b.o(.x2) |
| 45 | script_test_12b.o(.x3) |
| 46 | |
| 47 | The linker scripts set the absolute symbol INTERLEAVED, which we |
| 48 | test here to determine which ordering to expect. The scripts also |
| 49 | define the symbols test_array_start and test_array_end. |
| 50 | */ |
| 51 | |
| 52 | extern int test_array_start; |
| 53 | extern int test_array_end; |
| 54 | extern char interleaved __attribute__((__aligned__(1))); |
| 55 | |
| 56 | int |
| 57 | main(void) |
| 58 | { |
| 59 | int last = 0; |
| 60 | int *p; |
| 61 | long should_be_interleaved = (long)&interleaved; |
| 62 | int mask = (should_be_interleaved == 1 ? 0x7f : 0xff); |
| 63 | for (p = &test_array_start; p < &test_array_end; ++p) |
| 64 | { |
| 65 | int next = *p & mask; |
| 66 | if (next <= last) |
| 67 | return 1; |
| 68 | last = next; |
| 69 | } |
| 70 | return 0; |
| 71 | } |
| 72 | |
| 73 | int a1[] __attribute((section(".x1"))) = { 0x01, 0x02, 0x03, 0x04 }; |
| 74 | int a2[] __attribute((section(".x2"))) = { 0x11, 0x12, 0x13, 0x14}; |
| 75 | int a3[] __attribute((section(".x3"))) = { 0x21, 0x22, 0x23, 0x24 }; |
| 76 | int a4[] __attribute((section(".x4"))) = { 0xff, 0xff, 0xff, 0xff }; |