mirror of
https://github.com/smaeul/u-boot.git
synced 2025-10-14 04:46:01 +01:00
binman: Allow obtaining a symbol value
Provide a function to obtain the integer value of an ELF symbol. This will be used Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
6e55b114aa
commit
28565796df
@ -188,6 +188,28 @@ def GetSymbolAddress(fname, sym_name):
|
|||||||
return None
|
return None
|
||||||
return sym.address
|
return sym.address
|
||||||
|
|
||||||
|
def GetPackString(sym, msg):
|
||||||
|
"""Get the struct.pack/unpack string to use with a given symbol
|
||||||
|
|
||||||
|
Args:
|
||||||
|
sym (Symbol): Symbol to check. Only the size member is checked
|
||||||
|
@msg (str): String which indicates the entry being processed, used for
|
||||||
|
errors
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: struct string to use, .e.g. '<I'
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError: Symbol has an unexpected size
|
||||||
|
"""
|
||||||
|
if sym.size == 4:
|
||||||
|
return '<I'
|
||||||
|
elif sym.size == 8:
|
||||||
|
return '<Q'
|
||||||
|
else:
|
||||||
|
raise ValueError('%s has size %d: only 4 and 8 are supported' %
|
||||||
|
(msg, sym.size))
|
||||||
|
|
||||||
def LookupAndWriteSymbols(elf_fname, entry, section):
|
def LookupAndWriteSymbols(elf_fname, entry, section):
|
||||||
"""Replace all symbols in an entry with their correct values
|
"""Replace all symbols in an entry with their correct values
|
||||||
|
|
||||||
@ -218,14 +240,7 @@ def LookupAndWriteSymbols(elf_fname, entry, section):
|
|||||||
raise ValueError('%s has offset %x (size %x) but the contents '
|
raise ValueError('%s has offset %x (size %x) but the contents '
|
||||||
'size is %x' % (entry.GetPath(), offset,
|
'size is %x' % (entry.GetPath(), offset,
|
||||||
sym.size, entry.contents_size))
|
sym.size, entry.contents_size))
|
||||||
if sym.size == 4:
|
pack_string = GetPackString(sym, msg)
|
||||||
pack_string = '<I'
|
|
||||||
elif sym.size == 8:
|
|
||||||
pack_string = '<Q'
|
|
||||||
else:
|
|
||||||
raise ValueError('%s has size %d: only 4 and 8 are supported' %
|
|
||||||
(msg, sym.size))
|
|
||||||
|
|
||||||
if name == '_binman_sym_magic':
|
if name == '_binman_sym_magic':
|
||||||
value = BINMAN_SYM_MAGIC_VALUE
|
value = BINMAN_SYM_MAGIC_VALUE
|
||||||
else:
|
else:
|
||||||
@ -241,6 +256,28 @@ def LookupAndWriteSymbols(elf_fname, entry, section):
|
|||||||
entry.data = (entry.data[:offset] + value_bytes +
|
entry.data = (entry.data[:offset] + value_bytes +
|
||||||
entry.data[offset + sym.size:])
|
entry.data[offset + sym.size:])
|
||||||
|
|
||||||
|
def GetSymbolValue(sym, data, msg):
|
||||||
|
"""Get the value of a symbol
|
||||||
|
|
||||||
|
This can only be used on symbols with an integer value.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
sym (Symbol): Symbol to check
|
||||||
|
data (butes): Data for the ELF file - the symbol data appears at offset
|
||||||
|
sym.offset
|
||||||
|
@msg (str): String which indicates the entry being processed, used for
|
||||||
|
errors
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
int: Value of the symbol
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError: Symbol has an unexpected size
|
||||||
|
"""
|
||||||
|
pack_string = GetPackString(sym, msg)
|
||||||
|
value = struct.unpack(pack_string, data[sym.offset:sym.offset + sym.size])
|
||||||
|
return value[0]
|
||||||
|
|
||||||
def MakeElf(elf_fname, text, data):
|
def MakeElf(elf_fname, text, data):
|
||||||
"""Make an elf file with the given data in a single section
|
"""Make an elf file with the given data in a single section
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user