forked from Imagelibrary/binutils-gdb
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:
@@ -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"
|
||||
}
|
||||
|
||||
3
binutils/testsuite/binutils-all/dw2-3.rS
Normal file
3
binutils/testsuite/binutils-all/dw2-3.rS
Normal 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
|
||||
6
binutils/testsuite/binutils-all/dw2-3.rt
Normal file
6
binutils/testsuite/binutils-all/dw2-3.rt
Normal 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
|
||||
@@ -0,0 +1,3 @@
|
||||
#...
|
||||
.*ZLIB.*
|
||||
#pass
|
||||
Reference in New Issue
Block a user