aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-04-14 22:01:25 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-04-14 22:01:38 -0700
commit0ce398f106dac65c3a1d2f7d254213fa652af089 (patch)
tree6ab688c878a7eac3183247b29dd9add73bf1dec6 /ld
parentecd272101d27ed8d654cbab9972aa05c124f981c (diff)
downloadgdb-0ce398f106dac65c3a1d2f7d254213fa652af089.zip
gdb-0ce398f106dac65c3a1d2f7d254213fa652af089.tar.gz
gdb-0ce398f106dac65c3a1d2f7d254213fa652af089.tar.bz2
Add --compress-debug-sections=[none|zlib|zlib-gnu|zlib-gabi]
This patch adds --compress-debug-sections=[none|zlib|zlib-gnu|zlib-gabi] to ld for ELF targets to support generating compressed DWARF debug sections. We always generate .zdebug_* section since section names have been finalized and they can't be changed easily when compression is being performed. bfd/ * bfd-in.h (compressed_debug_section_type): New. * compress.c (bfd_compress_section_contents): Add an argument for linker write compression and always generate .zdebug_* section when linking. (bfd_init_section_compress_status): Pass FALSE to bfd_compress_section_contents. (bfd_compress_section): New function. * elf.c (elf_fake_sections): For linking, set SEC_ELF_COMPRESS on DWARF debug sections if COMPRESS_DEBUG is set and rename section if COMPRESS_DEBUG_GABI_ZLIB isn't set. (assign_file_positions_for_non_load_sections): Set sh_offset to -1 if SEC_ELF_COMPRESS is set. (assign_file_positions_except_relocs): Likwise. (_bfd_elf_assign_file_positions_for_relocs): Renamed to ... (_bfd_elf_assign_file_positions_for_non_load): This. Change return time to bfd_boolean. Compress the section if SEC_ELF_COMPRESS is set. (_bfd_elf_write_object_contents): Updated. (_bfd_elf_set_section_contents): Write section contents to the buffer if SEC_ELF_COMPRESS is set. * merge.c: Include "elf-bfd.h". (sec_merge_emit): Add arguments for contents and offset. Write to contents with offset if contents isn't NULL. (_bfd_write_merged_section): Write section contents to the buffer if SEC_ELF_COMPRESS is set. Pass contents and output_offset to sec_merge_emit. * elflink.c (bfd_elf_final_link): Allocate the buffer for output section contents if SEC_ELF_COMPRESS is set. * section.c (SEC_ELF_COMPRESS): New. * bfd-in2.h: Regenerated. gas/ * as.h (compressed_debug_section_type): Removed. include/ * bfdlink.h (bfd_link_info): Add compress_debug. ld/ * ld.texinfo: Document --compress-debug-sections=. * ldmain.c (main): Set BFD_COMPRESS on output_bfd if COMPRESS_DEBUG is set. Set BFD_COMPRESS_GABI on output_bfd for COMPRESS_DEBUG_GABI_ZLIB. * lexsup.c (elf_static_list_options): Add --compress-debug-sections=. * emultempl/elf32.em (OPTION_COMPRESS_DEBUG): New. (xtra_long): Add "compress-debug-sections". (gld${EMULATION_NAME}_handle_option): Handle OPTION_COMPRESS_DEBUG. ld/testsuite/ * ld-elf/compress.exp (build_tests): Add tests for --compress-debug-sections=. (run_tests): Likewise. Add additonal tests for --compress-debug-sections=. * ld-elf/gabiend.rt: New file. * ld-elf/gabinormal.rt: Likewise. * ld-elf/gnubegin.rS: Likewise. * ld-elf/gnunormal.rS: Likewise. * ld-elf/zlibbegin.rS: Likewise. * ld-elf/zlibnormal.rS: Likewise.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog13
-rw-r--r--ld/emultempl/elf32.em15
-rw-r--r--ld/ld.texinfo16
-rw-r--r--ld/ldmain.c7
-rw-r--r--ld/lexsup.c3
-rw-r--r--ld/testsuite/ChangeLog13
-rw-r--r--ld/testsuite/ld-elf/compress.exp167
-rw-r--r--ld/testsuite/ld-elf/gabiend.rt4
-rw-r--r--ld/testsuite/ld-elf/gabinormal.rt4
-rw-r--r--ld/testsuite/ld-elf/gnubegin.rS3
-rw-r--r--ld/testsuite/ld-elf/gnunormal.rS3
-rw-r--r--ld/testsuite/ld-elf/zlibbegin.rS3
-rw-r--r--ld/testsuite/ld-elf/zlibnormal.rS3
13 files changed, 253 insertions, 1 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 3e944fe..bad213b 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,18 @@
2015-04-14 H.J. Lu <hongjiu.lu@intel.com>
+ * ld.texinfo: Document --compress-debug-sections=.
+ * ldmain.c (main): Set BFD_COMPRESS on output_bfd if
+ COMPRESS_DEBUG is set. Set BFD_COMPRESS_GABI on output_bfd
+ for COMPRESS_DEBUG_GABI_ZLIB.
+ * lexsup.c (elf_static_list_options): Add
+ --compress-debug-sections=.
+ * emultempl/elf32.em (OPTION_COMPRESS_DEBUG): New.
+ (xtra_long): Add "compress-debug-sections".
+ (gld${EMULATION_NAME}_handle_option): Handle
+ OPTION_COMPRESS_DEBUG.
+
+2015-04-14 H.J. Lu <hongjiu.lu@intel.com>
+
PR ld/pr17709
* ld.texinfo: Document "-z noextern-protected-data".
* ldmain.c (main): Initialize link_info.extern_protected_data
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
index 5db5a93..0802d76 100644
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -2110,6 +2110,7 @@ fragment <<EOF
#define OPTION_HASH_STYLE (OPTION_EXCLUDE_LIBS + 1)
#define OPTION_BUILD_ID (OPTION_HASH_STYLE + 1)
#define OPTION_AUDIT (OPTION_BUILD_ID + 1)
+#define OPTION_COMPRESS_DEBUG (OPTION_AUDIT + 1)
static void
gld${EMULATION_NAME}_add_options
@@ -2137,6 +2138,7 @@ EOF
fi
fragment <<EOF
{"build-id", optional_argument, NULL, OPTION_BUILD_ID},
+ {"compress-debug-sections", required_argument, NULL, OPTION_COMPRESS_DEBUG},
EOF
if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
fragment <<EOF
@@ -2186,6 +2188,19 @@ gld${EMULATION_NAME}_handle_option (int optc)
emit_note_gnu_build_id = xstrdup (optarg);
break;
+ case OPTION_COMPRESS_DEBUG:
+ if (strcasecmp (optarg, "none") == 0)
+ link_info.compress_debug = COMPRESS_DEBUG_NONE;
+ else if (strcasecmp (optarg, "zlib") == 0)
+ link_info.compress_debug = COMPRESS_DEBUG_ZLIB;
+ else if (strcasecmp (optarg, "zlib-gnu") == 0)
+ link_info.compress_debug = COMPRESS_DEBUG_GNU_ZLIB;
+ else if (strcasecmp (optarg, "zlib-gabi") == 0)
+ link_info.compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
+ else
+ einfo (_("%P%F: invalid --compress-debug-sections option: \`%s'\n"),
+ optarg);
+ break;
EOF
if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
diff --git a/ld/ld.texinfo b/ld/ld.texinfo
index 4348c88..77c02d6 100644
--- a/ld/ld.texinfo
+++ b/ld/ld.texinfo
@@ -2201,6 +2201,22 @@ new style GNU @code{.gnu.hash} section or @code{both} for both
the classic ELF @code{.hash} and new style GNU @code{.gnu.hash}
hash tables. The default is @code{sysv}.
+@kindex --compress-debug-sections=none
+@kindex --compress-debug-sections=zlib
+@kindex --compress-debug-sections=zlib-gnu
+@kindex --compress-debug-sections=zlib-gabi
+@item --compress-debug-sections=none
+@itemx --compress-debug-sections=zlib
+@itemx --compress-debug-sections=zlib-gnu
+@itemx --compress-debug-sections=zlib-gabi
+On ELF platforms , these options control how DWARF debug sections are
+compressed using zlib. @option{--compress-debug-sections=none} doesn't
+compress DWARF debug sections. @option{--compress-debug-sections=zlib}
+and @option{--compress-debug-sections=zlib-gnu} compress DWARF debug
+sections and rename debug section names to begin with @samp{.zdebug}
+instead of @samp{.debug}. @option{--compress-debug-sections=zlib-gabi}
+compresses DWARF debug sections with SHF_COMPRESSED from the ELF ABI.
+
@kindex --reduce-memory-overheads
@item --reduce-memory-overheads
This option reduces memory requirements at ld runtime, at the expense of
diff --git a/ld/ldmain.c b/ld/ldmain.c
index 2ecb92d..a7b72bd 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -425,6 +425,13 @@ main (int argc, char **argv)
else
link_info.output_bfd->flags |= EXEC_P;
+ if ((link_info.compress_debug & COMPRESS_DEBUG))
+ {
+ link_info.output_bfd->flags |= BFD_COMPRESS;
+ if (link_info.compress_debug == COMPRESS_DEBUG_GABI_ZLIB)
+ link_info.output_bfd->flags |= BFD_COMPRESS_GABI;
+ }
+
ldwrite ();
if (config.map_file != NULL)
diff --git a/ld/lexsup.c b/ld/lexsup.c
index 4a71ba4..b618241 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -1722,6 +1722,9 @@ elf_static_list_options (FILE *file)
fprintf (file, _("\
--build-id[=STYLE] Generate build ID note\n"));
fprintf (file, _("\
+ --compress-debug-sections=[none|zlib|zlib-gnu|zlib-gabi]\n\
+ Compress DWARF debug sections using zlib\n"));
+ fprintf (file, _("\
-z common-page-size=SIZE Set common page size to SIZE\n"));
fprintf (file, _("\
-z max-page-size=SIZE Set maximum page size to SIZE\n"));
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index c2ed134..54ae0ae 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,16 @@
+2015-04-14 H.J. Lu <hongjiu.lu@intel.com>
+
+ * ld-elf/compress.exp (build_tests): Add tests for
+ --compress-debug-sections=.
+ (run_tests): Likewise.
+ Add additonal tests for --compress-debug-sections=.
+ * ld-elf/gabiend.rt: New file.
+ * ld-elf/gabinormal.rt: Likewise.
+ * ld-elf/gnubegin.rS: Likewise.
+ * ld-elf/gnunormal.rS: Likewise.
+ * ld-elf/zlibbegin.rS: Likewise.
+ * ld-elf/zlibnormal.rS: Likewise.
+
2015-04-15 Alan Modra <amodra@gmail.com>
* ld-gc/pr18223.d: xfail tic6x.
diff --git a/ld/testsuite/ld-elf/compress.exp b/ld/testsuite/ld-elf/compress.exp
index adb7fc2..e2448b9 100644
--- a/ld/testsuite/ld-elf/compress.exp
+++ b/ld/testsuite/ld-elf/compress.exp
@@ -49,7 +49,8 @@ set build_tests {
"-shared" "-fPIC -g -Wa,--compress-debug-sections"
{foo.c} {} "libfoo.so"}
{"Build libbar.so with compressed debug sections"
- "-shared" "-fPIC -g -Wa,--compress-debug-sections"
+ "-shared -Wl,--compress-debug-sections=none"
+ "-fPIC -g -Wa,--compress-debug-sections"
{begin.c end.c} {} "libbar.so"}
{"Build libfoozlib.so with compressed debug sections with zlib-gabi"
"-shared" "-fPIC -g -Wa,--compress-debug-sections=zlib-gabi"
@@ -57,6 +58,30 @@ set build_tests {
{"Build libbarzlib.so with compressed debug sections with zlib-gabi"
"-shared" "-fPIC -g -Wa,--compress-debug-sections=zlib-gabi"
{begin.c end.c} {} "libbarzlib.so"}
+ {"Build libzlibfoo.so with zlib compressed debug sections"
+ "-shared -Wl,--compress-debug-sections=zlib"
+ "-fPIC -g -Wa,--compress-debug-sections=zlib"
+ {foo.c} {} "libzlibfoo.so"}
+ {"Build libgnufoo.so with zlib-gnu compressed debug sections"
+ "-shared -Wl,--compress-debug-sections=zlib-gnu"
+ "-fPIC -g -Wa,--compress-debug-sections=zlib-gnu"
+ {foo.c} {} "libgnufoo.so"}
+ {"Build libgabifoo.so with zlib-gabi compressed debug sections"
+ "-shared -Wl,--compress-debug-sections=zlib-gabi"
+ "-fPIC -g -Wa,--compress-debug-sections=zlib-gabi"
+ {foo.c} {} "libgabifoo.so"}
+ {"Build zlibbegin.o with zlib compressed debug sections"
+ "-r -nostdlib -Wl,--compress-debug-sections=zlib"
+ "-g -Wa,--compress-debug-sections=zlib"
+ {begin.c} {} "zlibbegin.o"}
+ {"Build gnubegin.o with zlib-gnu compressed debug sections"
+ "-r -nostdlib -Wl,--compress-debug-sections=zlib-gnu"
+ "-g -Wa,--compress-debug-sections=zlib-gnu"
+ {begin.c} {} "gnubegin.o"}
+ {"Build gabiend.o with zlib-gabi compressed debug sections"
+ "-r -nostdlib -Wl,--compress-debug-sections=zlib-gabi"
+ "-g -Wa,--compress-debug-sections=zlib-gnu"
+ {end.c} {} "gabiend.o"}
}
set run_tests {
@@ -66,6 +91,15 @@ set run_tests {
{"Run normal with libfoo.so with compressed debug sections with zlib-gabi"
"tmpdir/begin.o tmpdir/libfoozlib.so tmpdir/end.o" ""
{main.c} "normal" "normal.out" "-Wa,--compress-debug-sections=zlib-gabi"}
+ {"Run zlibnormal with libzlibfoo.so with zlib compressed debug sections"
+ "tmpdir/begin.o tmpdir/libzlibfoo.so tmpdir/end.o --compress-debug-sections=zlib" ""
+ {main.c} "zlibnormal" "normal.out" "-Wa,--compress-debug-sections=zlib"}
+ {"Run gnunormal with libgnufoo.so with zlib-gnu compressed debug sections"
+ "tmpdir/gnubegin.o tmpdir/libgnufoo.so tmpdir/end.o --compress-debug-sections=zlib-gnu" ""
+ {main.c} "gnunormal" "normal.out" "-Wa,--compress-debug-sections=zlib-gnu"}
+ {"Run gabinormal with libgabifoo.so with zlib-gabi compressed debug sections"
+ "tmpdir/zlibbegin.o tmpdir/libgabifoo.so tmpdir/gabiend.o --compress-debug-sections=zlib-gabi" ""
+ {main.c} "gabinormal" "normal.out" "-Wa,--compress-debug-sections=zlib-gabi"}
}
run_cc_link_tests $build_tests
@@ -79,3 +113,134 @@ if { [catch {exec cmp tmpdir/libfoo.so tmpdir/libfoozlib.so}] } then {
} else {
pass "$test_name"
}
+
+global READELF
+
+set test_name "Link -r with zlib compressed debug output"
+set test zlibbegin
+send_log "$READELF -S -W tmpdir/$test.o > tmpdir/$test.out\n"
+set got [remote_exec host "$READELF -S -W tmpdir/$test.o" "" "/dev/null" "tmpdir/$test.out"]
+if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ send_log "$got\n"
+ unresolved "$test_name"
+}
+if { [regexp_diff tmpdir/$test.out $srcdir/$subdir/$test.rS] } then {
+ fail "$test_name"
+} else {
+ pass "$test_name"
+}
+
+set test_name "Link -r with zlib-gnu compressed debug output"
+set test gnubegin
+send_log "$READELF -S -W tmpdir/$test.o > tmpdir/$test.out\n"
+set got [remote_exec host "$READELF -S -W tmpdir/$test.o" "" "/dev/null" "tmpdir/$test.out"]
+if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ send_log "$got\n"
+ unresolved "$test_name"
+}
+if { [regexp_diff tmpdir/$test.out $srcdir/$subdir/$test.rS] } then {
+ fail "$test_name"
+} else {
+ pass "$test_name"
+}
+
+set test_name "Link -r with zlib-gabi compressed debug output"
+set test gabiend
+send_log "$READELF -t -W tmpdir/$test.o > tmpdir/$test.out\n"
+set got [remote_exec host "$READELF -t -W tmpdir/$test.o" "" "/dev/null" "tmpdir/$test.out"]
+if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ send_log "$got\n"
+ unresolved "$test_name"
+}
+if { [regexp_diff tmpdir/$test.out $srcdir/$subdir/$test.rt] } then {
+ fail "$test_name"
+} else {
+ pass "$test_name"
+}
+
+set test_name "Link with zlib compressed debug output"
+set test normal
+send_log "$READELF -w tmpdir/$test > tmpdir/$test.out\n"
+set got [remote_exec host "$READELF -w tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"]
+if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ send_log "$got\n"
+ unresolved "$test_name"
+}
+
+set test_name "Link with zlib compressed debug output"
+set test zlibnormal
+send_log "$READELF -w tmpdir/$test | sed -e \"s/.zdebug_/.debug_/\" > tmpdir/$test.out\n"
+set got [remote_exec host "$READELF -w tmpdir/$test | sed -e \"s/.zdebug_/.debug_/\"" "" "/dev/null" "tmpdir/$test.out"]
+if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ send_log "$got\n"
+ unresolved "$test_name"
+}
+if { [catch {exec cmp tmpdir/normal.out tmpdir/$test.out}] } then {
+ send_log "tmpdir/normal.out tmpdir/$test.out differ.\n"
+ fail "$test_name"
+} else {
+ pass "$test_name"
+}
+send_log "$READELF -S -W tmpdir/$test' > tmpdir/$test.out\n"
+set got [remote_exec host "$READELF -S -W tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"]
+if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ send_log "$got\n"
+ unresolved "$test_name"
+}
+if { [regexp_diff tmpdir/$test.out $srcdir/$subdir/$test.rS] } then {
+ fail "$test_name"
+} else {
+ pass "$test_name"
+}
+
+set test_name "Link with zlib-gnu compressed debug output"
+set test gnunormal
+send_log "$READELF -w tmpdir/$test | sed -e \"s/.zdebug_/.debug_/\" > tmpdir/$test.out\n"
+set got [remote_exec host "$READELF -w tmpdir/$test | sed -e \"s/.zdebug_/.debug_/\"" "" "/dev/null" "tmpdir/$test.out"]
+if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ send_log "$got\n"
+ unresolved "$test_name"
+}
+if { [catch {exec cmp tmpdir/normal.out tmpdir/$test.out}] } then {
+ send_log "tmpdir/normal.out tmpdir/$test.out differ.\n"
+ fail "$test_name"
+} else {
+ pass "$test_name"
+}
+send_log "$READELF -S -W tmpdir/$test' > tmpdir/$test.out\n"
+set got [remote_exec host "$READELF -S -W tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"]
+if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ send_log "$got\n"
+ unresolved "$test_name"
+}
+if { [regexp_diff tmpdir/$test.out $srcdir/$subdir/$test.rS] } then {
+ fail "$test_name"
+} else {
+ pass "$test_name"
+}
+
+set test gabinormal
+set test_name "Link with zlib-gabi compressed debug output"
+send_log "$READELF -w tmpdir/$test > tmpdir/$test.out\n"
+set got [remote_exec host "$READELF -w tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"]
+if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ send_log "$got\n"
+ unresolved "$test_name"
+}
+if { [catch {exec cmp tmpdir/normal.out tmpdir/$test.out}] } then {
+ send_log "tmpdir/normal.out tmpdir/$test.out differ.\n"
+ fail "$test_name"
+} else {
+ pass "$test_name"
+}
+send_log "$READELF -t -W tmpdir/$test > tmpdir/$test.out\n"
+set got [remote_exec host "$READELF -t -W tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"]
+if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ send_log "$got\n"
+ unresolved "$test_name"
+}
+if { [regexp_diff tmpdir/$test.out $srcdir/$subdir/$test.rt] } then {
+ fail "$test_name"
+} else {
+ pass "$test_name"
+}
diff --git a/ld/testsuite/ld-elf/gabiend.rt b/ld/testsuite/ld-elf/gabiend.rt
new file mode 100644
index 0000000..23bc36c
--- /dev/null
+++ b/ld/testsuite/ld-elf/gabiend.rt
@@ -0,0 +1,4 @@
+#...
+ +\[[0-9a-f]+\]: .*COMPRESSED
+ +ZLIB, [0-9a-f]+, 1
+#pass
diff --git a/ld/testsuite/ld-elf/gabinormal.rt b/ld/testsuite/ld-elf/gabinormal.rt
new file mode 100644
index 0000000..23bc36c
--- /dev/null
+++ b/ld/testsuite/ld-elf/gabinormal.rt
@@ -0,0 +1,4 @@
+#...
+ +\[[0-9a-f]+\]: .*COMPRESSED
+ +ZLIB, [0-9a-f]+, 1
+#pass
diff --git a/ld/testsuite/ld-elf/gnubegin.rS b/ld/testsuite/ld-elf/gnubegin.rS
new file mode 100644
index 0000000..54de24c
--- /dev/null
+++ b/ld/testsuite/ld-elf/gnubegin.rS
@@ -0,0 +1,3 @@
+#...
+ +\[[ 0-9]+\] .zdebug_.* +(PROGBITS|MIPS_DWARF) +0+ +[0-9a-f]+ +[0-9a-f]+ [0-9a-f]+ +0 +0 +1
+#pass
diff --git a/ld/testsuite/ld-elf/gnunormal.rS b/ld/testsuite/ld-elf/gnunormal.rS
new file mode 100644
index 0000000..54de24c
--- /dev/null
+++ b/ld/testsuite/ld-elf/gnunormal.rS
@@ -0,0 +1,3 @@
+#...
+ +\[[ 0-9]+\] .zdebug_.* +(PROGBITS|MIPS_DWARF) +0+ +[0-9a-f]+ +[0-9a-f]+ [0-9a-f]+ +0 +0 +1
+#pass
diff --git a/ld/testsuite/ld-elf/zlibbegin.rS b/ld/testsuite/ld-elf/zlibbegin.rS
new file mode 100644
index 0000000..54de24c
--- /dev/null
+++ b/ld/testsuite/ld-elf/zlibbegin.rS
@@ -0,0 +1,3 @@
+#...
+ +\[[ 0-9]+\] .zdebug_.* +(PROGBITS|MIPS_DWARF) +0+ +[0-9a-f]+ +[0-9a-f]+ [0-9a-f]+ +0 +0 +1
+#pass
diff --git a/ld/testsuite/ld-elf/zlibnormal.rS b/ld/testsuite/ld-elf/zlibnormal.rS
new file mode 100644
index 0000000..54de24c
--- /dev/null
+++ b/ld/testsuite/ld-elf/zlibnormal.rS
@@ -0,0 +1,3 @@
+#...
+ +\[[ 0-9]+\] .zdebug_.* +(PROGBITS|MIPS_DWARF) +0+ +[0-9a-f]+ +[0-9a-f]+ [0-9a-f]+ +0 +0 +1
+#pass