[arch-commits] Commit in lld/repos/extra-x86_64 (6 files)

Evangelos Foutras foutrelis at archlinux.org
Fri Sep 11 04:37:26 UTC 2020


    Date: Friday, September 11, 2020 @ 04:37:24
  Author: foutrelis
Revision: 395759

archrelease: copy trunk to extra-x86_64

Added:
  lld/repos/extra-x86_64/PKGBUILD
    (from rev 395758, lld/trunk/PKGBUILD)
  lld/repos/extra-x86_64/respect-versioned-undefined-symbols.patch
    (from rev 395758, lld/trunk/respect-versioned-undefined-symbols.patch)
  lld/repos/extra-x86_64/sphinx2.patch
    (from rev 395758, lld/trunk/sphinx2.patch)
Deleted:
  lld/repos/extra-x86_64/PKGBUILD
  lld/repos/extra-x86_64/respect-versioned-undefined-symbols.patch
  lld/repos/extra-x86_64/sphinx2.patch

-------------------------------------------+
 PKGBUILD                                  |  143 ++---
 respect-versioned-undefined-symbols.patch |  696 ++++++++++++++--------------
 sphinx2.patch                             |   26 -
 3 files changed, 434 insertions(+), 431 deletions(-)

Deleted: PKGBUILD
===================================================================
--- PKGBUILD	2020-09-11 04:37:18 UTC (rev 395758)
+++ PKGBUILD	2020-09-11 04:37:24 UTC (rev 395759)
@@ -1,70 +0,0 @@
-# Maintainer: Evangelos Foutras <evangelos at foutrelis.com>
-# Contributor: Jan "heftig" Steffens <jan.steffens at gmail.com>
-
-pkgname=lld
-pkgver=10.0.1
-pkgrel=1
-pkgdesc="Linker from the LLVM project"
-arch=('x86_64')
-url="https://lld.llvm.org/"
-license=('custom:Apache 2.0 with LLVM Exception')
-depends=('llvm-libs')
-makedepends=('llvm' 'cmake' 'ninja' 'python-sphinx')
-_source_base=https://github.com/llvm/llvm-project/releases/download/llvmorg-$pkgver
-source=($_source_base/$pkgname-$pkgver.src.tar.xz{,.sig}
-        $_source_base/llvm-$pkgver.src.tar.xz{,.sig}
-        respect-versioned-undefined-symbols.patch
-        sphinx2.patch)
-sha256sums=('591449e0aa623a6318d5ce2371860401653c48bb540982ccdd933992cb88df7a'
-            'SKIP'
-            'c5d8e30b57cbded7128d78e5e8dad811bff97a8d471896812f57fa99ee82cdf3'
-            'SKIP'
-            'd5e6f2e60a35d9cc4a791b0ae35ac9634217bbe7f1bea316062c2af226ba786b'
-            '7f7cca66a16c5a4aca132bfa1d86a7a2ff33612ec47d3422dc91ad4cc1810646')
-validpgpkeys+=('B6C8F98282B944E3B0D5C2530FC3042E345AD05D') # Hans Wennborg <hans at chromium.org>
-validpgpkeys+=('474E22316ABF4785A88C6E8EA2C794A986419D8A') # Tom Stellard <tstellar at redhat.com>
-
-prepare() {
-  cd "$srcdir/$pkgname-$pkgver.src"
-  mkdir build
-
-  # https://bugs.llvm.org/show_bug.cgi?id=44842
-  patch -Np2 -i ../respect-versioned-undefined-symbols.patch
-
-  # https://bugs.llvm.org/show_bug.cgi?id=41789
-  patch -Np1 -i ../sphinx2.patch
-}
-
-build() {
-  cd "$srcdir/$pkgname-$pkgver.src/build"
-
-  cmake .. -G Ninja \
-    -DCMAKE_BUILD_TYPE=Release \
-    -DCMAKE_INSTALL_PREFIX=/usr \
-    -DPYTHON_EXECUTABLE=/usr/bin/python \
-    -DLLVM_LINK_LLVM_DYLIB=ON \
-    -DLLVM_INCLUDE_TESTS=ON \
-    -DLLVM_BUILD_TESTS=ON \
-    -DLLVM_BUILD_DOCS=ON \
-    -DLLVM_ENABLE_SPHINX=ON \
-    -DLLVM_EXTERNAL_LIT=/usr/bin/lit \
-    -DLLVM_MAIN_SRC_DIR="$srcdir/llvm-$pkgver.src"
-  ninja
-}
-
-check() {
-  cd "$srcdir/$pkgname-$pkgver.src/build"
-  ninja check-lld
-}
-
-package() {
-  cd "$srcdir/$pkgname-$pkgver.src/build"
-
-  DESTDIR="$pkgdir" ninja install
-  install -Dm644 ../LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
-
-  # Remove documentation sources
-  rm -r "$pkgdir"/usr/share/doc/$pkgname/html/{_sources,.buildinfo}
-}
-
-# vim:set ts=2 sw=2 et:

