From d0e8fed3e065f6750c1ce403f655627e6da5a23b Mon Sep 17 00:00:00 2001 From: Daniel Grumberg Date: Tue, 25 Nov 2025 14:05:46 +0000 Subject: [PATCH] Include linker generated symbol in default defined set It seems like `_GLOBAL_OFFSET_TABLE_` is defined by the linker without being present in any object file on x86_64. There are a few other symbols that the linker automatically defines although we haven't run into issues with them. I am including the full list I gathered from lld's source code [1] by default. [1] https://github.com/llvm/llvm-project/blob/177e38286cd61a7b5a968636e1f147f128dd25a2/lld/ELF/Config.h#L632 --- Sources/BinarySymbols/ReferencedSymbols.swift | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Sources/BinarySymbols/ReferencedSymbols.swift b/Sources/BinarySymbols/ReferencedSymbols.swift index 13200282409..6bf33f1f504 100644 --- a/Sources/BinarySymbols/ReferencedSymbols.swift +++ b/Sources/BinarySymbols/ReferencedSymbols.swift @@ -13,7 +13,26 @@ package struct ReferencedSymbols { package private(set) var undefined: Set package init() { - self.defined = [] + // Some symbols are defined by linker directly by convention and need to be assumed defined. + // The list below was pulled from + // https://github.com/llvm/llvm-project/blob/177e38286cd61a7b5a968636e1f147f128dd25a2/lld/ELF/Config.h#L632 + self.defined = [ + "__bss_start", + "_etext", + "etext", + "_edata", + "edata", + "_end", + "end", + "_GLOBAL_OFFSET_TABLE_", + "_gp", + "_gp_disp", + "__gnu_local_gp", + "__global_pointer$", + "__rela_iplt_start", + "__rela_iplt_end", + "_TLS_MODULE_BASE", + ] self.undefined = [] }