[PATCH] D33856: [ELF] Define __dso_handle symbol if needed

Petr Hosek via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 2 17:02:04 PDT 2017


phosek created this revision.
phosek added a project: lld.
Herald added a subscriber: emaste.

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 optionally 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.


Repository:
  rL LLVM

https://reviews.llvm.org/D33856

Files:
  ELF/Writer.cpp
  test/ELF/dso_handle.s


Index: test/ELF/dso_handle.s
===================================================================
--- /dev/null
+++ test/ELF/dso_handle.s
@@ -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
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -910,6 +910,11 @@
   if (!InX::DynSymTab)
     Symtab<ELFT>::X->addIgnored("__tls_get_addr");
 
+  // __dso_handle symbol is mandated by C++ ABI with a value which is an
+  // address in one of the object's segments, and as such this symbol has to be
+  // included statically and cannot be a part of a shared library.
+  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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D33856.101295.patch
Type: text/x-patch
Size: 1412 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170603/391c78db/attachment.bin>


More information about the llvm-commits mailing list