Copied: lld/repos/extra-x86_64/PKGBUILD (from rev 395758, lld/trunk/PKGBUILD)
===================================================================
--- PKGBUILD	                        (rev 0)
+++ PKGBUILD	2020-09-11 04:37:24 UTC (rev 395759)
@@ -0,0 +1,73 @@
+# Maintainer: Evangelos Foutras <evangelos at foutrelis.com>
+# Contributor: Jan "heftig" Steffens <jan.steffens at gmail.com>
+
+pkgname=lld
+pkgver=10.0.1
+pkgrel=2
+pkgdesc="Linker from the LLVM project"
+arch=('x86_64')
+url="https://lld.llvm.org/"
+license=('custom:Apache 2.0 with LLVM Exception')
+depends=('llvm-libs')
+makedepends=('llvm' 'cmake' 'ninja' 'python-sphinx')
+_source_base=https://github.com/llvm/llvm-project/releases/download/llvmorg-$pkgver
+source=($_source_base/$pkgname-$pkgver.src.tar.xz{,.sig}
+        $_source_base/llvm-$pkgver.src.tar.xz{,.sig}
+        respect-versioned-undefined-symbols.patch
+        sphinx2.patch)
+sha256sums=('591449e0aa623a6318d5ce2371860401653c48bb540982ccdd933992cb88df7a'
+            'SKIP'
+            'c5d8e30b57cbded7128d78e5e8dad811bff97a8d471896812f57fa99ee82cdf3'
+            'SKIP'
+            'd5e6f2e60a35d9cc4a791b0ae35ac9634217bbe7f1bea316062c2af226ba786b'
+            '7f7cca66a16c5a4aca132bfa1d86a7a2ff33612ec47d3422dc91ad4cc1810646')
+validpgpkeys+=('B6C8F98282B944E3B0D5C2530FC3042E345AD05D') # Hans Wennborg <hans at chromium.org>
+validpgpkeys+=('474E22316ABF4785A88C6E8EA2C794A986419D8A') # Tom Stellard <tstellar at redhat.com>
+
+prepare() {
+  cd "$srcdir/$pkgname-$pkgver.src"
+  mkdir build
+
+  # https://bugs.llvm.org/show_bug.cgi?id=44842
+  patch -Np2 -i ../respect-versioned-undefined-symbols.patch
+
+  # https://bugs.llvm.org/show_bug.cgi?id=41789
+  patch -Np1 -i ../sphinx2.patch
+}
+
+build() {
+  cd "$srcdir/$pkgname-$pkgver.src/build"
+
+  cmake .. -G Ninja \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DCMAKE_INSTALL_PREFIX=/usr \
+    -DPYTHON_EXECUTABLE=/usr/bin/python \
+    -DLLVM_LINK_LLVM_DYLIB=ON \
+    -DLLVM_INCLUDE_TESTS=ON \
+    -DLLVM_BUILD_TESTS=ON \
+    -DLLVM_BUILD_DOCS=ON \
+    -DLLVM_ENABLE_SPHINX=ON \
+    -DLLVM_EXTERNAL_LIT=/usr/bin/lit \
+    -DLLVM_MAIN_SRC_DIR="$srcdir/llvm-$pkgver.src"
+  ninja
+}
+
+check() {
+  cd "$srcdir/$pkgname-$pkgver.src/build"
+  ninja check-lld
+}
+
+package() {
+  cd "$srcdir/$pkgname-$pkgver.src/build"
+
+  DESTDIR="$pkgdir" ninja install
+  install -Dm644 ../LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
+
+  # https://bugs.llvm.org/show_bug.cgi?id=42455
+  install -Dm644 -t "$pkgdir/usr/share/man/man1" ../docs/ld.lld.1
+
+  # Remove documentation sources
+  rm -r "$pkgdir"/usr/share/doc/$pkgname/html/{_sources,.buildinfo}
+}
+
+# vim:set ts=2 sw=2 et:

