diff options
author | Simon Glass <sjg@chromium.org> | 2019-11-06 17:22:44 -0700 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2019-11-11 14:20:35 -0500 |
commit | 7c150136398916ac546b5a902d09208cc793cabe (patch) | |
tree | 98854625b04a561a29aede0fdde231efabe417c5 /tools/binman/etype | |
parent | 086e391bc46d3dda5c44053532bb51dc3827ee94 (diff) |
binman: tegra: Adjust symbol calculation depending on end-at-4gb
A recent change adjusted the symbol calculation to work on x86 but broke
it for Tegra. In fact this is because they have different needs.
On x86 devices the code is linked to a ROM address and the end-at-4gb
property is used for the image. In this case there is no need to add the
base address of the image, since the base address is already built into
the offset and image-pos properties.
On other devices we must add the base address since the offsets start at
zero.
In addition the base address is currently added to the 'offset' and 'size'
values. It should in fact only be added to 'image-pos', since 'offset' is
relative to its parent and 'size' is not actually an address. This code
should have been adjusted when support for 'image-pos' and 'size' was
added, but it was not.
To correct these problems:
- move the code that handles adding the base address to section.py, which
can check the end-at-4gb property and which property
(offset/size/image-pos) is being read
- add the base address only when needed (only for image-pos and not if the
image uses end-at-4gb)
- add a note to the documentation
- add a separate test to cover x86 behaviour
Fixes: 15c981cc (binman: Correct symbol calculation with non-zero image base)
Signed-off-by: Simon Glass <sjg@chromium.org>
Tested-by: Stephen Warren <swarren@nvidia.com>
Diffstat (limited to 'tools/binman/etype')
-rw-r--r-- | tools/binman/etype/section.py | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/tools/binman/etype/section.py b/tools/binman/etype/section.py index ab0c42cee0..89b7bf67fa 100644 --- a/tools/binman/etype/section.py +++ b/tools/binman/etype/section.py @@ -290,13 +290,16 @@ class Entry_section(Entry): return entry.GetData() source_entry.Raise("Cannot find entry for node '%s'" % node.name) - def LookupSymbol(self, sym_name, optional, msg): + def LookupSymbol(self, sym_name, optional, msg, base_addr): """Look up a symbol in an ELF file Looks up a symbol in an ELF file. Only entry types which come from an ELF image can be used by this function. - At present the only entry property supported is offset. + At present the only entry properties supported are: + offset + image_pos - 'base_addr' is added if this is not an end-at-4gb image + size Args: sym_name: Symbol name in the ELF file to look up in the format @@ -309,6 +312,12 @@ class Entry_section(Entry): optional: True if the symbol is optional. If False this function will raise if the symbol is not found msg: Message to display if an error occurs + base_addr: Base address of image. This is added to the returned + image_pos in most cases so that the returned position indicates + where the targetted entry/binary has actually been loaded. But + if end-at-4gb is used, this is not done, since the binary is + already assumed to be linked to the ROM position and using + execute-in-place (XIP). Returns: Value that should be assigned to that symbol, or None if it was @@ -343,7 +352,10 @@ class Entry_section(Entry): if prop_name == 'offset': return entry.offset elif prop_name == 'image_pos': - return entry.image_pos + value = entry.image_pos + if not self.GetImage()._end_4gb: + value += base_addr + return value if prop_name == 'size': return entry.size else: |