Add SHF_COMPRESSED support to gas and objcopy

This patch adds --compress-debug-sections={none|zlib|zlib-gnu|zlib-gabi}
options to gas and objcopy for ELF files. They control how DWARF debug
sections are compressed.  --compress-debug-sections=none is equivalent to
--nocompress-debug-sections.  --compress-debug-sections=zlib and
--compress-debug-sections=zlib-gnu are equivalent to
--compress-debug-sections.  --compress-debug-sections=zlib-gabi compresses
DWARF debug sections with SHF_COMPRESSED from the ELF ABI.  No linker
changes are required to support SHF_COMPRESSED.

bfd/

	* archive.c (_bfd_get_elt_at_filepos): Also copy BFD_COMPRESS_GABI
	bit.
	* bfd.c (bfd::flags): Increase size to 18 bits.
	(BFD_COMPRESS_GABI): New.
	(BFD_FLAGS_SAVED): Add BFD_COMPRESS_GABI.
	(BFD_FLAGS_FOR_BFD_USE_MASK): Likewise.
	(bfd_update_compression_header): New fuction.
	(bfd_check_compression_header): Likewise.
	(bfd_get_compression_header_size): Likewise.
	(bfd_is_section_compressed_with_header): Likewise.
	* compress.c (MAX_COMPRESSION_HEADER_SIZE): New.
	(bfd_compress_section_contents): Return the uncompressed size if
	the full section contents is compressed successfully.  Support
	converting from/to .zdebug* sections.
	(bfd_get_full_section_contents): Call
	bfd_get_compression_header_size to get compression header size.
	(bfd_is_section_compressed): Renamed to ...
	(bfd_is_section_compressed_with_header): This.  Add a pointer
	argument to return compression header size.
	(bfd_is_section_compressed): Use it.
	(bfd_init_section_decompress_status): Call
	bfd_get_compression_header_size to get compression header size.
	Return FALSE if uncompressed section size is 0.
	* elf.c (_bfd_elf_make_section_from_shdr): Support converting
	from/to .zdebug* sections.
	* bfd-in2.h: Regenerated.

binutils/

	* objcopy.c (do_debug_sections): Add compress_zlib,
	compress_gnu_zlib and compress_gabi_zlib.
	(copy_options): Use optional_argument on compress-debug-sections.
	(copy_usage): Update --compress-debug-sections.
	(copy_file): Handle compress_zlib, compress_gnu_zlib and
	compress_gabi_zlib.
	(copy_main): Handle
	--compress-debug-sections={none|zlib|zlib-gnu|zlib-gabi}.
	* doc/binutils.texi: Document
	--compress-debug-sections={none|zlib|zlib-gnu|zlib-gabi}.

binutils/testsuite/

	* compress.exp: Add tests for
	--compress-debug-sections={none|zlib|zlib-gnu|zlib-gabi}.
	* binutils-all/dw2-3.rS: New file.
	* binutils-all/dw2-3.rt: Likewise.
	* binutils-all/libdw2-compressedgabi.out: Likewise.

gas/

	* as.c (show_usage): Update --compress-debug-sections.
	(std_longopts): Use optional_argument on compress-debug-sections.
	(parse_args): Handle
	--compress-debug-sections={none|zlib|zlib-gnu|zlib-gabi}.
	* as.h (compressed_debug_section_type): New.
	(flag_compress_debug): Change type to compressed_debug_section_type.
	--compress-debug-sections={none|zlib|zlib-gnu|zlib-gabi}.
	* write.c (compress_debug): Set BFD_COMPRESS_GABI for
	--compress-debug-sections=zlib-gabi.  Call
	bfd_get_compression_header_size to get compression header size.
	Don't rename section name for --compress-debug-sections=zlib-gabi.
	* config/tc-i386.c (compressed_debug_section_type): Set to
	COMPRESS_DEBUG_ZLIB.
	* doc/as.texinfo: Document
	--compress-debug-sections={none|zlib|zlib-gnu|zlib-gabi}.