Deleted: respect-versioned-undefined-symbols.patch
===================================================================
--- respect-versioned-undefined-symbols.patch	2020-09-11 04:37:18 UTC (rev 395758)
+++ respect-versioned-undefined-symbols.patch	2020-09-11 04:37:24 UTC (rev 395759)
@@ -1,348 +0,0 @@
-From 0156f360b82c55ebcb92c44a9380e3e30af2fffa Mon Sep 17 00:00:00 2001
-From: Fangrui Song <maskray at google.com>
-Date: Mon, 18 May 2020 10:15:59 -0700
-Subject: [PATCH 1/2] [ELF] Make --trace-symbol track preempted shared
- definitions
-
-Note, we still name a preempted SharedSymbol "shared definition",
-instead of "reference" as printed by GNU ld. This difference should not matter.
-
-```
-// GNU ld
-ld.bfd: t: definition of f at v1
-ld.bfd: t.so: reference to f at v1
-```
-
-Reviewed By: psmith
-
-Differential Revision: https://reviews.llvm.org/D80143
-
-(cherry picked from commit 64676499741cb985146ab982a67da859ff8f4f4d)
----
- lld/ELF/Symbols.cpp          | 3 ++-
- lld/test/ELF/trace-symbols.s | 5 +++++
- 2 files changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
-index 0dcf34722d3..4c7bc0f28c0 100644
---- a/lld/ELF/Symbols.cpp
-+++ b/lld/ELF/Symbols.cpp
-@@ -688,7 +688,8 @@ void Symbol::resolveShared(const SharedSymbol &other) {
-     replace(other);
-     binding = bind;
-     referenced = true;
--  }
-+  } else if (traced)
-+    printTraceSymbol(&other);
- }
- 
- } // namespace elf
-diff --git a/lld/test/ELF/trace-symbols.s b/lld/test/ELF/trace-symbols.s
-index b6f8bea79d1..f5211b367eb 100644
---- a/lld/test/ELF/trace-symbols.s
-+++ b/lld/test/ELF/trace-symbols.s
-@@ -13,6 +13,11 @@
- # RUN: rm -f %t2.a
- # RUN: llvm-ar rcs %t2.a %t2
- 
-+# RUN: ld.lld -y foo -shared %t1 %t1.so -o /dev/null | \
-+# RUN:   FileCheck --check-prefix=PREEMPT %s --implicit-check-not=foo
-+# PREEMPT:      trace-symbols.s.tmp1: definition of foo
-+# PREEMPT-NEXT: trace-symbols.s.tmp1.so: shared definition of foo
-+
- # RUN: ld.lld -y foo -trace-symbol common -trace-symbol=hsymbol \
- # RUN:   %t %t1 %t2 -o %t3 | FileCheck -check-prefix=OBJECTRFOO %s
- # OBJECTRFOO: trace-symbols.s.tmp: reference to foo
-
-From 7940788867bea8fabc929d714841476356726399 Mon Sep 17 00:00:00 2001
-From: Fangrui Song <maskray at google.com>
-Date: Fri, 15 May 2020 20:36:41 -0700
-Subject: [PATCH 2/2] [ELF] Parse SHT_GNU_verneed and respect versioned
- undefined symbols in shared objects
-
-An undefined symbol in a shared object can be versioned, like `f at v1`.
-We currently insert `f` as an Undefined into the symbol table, but we
-should insert `f at v1` instead.
-
-The string `v1` is inferred from SHT_GNU_versym and SHT_GNU_verneed.
-This patch implements the functionality.
-
-Failing to do this can cause two issues:
-
-* If a versioned symbol referenced by a shared object is defined in the
-  executable, we will fail to export it.
-* If a versioned symbol referenced by a shared object in another object
-  file, --no-allow-shlib-undefined may spuriously report an
-  "undefined reference to " error. See https://bugs.llvm.org/show_bug.cgi?id=44842
-  (Linking -lfftw3 -lm on Arch Linux can cause
-  `undefined reference to __log_finite`)
-
-Reviewed By: grimar
-
-Differential Revision: https://reviews.llvm.org/D80059
-
-(cherry picked from commit e32f04cdc95224589f30148599c362ba37bae7b6)
----
- lld/ELF/InputFiles.cpp                   | 59 +++++++++++++++++-
- lld/ELF/InputFiles.h                     |  5 ++
- lld/test/ELF/invalid/verneed-shared.yaml | 79 ++++++++++++++++++++++++
- lld/test/ELF/verneed-shared.s            | 37 +++++++++++
- 4 files changed, 178 insertions(+), 2 deletions(-)
- create mode 100644 lld/test/ELF/invalid/verneed-shared.yaml
- create mode 100644 lld/test/ELF/verneed-shared.s
-
-diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
-index 43978cd66c6..ddfb24888ce 100644
---- a/lld/ELF/InputFiles.cpp
-+++ b/lld/ELF/InputFiles.cpp
-@@ -1179,6 +1179,42 @@ static std::vector<const void *> parseVerdefs(const uint8_t *base,
-   return verdefs;
- }
- 
-+// Parse SHT_GNU_verneed to properly set the name of a versioned undefined
-+// symbol. We detect fatal issues which would cause vulnerabilities, but do not
-+// implement sophisticated error checking like in llvm-readobj because the value
-+// of such diagnostics is low.
-+template <typename ELFT>
-+std::vector<uint32_t> SharedFile::parseVerneed(const ELFFile<ELFT> &obj,
-+                                               const typename ELFT::Shdr *sec) {
-+  if (!sec)
-+    return {};
-+  std::vector<uint32_t> verneeds;
-+  ArrayRef<uint8_t> data = CHECK(obj.getSectionContents(sec), this);
-+  const uint8_t *verneedBuf = data.begin();
-+  for (unsigned i = 0; i != sec->sh_info; ++i) {
-+    if (verneedBuf + sizeof(typename ELFT::Verneed) > data.end() ||
-+        uintptr_t(verneedBuf) % sizeof(uint32_t) != 0)
-+      fatal(toString(this) + " has an invalid Verneed");
-+    auto *vn = reinterpret_cast<const typename ELFT::Verneed *>(verneedBuf);
-+    const uint8_t *vernauxBuf = verneedBuf + vn->vn_aux;
-+    for (unsigned j = 0; j != vn->vn_cnt; ++j) {
-+      if (vernauxBuf + sizeof(typename ELFT::Vernaux) > data.end() ||
-+          uintptr_t(vernauxBuf) % sizeof(uint32_t) != 0)
-+        fatal(toString(this) + " has an invalid Vernaux");
-+      auto *aux = reinterpret_cast<const typename ELFT::Vernaux *>(vernauxBuf);
-+      if (aux->vna_name >= this->stringTable.size())
-+        fatal(toString(this) + " has a Vernaux with an invalid vna_name");
-+      uint16_t version = aux->vna_other & VERSYM_VERSION;
-+      if (version >= verneeds.size())
-+        verneeds.resize(version + 1);
-+      verneeds[version] = aux->vna_name;
-+      vernauxBuf += aux->vna_next;
-+    }
-+    verneedBuf += vn->vn_next;
-+  }
-+  return verneeds;
-+}
-+
- // We do not usually care about alignments of data in shared object
- // files because the loader takes care of it. However, if we promote a
- // DSO symbol to point to .bss due to copy relocation, we need to keep
-@@ -1222,6 +1258,7 @@ template <class ELFT> void SharedFile::parse() {
- 
-   const Elf_Shdr *versymSec = nullptr;
-   const Elf_Shdr *verdefSec = nullptr;
-+  const Elf_Shdr *verneedSec = nullptr;
- 
-   // Search for .dynsym, .dynamic, .symtab, .gnu.version and .gnu.version_d.
-   for (const Elf_Shdr &sec : sections) {
-@@ -1238,6 +1275,9 @@ template <class ELFT> void SharedFile::parse() {
-     case SHT_GNU_verdef:
-       verdefSec = &sec;
-       break;
-+    case SHT_GNU_verneed:
-+      verneedSec = &sec;
-+      break;
-     }
-   }
- 
-@@ -1277,12 +1317,13 @@ template <class ELFT> void SharedFile::parse() {
-   sharedFiles.push_back(this);
- 
-   verdefs = parseVerdefs<ELFT>(obj.base(), verdefSec);
-+  std::vector<uint32_t> verneeds = parseVerneed<ELFT>(obj, verneedSec);
- 
-   // Parse ".gnu.version" section which is a parallel array for the symbol
-   // table. If a given file doesn't have a ".gnu.version" section, we use
-   // VER_NDX_GLOBAL.
-   size_t size = numELFSyms - firstGlobal;
--  std::vector<uint32_t> versyms(size, VER_NDX_GLOBAL);
-+  std::vector<uint16_t> versyms(size, VER_NDX_GLOBAL);
-   if (versymSec) {
-     ArrayRef<Elf_Versym> versym =
-         CHECK(obj.template getSectionContentsAsArray<Elf_Versym>(versymSec),
-@@ -1313,7 +1354,22 @@ template <class ELFT> void SharedFile::parse() {
-       continue;
-     }
- 
-+    uint16_t idx = versyms[i] & ~VERSYM_HIDDEN;
-     if (sym.isUndefined()) {
-+      // For unversioned undefined symbols, VER_NDX_GLOBAL makes more sense but
-+      // as of binutils 2.34, GNU ld produces VER_NDX_LOCAL.
-+      if (idx != VER_NDX_LOCAL && idx != VER_NDX_GLOBAL) {
-+        if (idx >= verneeds.size()) {
-+          error("corrupt input file: version need index " + Twine(idx) +
-+                " for symbol " + name + " is out of bounds\n>>> defined in " +
-+                toString(this));
-+          continue;
-+        }
-+        StringRef verName = this->stringTable.data() + verneeds[idx];
-+        versionedNameBuffer.clear();
-+        name =
-+            saver.save((name + "@" + verName).toStringRef(versionedNameBuffer));
-+      }
-       Symbol *s = symtab->addSymbol(
-           Undefined{this, name, sym.getBinding(), sym.st_other, sym.getType()});
-       s->exportDynamic = true;
-@@ -1323,7 +1379,6 @@ template <class ELFT> void SharedFile::parse() {
-     // MIPS BFD linker puts _gp_disp symbol into DSO files and incorrectly
-     // assigns VER_NDX_LOCAL to this section global symbol. Here is a
-     // workaround for this bug.
--    uint32_t idx = versyms[i] & ~VERSYM_HIDDEN;
-     if (config->emachine == EM_MIPS && idx == VER_NDX_LOCAL &&
-         name == "_gp_disp")
-       continue;
-diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h
-index a310ba551bd..2d91c01bf48 100644
---- a/lld/ELF/InputFiles.h
-+++ b/lld/ELF/InputFiles.h
-@@ -366,6 +366,11 @@ public:
- 
-   // Used for --as-needed
-   bool isNeeded;
-+
-+private:
-+  template <typename ELFT>
-+  std::vector<uint32_t> parseVerneed(const llvm::object::ELFFile<ELFT> &obj,
-+                                     const typename ELFT::Shdr *sec);
- };
- 
- class BinaryFile : public InputFile {
-diff --git a/lld/test/ELF/invalid/verneed-shared.yaml b/lld/test/ELF/invalid/verneed-shared.yaml
-new file mode 100644
-index 00000000000..18315fe8a2d
---- /dev/null
-+++ b/lld/test/ELF/invalid/verneed-shared.yaml
-@@ -0,0 +1,79 @@
-+## REQUIRES: x86
-+## Test that we can parse SHT_GNU_verneed in a shared object and report certain errors.
-+
-+# RUN: echo '.globl _start; _start:' | llvm-mc -filetype=obj -triple=x86_64 - -o %t.o
-+
-+## sh_offset(SHT_GNU_verneed) is out of bounds.
-+# RUN: yaml2obj --docnum=1 %s -o %t1.so
-+# RUN: not ld.lld %t.o %t1.so -o /dev/null 2>&1 | FileCheck --check-prefix=SHOFFSET %s
-+# SHOFFSET: error: {{.*}}.so: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x0) that is greater than the file size (0x228)
-+--- !ELF
-+FileHeader:
-+  Class:   ELFCLASS64
-+  Data:    ELFDATA2LSB
-+  Type:    ET_DYN
-+  Machine: EM_X86_64
-+Sections:
-+  - Name:  .gnu.version_r
-+    Type:  SHT_GNU_verneed
-+    Flags: [ SHF_ALLOC ]
-+    ShOffset: 0xFFFFFFFF
-+
-+## A Verneed entry is misaligned (not a multiple of 4).
-+# RUN: yaml2obj --docnum=2 %s -o %t2.so
-+# RUN: not ld.lld %t.o %t2.so -o /dev/null 2>&1 | FileCheck --check-prefix=VN-MISALIGNED %s
-+# VN-MISALIGNED: {{.*}}.so has an invalid Verneed
-+--- !ELF
-+FileHeader:
-+  Class:   ELFCLASS64
-+  Data:    ELFDATA2LSB
-+  Type:    ET_DYN
-+  Machine: EM_X86_64
-+Sections:
-+  - Type: Fill
-+    Size: 0x1
-+  - Name:  .gnu.version_r
-+    Type:  SHT_GNU_verneed
-+    Flags: [ SHF_ALLOC ]
-+    Info:  1
-+    Link:  .dynstr
-+    Dependencies:
-+      - Version: 1
-+        File:    foo
-+        Entries:
-+          - Name:  'foo'
-+            Hash:  0
-+            Flags: 0
-+            Other: 0
-+DynamicSymbols:
-+  - Name: foo
-+
-+## vn_aux points to a place outside of the file.
-+# RUN: yaml2obj --docnum=3 -D VERNEED=0100010001000000040200000000000000000000 %s -o %t3.so
-+# RUN: not ld.lld %t.o %t3.so -o /dev/null 2>&1 | FileCheck --check-prefix=AUX-OOB %s
-+# AUX-OOB: {{.*}}.so has an invalid Vernaux
-+--- !ELF
-+FileHeader:
-+  Class:   ELFCLASS64
-+  Data:    ELFDATA2LSB
-+  Type:    ET_DYN
-+  Machine: EM_X86_64
-+Sections:
-+  - Name:  .gnu.version_r
-+    Type:  SHT_GNU_verneed
-+    Flags: [ SHF_ALLOC ]
-+    Info:  1
-+    Link:  .dynstr
-+    Content: "[[VERNEED]]"
-+DynamicSymbols:
-+  - Name: foo
-+
-+## vn_aux is misaligned.
-+# RUN: yaml2obj --docnum=3 -D VERNEED=0100010001000000110000000000000000000000 %s -o %t4.so
-+# RUN: not ld.lld %t.o %t4.so -o /dev/null 2>&1 | FileCheck --check-prefix=AUX-MISALIGNED %s
-+# AUX-MISALIGNED: {{.*}}.so has an invalid Vernaux
-+
-+## vna_name is out of bounds.
-+# RUN: yaml2obj --docnum=3 -D VERNEED=010001000000000010000000000000009107000000000000ff00000000000000 %s -o %t5.so
-+# RUN: not ld.lld %t.o %t5.so -o /dev/null 2>&1 | FileCheck --check-prefix=NAME-OOB %s
-+# NAME-OOB: {{.*}}.so has a Vernaux with an invalid vna_name
-diff --git a/lld/test/ELF/verneed-shared.s b/lld/test/ELF/verneed-shared.s
-new file mode 100644
-index 00000000000..218f43c2545
---- /dev/null
-+++ b/lld/test/ELF/verneed-shared.s
-@@ -0,0 +1,37 @@
-+# REQUIRES: x86
-+# RUN: echo 'v1 { f; }; v2 { g; };' > %t.ver
-+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
-+# RUN: ld.lld -shared --version-script %t.ver %t.o -o %t.so
-+
-+# RUN: ld.lld --version-script %t.ver %t.o %t.so -o /dev/null -y f at v1 | \
-+# RUN:   FileCheck --check-prefix=TRACE %s --implicit-check-not=f at v1
-+
-+## TRACE:      {{.*}}.o: definition of f at v1
-+## TRACE-NEXT: {{.*}}.so: shared definition of f at v1
-+
-+# RUN: echo '.symver f,f at v1; .symver g,g at v2; call f; call g' | \
-+# RUN:   llvm-mc -filetype=obj -triple=x86_64 - -o %t1.o
-+# RUN: ld.lld -shared %t1.o %t.so -o %t1.so
-+
-+## Test that we can parse SHT_GNU_verneed to know that the undefined symbols in
-+## %t1.so are called 'f at v1' and 'g at v2', which can be satisfied by the executable.
-+## We will thus export the symbols.
-+# RUN: ld.lld -pie %t.o %t1.so -o %t
-+# RUN: llvm-nm -D %t | FileCheck --check-prefix=NM %s
-+
-+# NM: T f
-+# NM: T g
-+
-+## The default is --no-allow-shlib-undefined.
-+## Don't error because undefined symbols in %t1.so are satisfied by %t.so
-+# RUN: llvm-mc -filetype=obj -triple=x86_64 /dev/null -o %t2.o
-+# RUN: ld.lld %t2.o %t1.so %t.so -y f at v1 -o /dev/null | FileCheck %s
-+
-+# CHECK:      {{.*}}1.so: reference to f at v1
-+# CHECK-NEXT: {{.*}}.so: shared definition of f at v1
-+
-+.globl f_v1, g_v2
-+.symver f_v1,f at v1
-+.symver g_v2,g at v2
-+f_v1:
-+g_v2:

Copied: lld/repos/extra-x86_64/respect-versioned-undefined-symbols.patch (from rev 395758, lld/trunk/respect-versioned-undefined-symbols.patch)
===================================================================
--- respect-versioned-undefined-symbols.patch	                        (rev 0)
+++ respect-versioned-undefined-symbols.patch	2020-09-11 04:37:24 UTC (rev 395759)
@@ -0,0 +1,348 @@
+From 0156f360b82c55ebcb92c44a9380e3e30af2fffa Mon Sep 17 00:00:00 2001
+From: Fangrui Song <maskray at google.com>
+Date: Mon, 18 May 2020 10:15:59 -0700
+Subject: [PATCH 1/2] [ELF] Make --trace-symbol track preempted shared
+ definitions
+
+Note, we still name a preempted SharedSymbol "shared definition",
+instead of "reference" as printed by GNU ld. This difference should not matter.
+
+```
+// GNU ld
+ld.bfd: t: definition of f at v1
+ld.bfd: t.so: reference to f at v1
+```
+
+Reviewed By: psmith
+
+Differential Revision: https://reviews.llvm.org/D80143
+
+(cherry picked from commit 64676499741cb985146ab982a67da859ff8f4f4d)
+---
+ lld/ELF/Symbols.cpp          | 3 ++-
+ lld/test/ELF/trace-symbols.s | 5 +++++
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
+index 0dcf34722d3..4c7bc0f28c0 100644
+--- a/lld/ELF/Symbols.cpp
++++ b/lld/ELF/Symbols.cpp
+@@ -688,7 +688,8 @@ void Symbol::resolveShared(const SharedSymbol &other) {
+     replace(other);
+     binding = bind;
+     referenced = true;
+-  }
++  } else if (traced)
++    printTraceSymbol(&other);
+ }
+ 
+ } // namespace elf
+diff --git a/lld/test/ELF/trace-symbols.s b/lld/test/ELF/trace-symbols.s
+index b6f8bea79d1..f5211b367eb 100644
+--- a/lld/test/ELF/trace-symbols.s
++++ b/lld/test/ELF/trace-symbols.s
+@@ -13,6 +13,11 @@
+ # RUN: rm -f %t2.a
+ # RUN: llvm-ar rcs %t2.a %t2
+ 
++# RUN: ld.lld -y foo -shared %t1 %t1.so -o /dev/null | \
++# RUN:   FileCheck --check-prefix=PREEMPT %s --implicit-check-not=foo
++# PREEMPT:      trace-symbols.s.tmp1: definition of foo
++# PREEMPT-NEXT: trace-symbols.s.tmp1.so: shared definition of foo
++
+ # RUN: ld.lld -y foo -trace-symbol common -trace-symbol=hsymbol \
+ # RUN:   %t %t1 %t2 -o %t3 | FileCheck -check-prefix=OBJECTRFOO %s
+ # OBJECTRFOO: trace-symbols.s.tmp: reference to foo
+
+From 7940788867bea8fabc929d714841476356726399 Mon Sep 17 00:00:00 2001
+From: Fangrui Song <maskray at google.com>
+Date: Fri, 15 May 2020 20:36:41 -0700
+Subject: [PATCH 2/2] [ELF] Parse SHT_GNU_verneed and respect versioned
+ undefined symbols in shared objects
+
+An undefined symbol in a shared object can be versioned, like `f at v1`.
+We currently insert `f` as an Undefined into the symbol table, but we
+should insert `f at v1` instead.
+
+The string `v1` is inferred from SHT_GNU_versym and SHT_GNU_verneed.
+This patch implements the functionality.
+
+Failing to do this can cause two issues:
+
+* If a versioned symbol referenced by a shared object is defined in the
+  executable, we will fail to export it.
+* If a versioned symbol referenced by a shared object in another object
+  file, --no-allow-shlib-undefined may spuriously report an
+  "undefined reference to " error. See https://bugs.llvm.org/show_bug.cgi?id=44842
+  (Linking -lfftw3 -lm on Arch Linux can cause
+  `undefined reference to __log_finite`)
+
+Reviewed By: grimar
+
+Differential Revision: https://reviews.llvm.org/D80059
+
+(cherry picked from commit e32f04cdc95224589f30148599c362ba37bae7b6)
+---
+ lld/ELF/InputFiles.cpp                   | 59 +++++++++++++++++-
+ lld/ELF/InputFiles.h                     |  5 ++
+ lld/test/ELF/invalid/verneed-shared.yaml | 79 ++++++++++++++++++++++++
+ lld/test/ELF/verneed-shared.s            | 37 +++++++++++
+ 4 files changed, 178 insertions(+), 2 deletions(-)
+ create mode 100644 lld/test/ELF/invalid/verneed-shared.yaml
+ create mode 100644 lld/test/ELF/verneed-shared.s
+
+diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
+index 43978cd66c6..ddfb24888ce 100644
+--- a/lld/ELF/InputFiles.cpp
++++ b/lld/ELF/InputFiles.cpp
+@@ -1179,6 +1179,42 @@ static std::vector<const void *> parseVerdefs(const uint8_t *base,
+   return verdefs;
+ }
+ 
++// Parse SHT_GNU_verneed to properly set the name of a versioned undefined
++// symbol. We detect fatal issues which would cause vulnerabilities, but do not
++// implement sophisticated error checking like in llvm-readobj because the value
++// of such diagnostics is low.
++template <typename ELFT>
++std::vector<uint32_t> SharedFile::parseVerneed(const ELFFile<ELFT> &obj,
++                                               const typename ELFT::Shdr *sec) {
++  if (!sec)
++    return {};
++  std::vector<uint32_t> verneeds;
++  ArrayRef<uint8_t> data = CHECK(obj.getSectionContents(sec), this);
++  const uint8_t *verneedBuf = data.begin();
++  for (unsigned i = 0; i != sec->sh_info; ++i) {
++    if (verneedBuf + sizeof(typename ELFT::Verneed) > data.end() ||
++        uintptr_t(verneedBuf) % sizeof(uint32_t) != 0)
++      fatal(toString(this) + " has an invalid Verneed");
++    auto *vn = reinterpret_cast<const typename ELFT::Verneed *>(verneedBuf);
++    const uint8_t *vernauxBuf = verneedBuf + vn->vn_aux;
++    for (unsigned j = 0; j != vn->vn_cnt; ++j) {
++      if (vernauxBuf + sizeof(typename ELFT::Vernaux) > data.end() ||
++          uintptr_t(vernauxBuf) % sizeof(uint32_t) != 0)
++        fatal(toString(this) + " has an invalid Vernaux");
++      auto *aux = reinterpret_cast<const typename ELFT::Vernaux *>(vernauxBuf);
++      if (aux->vna_name >= this->stringTable.size())
++        fatal(toString(this) + " has a Vernaux with an invalid vna_name");
++      uint16_t version = aux->vna_other & VERSYM_VERSION;
++      if (version >= verneeds.size())
++        verneeds.resize(version + 1);
++      verneeds[version] = aux->vna_name;
++      vernauxBuf += aux->vna_next;
++    }
++    verneedBuf += vn->vn_next;
++  }
++  return verneeds;
++}
++
+ // We do not usually care about alignments of data in shared object
+ // files because the loader takes care of it. However, if we promote a
+ // DSO symbol to point to .bss due to copy relocation, we need to keep
+@@ -1222,6 +1258,7 @@ template <class ELFT> void SharedFile::parse() {
+ 
+   const Elf_Shdr *versymSec = nullptr;
+   const Elf_Shdr *verdefSec = nullptr;
++  const Elf_Shdr *verneedSec = nullptr;
+ 
+   // Search for .dynsym, .dynamic, .symtab, .gnu.version and .gnu.version_d.
+   for (const Elf_Shdr &sec : sections) {
+@@ -1238,6 +1275,9 @@ template <class ELFT> void SharedFile::parse() {
+     case SHT_GNU_verdef:
+       verdefSec = &sec;
+       break;
++    case SHT_GNU_verneed:
++      verneedSec = &sec;
++      break;
+     }
+   }
+ 
+@@ -1277,12 +1317,13 @@ template <class ELFT> void SharedFile::parse() {
+   sharedFiles.push_back(this);
+ 
+   verdefs = parseVerdefs<ELFT>(obj.base(), verdefSec);
++  std::vector<uint32_t> verneeds = parseVerneed<ELFT>(obj, verneedSec);
+ 
+   // Parse ".gnu.version" section which is a parallel array for the symbol
+   // table. If a given file doesn't have a ".gnu.version" section, we use
+   // VER_NDX_GLOBAL.
+   size_t size = numELFSyms - firstGlobal;
+-  std::vector<uint32_t> versyms(size, VER_NDX_GLOBAL);
++  std::vector<uint16_t> versyms(size, VER_NDX_GLOBAL);
+   if (versymSec) {
+     ArrayRef<Elf_Versym> versym =
+         CHECK(obj.template getSectionContentsAsArray<Elf_Versym>(versymSec),
+@@ -1313,7 +1354,22 @@ template <class ELFT> void SharedFile::parse() {
+       continue;
+     }
+ 
++    uint16_t idx = versyms[i] & ~VERSYM_HIDDEN;
+     if (sym.isUndefined()) {
++      // For unversioned undefined symbols, VER_NDX_GLOBAL makes more sense but
++      // as of binutils 2.34, GNU ld produces VER_NDX_LOCAL.
++      if (idx != VER_NDX_LOCAL && idx != VER_NDX_GLOBAL) {
++        if (idx >= verneeds.size()) {
++          error("corrupt input file: version need index " + Twine(idx) +
++                " for symbol " + name + " is out of bounds\n>>> defined in " +
++                toString(this));
++          continue;
++        }
++        StringRef verName = this->stringTable.data() + verneeds[idx];
++        versionedNameBuffer.clear();
++        name =
++            saver.save((name + "@" + verName).toStringRef(versionedNameBuffer));
++      }
+       Symbol *s = symtab->addSymbol(
+           Undefined{this, name, sym.getBinding(), sym.st_other, sym.getType()});
+       s->exportDynamic = true;
+@@ -1323,7 +1379,6 @@ template <class ELFT> void SharedFile::parse() {
+     // MIPS BFD linker puts _gp_disp symbol into DSO files and incorrectly
+     // assigns VER_NDX_LOCAL to this section global symbol. Here is a
+     // workaround for this bug.
+-    uint32_t idx = versyms[i] & ~VERSYM_HIDDEN;
+     if (config->emachine == EM_MIPS && idx == VER_NDX_LOCAL &&
+         name == "_gp_disp")
+       continue;
+diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h
+index a310ba551bd..2d91c01bf48 100644
+--- a/lld/ELF/InputFiles.h
++++ b/lld/ELF/InputFiles.h
+@@ -366,6 +366,11 @@ public:
+ 
+   // Used for --as-needed
+   bool isNeeded;
++
++private:
++  template <typename ELFT>
++  std::vector<uint32_t> parseVerneed(const llvm::object::ELFFile<ELFT> &obj,
++                                     const typename ELFT::Shdr *sec);
+ };
+ 
+ class BinaryFile : public InputFile {
+diff --git a/lld/test/ELF/invalid/verneed-shared.yaml b/lld/test/ELF/invalid/verneed-shared.yaml
+new file mode 100644
+index 00000000000..18315fe8a2d
+--- /dev/null
++++ b/lld/test/ELF/invalid/verneed-shared.yaml
+@@ -0,0 +1,79 @@
++## REQUIRES: x86
++## Test that we can parse SHT_GNU_verneed in a shared object and report certain errors.
++
++# RUN: echo '.globl _start; _start:' | llvm-mc -filetype=obj -triple=x86_64 - -o %t.o
++
++## sh_offset(SHT_GNU_verneed) is out of bounds.
++# RUN: yaml2obj --docnum=1 %s -o %t1.so
++# RUN: not ld.lld %t.o %t1.so -o /dev/null 2>&1 | FileCheck --check-prefix=SHOFFSET %s
++# SHOFFSET: error: {{.*}}.so: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x0) that is greater than the file size (0x228)
++--- !ELF
++FileHeader:
++  Class:   ELFCLASS64
++  Data:    ELFDATA2LSB
++  Type:    ET_DYN
++  Machine: EM_X86_64
++Sections:
++  - Name:  .gnu.version_r
++    Type:  SHT_GNU_verneed
++    Flags: [ SHF_ALLOC ]
++    ShOffset: 0xFFFFFFFF
++
++## A Verneed entry is misaligned (not a multiple of 4).
++# RUN: yaml2obj --docnum=2 %s -o %t2.so
++# RUN: not ld.lld %t.o %t2.so -o /dev/null 2>&1 | FileCheck --check-prefix=VN-MISALIGNED %s
++# VN-MISALIGNED: {{.*}}.so has an invalid Verneed
++--- !ELF
++FileHeader:
++  Class:   ELFCLASS64
++  Data:    ELFDATA2LSB
++  Type:    ET_DYN
++  Machine: EM_X86_64
++Sections:
++  - Type: Fill
++    Size: 0x1
++  - Name:  .gnu.version_r
++    Type:  SHT_GNU_verneed
++    Flags: [ SHF_ALLOC ]
++    Info:  1
++    Link:  .dynstr
++    Dependencies:
++      - Version: 1
++        File:    foo
++        Entries:
++          - Name:  'foo'
++            Hash:  0
++            Flags: 0
++            Other: 0
++DynamicSymbols:
++  - Name: foo
++
++## vn_aux points to a place outside of the file.
++# RUN: yaml2obj --docnum=3 -D VERNEED=0100010001000000040200000000000000000000 %s -o %t3.so
++# RUN: not ld.lld %t.o %t3.so -o /dev/null 2>&1 | FileCheck --check-prefix=AUX-OOB %s
++# AUX-OOB: {{.*}}.so has an invalid Vernaux
++--- !ELF
++FileHeader:
++  Class:   ELFCLASS64
++  Data:    ELFDATA2LSB
++  Type:    ET_DYN
++  Machine: EM_X86_64
++Sections:
++  - Name:  .gnu.version_r
++    Type:  SHT_GNU_verneed
++    Flags: [ SHF_ALLOC ]
++    Info:  1
++    Link:  .dynstr
++    Content: "[[VERNEED]]"
++DynamicSymbols:
++  - Name: foo
++
++## vn_aux is misaligned.
++# RUN: yaml2obj --docnum=3 -D VERNEED=0100010001000000110000000000000000000000 %s -o %t4.so
++# RUN: not ld.lld %t.o %t4.so -o /dev/null 2>&1 | FileCheck --check-prefix=AUX-MISALIGNED %s
++# AUX-MISALIGNED: {{.*}}.so has an invalid Vernaux
++
++## vna_name is out of bounds.
++# RUN: yaml2obj --docnum=3 -D VERNEED=010001000000000010000000000000009107000000000000ff00000000000000 %s -o %t5.so
++# RUN: not ld.lld %t.o %t5.so -o /dev/null 2>&1 | FileCheck --check-prefix=NAME-OOB %s
++# NAME-OOB: {{.*}}.so has a Vernaux with an invalid vna_name
+diff --git a/lld/test/ELF/verneed-shared.s b/lld/test/ELF/verneed-shared.s
+new file mode 100644
+index 00000000000..218f43c2545
+--- /dev/null
++++ b/lld/test/ELF/verneed-shared.s
+@@ -0,0 +1,37 @@
++# REQUIRES: x86
++# RUN: echo 'v1 { f; }; v2 { g; };' > %t.ver
++# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
++# RUN: ld.lld -shared --version-script %t.ver %t.o -o %t.so
++
++# RUN: ld.lld --version-script %t.ver %t.o %t.so -o /dev/null -y f at v1 | \
++# RUN:   FileCheck --check-prefix=TRACE %s --implicit-check-not=f at v1
++
++## TRACE:      {{.*}}.o: definition of f at v1
++## TRACE-NEXT: {{.*}}.so: shared definition of f at v1
++
++# RUN: echo '.symver f,f at v1; .symver g,g at v2; call f; call g' | \
++# RUN:   llvm-mc -filetype=obj -triple=x86_64 - -o %t1.o
++# RUN: ld.lld -shared %t1.o %t.so -o %t1.so
++
++## Test that we can parse SHT_GNU_verneed to know that the undefined symbols in
++## %t1.so are called 'f at v1' and 'g at v2', which can be satisfied by the executable.
++## We will thus export the symbols.
++# RUN: ld.lld -pie %t.o %t1.so -o %t
++# RUN: llvm-nm -D %t | FileCheck --check-prefix=NM %s
++
++# NM: T f
++# NM: T g
++
++## The default is --no-allow-shlib-undefined.
++## Don't error because undefined symbols in %t1.so are satisfied by %t.so
++# RUN: llvm-mc -filetype=obj -triple=x86_64 /dev/null -o %t2.o
++# RUN: ld.lld %t2.o %t1.so %t.so -y f at v1 -o /dev/null | FileCheck %s
++
++# CHECK:      {{.*}}1.so: reference to f at v1
++# CHECK-NEXT: {{.*}}.so: shared definition of f at v1
++
++.globl f_v1, g_v2
++.symver f_v1,f at v1
++.symver g_v2,g at v2
++f_v1:
++g_v2:

Deleted: sphinx2.patch
===================================================================
--- sphinx2.patch	2020-09-11 04:37:18 UTC (rev 395758)
+++ sphinx2.patch	2020-09-11 04:37:24 UTC (rev 395759)
@@ -1,13 +0,0 @@
-diff --git a/docs/conf.py b/docs/conf.py
-index 62404b275..b5a3cdc68 100644
---- a/docs/conf.py
-+++ b/docs/conf.py
-@@ -134,7 +134,7 @@ html_last_updated_fmt = '%Y-%m-%d'
- #html_use_smartypants = True
- 
- # Custom sidebar templates, maps document names to template names.
--html_sidebars = {'index': 'indexsidebar.html'}
-+html_sidebars = {'index': ['localtoc.html', 'relations.html', 'sourcelink.html', 'indexsidebar.html', 'searchbox.html']}
- 
- # Additional templates that should be rendered to pages, maps page names to
- # template names.

Copied: lld/repos/extra-x86_64/sphinx2.patch (from rev 395758, lld/trunk/sphinx2.patch)
===================================================================
--- sphinx2.patch	                        (rev 0)
+++ sphinx2.patch	2020-09-11 04:37:24 UTC (rev 395759)
@@ -0,0 +1,13 @@
+diff --git a/docs/conf.py b/docs/conf.py
+index 62404b275..b5a3cdc68 100644
+--- a/docs/conf.py
++++ b/docs/conf.py
+@@ -134,7 +134,7 @@ html_last_updated_fmt = '%Y-%m-%d'
+ #html_use_smartypants = True
+ 
+ # Custom sidebar templates, maps document names to template names.
+-html_sidebars = {'index': 'indexsidebar.html'}
++html_sidebars = {'index': ['localtoc.html', 'relations.html', 'sourcelink.html', 'indexsidebar.html', 'searchbox.html']}
+ 
+ # Additional templates that should be rendered to pages, maps page names to
+ # template names.



More information about the arch-commits mailing list