
In ELF, relocatable files generated for x86-32 and some code models of x86-64 (medium, large) may reference the special symbol `_GLOBAL_OFFSET_TABLE_` that is not used in the IR. In an LTO link, if there is no regular relocatable file referencing the special symbol, the linker may not define the symbol and lead to a spurious "undefined symbol" error. Fix #61101: record that `_GLOBAL_OFFSET_TABLE_` is used in the IR symbol table. Note: The `PreservedSymbols` mechanism (https://reviews.llvm.org/D112595) that just sets `FB_used` is not applicable. The `getRuntimeLibcallSymbols` for extracting lazy runtime library symbols is for symbols that are "always" potentially used, but linkers don't have the code model information to make a precise decision. Pull Request: https://github.com/llvm/llvm-project/pull/89463
21 lines
614 B
LLVM
21 lines
614 B
LLVM
; RUN: llvm-as %s -o %t.o
|
|
; RUN: llvm-lto2 run -r %t.o,_start,px -r %t.o,_GLOBAL_OFFSET_TABLE_, %t.o -o %t.s
|
|
; RUN: llvm-objdump --no-print-imm-hex -d %t.s.0 | FileCheck %s --check-prefix=CHECK-LARGE
|
|
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
!llvm.module.flags = !{!0, !1}
|
|
|
|
!0 = !{i32 1, !"wchar_size", i32 4}
|
|
!1 = !{i32 1, !"Code Model", i32 4}
|
|
|
|
@data = internal constant [0 x i32] []
|
|
|
|
define ptr @_start() nounwind readonly {
|
|
entry:
|
|
; CHECK-LARGE-LABEL: <_start>:
|
|
; CHECK-LARGE: movabsq $0, %rax
|
|
ret ptr @data
|
|
}
|