| /* script_test_12a.c -- a test case for gold |
| |
| Copyright (C) 2015-2021 Free Software Foundation, Inc. |
| Written by Cary Coutant <ccoutant@gmail.com>. |
| |
| This file is part of gold. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software |
| Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
| MA 02110-1301, USA. |
| |
| This tests linker script behavior, that gold distinguishes correctly |
| between |
| *(.x1) *(.x2) *(.x3) |
| and |
| *(.x1 .x2 .x3) |
| in an input section spec. In the first case, the output section |
| should contain all .x1 sections, followed by all .x2 sections, |
| then all .x3 sections; i.e.: |
| script_test_12a.o(.x1) |
| script_test_12b.o(.x1) |
| script_test_12a.o(.x2) |
| script_test_12b.o(.x2) |
| script_test_12a.o(.x3) |
| script_test_12b.o(.x3) |
| |
| In the second case, the output section should interleave the |
| .x1, .x2, and .x3 sections in the order seen; i.e.: |
| script_test_12a.o(.x1) |
| script_test_12a.o(.x2) |
| script_test_12a.o(.x3) |
| script_test_12b.o(.x1) |
| script_test_12b.o(.x2) |
| script_test_12b.o(.x3) |
| |
| The linker scripts set the absolute symbol INTERLEAVED, which we |
| test here to determine which ordering to expect. The scripts also |
| define the symbols test_array_start and test_array_end. |
| */ |
| |
| extern int test_array_start; |
| extern int test_array_end; |
| extern char interleaved __attribute__((__aligned__(1))); |
| |
| int |
| main(void) |
| { |
| int last = 0; |
| int *p; |
| long should_be_interleaved = (long)&interleaved; |
| int mask = (should_be_interleaved == 1 ? 0x7f : 0xff); |
| for (p = &test_array_start; p < &test_array_end; ++p) |
| { |
| int next = *p & mask; |
| if (next <= last) |
| return 1; |
| last = next; |
| } |
| return 0; |
| } |
| |
| int a1[] __attribute((section(".x1"))) = { 0x01, 0x02, 0x03, 0x04 }; |
| int a2[] __attribute((section(".x2"))) = { 0x11, 0x12, 0x13, 0x14}; |
| int a3[] __attribute((section(".x3"))) = { 0x21, 0x22, 0x23, 0x24 }; |
| int a4[] __attribute((section(".x4"))) = { 0xff, 0xff, 0xff, 0xff }; |