1#!/bin/sh
2
3# pr23016_1.sh -- check that .eh_frame sections and their relocations
4# are merged together even when mixing SHT_PROGBITS and SHT_X86_64_UNWIND.
5
6# Copyright (C) 2018-2020 Free Software Foundation, Inc.
7# Written by Cary Coutant <ccoutant@gmail.com>.
8
9# This file is part of gold.
10
11# This program is free software; you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation; either version 3 of the License, or
14# (at your option) any later version.
15
16# This program is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19# GNU General Public License for more details.
20
21# You should have received a copy of the GNU General Public License
22# along with this program; if not, write to the Free Software
23# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
24# MA 02110-1301, USA.
25
26set -e
27
28check() {
29  awk -v "FILE=$1" '
30  BEGIN {
31      progbits = 0;
32      unwind = 0;
33      ehframe_rel = 0;
34      relocx = 0;
35      relocy = 0;
36    }
37  /\.eh_frame *PROGBITS/ {
38      progbits++;
39    }
40  /\.eh_frame *X86_64_UNWIND/ {
41      unwind++;
42    }
43  /^Relocation section .\.rela\.eh_frame/ {
44      ehframe_rel++;
45    }
46  /R_X86_64_64.*x \+ 0/ {
47      relocx++;
48    }
49  /R_X86_64_64.*y \+ 0/ {
50      relocy++;
51    }
52  END {
53      errs = 0;
54      if (progbits != 0)
55	{
56	  printf "%s: There should be no .eh_frame sections of type PROGBITS.\n", FILE;
57	  errs++;
58	}
59      if (unwind != 1)
60	{
61	  printf "%s: There should be exactly one .eh_frame section of type X86_64_UNWIND.\n", FILE;
62	  errs++;
63	}
64      if (ehframe_rel != 1)
65	{
66	  printf "%s: There should be exactly one .rela.eh_frame relocation section.\n", FILE;
67	  errs++;
68	}
69      if (relocx != 1)
70	{
71	  printf "%s: There should be exactly one relocation for x.\n", FILE;
72	  errs++;
73	}
74      if (relocy != 1)
75	{
76	  printf "%s: There should be exactly one relocation for y.\n", FILE;
77	  errs++;
78	}
79      exit errs;
80    }
81  ' $1
82}
83
84check pr23016_1.stdout
85check pr23016_1r.stdout
86
87exit 0
88