xref: /illumos-gate/usr/src/test/elf-tests/tests/sections/gcc-except-table/simple.sh (revision 5425aa59e8fd3834b86390ed6d8a13586c918df9)
1*5425aa59SJoshua Carp#!/bin/ksh
2*5425aa59SJoshua Carp#
3*5425aa59SJoshua Carp# This file and its contents are supplied under the terms of the
4*5425aa59SJoshua Carp# Common Development and Distribution License ("CDDL"), version 1.0.
5*5425aa59SJoshua Carp# You may only use this file in accordance with the terms of version
6*5425aa59SJoshua Carp# 1.0 of the CDDL.
7*5425aa59SJoshua Carp#
8*5425aa59SJoshua Carp# A full copy of the text of the CDDL should have accompanied this
9*5425aa59SJoshua Carp# source.  A copy of the CDDL is also available via the Internet at
10*5425aa59SJoshua Carp# http://www.illumos.org/license/CDDL.
11*5425aa59SJoshua Carp#
12*5425aa59SJoshua Carp
13*5425aa59SJoshua Carp# Copyright 2026 Oxide Computer Company
14*5425aa59SJoshua Carp
15*5425aa59SJoshua Carp#
16*5425aa59SJoshua Carp# Verify that per-function .gcc_except_table.<sym> input sections are
17*5425aa59SJoshua Carp# merged into a single .gcc_except_table output section, matching the
18*5425aa59SJoshua Carp# behaviour of GNU ld.
19*5425aa59SJoshua Carp#
20*5425aa59SJoshua Carp
21*5425aa59SJoshua CarpTESTDIR=$(dirname $0)
22*5425aa59SJoshua Carp
23*5425aa59SJoshua Carptmpdir=/tmp/test.$$
24*5425aa59SJoshua Carpmkdir $tmpdir
25*5425aa59SJoshua Carpcd $tmpdir
26*5425aa59SJoshua Carp
27*5425aa59SJoshua Carpfunction cleanup {
28*5425aa59SJoshua Carp	cd /
29*5425aa59SJoshua Carp	rm -fr $tmpdir
30*5425aa59SJoshua Carp}
31*5425aa59SJoshua Carp
32*5425aa59SJoshua Carptrap cleanup EXIT
33*5425aa59SJoshua Carp
34*5425aa59SJoshua Carp
35*5425aa59SJoshua Carpif [[ $PWD != $tmpdir ]]; then
36*5425aa59SJoshua Carp	print -u2 "Failed to create temporary directory: $tmpdir"
37*5425aa59SJoshua Carp	exit 1
38*5425aa59SJoshua Carpfi
39*5425aa59SJoshua Carp
40*5425aa59SJoshua Carpfunction assemble {
41*5425aa59SJoshua Carp	gcc -c -o $2 $1
42*5425aa59SJoshua Carp	if (( $? != 0 )); then
43*5425aa59SJoshua Carp		print -u2 "assembly of ${1} failed"
44*5425aa59SJoshua Carp		exit 1
45*5425aa59SJoshua Carp	fi
46*5425aa59SJoshua Carp}
47*5425aa59SJoshua Carp
48*5425aa59SJoshua Carpassemble ${TESTDIR}/gcct1.s gcct1.o
49*5425aa59SJoshua Carpassemble ${TESTDIR}/gcct2.s gcct2.o
50*5425aa59SJoshua Carp
51*5425aa59SJoshua Carpgcc -shared -o gcct.so gcct1.o gcct2.o
52*5425aa59SJoshua Carpif (( $? != 0 )); then
53*5425aa59SJoshua Carp	print -u2 "link of gcct[12].o failed"
54*5425aa59SJoshua Carp	exit 1
55*5425aa59SJoshua Carpfi
56*5425aa59SJoshua Carp
57*5425aa59SJoshua Carp#
58*5425aa59SJoshua Carp# There must be exactly one section named .gcc_except_table, and no
59*5425aa59SJoshua Carp# .gcc_except_table.<sym> sections from the per-function inputs.
60*5425aa59SJoshua Carp#
61*5425aa59SJoshua Carpnmerged=$(elfdump -c gcct.so | awk '
62*5425aa59SJoshua Carp	$3 == "sh_name:" && $4 == ".gcc_except_table" { n++ }
63*5425aa59SJoshua Carp	END { print n + 0 }
64*5425aa59SJoshua Carp	')
65*5425aa59SJoshua Carpif (( nmerged != 1 )); then
66*5425aa59SJoshua Carp	print -u2 "FAIL: expected 1 .gcc_except_table section, found ${nmerged}"
67*5425aa59SJoshua Carp	elfdump -c gcct.so | grep gcc_except >&2
68*5425aa59SJoshua Carp	exit 1
69*5425aa59SJoshua Carpfi
70*5425aa59SJoshua Carp
71*5425aa59SJoshua Carpnsplit=$(elfdump -c gcct.so | awk '
72*5425aa59SJoshua Carp	$3 == "sh_name:" && $4 ~ /^\.gcc_except_table\./ { n++ }
73*5425aa59SJoshua Carp	END { print n + 0 }
74*5425aa59SJoshua Carp	')
75*5425aa59SJoshua Carpif (( nsplit != 0 )); then
76*5425aa59SJoshua Carp	print -u2 "FAIL: .gcc_except_table.* sections were not merged"
77*5425aa59SJoshua Carp	elfdump -c gcct.so | grep gcc_except >&2
78*5425aa59SJoshua Carp	exit 1
79*5425aa59SJoshua Carpfi
80*5425aa59SJoshua Carp
81*5425aa59SJoshua Carp#
82*5425aa59SJoshua Carp# Verify the merged section contains the bytes contributed by both inputs.
83*5425aa59SJoshua Carp#
84*5425aa59SJoshua Carphex=$(elfdump -N.gcc_except_table -w /dev/stdout gcct.so |
85*5425aa59SJoshua Carp    od -An -tx1 | tr -d ' \n')
86*5425aa59SJoshua Carpcase "$hex" in
87*5425aa59SJoshua Carp*11223344*) ;;
88*5425aa59SJoshua Carp*)
89*5425aa59SJoshua Carp	print -u2 "FAIL: merged .gcc_except_table content unexpected: ${hex}"
90*5425aa59SJoshua Carp	exit 1
91*5425aa59SJoshua Carp	;;
92*5425aa59SJoshua Carpesac
93*5425aa59SJoshua Carp
94*5425aa59SJoshua Carpexit 0
95