From d7008692355f5029ffc6360d25574e65613d63af Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 17 Jan 2018 19:19:55 +0000 Subject: Use a got to access a hidden weak undefined on MachO. Trying to link __attribute__((weak, visibility("hidden"))) extern int foo; int *main(void) { return &foo; } on OS X fails with ld: 32-bit RIP relative reference out of range (-4294971318 max is +/-2GB): from _main (0x100000FAB) to _foo@0x00001000 (0x00000000) in '_main' from test.o for architecture x86_64 The problem being that 0 cannot be computed as a fixed difference from %rip. Exactly the same issue exists on ELF and we can use the same solution. llvm-svn: 322739 --- llvm/lib/Target/TargetMachine.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'llvm/lib/Target/TargetMachine.cpp') diff --git a/llvm/lib/Target/TargetMachine.cpp b/llvm/lib/Target/TargetMachine.cpp index 8e3a818690f..ee5b010ecf2 100644 --- a/llvm/lib/Target/TargetMachine.cpp +++ b/llvm/lib/Target/TargetMachine.cpp @@ -141,9 +141,7 @@ bool TargetMachine::shouldAssumeDSOLocal(const Module &M, // produce a 0 if it turns out the symbol is undefined. While this // is ABI and relocation depended, it seems worth it to handle it // here. - // FIXME: this is probably not ELF specific. - if (GV && isPositionIndependent() && TT.isOSBinFormatELF() && - GV->hasExternalWeakLinkage()) + if (GV && isPositionIndependent() && GV->hasExternalWeakLinkage()) return false; if (GV && !GV->hasDefaultVisibility()) -- cgit v1.2.3