diff --git a/cc/config/arm64_linux_host.go b/cc/config/arm64_linux_host.go index 9f5124bb4..335ad5672 100644 --- a/cc/config/arm64_linux_host.go +++ b/cc/config/arm64_linux_host.go @@ -46,6 +46,10 @@ var ( "-Wl,--no-undefined-version", } + linuxCrossLldflags = append(linuxCrossLdflags, + "-Wl,--compress-debug-sections=zstd", + ) + // Embed the linker into host bionic binaries. This is needed to support host bionic, // as the linux kernel requires that the ELF interpreter referenced by PT_INTERP be // either an absolute path, or relative from CWD. To work around this, we extract @@ -60,6 +64,7 @@ var ( func init() { exportedVars.ExportStringListStaticVariable("LinuxBionicArm64Cflags", linuxCrossCflags) exportedVars.ExportStringListStaticVariable("LinuxBionicArm64Ldflags", linuxCrossLdflags) + exportedVars.ExportStringListStaticVariable("LinuxBionicArm64Lldflags", linuxCrossLldflags) } // toolchain config for ARM64 Linux CrossHost. Almost everything is the same as the ARM64 Android diff --git a/cc/config/arm_linux_host.go b/cc/config/arm_linux_host.go index 525fb5d5d..e21c60d63 100644 --- a/cc/config/arm_linux_host.go +++ b/cc/config/arm_linux_host.go @@ -27,16 +27,24 @@ var ( "-march=armv7a", } + linuxArmLldflags = append(linuxArmLdflags, + "-Wl,--compress-debug-sections=zstd", + ) + linuxArm64Ldflags = []string{} + + linuxArm64Lldflags = append(linuxArm64Ldflags, + "-Wl,--compress-debug-sections=zstd", + ) ) func init() { exportedVars.ExportStringListStaticVariable("LinuxArmCflags", linuxArmCflags) exportedVars.ExportStringListStaticVariable("LinuxArm64Cflags", linuxArm64Cflags) exportedVars.ExportStringListStaticVariable("LinuxArmLdflags", linuxArmLdflags) - exportedVars.ExportStringListStaticVariable("LinuxArmLldflags", linuxArmLdflags) + exportedVars.ExportStringListStaticVariable("LinuxArmLldflags", linuxArmLldflags) exportedVars.ExportStringListStaticVariable("LinuxArm64Ldflags", linuxArm64Ldflags) - exportedVars.ExportStringListStaticVariable("LinuxArm64Lldflags", linuxArm64Ldflags) + exportedVars.ExportStringListStaticVariable("LinuxArm64Lldflags", linuxArm64Lldflags) exportedVars.ExportStringListStaticVariable("LinuxArmYasmFlags", []string{"-f elf32 -m arm"}) exportedVars.ExportStringListStaticVariable("LinuxArm64YasmFlags", []string{"-f elf64 -m aarch64"}) diff --git a/cc/config/global.go b/cc/config/global.go index 62b008b06..666893778 100644 --- a/cc/config/global.go +++ b/cc/config/global.go @@ -133,6 +133,9 @@ var ( // Using simple template names reduces the size of debug builds. "-gsimple-template-names", + // Use zstd to compress debug data. + "-gz=zstd", + // Make paths in deps files relative. "-no-canonical-prefixes", } @@ -200,7 +203,9 @@ var ( "-Wl,-mllvm,-regalloc-enable-advisor=release", } - deviceGlobalLldflags = append(deviceGlobalLdflags, commonGlobalLldflags...) + deviceGlobalLldflags = append(append(deviceGlobalLdflags, commonGlobalLldflags...), + "-Wl,--compress-debug-sections=zstd", + ) hostGlobalCflags = []string{} diff --git a/cc/config/x86_linux_bionic_host.go b/cc/config/x86_linux_bionic_host.go index e0064717d..f80be9915 100644 --- a/cc/config/x86_linux_bionic_host.go +++ b/cc/config/x86_linux_bionic_host.go @@ -53,6 +53,10 @@ var ( "--gcc-toolchain=${LinuxBionicGccRoot}", } + linuxBionicLldflags = append(linuxBionicLdflags, + "-Wl,--compress-debug-sections=zstd", + ) + // Embed the linker into host bionic binaries. This is needed to support host bionic, // as the linux kernel requires that the ELF interpreter referenced by PT_INTERP be // either an absolute path, or relative from CWD. To work around this, we extract @@ -71,7 +75,7 @@ const ( func init() { exportedVars.ExportStringListStaticVariable("LinuxBionicCflags", linuxBionicCflags) exportedVars.ExportStringListStaticVariable("LinuxBionicLdflags", linuxBionicLdflags) - exportedVars.ExportStringListStaticVariable("LinuxBionicLldflags", linuxBionicLdflags) + exportedVars.ExportStringListStaticVariable("LinuxBionicLldflags", linuxBionicLldflags) // Use the device gcc toolchain for now exportedVars.ExportStringStaticVariable("LinuxBionicGccVersion", x86_64GccVersion) diff --git a/cc/config/x86_linux_host.go b/cc/config/x86_linux_host.go index 93aa82ec5..f95da0b3b 100644 --- a/cc/config/x86_linux_host.go +++ b/cc/config/x86_linux_host.go @@ -59,6 +59,10 @@ var ( "--gcc-toolchain=${LinuxGccRoot}", } + linuxLldflags = append(linuxLdflags, + "-Wl,--compress-debug-sections=zstd", + ) + linuxGlibcLdflags = []string{ "--sysroot ${LinuxGccRoot}/sysroot", } @@ -138,7 +142,7 @@ func init() { exportedVars.ExportStringListStaticVariable("LinuxCflags", linuxCflags) exportedVars.ExportStringListStaticVariable("LinuxLdflags", linuxLdflags) - exportedVars.ExportStringListStaticVariable("LinuxLldflags", linuxLdflags) + exportedVars.ExportStringListStaticVariable("LinuxLldflags", linuxLldflags) exportedVars.ExportStringListStaticVariable("LinuxGlibcCflags", linuxGlibcCflags) exportedVars.ExportStringListStaticVariable("LinuxGlibcLdflags", linuxGlibcLdflags) exportedVars.ExportStringListStaticVariable("LinuxGlibcLldflags", linuxGlibcLdflags) diff --git a/rust/config/global.go b/rust/config/global.go index b94d92fd9..4d31121e5 100644 --- a/rust/config/global.go +++ b/rust/config/global.go @@ -65,6 +65,7 @@ var ( "-lpthread", "-lm", "-lgcc_s", + "-Wl,--compress-debug-sections=zstd", } deviceGlobalRustFlags = []string{ @@ -86,6 +87,7 @@ var ( "-Wl,--use-android-relr-tags", "-Wl,--no-undefined", "-B${cc_config.ClangBin}", + "-Wl,--compress-debug-sections=zstd", } ) diff --git a/scripts/strip.sh b/scripts/strip.sh index d09c187b1..7b360bf5f 100755 --- a/scripts/strip.sh +++ b/scripts/strip.sh @@ -98,9 +98,17 @@ do_strip_keep_mini_debug_info_linux() { "${CLANG_BIN}/llvm-strip" --strip-all --keep-section=.ARM.attributes --remove-section=.comment "${infile}" -o "${outfile}.tmp" || fail=true if [ -z $fail ]; then - "${CREATE_MINIDEBUGINFO}" "${infile}" "${outfile}.mini_debuginfo.xz" + # create_minidebuginfo has issues with compressed debug sections. Just + # decompress them for now using objcopy which understands compressed + # debug sections. + # b/306150780 tracks supporting this directly in create_minidebuginfo + decompressed="${infile}.decompressed" + "${CLANG_BIN}/llvm-objcopy" --decompress-debug-sections \ + "${infile}" "${decompressed}" + + "${CREATE_MINIDEBUGINFO}" "${decompressed}" "${outfile}.mini_debuginfo.xz" "${CLANG_BIN}/llvm-objcopy" --add-section .gnu_debugdata="${outfile}.mini_debuginfo.xz" "${outfile}.tmp" - rm -f "${outfile}.mini_debuginfo.xz" + rm -f "${outfile}.mini_debuginfo.xz" "${decompressed}" else cp -f "${infile}" "${outfile}.tmp" fi