[lld] r304732 - [ELF] Define __dso_handle symbol if needed

Petr Hosek via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 5 13:42:34 PDT 2017


Author: phosek
Date: Mon Jun  5 15:42:34 2017
New Revision: 304732

URL: http://llvm.org/viewvc/llvm-project?rev=304732&view=rev
Log:
[ELF] Define __dso_handle symbol if needed

Traditionally, it has been defined in crtbegin.o, which is typically
provided by libgcc or as part of the C library on some systems. However,
but there's no principled reason for it to be there. We optionaly
define this symbol, which can be used on platforms that don't provide
__dso_handle in crtbegin.o or which don't use crtbegin.o at all.

Differential Revision: https://reviews.llvm.org/D33856

Added:
    lld/trunk/test/ELF/dso_handle.s
Modified:
    lld/trunk/ELF/Writer.cpp

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=304732&r1=304731&r2=304732&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Mon Jun  5 15:42:34 2017
@@ -907,6 +907,11 @@ template <class ELFT> void Writer<ELFT>:
   if (!InX::DynSymTab)
     Symtab<ELFT>::X->addIgnored("__tls_get_addr");
 
+  // __dso_handle symbol is passed to cxa_finalize as a marker to identify
+  // each DSO. The address of the symbol doesn't matter as long as they are
+  // different in different DSOs, so we chose the start address of the DSO.
+  addOptionalRegular<ELFT>("__dso_handle", Out::ElfHeader, 0, STV_HIDDEN);
+
   // __ehdr_start is the location of ELF file headers. Note that we define
   // this symbol unconditionally even when using a linker script, which
   // differs from the behavior implemented by GNU linker which only define

Added: lld/trunk/test/ELF/dso_handle.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/dso_handle.s?rev=304732&view=auto
==============================================================================
--- lld/trunk/test/ELF/dso_handle.s (added)
+++ lld/trunk/test/ELF/dso_handle.s Mon Jun  5 15:42:34 2017
@@ -0,0 +1,19 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: ld.lld -shared %t.o -o %t
+# RUN: llvm-readobj -symbols %t | FileCheck %s
+# CHECK:    Name: __dso_handle
+# CHECK-NEXT:    Value: 0x0
+# CHECK-NEXT:    Size: 0
+# CHECK-NEXT:    Binding: Local
+# CHECK-NEXT:    Type: None
+# CHECK-NEXT:    Other [
+# CHECK-NEXT:      STV_HIDDEN
+# CHECK-NEXT:    ]
+# CHECK-NEXT:    Section: .dynsym
+
+.text
+.global foo, __dso_handle
+foo:
+  lea __dso_handle(%rip),%rax




More information about the llvm-commits mailing list