Re: [PATCH v2 04/13] binman: Expand elf support a little

2022-03-10 Thread Tom Rini
On Fri, Mar 04, 2022 at 08:42:59AM -0700, Simon Glass wrote:

> Allow finding a symbol by its address. Also export the function to get
> the file offset of a particular address, so it can be used by a script to
> be added.
> 
> Signed-off-by: Simon Glass 

Applied to u-boot/next, thanks!

-- 
Tom


signature.asc
Description: PGP signature


[PATCH v2 04/13] binman: Expand elf support a little

2022-03-04 Thread Simon Glass
Allow finding a symbol by its address. Also export the function to get
the file offset of a particular address, so it can be used by a script to
be added.

Signed-off-by: Simon Glass 
---

(no changes since v1)

 tools/binman/elf.py | 58 +++--
 1 file changed, 51 insertions(+), 7 deletions(-)

diff --git a/tools/binman/elf.py b/tools/binman/elf.py
index 5e7d6ae7b9..35971731d0 100644
--- a/tools/binman/elf.py
+++ b/tools/binman/elf.py
@@ -85,6 +85,57 @@ def GetSymbols(fname, patterns):
 # Sort dict by address
 return OrderedDict(sorted(syms.items(), key=lambda x: x[1].address))
 
+def _GetFileOffset(elf, addr):
+"""Get the file offset for an address
+
+Args:
+elf (ELFFile): ELF file to check
+addr (int): Address to search for
+
+Returns
+int: Offset of that address in the ELF file, or None if not valid
+"""
+for seg in elf.iter_segments():
+seg_end = seg['p_vaddr'] + seg['p_filesz']
+if seg.header['p_type'] == 'PT_LOAD':
+if addr >= seg['p_vaddr'] and addr < seg_end:
+return addr - seg['p_vaddr'] + seg['p_offset']
+
+def GetFileOffset(fname, addr):
+"""Get the file offset for an address
+
+Args:
+fname (str): Filename of ELF file to check
+addr (int): Address to search for
+
+Returns
+int: Offset of that address in the ELF file, or None if not valid
+"""
+if not ELF_TOOLS:
+raise ValueError('Python elftools package is not available')
+with open(fname, 'rb') as fd:
+elf = ELFFile(fd)
+return _GetFileOffset(elf, addr)
+
+def GetSymbolFromAddress(fname, addr):
+"""Get the symbol at a particular address
+
+Args:
+fname (str): Filename of ELF file to check
+addr (int): Address to search for
+
+Returns:
+str: Symbol name, or None if no symbol at that address
+"""
+if not ELF_TOOLS:
+raise ValueError('Python elftools package is not available')
+with open(fname, 'rb') as fd:
+elf = ELFFile(fd)
+syms = GetSymbols(fname, None)
+for name, sym in syms.items():
+if sym.address == addr:
+return name
+
 def GetSymbolFileOffset(fname, patterns):
 """Get the symbols from an ELF file
 
@@ -97,13 +148,6 @@ def GetSymbolFileOffset(fname, patterns):
   key: Name of symbol
   value: Hex value of symbol
 """
-def _GetFileOffset(elf, addr):
-for seg in elf.iter_segments():
-seg_end = seg['p_vaddr'] + seg['p_filesz']
-if seg.header['p_type'] == 'PT_LOAD':
-if addr >= seg['p_vaddr'] and addr < seg_end:
-return addr - seg['p_vaddr'] + seg['p_offset']
-
 if not ELF_TOOLS:
 raise ValueError('Python elftools package is not available')
 
-- 
2.35.1.616.g0bdcbb4464-goog