[ELF] More dynamic relocation packing
Currently, with Android dynamic relocation packing, only relative relocations are grouped together. This patch implements similar packing for non-relative relocations. The implementation groups non-relative relocations with the same r_info and r_addend, if using RELA. By requiring a minimum group size of 3, this achieves smaller relocation sections. Building Android for an ARM32 device, I see the total size of /system/lib decrease by 392 KB. Grouping by r_info also allows the runtime dynamic linker to implement an 1-entry cache to reduce the number of symbol lookup required. With such 1-entry cache implemented on Android, I'm seeing 10% to 20% reduction in total time spent in runtime linker for several executables that I tested. As a simple correctness check, I've also built x86_64 Android and booted successfully. Differential Revision: https://reviews.llvm.org/D66491 Patch by Vic Yang! llvm-svn: 369488
This commit is contained in:
parent
f938755a33
commit
35f9a84a15
|
@ -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);
|
||||
|
|
|
@ -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: 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: 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: 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: 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: 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: 0x306C1 R_AARCH64_RELATIVE - 0xA
|
||||
// UNPACKED64-NEXT: 0x30630 R_AARCH64_ABS64 bar2 0x1
|
||||
// UNPACKED64-NEXT: 0x30670 R_AARCH64_ABS64 zed2 0x0
|
||||
// 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: 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: 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: 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: 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: 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: 0x30491 R_AARCH64_RELATIVE - 0xA
|
||||
// ANDROID64-NEXT: 0x30400 R_AARCH64_ABS64 bar2 0x1
|
||||
// ANDROID64-NEXT: 0x30440 R_AARCH64_ABS64 zed2 0x0
|
||||
// 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
|
||||
|
|
Loading…
Reference in New Issue