]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/netbsd-tests/usr.bin/ld/t_section.sh
MFC r305358,r305449,r305451,r306367,r306397,r309474:
[FreeBSD/stable/10.git] / contrib / netbsd-tests / usr.bin / ld / t_section.sh
1 #       $NetBSD: t_section.sh,v 1.4 2015/02/17 11:51:04 martin Exp $
2 #
3 # Copyright (c) 2014 The NetBSD Foundation, Inc.
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 #    notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 #    notice, this list of conditions and the following disclaimer in the
13 #    documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 # POSSIBILITY OF SUCH DAMAGE.
26 #
27
28 ################################################################################
29
30 atf_test_case startstop
31 startstop_head() {
32         atf_set "descr" "check if __start_*/__stop_* symbols are generated"
33         atf_set "require.progs" "cc"
34 }
35
36 startstop_body() {
37         cat > test.c << EOF
38 #include <sys/cdefs.h>
39 int i __section("hoge");
40 extern int __start_hoge[], __stop_hoge[];
41 int main(void) { return __start_hoge[0] + __stop_hoge[0]; }
42 EOF
43         atf_check -s exit:0 -o ignore -e ignore cc -o test test.c
44 }
45
46 ################################################################################
47
48 atf_test_case orphan
49 orphan_head() {
50         atf_set "descr" "check orphan section placement"
51         atf_set "require.progs" "cc" "readelf" "grep"
52 }
53
54 orphan_body() {
55         cat > test.c << EOF
56 #include <sys/cdefs.h>
57 /* read-only orphan */
58 const char a[] __section("hoge") = "hoge";
59 /* read-write orphan */
60 char b[] __section("fuga") = { 'f', 'u', 'g', 'a', '\0' };
61 /* .data */
62 int c[1024] = { 123, 20, 1, 0 };
63 /* .bss */
64 int d = 0;
65 /* .text */
66 int main(void) { return 0; }
67 EOF
68         atf_check -s exit:0 -o ignore -e ignore cc -o test test.c
69         readelf -S test |
70         grep ' \.text\| hoge\| \.data\| fuga\| \.bss' >test.secs
71         {
72                 # Read-only orphan sections are placed after well-known
73                 # read-only sections (.text, .rodata) but before .data.
74                 match ".text" &&
75                 match "hoge" &&
76                 # Read-write orphan sections are placed after well-known
77                 # read-write sections (.data) but before .bss.
78                 match ".data" &&
79                 match "fuga" &&
80                 match ".bss" &&
81                 :
82         } < test.secs
83         atf_check test "$?" -eq 0
84 }
85
86 match() {
87         read line
88         case "$line" in
89         *"$1"*) return 0;
90         esac
91         return 1
92 }
93
94 ################################################################################
95
96 atf_init_test_cases()
97 {
98         atf_add_test_case startstop
99         atf_add_test_case orphan
100 }