diff options
| -rw-r--r-- | lld/ELF/SyntheticSections.cpp | 73 | ||||
| -rw-r--r-- | lld/test/ELF/pack-dyn-relocs.s | 225 | 
2 files changed, 187 insertions, 111 deletions
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index 50db46b1249..9e8b0f6781d 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -1702,6 +1702,56 @@ bool AndroidPackedRelocationSection<ELFT>::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<Elf_Rela> ungroupedNonRelatives; +  std::vector<std::vector<Elf_Rela>> 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; @@ -1756,14 +1806,23 @@ bool AndroidPackedRelocationSection<ELFT>::updateAllocSize() {      }    } -  // 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()); +  // Grouped non-relatives. +  for (ArrayRef<Elf_Rela> 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());      add(hasAddendIfRela); -    for (Elf_Rela &r : nonRelatives) { +    for (Elf_Rela &r : ungroupedNonRelatives) {        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 85ab8ac6923..8d415e91042 100644 --- a/lld/test/ELF/pack-dyn-relocs.s +++ b/lld/test/ELF/pack-dyn-relocs.s @@ -25,7 +25,6 @@  // 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 @@ -34,9 +33,16 @@  // 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:     0x2069 R_ARM_RELATIVE - 0x0 +// UNPACKED32-NEXT:     0x206D 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:     } @@ -63,8 +69,9 @@  // ANDROID32-HEADERS: 0x6000000F ANDROID_REL          [[ADDR]]  // ANDROID32-HEADERS: 0x60000010 ANDROID_RELSZ        [[SIZE]] -// Packed should have the larger groups of relative relocations first, -// i.e. the 8 and 9 followed by the 7. +// 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.)  // ANDROID32:          Section ({{.+}}) .rel.dyn {  // ANDROID32-NEXT:     0x2000 R_ARM_RELATIVE - 0x0  // ANDROID32-NEXT:     0x2004 R_ARM_RELATIVE - 0x0 @@ -75,7 +82,6 @@  // 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 @@ -84,6 +90,7 @@  // 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 @@ -93,8 +100,16 @@  // ANDROID32-NEXT:     0x2038 R_ARM_RELATIVE - 0x0  // ANDROID32-NEXT:     0x203C R_ARM_RELATIVE - 0x0 -// ANDROID32-NEXT:     0x2069 R_ARM_RELATIVE - 0x0 +// ANDROID32-NEXT:     0x206D 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:     } @@ -127,15 +142,21 @@  // encoding the offsets for relative relocation.  // RAW-RELR32:           Section ({{.+}}) .relr.dyn {  // RAW-RELR32-NEXT:      0x2000 -// RAW-RELR32-NEXT:      0x3FEFEFF +// RAW-RELR32-NEXT:      0x7FCFEFF  // 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:          0x2069 R_ARM_RELATIVE - 0x0 +// RELR32-NEXT:          0x206D 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 { @@ -156,7 +177,6 @@  // 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 @@ -165,6 +185,7 @@  // 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 @@ -174,36 +195,42 @@  // RUN: llvm-readobj -r %t2.a64 | FileCheck --check-prefix=UNPACKED64 %s  // UNPACKED64:          Section ({{.+}}) .rela.dyn { -// 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:     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:     }  // RUN: ld.lld -pie --pack-dyn-relocs=android %t.a64 %t.a64.so -o %t3.a64 @@ -230,36 +257,42 @@  // ANDROID64-HEADERS: 0x0000000060000012 ANDROID_RELASZ        [[SIZE]]  // ANDROID64:          Section ({{.+}}) .rela.dyn { -// 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:     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:     }  // RUN: ld.lld -pie --pack-dyn-relocs=relr %t.a64 %t.a64.so -o %t4.a64 @@ -290,46 +323,24 @@  // SHT_RELR section contains address/bitmap entries  // encoding the offsets for relative relocation.  // RAW-RELR64:           Section ({{.+}}) .relr.dyn { -// RAW-RELR64-NEXT:      0x303F0 -// RAW-RELR64-NEXT:      0x3FEFEFF +// RAW-RELR64-NEXT:      0x30480 +// RAW-RELR64-NEXT:      0x7FCFEFF  // 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:          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:          } +// 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: }  .data  .align 2 @@ -351,6 +362,7 @@  .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 @@ -363,3 +375,8 @@  .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  | 

