xref: /optee_os/scripts/gen_ld_sects.py (revision 5976a0a5b9bf7aaebe65320eb5e1709f7bd1f04e)
1*5976a0a5SJens Wiklander#!/usr/bin/env python
2*5976a0a5SJens Wiklander#
3*5976a0a5SJens Wiklander# Copyright (c) 2017, Linaro Limited
4*5976a0a5SJens Wiklander# All rights reserved.
5*5976a0a5SJens Wiklander#
6*5976a0a5SJens Wiklander# Redistribution and use in source and binary forms, with or without
7*5976a0a5SJens Wiklander# modification, are permitted provided that the following conditions are met:
8*5976a0a5SJens Wiklander#
9*5976a0a5SJens Wiklander# 1. Redistributions of source code must retain the above copyright notice,
10*5976a0a5SJens Wiklander# this list of conditions and the following disclaimer.
11*5976a0a5SJens Wiklander#
12*5976a0a5SJens Wiklander# 2. Redistributions in binary form must reproduce the above copyright notice,
13*5976a0a5SJens Wiklander# this list of conditions and the following disclaimer in the documentation
14*5976a0a5SJens Wiklander# and/or other materials provided with the distribution.
15*5976a0a5SJens Wiklander#
16*5976a0a5SJens Wiklander# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*5976a0a5SJens Wiklander# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*5976a0a5SJens Wiklander# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*5976a0a5SJens Wiklander# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*5976a0a5SJens Wiklander# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*5976a0a5SJens Wiklander# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*5976a0a5SJens Wiklander# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*5976a0a5SJens Wiklander# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*5976a0a5SJens Wiklander# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*5976a0a5SJens Wiklander# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*5976a0a5SJens Wiklander# POSSIBILITY OF SUCH DAMAGE.
27*5976a0a5SJens Wiklander#
28*5976a0a5SJens Wiklander
29*5976a0a5SJens Wiklanderimport sys
30*5976a0a5SJens Wiklanderimport re
31*5976a0a5SJens Wiklander
32*5976a0a5SJens Wiklanderdef usage():
33*5976a0a5SJens Wiklander	print "Usage: {} <section reg exp match> [<skip section>...]".format( \
34*5976a0a5SJens Wiklander		sys.argv[0])
35*5976a0a5SJens Wiklander	sys.exit (1)
36*5976a0a5SJens Wiklander
37*5976a0a5SJens Wiklanderdef main():
38*5976a0a5SJens Wiklander	if len(sys.argv) < 2 :
39*5976a0a5SJens Wiklander		usage()
40*5976a0a5SJens Wiklander
41*5976a0a5SJens Wiklander	in_shdr = False
42*5976a0a5SJens Wiklander	section_headers = re.compile("Section Headers:")
43*5976a0a5SJens Wiklander	key_to_flags = re.compile("Key to Flags:")
44*5976a0a5SJens Wiklander	match_rule = re.compile(sys.argv[1])
45*5976a0a5SJens Wiklander	skip_sections = sys.argv[2:]
46*5976a0a5SJens Wiklander
47*5976a0a5SJens Wiklander	for line in sys.stdin:
48*5976a0a5SJens Wiklander		if section_headers.match(line) :
49*5976a0a5SJens Wiklander			in_shdr = True;
50*5976a0a5SJens Wiklander			continue
51*5976a0a5SJens Wiklander		if key_to_flags.match(line) :
52*5976a0a5SJens Wiklander			in_shdr = False;
53*5976a0a5SJens Wiklander			continue
54*5976a0a5SJens Wiklander
55*5976a0a5SJens Wiklander		if not in_shdr :
56*5976a0a5SJens Wiklander			continue
57*5976a0a5SJens Wiklander
58*5976a0a5SJens Wiklander		words = line.split()
59*5976a0a5SJens Wiklander
60*5976a0a5SJens Wiklander		if len(words) < 3 :
61*5976a0a5SJens Wiklander			continue
62*5976a0a5SJens Wiklander
63*5976a0a5SJens Wiklander		if words[0] == "[" :
64*5976a0a5SJens Wiklander			name_offs = 2
65*5976a0a5SJens Wiklander		else :
66*5976a0a5SJens Wiklander			name_offs = 1;
67*5976a0a5SJens Wiklander
68*5976a0a5SJens Wiklander		sect_name = words[name_offs]
69*5976a0a5SJens Wiklander		sect_type = words[name_offs + 1]
70*5976a0a5SJens Wiklander
71*5976a0a5SJens Wiklander		if sect_type != "PROGBITS" :
72*5976a0a5SJens Wiklander			continue
73*5976a0a5SJens Wiklander
74*5976a0a5SJens Wiklander		if not match_rule.match(sect_name) :
75*5976a0a5SJens Wiklander			continue
76*5976a0a5SJens Wiklander
77*5976a0a5SJens Wiklander		if sect_name in skip_sections :
78*5976a0a5SJens Wiklander			continue
79*5976a0a5SJens Wiklander
80*5976a0a5SJens Wiklander		print '\t*({})'.format(sect_name)
81*5976a0a5SJens Wiklander
82*5976a0a5SJens Wiklanderif __name__ == "__main__":
83*5976a0a5SJens Wiklander        main()
84