[SeaBIOS] [PATCH 1/3] Ensure exported symbols are visible in the final link

David Woodhouse dwmw2 at infradead.org
Thu Jan 17 22:49:33 CET 2013


I'm about to introduce some post-processing in checkrom.py which will want
access to public symbols. So let's make sure they're defined in the final
link even if they're *not* cross-referenced from a different code section.

Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
---
 tools/layoutrom.py | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/tools/layoutrom.py b/tools/layoutrom.py
index 816ff9b..75c49be 100755
--- a/tools/layoutrom.py
+++ b/tools/layoutrom.py
@@ -248,7 +248,7 @@ def doLayout(sections, genreloc):
 ######################################################################
 
 # Write LD script includes for the given cross references
-def outXRefs(sections, useseg=0):
+def outXRefs(sections, useseg=0, exportsyms=[]):
     xrefs = {}
     out = ""
     for section in sections:
@@ -264,6 +264,16 @@ def outXRefs(sections, useseg=0):
             if useseg:
                 loc = symbol.section.finalsegloc
             out += "%s = 0x%x ;\n" % (reloc.symbolname, loc + symbol.offset)
+
+    for symbol in exportsyms:
+        if symbol.name in xrefs:
+            continue
+        xrefs[symbol.name] = 1
+        loc = symbol.section.finalloc
+        if useseg:
+            loc = symbol.section.finalsegloc
+        out += "%s = 0x%x ;\n" % (symbol.name, loc + symbol.offset)
+
     return out
 
 # Write LD script includes for the given sections using relative offsets
@@ -310,7 +320,7 @@ def getSectionsStart(sections, defaddr=0):
                 if section.finalloc is not None] or [defaddr])
 
 # Output the linker scripts for all required sections.
-def writeLinkerScripts(li, entrysym, genreloc, out16, out32seg, out32flat):
+def writeLinkerScripts(li, entrysym, genreloc, exportsyms, out16, out32seg, out32flat):
     # Write 16bit linker script
     out = outXRefs(li.sections16, useseg=1) + """
     datalow_base = 0x%x ;
@@ -361,7 +371,7 @@ def writeLinkerScripts(li, entrysym, genreloc, out16, out32seg, out32flat):
                     + strRelocs("_reloc_datalow", "code32flat_start", lowrelocs))
         numrelocs = len(absrelocs + relrelocs + initrelocs + lowrelocs)
         sec32all_start -= numrelocs * 4
-    out = outXRefs(sections32all) + """
+    out = outXRefs(sections32all, exportsyms=exportsyms) + """
     %s = 0x%x ;
     _reloc_min_align = 0x%x ;
     datalow_base = 0x%x ;
@@ -518,6 +528,7 @@ def parseObjDump(file, fileid):
     sectionmap = {}
     # symbols[symbolname] = symbol
     symbols = {}
+    exportsyms = {}
 
     state = None
     for line in file.readlines():
@@ -569,6 +580,9 @@ def parseObjDump(file, fileid):
                 symbol.name = name
                 symbol.section = sectionmap.get(sectionname)
                 symbols[name] = symbol
+                if ".export." in sectionname and sectionname != name:
+                    exportsyms[symbol] = symbol
+
             except ValueError:
                 pass
             continue
@@ -592,7 +606,7 @@ def parseObjDump(file, fileid):
                 relocsection.relocs.append(reloc)
             except ValueError:
                 pass
-    return sections, symbols
+    return sections, symbols, exportsyms
 
 def main():
     # Get output name
@@ -613,6 +627,7 @@ def main():
 
     # Separate 32bit flat into runtime and init parts
     findInit(sections)
+    exportsyms = dict(info16[2].items() + info32seg[2].items() + info32flat[2].items())
 
     # Note "low memory" parts
     for section in getSectionsPrefix(sections, '.datalow.'):
@@ -624,7 +639,7 @@ def main():
 
     # Write out linker script files.
     entrysym = info16[1]['entry_elf']
-    writeLinkerScripts(li, entrysym, genreloc, out16, out32seg, out32flat)
+    writeLinkerScripts(li, entrysym, genreloc, exportsyms, out16, out32seg, out32flat)
 
 if __name__ == '__main__':
     main()
-- 
1.8.0.2


-- 
dwmw2

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 6171 bytes
Desc: not available
URL: <http://www.seabios.org/pipermail/seabios/attachments/20130117/16bd1a30/attachment-0001.bin>


More information about the SeaBIOS mailing list