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