]> git.alrj.org Git - bold.git/blobdiff - Bold/linker.py
Correct a "oh so stupid" bug.
[bold.git] / Bold / linker.py
index 0f447c1a8f470067ada9e65f504111a285f1a0e7..d80c110ad0f8e71a39bee8e4563bd9411741d81c 100644 (file)
@@ -18,6 +18,7 @@ from BinArray import BinArray
 from elf import Elf64, Elf64_Phdr, Elf64_Shdr, TextSegment, DataSegment
 from elf import SStrtab, SSymtab, SProgBits, SNobits, Dynamic, Interpreter
 from errors import *
+from ctypes import CDLL
 from ctypes.util import find_library
 import struct
 
@@ -125,17 +126,9 @@ class BoldLinker(object):
     fo.shdrs.append(data_shdr)
     fo.sections['.data'] = data_shdr
 
-    # .bss will contain pointers to resolved external functions, as well as
-    # the COMMON symbols (from C tentative declaration).
-    bss_size = len(symbols) * 8
-    for s_name, s_size, s_alignment in self.common_symbols:
-      padding = (s_alignment - (bss_size % s_alignment))
-      bss_size += padding + s_size
-
     bss_shdr = Elf64_Shdr()
     bss_shdr.sh_type = SHT_NOBITS
     bss_shdr.sh_flags = (SHF_WRITE | SHF_ALLOC)
-    bss_shdr.sh_size = bss_size
     bss_shdr.content = BinArray("")
     fo.shdrs.append(bss_shdr)
     fo.sections['.bss'] = bss_shdr
@@ -165,11 +158,12 @@ class BoldLinker(object):
     # The COMMON symbols. Assign an offset in .bss, declare as global.
     bss_common_offset = len(symbols) * 8
     for s_name, s_size, s_alignment in self.common_symbols:
-      padding = (s_alignment - (bss_common_offset % s_alignment))
+      padding = (s_alignment - (bss_common_offset % s_alignment)) % s_alignment
       bss_common_offset += padding
       fo.global_symbols[s_name] = (bss_shdr, bss_common_offset)
       bss_common_offset += s_size
 
+    bss_shdr.sh_size = bss_common_offset
 
     for n, i in enumerate(symbols):
       # The hash is always in .data
@@ -225,6 +219,26 @@ class BoldLinker(object):
     self.shlibs.append(fullname)
 
 
+  def check_external(self):
+    """Verify that all globally undefined symbols are present in shared
+    libraries."""
+    libs = []
+    for libname in self.shlibs:
+      libs.append(CDLL(libname))
+
+    for symbol in self.undefined_symbols:
+      # Hackish ! Eek!
+      if symbol.startswith('_bold__'):
+        continue
+      found = False
+      for lib in libs:
+        if hasattr(lib, symbol):
+          found = True
+          break
+      if not found:
+        raise UndefinedSymbol(symbol)
+
+
   def link(self):
     """Do the actual linking."""
     # Prepare two segments. One for .text, the other for .data + .bss