Issue #3: make examples/elf_low_high_api.py more generic. Patch by Jessica McKellar
diff --git a/examples/elf_low_high_api.py b/examples/elf_low_high_api.py
index a4fb2ca..a5600c1 100644
--- a/examples/elf_low_high_api.py
+++ b/examples/elf_low_high_api.py
@@ -2,7 +2,8 @@
# elftools example: elf_low_high_api.py
#
# A simple example that shows some usage of the low-level API pyelftools
-# provides versus the high-level API.
+# provides versus the high-level API while inspecting an ELF file's symbol
+# table.
#
# Eli Bendersky (eliben@gmail.com)
# This code is in the public domain
@@ -38,20 +39,24 @@
# The e_shnum ELF header field says how many sections there are in a file
print(' %s sections' % elffile['e_shnum'])
- # We need section #40
- section_offset = elffile['e_shoff'] + 40 * elffile['e_shentsize']
+ # Try to find the symbol table
+ for i in range(elffile['e_shnum']):
+ section_offset = elffile['e_shoff'] + i * elffile['e_shentsize']
+ # Parse the section header using structs.Elf_Shdr
+ stream.seek(section_offset)
+ section_header = elffile.structs.Elf_Shdr.parse_stream(stream)
+ if section_header['sh_type'] == 'SHT_SYMTAB':
+ # Some details about the section. Note that the section name is a
+ # pointer to the object's string table, so it's only a number
+ # here. To get to the actual name one would need to parse the string
+ # table section and extract the name from there (or use the
+ # high-level API!)
+ print(' Section name: %s, type: %s' % (
+ section_header['sh_name'], section_header['sh_type']))
+ break
+ else:
+ print(' No symbol table found. Perhaps this ELF has been stripped?')
- # Parse the section header using structs.Elf_Shdr
- stream.seek(section_offset)
- section_header = elffile.structs.Elf_Shdr.parse_stream(stream)
-
- # Some details about the section. Note that the section name is a pointer
- # to the object's string table, so it's only a number here. To get to the
- # actual name one would need to parse the string table section and extract
- # the name from there (or use the high-level API!)
- print(' Section name: %s, type: %s' % (
- section_header['sh_name'], section_header['sh_type']))
-
def section_info_highlevel(stream):
print('High level API...')
@@ -59,7 +64,11 @@
# Just use the public methods of ELFFile to get what we need
print(' %s sections' % elffile.num_sections())
- section = elffile.get_section(40)
+ section = elffile.get_section_by_name('.symtab')
+
+ if not section:
+ print(' No symbol table found. Perhaps this ELF has been stripped?')
+ return
# A section type is in its header, but the name was decoded and placed in
# a public attribute.
@@ -70,9 +79,10 @@
# the case in the sample ELF file that comes with the examples), we can
# get some more information about it.
if isinstance(section, SymbolTableSection):
- print(" It's a symbol section with %s symbols" % section.num_symbols())
- print(" The name of symbol #60 is: %s" % (
- section.get_symbol(60).name))
+ num_symbols = section.num_symbols()
+ print(" It's a symbol section with %s symbols" % num_symbols)
+ print(" The name of the last symbol in the section is: %s" % (
+ section.get_symbol(num_symbols - 1).name))
if __name__ == '__main__':
diff --git a/examples/reference_output/elf_low_high_api.out b/examples/reference_output/elf_low_high_api.out
index b808199..5ef601a 100644
--- a/examples/reference_output/elf_low_high_api.out
+++ b/examples/reference_output/elf_low_high_api.out
@@ -6,4 +6,4 @@
42 sections
Section name: .symtab, type: SHT_SYMTAB
It's a symbol section with 80 symbols
- The name of symbol #60 is: __init_array_start
+ The name of the last symbol in the section is: _init