gas/testsuite/

	* gas/i386/dw2-compressed-1.d: New file.
	* gas/i386/dw2-compressed-2.d: Likewise.
	* gas/i386/dw2-compressed-3.d: Likewise.
	* gas/i386/x86-64-dw2-compressed-2.d: Likewise.
	* gas/i386/i386.exp: Run dw2-compressed-2, dw2-compressed-1,
	dw2-compressed-3 and x86-64-dw2-compressed-2.

ld/testsuite/

	* ld-elf/compress.exp: Add a test for
	--compress-debug-sections=zlib-gabi.
	(build_tests): Add 2 tests for --compress-debug-sections=zlib-gabi.
	(run_tests): Likewise.
	Verify linker output with zlib-gabi compressed debug input.
	* ld-elf/compressed1a.d: New file.
	* ld-elf/compressed1b.d: Likewise.
	* ld-elf/compressed1c.d: Likewise.
This commit is contained in:
H.J. Lu
2015-04-08 07:53:54 -07:00
parent bfcf0ccd01
commit 151411f8af
31 changed files with 1300 additions and 128 deletions

View File

@@ -217,3 +217,357 @@ if ![is_remote host] {
}
run_dump_test "debug_str"
if { ![binutils_assemble_flags $srcdir/$subdir/dw2-1.S ${compressedfile}gabi.o --compress-debug-sections=zlib-gabi] } then {
fail "compressed debug sections with zlib-gabi"
return
}
if { ![binutils_assemble_flags $srcdir/$subdir/dw2-1.S ${compressedfile}gnu.o --compress-debug-sections=zlib-gnu] } then {
fail "compressed debug sections with zlib-gnu"
return
}
set src1 ${compressedfile}gnu.o
set src2 ${compressedfile}.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
fail "compressed debug sections with zlib-gnu"
return
}
if { ![binutils_assemble_flags $srcdir/$subdir/dw2-2.S ${compressedfile2}gabi.o --compress-debug-sections=zlib-gabi] } then {
fail "compressed debug sections with zlib-gabi"
return
}
if { ![binutils_assemble_flags $srcdir/$subdir/dw2-2.S ${compressedfile2}gnu.o --compress-debug-sections=zlib-gnu] } then {
fail "compressed debug sections with zlib-gnu"
return
}
set src1 ${compressedfile2}gnu.o
set src2 ${compressedfile2}.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
fail "compressed debug sections with zlib-gnu"
return
}
if { ![binutils_assemble_flags $srcdir/$subdir/dw2-3.S ${compressedfile3}gabi.o --compress-debug-sections=zlib-gabi] } then {
fail "compressed debug sections with zlib-gabi"
return
}
set testname "readelf -t zlib-gabi compress debug sections"
set got [remote_exec host "$READELF -t --wide ${compressedfile3}gabi.o" "" "/dev/null" "tmpdir/dw2-3.rt"]
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
fail "$testname (reason: unexpected output)"
send_log "$got\n"
}
if { [regexp_diff tmpdir/dw2-3.rt $srcdir/$subdir/dw2-3.rt] } then {
fail "$testname"
} else {
pass "$testname"
}
set testname "readelf -S zlib-gabi compress debug sections"
set got [remote_exec host "$READELF -S --wide ${compressedfile3}gabi.o" "" "/dev/null" "tmpdir/dw2-3.rS"]
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
fail "$testname (reason: unexpected output)"
send_log "$got\n"
}
if { [regexp_diff tmpdir/dw2-3.rS $srcdir/$subdir/dw2-3.rS] } then {
fail "$testname"
} else {
pass "$testname"
}
if { ![binutils_assemble_flags $srcdir/$subdir/dw2-3.S ${compressedfile3}gnu.o --compress-debug-sections=zlib-gnu] } then {
fail "compressed debug sections with zlib-gnu"
return
}
set src1 ${compressedfile3}gnu.o
set src2 ${compressedfile3}.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
fail "compressed debug sections with zlib-gnu"
return
}
remote_file host delete ${libfile}gabi.a
set got [binutils_run $AR "rc ${libfile}gabi.a ${compressedfile}gabi.o ${compressedfile2}gabi.o ${compressedfile3}gabi.o"]
if ![string match "" $got] then {
fail "compressed debug sections"
return
}
set testname "objcopy compress debug sections with zlib-gabi"
set got [binutils_run $OBJCOPY "--compress-debug-sections=zlib-gabi ${testfile}.o ${copyfile}gabi.o"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
return
}
send_log "cmp ${compressedfile}gabi.o ${copyfile}gabi.o\n"
verbose "cmp ${compressedfile}gabi.o ${copyfile}gabi.o"
set src1 ${compressedfile}gabi.o
set src2 ${copyfile}gabi.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "objcopy ($testname)"
} else {
pass "objcopy ($testname)"
}
set testname "objcopy decompress compressed debug sections with zlib-gabi"
set got [binutils_run $OBJCOPY "--decompress-debug-sections ${compressedfile}gabi.o ${copyfile}gabi.o"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
return
}
send_log "cmp ${testfile}.o ${copyfile}gabi.o\n"
verbose "cmp ${testfile}.o ${copyfile}gabi.o"
set src1 ${testfile}.o
set src2 ${copyfile}gabi.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "objcopy ($testname)"
} else {
pass "objcopy ($testname)"
}
set testname "objcopy zlib-gnu compress debug sections with zlib-gabi"
set got [binutils_run $OBJCOPY "--compress-debug-sections=zlib-gabi ${compressedfile}.o ${copyfile}gabi.o"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
return
}
send_log "cmp ${compressedfile}gabi.o ${copyfile}gabi.o\n"
verbose "cmp ${compressedfile}gabi.o ${copyfile}gabi.o"
set src1 ${compressedfile}gabi.o
set src2 ${copyfile}gabi.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "objcopy ($testname)"
} else {
pass "objcopy ($testname)"
}
set testname "objcopy zlib-gabi compress debug sections with zlib-gnu"
set got [binutils_run $OBJCOPY "--compress-debug-sections=zlib-gnu ${compressedfile}gabi.o ${copyfile}gnu.o"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
return
}
send_log "cmp ${compressedfile}gnu.o ${copyfile}gnu.o\n"
verbose "cmp ${compressedfile}gnu.o ${copyfile}gnu.o"
set src1 ${compressedfile}gnu.o
set src2 ${copyfile}gnu.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "objcopy ($testname)"
} else {
pass "objcopy ($testname)"
}
set testname "objcopy compress debug sections 3 with zlib-gabi"
set got [binutils_run $OBJCOPY "--compress-debug-sections=zlib-gabi ${testfile3}.o ${copyfile}gabi.o"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
return
}
send_log "cmp ${compressedfile3}gabi.o ${copyfile}gabi.o\n"
verbose "cmp ${compressedfile3}gabi.o ${copyfile}gabi.o"
set src1 ${compressedfile3}gabi.o
set src2 ${copyfile}gabi.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "objcopy ($testname)"
} else {
pass "objcopy ($testname)"
}
set testname "objcopy decompress compressed debug sections 3 with zlib-gabi"
set got [binutils_run $OBJCOPY "--decompress-debug-sections ${compressedfile3}gabi.o ${copyfile}gabi.o"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
return
}
send_log "cmp ${testfile3}.o ${copyfile}gabi.o\n"
verbose "cmp ${testfile3}.o ${copyfile}gabi.o"
set src1 ${testfile3}.o
set src2 ${copyfile}gabi.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "objcopy ($testname)"
} else {
pass "objcopy ($testname)"
}
set testname "objcopy zlib-gnu compress debug sections 3 with zlib-gabi"
set got [binutils_run $OBJCOPY "--compress-debug-sections=zlib-gabi ${compressedfile3}.o ${copyfile}gabi.o"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
return
}
send_log "cmp ${compressedfile3}gabi.o ${copyfile}gabi.o\n"
verbose "cmp ${compressedfile3}gabi.o ${copyfile}gabi.o"
set src1 ${compressedfile3}gabi.o
set src2 ${copyfile}gabi.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "objcopy ($testname)"
} else {
pass "objcopy ($testname)"
}
set testname "objcopy zlib-gabi compress debug sections 3 with zlib-gnu"
set got [binutils_run $OBJCOPY "--compress-debug-sections=zlib-gnu ${compressedfile3}gabi.o ${copyfile}gnu.o"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
return
}
send_log "cmp ${compressedfile3}gnu.o ${copyfile}gnu.o\n"
verbose "cmp ${compressedfile3}gnu.o ${copyfile}gnu.o"
set src1 ${compressedfile3}gnu.o
set src2 ${copyfile}gnu.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "objcopy ($testname)"
} else {
pass "objcopy ($testname)"
}
set testname "objcopy zlib-gnu compress debug sections 3"
set got [binutils_run $OBJCOPY "${compressedfile3}gnu.o ${copyfile}gnu.o"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
return
}
send_log "cmp ${compressedfile3}gnu.o ${copyfile}gnu.o\n"
verbose "cmp ${compressedfile3}gnu.o ${copyfile}gnu.o"
set src1 ${compressedfile3}gnu.o
set src2 ${copyfile}gnu.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "objcopy ($testname)"
} else {
pass "objcopy ($testname)"
}
set testname "objcopy zlib-gnu compress debug sections 3"
set got [binutils_run $OBJCOPY "${compressedfile3}gnu.o ${copyfile}gnu.o"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
return
}
send_log "cmp ${compressedfile3}gnu.o ${copyfile}gnu.o\n"
verbose "cmp ${compressedfile3}gnu.o ${copyfile}gnu.o"
set src1 ${compressedfile3}gnu.o
set src2 ${copyfile}gnu.o
set status [remote_exec build cmp "${src1} ${src2}"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if ![string match "" $exec_output] then {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "objcopy ($testname)"
} else {
pass "objcopy ($testname)"
}
set testname "objcopy decompress debug sections in archive with zlib-gabi"
set got [binutils_run $OBJCOPY "--decompress-debug-sections ${libfile}gabi.a ${copyfile}gabi.a"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
} else {
set got [remote_exec host "$READELF -S --wide ${copyfile}gabi.a" "" "/dev/null" "tmpdir/libdw2.out"]
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
fail "$testname (reason: unexpected output)"
send_log $got
send_log "\n"
}
if { [regexp_diff tmpdir/libdw2.out $srcdir/$subdir/libdw2.out] } then {
fail "$testname"
} else {
pass "$testname"
}
}
set testname "objcopy compress debug sections in archive with zlib-gabi"
set got [binutils_run $OBJCOPY "--compress-debug-sections=zlib-gabi ${copyfile}gabi.a ${compressedcopyfile}gabi.a"]
if ![string match "" $got] then {
fail "objcopy ($testname)"
} else {
set got [remote_exec host "$OBJDUMP -s -j .debug_info
${compressedcopyfile}gabi.a" "" "/dev/null" "tmpdir/libdw2-compressedgabi.out"]
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
fail "$testname (reason: unexpected output)"
send_log $got
send_log "\n"
}
if { [regexp_diff tmpdir/libdw2-compressedgabi.out $srcdir/$subdir/libdw2-compressedgabi.out] } then {
fail "$testname"
} else {
pass "$testname"
}
}
set testname "objdump compress debug sections 3 with zlib-gabi"
set got [remote_exec host "$OBJDUMP -W ${compressedfile3}gabi.o" "" "/dev/null" "objdump.out"]
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
fail "$testname"
send_log "$got\n"
}
if { [regexp_diff objdump.out $srcdir/$subdir/dw2-3.W] } then {
fail "$testname"
} else {
pass "$testname"
}

View File

@@ -0,0 +1,3 @@
#...
+\[[ 0-9]+\] .debug_info +(PROGBITS|MIPS_DWARF) +0+ +[0-9a-f]+ +[0-9a-f]+ [0-9a-f]+ +C +0 +0 +1
#pass

View File

@@ -0,0 +1,6 @@
#...
+\[[ 0-9]+\] .debug_info
+(PROGBITS|MIPS_DWARF) +0+ +[0-9a-f]+ +[0-9a-f]+ +[0-9a-f]+ +0 +0 +1
+\[0+800\]: COMPRESSED
+ZLIB, 0+9d, 1
#pass

View File

@@ -0,0 +1,3 @@
#...
.*ZLIB.*
#pass