blob: 780af3fa9947dc5c83466d09d0c303871d50c59f [file] [log] [blame]
#-------------------------------------------------------------------------------
# Tests the functionality of get_symbol_by_name
#
# Eli Bendersky (eliben@gmail.com)
# This code is in the public domain
#-------------------------------------------------------------------------------
import unittest
import os
from elftools.elf.elffile import ELFFile
class TestGetSymbolByName(unittest.TestCase):
def test_existing_symbol(self):
with open(os.path.join('test', 'testfiles_for_unittests',
'simple_gcc.elf.arm'), 'rb') as f:
elf = ELFFile(f)
# Find the symbol table.
symtab = elf.get_section_by_name('.symtab')
self.assertIsNotNone(symtab)
# Test we can find a symbol by its name.
mains = symtab.get_symbol_by_name('main')
self.assertIsNotNone(mains)
# Test it is actually the symbol we expect.
self.assertIsInstance(mains, list)
self.assertEqual(len(mains), 1)
main = mains[0]
self.assertEqual(main.name, 'main')
self.assertEqual(main['st_value'], 0x8068)
self.assertEqual(main['st_size'], 0x28)
def test_missing_symbol(self):
with open(os.path.join('test', 'testfiles_for_unittests',
'simple_gcc.elf.arm'), 'rb') as f:
elf = ELFFile(f)
# Find the symbol table.
symtab = elf.get_section_by_name('.symtab')
self.assertIsNotNone(symtab)
# Test we get None when we look up a symbol that doesn't exist.
undef = symtab.get_symbol_by_name('non-existent symbol')
self.assertIsNone(undef)
def test_duplicated_symbol(self):
with open(os.path.join('test', 'testfiles_for_unittests',
'simple_gcc.elf.arm'), 'rb') as f:
elf = ELFFile(f)
# Find the symbol table.
symtab = elf.get_section_by_name('.symtab')
self.assertIsNotNone(symtab)
# The '$a' symbols that are present in the test file.
expected_symbols = [0x8000, 0x8034, 0x8090, 0x800c, 0x809c, 0x8018,
0x8068]
# Test we get all expected instances of the symbol '$a'.
arm_markers = symtab.get_symbol_by_name('$a')
self.assertIsNotNone(arm_markers)
self.assertIsInstance(arm_markers, list)
self.assertEqual(len(arm_markers), len(expected_symbols))
for symbol in arm_markers:
self.assertEqual(symbol.name, '$a')
self.assertIn(symbol['st_value'], expected_symbols)
if __name__ == '__main__':
unittest.main()