Enable SHT_RELR sections to encode relative relocations.
Proposal for adding SHT_RELR sections in the generic-abi is at
https://groups.google.com/forum/#!topic/generic-abi/bX460iggiKg
This CL requires clang-r328903.
The following test results are on clang-r339409.
Size comparison for "aosp_marlin-userdebug":
$ du -B1 -s {none,pack,relr,both}/out/target/product/marlin/system
1014616064 none/out/target/product/marlin/system
1001074688 pack/out/target/product/marlin/system
1004273664 relr/out/target/product/marlin/system
1000099840 both/out/target/product/marlin/system
none contains a build with no packing (--pack-dyn-relocs=none).
pack contains a build with current settings (--pack-dyn-relocs=android).
relr contains a build with relr packing only (--pack-dyn-relocs=relr).
both contains a build with both options enabled (--pack-dyn-relocs=android+relr).
With --pack-dyn-relocs=android+relr, lld will encode the relative
relocations in a SHT_ANDROID_RELR section, and pack the rest of
the dynamic relocations in a SHT_ANDROID_REL(A) section.
--pack-dyn-relocs=android was saving us 13,541,376 bytes (1.35%) (none - pack).
--pack-dyn-relocs=relr will save us 10,342,400 bytes (1.03%) (none - relr).
--pack-dyn-relocs=android+relr is saving us 14,516,224 bytes (1.45%) (none - both).
Size comparison for the "system/bin" directory:
$ du -B1 -s {none,pack,relr,both}/out/target/product/marlin/system/bin
29413376 none/out/target/product/marlin/system/bin
28319744 pack/out/target/product/marlin/system/bin
28258304 relr/out/target/product/marlin/system/bin
28180480 both/out/target/product/marlin/system/bin
--pack-dyn-relocs=android was saving us 1,093,632 bytes (3.72%) (none - pack).
--pack-dyn-relocs=relr will save us 1,155,072 bytes (3.93%) (none - relr).
--pack-dyn-relocs=android+relr is saving us 1,232,896 bytes (4.19%) (none - both).
Bug: None
Test: Built aosp_marlin-userdebug image, boots on device.
Test: Built aosp_x86_64-userdebug image, boots in emulator.
Change-Id: Ibb726c3b9d87688f387a7f2974fdae9bfc24efc9
diff --git a/cc/config/global.go b/cc/config/global.go
index 330cb10..3e76373 100644
--- a/cc/config/global.go
+++ b/cc/config/global.go
@@ -91,7 +91,8 @@
// TODO(b/109657296): needs --no-rosegment until Android
// stack unwinder can handle the read-only segment.
"-Wl,--no-rosegment",
- "-Wl,--pack-dyn-relocs=android",
+ "-Wl,--pack-dyn-relocs=android+relr",
+ "-Wl,--use-android-relr-tags",
"-fuse-ld=lld",
}...)