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