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
30atf_test_case startstop
31startstop_head() {
32	atf_set "descr" "check if __start_*/__stop_* symbols are generated"
33	atf_set "require.progs" "cc"
34}
35
36startstop_body() {
37	cat > test.c << EOF
38#include <sys/cdefs.h>
39int i __section("hoge");
40extern int __start_hoge[], __stop_hoge[];
41int main(void) { return __start_hoge[0] + __stop_hoge[0]; }
42EOF
43	atf_check -s exit:0 -o ignore -e ignore cc -o test test.c
44}
45
46################################################################################
47
48atf_test_case orphan
49orphan_head() {
50	atf_set "descr" "check orphan section placement"
51	atf_set "require.progs" "cc" "readelf" "grep"
52}
53
54orphan_body() {
55	cat > test.c << EOF
56#include <sys/cdefs.h>
57/* read-only orphan */
58const char a[] __section("hoge") = "hoge";
59/* read-write orphan */
60char b[] __section("fuga") = { 'f', 'u', 'g', 'a', '\0' };
61/* .data */
62int c[1024] = { 123, 20, 1, 0 };
63/* .bss */
64int d = 0;
65/* .text */
66int main(void) { return 0; }
67EOF
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
86match() {
87	read line
88	case "$line" in
89	*"$1"*) return 0;
90	esac
91	return 1
92}
93
94################################################################################
95
96atf_init_test_cases()
97{
98	atf_add_test_case startstop
99	atf_add_test_case orphan
100}
101