From 2f6e3bc47112f6d0fc38f4898752a10d16630ba6 Mon Sep 17 00:00:00 2001 From: Amand Tihon Date: Sat, 15 Aug 2009 20:49:36 +0200 Subject: [PATCH] Check for external symbols. Verifies that all undefined symbols can actually be found in the shared libraries given on the command line. --- Bold/linker.py | 21 +++++++++++++++++++++ bold | 3 +++ 2 files changed, 24 insertions(+) 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() -- 2.39.2