From b2895a8cdcd81ab7a124de4fe8e69f98ba6d50b8 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Wed, 21 Aug 2019 06:50:08 +0000 Subject: [PATCH] Revert D65242 "[ELF] More dynamic relocation packing" This reverts r369488 and r369489. The change broke build bots: http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap-ubsan/builds/14511 http://lab.llvm.org:8011/builders/lld-x86_64-freebsd/builds/34407 llvm-svn: 369497 --- lld/ELF/SyntheticSections.cpp | 73 ++--------- lld/test/ELF/pack-dyn-relocs.s | 267 +++++++++++++++++------------------------ 2 files changed, 119 insertions(+), 221 deletions(-) diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index 9e8b0f6..50db46b 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -1702,56 +1702,6 @@ bool AndroidPackedRelocationSection::updateAllocSize() { relativeGroups.emplace_back(std::move(group)); } - // For non-relative relocations, we would like to: - // 1. Have relocations with the same symbol offset to be consecutive, so - // that the runtime linker can speed-up symbol lookup by implementing an - // 1-entry cache. - // 2. Group relocations by r_info to reduce the size of the relocation - // section. - // Since the symbol offset is the high bits in r_info, sorting by r_info - // allows us to do both. - // - // For Rela, we also want to sort by r_addend when r_info is the same. This - // enables us to group by r_addend as well. - llvm::stable_sort(nonRelatives, [](const Elf_Rela &a, const Elf_Rela &b) { - if (a.r_info != b.r_info) - return a.r_info < b.r_info; - if (config->isRela) - return a.r_addend < b.r_addend; - return false; - }); - - // Group relocations with the same r_info. Note that each group emits a group - // header and that may make the relocation section larger. It is hard to - // estimate the size of a group header as the encoded size of that varies - // based on r_info. However, we can approximate this trade-off by the number - // of values encoded. Each group header contains 3 values, and each relocation - // in a group encodes one less value, as compared to when it is not grouped. - // Therefore, we only group relocations if there are 3 or more of them with - // the same r_info. - // - // For Rela, the addend for most non-relative relocations is zero, and thus we - // can usually get a smaller relocation section if we group relocations with 0 - // addend as well. - std::vector ungroupedNonRelatives; - std::vector> nonRelativeGroups; - for (auto i = nonRelatives.begin(), e = nonRelatives.end(); i != e;) { - auto j = i + 1; - while (j != e && i->r_info == j->r_info && - (!config->isRela || i->r_addend == j->r_addend)) - ++j; - if (j - i < 3 || i->r_addend != 0) - ungroupedNonRelatives.insert(ungroupedNonRelatives.end(), i, j); - else - nonRelativeGroups.emplace_back(i, j); - i = j; - } - - // Sort ungrouped relocations by offset to minimize the encoded length. - llvm::sort(ungroupedNonRelatives, [](const Elf_Rela &a, const Elf_Rela &b) { - return a.r_offset < b.r_offset; - }); - unsigned hasAddendIfRela = config->isRela ? RELOCATION_GROUP_HAS_ADDEND_FLAG : 0; @@ -1806,23 +1756,14 @@ bool AndroidPackedRelocationSection::updateAllocSize() { } } - // Grouped non-relatives. - for (ArrayRef g : nonRelativeGroups) { - add(g.size()); - add(RELOCATION_GROUPED_BY_INFO_FLAG); - add(g[0].r_info); - for (const Elf_Rela &r : g) { - add(r.r_offset - offset); - offset = r.r_offset; - } - addend = 0; - } - - // Finally the ungrouped non-relative relocations. - if (!ungroupedNonRelatives.empty()) { - add(ungroupedNonRelatives.size()); + // Finally the non-relative relocations. + llvm::sort(nonRelatives, [](const Elf_Rela &a, const Elf_Rela &b) { + return a.r_offset < b.r_offset; + }); + if (!nonRelatives.empty()) { + add(nonRelatives.size()); add(hasAddendIfRela); - for (Elf_Rela &r : ungroupedNonRelatives) { + for (Elf_Rela &r : nonRelatives) { add(r.r_offset - offset); offset = r.r_offset; add(r.r_info); diff --git a/lld/test/ELF/pack-dyn-relocs.s b/lld/test/ELF/pack-dyn-relocs.s index 37ad56c..85ab8ac 100644 --- a/lld/test/ELF/pack-dyn-relocs.s +++ b/lld/test/ELF/pack-dyn-relocs.s @@ -2,8 +2,8 @@ // RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %p/Inputs/arm-shared.s -o %t.a32.so.o // RUN: ld.lld -shared %t.a32.so.o -soname=so -o %t.a32.so -// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.a32.o -// RUN: ld.lld -pie --pack-dyn-relocs=none %t.a32.o %t.a32.so -o %t2.a32 +// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.a32 +// RUN: ld.lld -pie --pack-dyn-relocs=none %t.a32 %t.a32.so -o %t2.a32 // RUN: llvm-readobj -r %t2.a32 | FileCheck --check-prefix=UNPACKED32 %s // Unpacked should have the relative relocations in their natural order. @@ -25,6 +25,7 @@ // UNPACKED32-NEXT: 0x2038 R_ARM_RELATIVE - 0x0 // UNPACKED32-NEXT: 0x203C R_ARM_RELATIVE - 0x0 +// UNPACKED32-NEXT: 0x2044 R_ARM_RELATIVE - 0x0 // UNPACKED32-NEXT: 0x2048 R_ARM_RELATIVE - 0x0 // UNPACKED32-NEXT: 0x204C R_ARM_RELATIVE - 0x0 // UNPACKED32-NEXT: 0x2050 R_ARM_RELATIVE - 0x0 @@ -33,20 +34,13 @@ // UNPACKED32-NEXT: 0x205C R_ARM_RELATIVE - 0x0 // UNPACKED32-NEXT: 0x2060 R_ARM_RELATIVE - 0x0 // UNPACKED32-NEXT: 0x2064 R_ARM_RELATIVE - 0x0 -// UNPACKED32-NEXT: 0x2068 R_ARM_RELATIVE - 0x0 -// UNPACKED32-NEXT: 0x206D R_ARM_RELATIVE - 0x0 +// UNPACKED32-NEXT: 0x2069 R_ARM_RELATIVE - 0x0 // UNPACKED32-NEXT: 0x2020 R_ARM_ABS32 bar2 0x0 -// UNPACKED32-NEXT: 0x2044 R_ARM_ABS32 bar2 0x0 -// UNPACKED32-NEXT: 0x2071 R_ARM_ABS32 bar2 0x0 -// UNPACKED32-NEXT: 0x2075 R_ARM_ABS32 bar2 0x0 -// UNPACKED32-NEXT: 0x2079 R_ARM_ABS32 bar2 0x0 -// UNPACKED32-NEXT: 0x207D R_ARM_ABS32 bar2 0x0 -// UNPACKED32-NEXT: 0x2081 R_ARM_ABS32 bar2 0x0 // UNPACKED32-NEXT: 0x2040 R_ARM_ABS32 zed2 0x0 // UNPACKED32-NEXT: } -// RUN: ld.lld -pie --pack-dyn-relocs=android %t.a32.o %t.a32.so -o %t3.a32 +// RUN: ld.lld -pie --pack-dyn-relocs=android %t.a32 %t.a32.so -o %t3.a32 // RUN: llvm-readobj -S --dynamic-table %t3.a32 | FileCheck --check-prefix=ANDROID32-HEADERS %s // RUN: llvm-readobj -r %t3.a32 | FileCheck --check-prefix=ANDROID32 %s @@ -69,9 +63,8 @@ // ANDROID32-HEADERS: 0x6000000F ANDROID_REL [[ADDR]] // ANDROID32-HEADERS: 0x60000010 ANDROID_RELSZ [[SIZE]] -// Packed should have the groups of non-relative reloations first, followed -// by the larger groups of relative relocations (i.e. the 8 and 9 followed -// by the 7.) +// Packed should have the larger groups of relative relocations first, +// i.e. the 8 and 9 followed by the 7. // ANDROID32: Section ({{.+}}) .rel.dyn { // ANDROID32-NEXT: 0x2000 R_ARM_RELATIVE - 0x0 // ANDROID32-NEXT: 0x2004 R_ARM_RELATIVE - 0x0 @@ -82,6 +75,7 @@ // ANDROID32-NEXT: 0x2018 R_ARM_RELATIVE - 0x0 // ANDROID32-NEXT: 0x201C R_ARM_RELATIVE - 0x0 +// ANDROID32-NEXT: 0x2044 R_ARM_RELATIVE - 0x0 // ANDROID32-NEXT: 0x2048 R_ARM_RELATIVE - 0x0 // ANDROID32-NEXT: 0x204C R_ARM_RELATIVE - 0x0 // ANDROID32-NEXT: 0x2050 R_ARM_RELATIVE - 0x0 @@ -90,7 +84,6 @@ // ANDROID32-NEXT: 0x205C R_ARM_RELATIVE - 0x0 // ANDROID32-NEXT: 0x2060 R_ARM_RELATIVE - 0x0 // ANDROID32-NEXT: 0x2064 R_ARM_RELATIVE - 0x0 -// ANDROID32-NEXT: 0x2068 R_ARM_RELATIVE - 0x0 // ANDROID32-NEXT: 0x2024 R_ARM_RELATIVE - 0x0 // ANDROID32-NEXT: 0x2028 R_ARM_RELATIVE - 0x0 @@ -100,20 +93,12 @@ // ANDROID32-NEXT: 0x2038 R_ARM_RELATIVE - 0x0 // ANDROID32-NEXT: 0x203C R_ARM_RELATIVE - 0x0 -// ANDROID32-NEXT: 0x206D R_ARM_RELATIVE - 0x0 - +// ANDROID32-NEXT: 0x2069 R_ARM_RELATIVE - 0x0 // ANDROID32-NEXT: 0x2020 R_ARM_ABS32 bar2 0x0 -// ANDROID32-NEXT: 0x2044 R_ARM_ABS32 bar2 0x0 -// ANDROID32-NEXT: 0x2071 R_ARM_ABS32 bar2 0x0 -// ANDROID32-NEXT: 0x2075 R_ARM_ABS32 bar2 0x0 -// ANDROID32-NEXT: 0x2079 R_ARM_ABS32 bar2 0x0 -// ANDROID32-NEXT: 0x207D R_ARM_ABS32 bar2 0x0 -// ANDROID32-NEXT: 0x2081 R_ARM_ABS32 bar2 0x0 - // ANDROID32-NEXT: 0x2040 R_ARM_ABS32 zed2 0x0 // ANDROID32-NEXT: } -// RUN: ld.lld -pie --pack-dyn-relocs=relr %t.a32.o %t.a32.so -o %t4.a32 +// RUN: ld.lld -pie --pack-dyn-relocs=relr %t.a32 %t.a32.so -o %t4.a32 // RUN: llvm-readobj -S --dynamic-table %t4.a32 | FileCheck --check-prefix=RELR32-HEADERS %s // RUN: llvm-readobj -r --raw-relr %t4.a32 | FileCheck --check-prefix=RAW-RELR32 %s // RUN: llvm-readobj -r %t4.a32 | FileCheck --check-prefix=RELR32 %s @@ -142,21 +127,15 @@ // encoding the offsets for relative relocation. // RAW-RELR32: Section ({{.+}}) .relr.dyn { // RAW-RELR32-NEXT: 0x2000 -// RAW-RELR32-NEXT: 0x7FCFEFF +// RAW-RELR32-NEXT: 0x3FEFEFF // RAW-RELR32-NEXT: } // Decoded SHT_RELR section is same as UNPACKED, // but contains only the relative relocations. // Any relative relocations with odd offset stay in SHT_REL. // RELR32: Section ({{.+}}) .rel.dyn { -// RELR32-NEXT: 0x206D R_ARM_RELATIVE - 0x0 +// RELR32-NEXT: 0x2069 R_ARM_RELATIVE - 0x0 // RELR32-NEXT: 0x2020 R_ARM_ABS32 bar2 0x0 -// RELR32-NEXT: 0x2044 R_ARM_ABS32 bar2 0x0 -// RELR32-NEXT: 0x2071 R_ARM_ABS32 bar2 0x0 -// RELR32-NEXT: 0x2075 R_ARM_ABS32 bar2 0x0 -// RELR32-NEXT: 0x2079 R_ARM_ABS32 bar2 0x0 -// RELR32-NEXT: 0x207D R_ARM_ABS32 bar2 0x0 -// RELR32-NEXT: 0x2081 R_ARM_ABS32 bar2 0x0 // RELR32-NEXT: 0x2040 R_ARM_ABS32 zed2 0x0 // RELR32-NEXT: } // RELR32-NEXT: Section ({{.+}}) .relr.dyn { @@ -177,6 +156,7 @@ // RELR32-NEXT: 0x2038 R_ARM_RELATIVE - 0x0 // RELR32-NEXT: 0x203C R_ARM_RELATIVE - 0x0 +// RELR32-NEXT: 0x2044 R_ARM_RELATIVE - 0x0 // RELR32-NEXT: 0x2048 R_ARM_RELATIVE - 0x0 // RELR32-NEXT: 0x204C R_ARM_RELATIVE - 0x0 // RELR32-NEXT: 0x2050 R_ARM_RELATIVE - 0x0 @@ -185,55 +165,48 @@ // RELR32-NEXT: 0x205C R_ARM_RELATIVE - 0x0 // RELR32-NEXT: 0x2060 R_ARM_RELATIVE - 0x0 // RELR32-NEXT: 0x2064 R_ARM_RELATIVE - 0x0 -// RELR32-NEXT: 0x2068 R_ARM_RELATIVE - 0x0 // RELR32-NEXT: } // RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-linux %p/Inputs/shared2.s -o %t.a64.so.o // RUN: ld.lld -shared %t.a64.so.o -soname=so -o %t.a64.so -// RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-linux %s -o %t.a64.o -// RUN: ld.lld -pie --pack-dyn-relocs=none %t.a64.o %t.a64.so -o %t2.a64 +// RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-linux %s -o %t.a64 +// RUN: ld.lld -pie --pack-dyn-relocs=none %t.a64 %t.a64.so -o %t2.a64 // RUN: llvm-readobj -r %t2.a64 | FileCheck --check-prefix=UNPACKED64 %s // UNPACKED64: Section ({{.+}}) .rela.dyn { -// UNPACKED64-NEXT: 0x30680 R_AARCH64_RELATIVE - 0x1 -// UNPACKED64-NEXT: 0x30688 R_AARCH64_RELATIVE - 0x2 -// UNPACKED64-NEXT: 0x30690 R_AARCH64_RELATIVE - 0x3 -// UNPACKED64-NEXT: 0x30698 R_AARCH64_RELATIVE - 0x4 -// UNPACKED64-NEXT: 0x306A0 R_AARCH64_RELATIVE - 0x5 -// UNPACKED64-NEXT: 0x306A8 R_AARCH64_RELATIVE - 0x6 -// UNPACKED64-NEXT: 0x306B0 R_AARCH64_RELATIVE - 0x7 -// UNPACKED64-NEXT: 0x306B8 R_AARCH64_RELATIVE - 0x8 - -// UNPACKED64-NEXT: 0x306C8 R_AARCH64_RELATIVE - 0x1 -// UNPACKED64-NEXT: 0x306D0 R_AARCH64_RELATIVE - 0x2 -// UNPACKED64-NEXT: 0x306D8 R_AARCH64_RELATIVE - 0x3 -// UNPACKED64-NEXT: 0x306E0 R_AARCH64_RELATIVE - 0x4 -// UNPACKED64-NEXT: 0x306E8 R_AARCH64_RELATIVE - 0x5 -// UNPACKED64-NEXT: 0x306F0 R_AARCH64_RELATIVE - 0x6 -// UNPACKED64-NEXT: 0x306F8 R_AARCH64_RELATIVE - 0x7 - -// UNPACKED64-NEXT: 0x30710 R_AARCH64_RELATIVE - 0x1 -// UNPACKED64-NEXT: 0x30718 R_AARCH64_RELATIVE - 0x2 -// UNPACKED64-NEXT: 0x30720 R_AARCH64_RELATIVE - 0x3 -// UNPACKED64-NEXT: 0x30728 R_AARCH64_RELATIVE - 0x4 -// UNPACKED64-NEXT: 0x30730 R_AARCH64_RELATIVE - 0x5 -// UNPACKED64-NEXT: 0x30738 R_AARCH64_RELATIVE - 0x6 -// UNPACKED64-NEXT: 0x30740 R_AARCH64_RELATIVE - 0x7 -// UNPACKED64-NEXT: 0x30748 R_AARCH64_RELATIVE - 0x8 -// UNPACKED64-NEXT: 0x30750 R_AARCH64_RELATIVE - 0x9 - -// UNPACKED64-NEXT: 0x30759 R_AARCH64_RELATIVE - 0xA -// UNPACKED64-NEXT: 0x306C0 R_AARCH64_ABS64 bar2 0x1 -// UNPACKED64-NEXT: 0x30708 R_AARCH64_ABS64 bar2 0x0 -// UNPACKED64-NEXT: 0x30761 R_AARCH64_ABS64 bar2 0x0 -// UNPACKED64-NEXT: 0x30769 R_AARCH64_ABS64 bar2 0x0 -// UNPACKED64-NEXT: 0x30771 R_AARCH64_ABS64 bar2 0x1 -// UNPACKED64-NEXT: 0x30779 R_AARCH64_ABS64 bar2 0x1 -// UNPACKED64-NEXT: 0x30781 R_AARCH64_ABS64 bar2 0x0 -// UNPACKED64-NEXT: 0x30700 R_AARCH64_ABS64 zed2 0x0 +// UNPACKED64-NEXT: 0x305F0 R_AARCH64_RELATIVE - 0x1 +// UNPACKED64-NEXT: 0x305F8 R_AARCH64_RELATIVE - 0x2 +// UNPACKED64-NEXT: 0x30600 R_AARCH64_RELATIVE - 0x3 +// UNPACKED64-NEXT: 0x30608 R_AARCH64_RELATIVE - 0x4 +// UNPACKED64-NEXT: 0x30610 R_AARCH64_RELATIVE - 0x5 +// UNPACKED64-NEXT: 0x30618 R_AARCH64_RELATIVE - 0x6 +// UNPACKED64-NEXT: 0x30620 R_AARCH64_RELATIVE - 0x7 +// UNPACKED64-NEXT: 0x30628 R_AARCH64_RELATIVE - 0x8 + +// UNPACKED64-NEXT: 0x30638 R_AARCH64_RELATIVE - 0x1 +// UNPACKED64-NEXT: 0x30640 R_AARCH64_RELATIVE - 0x2 +// UNPACKED64-NEXT: 0x30648 R_AARCH64_RELATIVE - 0x3 +// UNPACKED64-NEXT: 0x30650 R_AARCH64_RELATIVE - 0x4 +// UNPACKED64-NEXT: 0x30658 R_AARCH64_RELATIVE - 0x5 +// UNPACKED64-NEXT: 0x30660 R_AARCH64_RELATIVE - 0x6 +// UNPACKED64-NEXT: 0x30668 R_AARCH64_RELATIVE - 0x7 + +// UNPACKED64-NEXT: 0x30678 R_AARCH64_RELATIVE - 0x1 +// UNPACKED64-NEXT: 0x30680 R_AARCH64_RELATIVE - 0x2 +// UNPACKED64-NEXT: 0x30688 R_AARCH64_RELATIVE - 0x3 +// UNPACKED64-NEXT: 0x30690 R_AARCH64_RELATIVE - 0x4 +// UNPACKED64-NEXT: 0x30698 R_AARCH64_RELATIVE - 0x5 +// UNPACKED64-NEXT: 0x306A0 R_AARCH64_RELATIVE - 0x6 +// UNPACKED64-NEXT: 0x306A8 R_AARCH64_RELATIVE - 0x7 +// UNPACKED64-NEXT: 0x306B0 R_AARCH64_RELATIVE - 0x8 +// UNPACKED64-NEXT: 0x306B8 R_AARCH64_RELATIVE - 0x9 + +// UNPACKED64-NEXT: 0x306C1 R_AARCH64_RELATIVE - 0xA +// UNPACKED64-NEXT: 0x30630 R_AARCH64_ABS64 bar2 0x1 +// UNPACKED64-NEXT: 0x30670 R_AARCH64_ABS64 zed2 0x0 // UNPACKED64-NEXT: } -// RUN: ld.lld -pie --pack-dyn-relocs=android %t.a64.o %t.a64.so -o %t3.a64 +// RUN: ld.lld -pie --pack-dyn-relocs=android %t.a64 %t.a64.so -o %t3.a64 // RUN: llvm-readobj -S --dynamic-table %t3.a64 | FileCheck --check-prefix=ANDROID64-HEADERS %s // RUN: llvm-readobj -r %t3.a64 | FileCheck --check-prefix=ANDROID64 %s @@ -257,45 +230,39 @@ // ANDROID64-HEADERS: 0x0000000060000012 ANDROID_RELASZ [[SIZE]] // ANDROID64: Section ({{.+}}) .rela.dyn { -// ANDROID64-NEXT: 0x303E0 R_AARCH64_RELATIVE - 0x1 -// ANDROID64-NEXT: 0x303E8 R_AARCH64_RELATIVE - 0x2 -// ANDROID64-NEXT: 0x303F0 R_AARCH64_RELATIVE - 0x3 -// ANDROID64-NEXT: 0x303F8 R_AARCH64_RELATIVE - 0x4 -// ANDROID64-NEXT: 0x30400 R_AARCH64_RELATIVE - 0x5 -// ANDROID64-NEXT: 0x30408 R_AARCH64_RELATIVE - 0x6 -// ANDROID64-NEXT: 0x30410 R_AARCH64_RELATIVE - 0x7 -// ANDROID64-NEXT: 0x30418 R_AARCH64_RELATIVE - 0x8 - -// ANDROID64-NEXT: 0x30470 R_AARCH64_RELATIVE - 0x1 -// ANDROID64-NEXT: 0x30478 R_AARCH64_RELATIVE - 0x2 -// ANDROID64-NEXT: 0x30480 R_AARCH64_RELATIVE - 0x3 -// ANDROID64-NEXT: 0x30488 R_AARCH64_RELATIVE - 0x4 -// ANDROID64-NEXT: 0x30490 R_AARCH64_RELATIVE - 0x5 -// ANDROID64-NEXT: 0x30498 R_AARCH64_RELATIVE - 0x6 -// ANDROID64-NEXT: 0x304A0 R_AARCH64_RELATIVE - 0x7 -// ANDROID64-NEXT: 0x304A8 R_AARCH64_RELATIVE - 0x8 -// ANDROID64-NEXT: 0x304B0 R_AARCH64_RELATIVE - 0x9 - -// ANDROID64-NEXT: 0x30428 R_AARCH64_RELATIVE - 0x1 -// ANDROID64-NEXT: 0x30430 R_AARCH64_RELATIVE - 0x2 -// ANDROID64-NEXT: 0x30438 R_AARCH64_RELATIVE - 0x3 -// ANDROID64-NEXT: 0x30440 R_AARCH64_RELATIVE - 0x4 -// ANDROID64-NEXT: 0x30448 R_AARCH64_RELATIVE - 0x5 -// ANDROID64-NEXT: 0x30450 R_AARCH64_RELATIVE - 0x6 -// ANDROID64-NEXT: 0x30458 R_AARCH64_RELATIVE - 0x7 -// ANDROID64-NEXT: 0x304B9 R_AARCH64_RELATIVE - 0xA - -// ANDROID64-NEXT: 0x30468 R_AARCH64_ABS64 bar2 0x0 -// ANDROID64-NEXT: 0x304C1 R_AARCH64_ABS64 bar2 0x0 -// ANDROID64-NEXT: 0x304C9 R_AARCH64_ABS64 bar2 0x0 -// ANDROID64-NEXT: 0x304E1 R_AARCH64_ABS64 bar2 0x0 -// ANDROID64-NEXT: 0x30420 R_AARCH64_ABS64 bar2 0x1 -// ANDROID64-NEXT: 0x30460 R_AARCH64_ABS64 zed2 0x0 -// ANDROID64-NEXT: 0x304D1 R_AARCH64_ABS64 bar2 0x1 -// ANDROID64-NEXT: 0x304D9 R_AARCH64_ABS64 bar2 0x1 +// ANDROID64-NEXT: 0x303C0 R_AARCH64_RELATIVE - 0x1 +// ANDROID64-NEXT: 0x303C8 R_AARCH64_RELATIVE - 0x2 +// ANDROID64-NEXT: 0x303D0 R_AARCH64_RELATIVE - 0x3 +// ANDROID64-NEXT: 0x303D8 R_AARCH64_RELATIVE - 0x4 +// ANDROID64-NEXT: 0x303E0 R_AARCH64_RELATIVE - 0x5 +// ANDROID64-NEXT: 0x303E8 R_AARCH64_RELATIVE - 0x6 +// ANDROID64-NEXT: 0x303F0 R_AARCH64_RELATIVE - 0x7 +// ANDROID64-NEXT: 0x303F8 R_AARCH64_RELATIVE - 0x8 + +// ANDROID64-NEXT: 0x30448 R_AARCH64_RELATIVE - 0x1 +// ANDROID64-NEXT: 0x30450 R_AARCH64_RELATIVE - 0x2 +// ANDROID64-NEXT: 0x30458 R_AARCH64_RELATIVE - 0x3 +// ANDROID64-NEXT: 0x30460 R_AARCH64_RELATIVE - 0x4 +// ANDROID64-NEXT: 0x30468 R_AARCH64_RELATIVE - 0x5 +// ANDROID64-NEXT: 0x30470 R_AARCH64_RELATIVE - 0x6 +// ANDROID64-NEXT: 0x30478 R_AARCH64_RELATIVE - 0x7 +// ANDROID64-NEXT: 0x30480 R_AARCH64_RELATIVE - 0x8 +// ANDROID64-NEXT: 0x30488 R_AARCH64_RELATIVE - 0x9 + +// ANDROID64-NEXT: 0x30408 R_AARCH64_RELATIVE - 0x1 +// ANDROID64-NEXT: 0x30410 R_AARCH64_RELATIVE - 0x2 +// ANDROID64-NEXT: 0x30418 R_AARCH64_RELATIVE - 0x3 +// ANDROID64-NEXT: 0x30420 R_AARCH64_RELATIVE - 0x4 +// ANDROID64-NEXT: 0x30428 R_AARCH64_RELATIVE - 0x5 +// ANDROID64-NEXT: 0x30430 R_AARCH64_RELATIVE - 0x6 +// ANDROID64-NEXT: 0x30438 R_AARCH64_RELATIVE - 0x7 + +// ANDROID64-NEXT: 0x30491 R_AARCH64_RELATIVE - 0xA +// ANDROID64-NEXT: 0x30400 R_AARCH64_ABS64 bar2 0x1 +// ANDROID64-NEXT: 0x30440 R_AARCH64_ABS64 zed2 0x0 // ANDROID64-NEXT: } -// RUN: ld.lld -pie --pack-dyn-relocs=relr %t.a64.o %t.a64.so -o %t4.a64 +// RUN: ld.lld -pie --pack-dyn-relocs=relr %t.a64 %t.a64.so -o %t4.a64 // RUN: llvm-readobj -S --dynamic-table %t4.a64 | FileCheck --check-prefix=RELR64-HEADERS %s // RUN: llvm-readobj -r --raw-relr %t4.a64 | FileCheck --check-prefix=RAW-RELR64 %s // RUN: llvm-readobj -r %t4.a64 | FileCheck --check-prefix=RELR64 %s @@ -323,50 +290,46 @@ // SHT_RELR section contains address/bitmap entries // encoding the offsets for relative relocation. // RAW-RELR64: Section ({{.+}}) .relr.dyn { -// RAW-RELR64-NEXT: 0x30480 -// RAW-RELR64-NEXT: 0x7FCFEFF +// RAW-RELR64-NEXT: 0x303F0 +// RAW-RELR64-NEXT: 0x3FEFEFF // RAW-RELR64-NEXT: } // Decoded SHT_RELR section is same as UNPACKED, // but contains only the relative relocations. // Any relative relocations with odd offset stay in SHT_RELA. -// RELR64: Section ({{.+}}) .rela.dyn { -// RELR64-NEXT: 0x30559 R_AARCH64_RELATIVE - 0xA -// RELR64-NEXT: 0x304C0 R_AARCH64_ABS64 bar2 0x1 -// RELR64-NEXT: 0x30508 R_AARCH64_ABS64 bar2 0x0 -// RELR64-NEXT: 0x30561 R_AARCH64_ABS64 bar2 0x0 -// RELR64-NEXT: 0x30569 R_AARCH64_ABS64 bar2 0x0 -// RELR64-NEXT: 0x30571 R_AARCH64_ABS64 bar2 0x1 -// RELR64-NEXT: 0x30579 R_AARCH64_ABS64 bar2 0x1 -// RELR64-NEXT: 0x30581 R_AARCH64_ABS64 bar2 0x0 -// RELR64-NEXT: 0x30500 R_AARCH64_ABS64 zed2 0x0 -// RELR64-NEXT: } -// RELR64-NEXT: Section ({{.+}}) .relr.dyn { -// RELR64-NEXT: 0x30480 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30488 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30490 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30498 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x304A0 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x304A8 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x304B0 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x304B8 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x304C8 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x304D0 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x304D8 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x304E0 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x304E8 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x304F0 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x304F8 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30510 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30518 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30520 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30528 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30530 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30538 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30540 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30548 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: 0x30550 R_AARCH64_RELATIVE - 0x0 -// RELR64-NEXT: } +// RELR64: Section ({{.+}}) .rela.dyn { +// RELR64-NEXT: 0x304C1 R_AARCH64_RELATIVE - 0xA +// RELR64-NEXT: 0x30430 R_AARCH64_ABS64 bar2 0x1 +// RELR64-NEXT: 0x30470 R_AARCH64_ABS64 zed2 0x0 +// RELR64-NEXT: } +// RELR64-NEXT: Section ({{.+}}) .relr.dyn { +// RELR64-NEXT: 0x303F0 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x303F8 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30400 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30408 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30410 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30418 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30420 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30428 R_AARCH64_RELATIVE - 0x0 + +// RELR64-NEXT: 0x30438 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30440 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30448 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30450 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30458 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30460 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30468 R_AARCH64_RELATIVE - 0x0 + +// RELR64-NEXT: 0x30478 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30480 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30488 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30490 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x30498 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x304A0 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x304A8 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x304B0 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: 0x304B8 R_AARCH64_RELATIVE - 0x0 +// RELR64-NEXT: } .data .align 2 @@ -388,7 +351,6 @@ .dc.a __ehdr_start + 6 .dc.a __ehdr_start + 7 .dc.a zed2 -.dc.a bar2 .dc.a __ehdr_start + 1 .dc.a __ehdr_start + 2 @@ -401,8 +363,3 @@ .dc.a __ehdr_start + 9 .byte 00 .dc.a __ehdr_start + 10 -.dc.a bar2 -.dc.a bar2 -.dc.a bar2 + 1 -.dc.a bar2 + 1 -.dc.a bar2 -- 2.7.4