blob: bf9ab39ac86c873433bc875df269940556497f15 [file] [log] [blame]
Kristofer Jonssone56b6e42022-09-29 11:52:22 +02001#
2# SPDX-FileCopyrightText: Copyright 2022 Arm Limited and/or its affiliates <open-source-office@arm.com>
3#
4# SPDX-License-Identifier: Apache-2.0
5#
6# Licensed under the Apache License, Version 2.0 (the License); you may
7# not use this file except in compliance with the License.
8# You may obtain a copy of the License at
9#
10# www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an AS IS BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15# See the License for the specific language governing permissions and
16# limitations under the License.
17#
18
19def elfFindSymbol(elf, name):
20 from elftools.elf.sections import SymbolTableSection
21
22 for section in elf.iter_sections():
23 if isinstance(section, SymbolTableSection):
24 symbol = section.get_symbol_by_name(name)
25 if symbol:
26 return symbol[0]
27
28 return None
29
30def elfGetData(elf, address, size):
31 for section in elf.iter_sections():
32 if address >= section.header['sh_addr'] and \
33 (address + size) < (section.header['sh_addr'] + section.header['sh_size']):
34 offset = address - section.header['sh_addr']
35 return bytearray(section.data()[offset:offset+size])
36
37 return None
38
39def elfGetSymbolData(elf, name):
40 from sys import stderr
41
42 symbol = elfFindSymbol(elf, name)
43 if not symbol:
44 stderr.write(f'Failed to find symbol {name}\n')
45 return None
46
47 return elfGetData(elf, symbol.entry.st_value, symbol.entry.st_size)