From: Amand Tihon Date: Sat, 15 Aug 2009 18:49:36 +0000 (+0200) Subject: Check for external symbols. X-Git-Tag: bold-0.2.0~3 X-Git-Url: https://git.alrj.org/?p=bold.git;a=commitdiff_plain;h=2f6e3bc47112f6d0fc38f4898752a10d16630ba6 Check for external symbols. Verifies that all undefined symbols can actually be found in the shared libraries given on the command line. --- diff --git a/Bold/linker.py b/Bold/linker.py index 0f447c1..625a28d 100644 --- a/Bold/linker.py +++ b/Bold/linker.py @@ -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 @@ -225,6 +226,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 diff --git a/bold b/bold index 74428bd..b33766d 100755 --- a/bold +++ b/bold @@ -121,6 +121,9 @@ def main(): try: linker.build_symbols_tables() + + linker.check_external() + linker.build_external(with_jump=options.ccall, align_jump=options.align) linker.link()