forked from OSchip/llvm-project
lld: elf: discard more specific .gnu.linkonce section
Summary: lld discards .gnu.linonce.* sections work around a bug in glibc. https://sourceware.org/bugzilla/show_bug.cgi?id=20543 Unfortunately, the Linux kernel uses a section named .gnu.linkonce.this_module to store infomation about kernel modules. The kernel reads data from this section when loading kernel modules, and errors if it fails to find this section. The current behavior of lld discards this section when kernel modules are linked, so kernel modules linked with lld are unloadable by the linux kernel. The Linux kernel should use a comdat section instead of .gnu.linkonce. The minimum version of binutils supported by the kernel supports comdat sections. The kernel is also not relying on the old linkonce behavior; it seems to have chosen a name that contains a deprecated GNU feature. Changing the section name now in the kernel would require all kernel modules to be recompiled to make use of the new section name. Instead, rather than discarding .gnu.linkonce.*, let's discard the more specific section name to continue working around the glibc issue while supporting linking Linux kernel modules. Link: https://github.com/ClangBuiltLinux/linux/issues/329 Reviewers: pcc, espindola Reviewed By: pcc Subscribers: nathanchance, emaste, arichardson, void, srhines Differential Revision: https://reviews.llvm.org/D57294 llvm-svn: 352302
This commit is contained in:
parent
590c67507a
commit
6cff0cb35a
|
@ -733,7 +733,8 @@ InputSectionBase *ObjFile<ELFT>::createInputSection(const Elf_Shdr &Sec) {
|
|||
// sections. Drop those sections to avoid duplicate symbol errors.
|
||||
// FIXME: This is glibc PR20543, we should remove this hack once that has been
|
||||
// fixed for a while.
|
||||
if (Name.startswith(".gnu.linkonce."))
|
||||
if (Name == ".gnu.linkonce.t.__x86.get_pc_thunk.bx" ||
|
||||
Name == ".gnu.linkonce.t.__i686.get_pc_thunk.bx")
|
||||
return &InputSection::Discarded;
|
||||
|
||||
// If we are creating a new .build-id section, strip existing .build-id
|
||||
|
|
|
@ -4,7 +4,12 @@
|
|||
// RUN: ld.lld -shared %t.o %t2.o -o %t
|
||||
// RUN: ld.lld -shared %t2.o %t.o -o %t
|
||||
|
||||
.section .gnu.linkonce.t.zed
|
||||
.section .gnu.linkonce.t.__x86.get_pc_thunk.bx
|
||||
.globl abc
|
||||
abc:
|
||||
nop
|
||||
|
||||
.section .gnu.linkonce.t.__i686.get_pc_thunk.bx
|
||||
.globl def
|
||||
def:
|
||||
nop
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
// REQUIRES: x86
|
||||
// RUN: llvm-mc -filetype=obj -triple=x86_64-linux-gnu -save-temp-labels %s -o %t
|
||||
// RUN: ld.lld %t -o %t2
|
||||
// RUN: llvm-readobj -s -sd -t %t2 | FileCheck %s
|
||||
|
||||
.global _start
|
||||
_start:
|
||||
|
||||
// This section and symbol is used by Linux kernel modules. Ensure it's not
|
||||
// accidentally discarded.
|
||||
.section .gnu.linkonce.this_module:
|
||||
__this_module:
|
||||
.byte 0x00
|
||||
|
||||
// CHECK: Section {
|
||||
// CHECK: Index:
|
||||
// CHECK: Name: .gnu.linkonce.this_module
|
||||
// CHECK-NEXT: Type: SHT_PROGBITS
|
||||
// CHECK-NEXT: Flags [
|
||||
// CHECK-NEXT: ]
|
||||
// CHECK-NEXT: Address:
|
||||
// CHECK-NEXT: Offset:
|
||||
// CHECK-NEXT: Size:
|
||||
// CHECK-NEXT: Link:
|
||||
// CHECK-NEXT: Info:
|
||||
// CHECK-NEXT: AddressAlignment:
|
||||
// CHECK-NEXT: EntrySize:
|
||||
// CHECK-NEXT: SectionData (
|
||||
// CHECK-NEXT: 0000: 00 |.|
|
||||
// CHECK-NEXT: )
|
||||
// CHECK-NEXT: }
|
||||
|
||||
// CHECK: Symbol {
|
||||
// CHECK: Name: __this_module
|
||||
// CHECK-NEXT: Value:
|
||||
// CHECK-NEXT: Size:
|
||||
// CHECK-NEXT: Binding: Local
|
||||
// CHECK-NEXT: Type: None
|
||||
// CHECK-NEXT: Other:
|
||||
// CHECK-NEXT: Section: .gnu.linkonce.this_module:
|
||||
// CHECK-NEXT: }
|
Loading…
Reference in New Issue