Emit a warning when -z relro is unsupported
authorAlan Modra <amodra@gmail.com>
Thu, 18 Jun 2020 23:47:20 +0000 (09:17 +0930)
committerAlan Modra <amodra@gmail.com>
Fri, 19 Jun 2020 00:20:20 +0000 (09:50 +0930)
ld silently accepts -z relro and -z norelro for targets that lack the
necessary GNU_RELRO support.  This patch makes those targets emit a
warning instead, and adds testsuite infrastructure to detect when
relro is unsupported.

binutils/
* testsuite/config/default.exp (ld_elf_shared_opt): Don't set.
* testsuite/lib/binutils-common.exp (check_relro_support): New proc.
(run_dump_test): Use check_relro_support to decide whether to pass
extra ld option "-z norelro".
ld/
* emultempl/elf.em (gld${EMULATION_NAME}_handle_option): Omit
-z relro and -z norelro when target support for GNU_RELRO is lacking.
(gld${EMULATION_NAME}_before_parse): Ignore RELRO default too.
* emultempl/aarch64elf.em (gld${EMULATION_NAME}_before_parse): Ignore
RELRO default when target support for GNU_RELRO is lacking.
* emultempl/armelf.em (gld${EMULATION_NAME}_before_parse): Likewise.
* emultempl/linux.em (gld${EMULATION_NAME}_before_parse): Likewise.
* emultempl/scoreelf.em (gld${EMULATION_NAME}_before_parse): Likewise.
* testsuite/config/default.exp (ld_elf_shared_opt): Don't set.
* testsuite/ld-elf/pr16322.d: xfail when no relro support.
* testsuite/ld-elf/pr22393-1a.d: Likewise.
* testsuite/ld-elf/pr22393-1b.d: Likewise.
* testsuite/ld-elf/shared.exp (pr20995-2.so, pr20995-2): Likewise.
* testsuite/lib/ld-lib.exp (run_ld_link_tests): Use check_relro_support
to decide whether to pass extra ld option "-z norelro".

15 files changed:
binutils/ChangeLog
binutils/testsuite/config/default.exp
binutils/testsuite/lib/binutils-common.exp
ld/ChangeLog
ld/emultempl/aarch64elf.em
ld/emultempl/armelf.em
ld/emultempl/elf.em
ld/emultempl/linux.em
ld/emultempl/scoreelf.em
ld/testsuite/config/default.exp
ld/testsuite/ld-elf/pr16322.d
ld/testsuite/ld-elf/pr22393-1a.d
ld/testsuite/ld-elf/pr22393-1b.d
ld/testsuite/ld-elf/shared.exp
ld/testsuite/lib/ld-lib.exp

index 30eae9709d4e785703ddb877003d4c238f540cc5..0cac3f4f95515fab24ddc55521f0a15433eb36f1 100644 (file)
@@ -1,3 +1,10 @@
+2020-06-19  Alan Modra  <amodra@gmail.com>
+
+       * testsuite/config/default.exp (ld_elf_shared_opt): Don't set.
+       * testsuite/lib/binutils-common.exp (check_relro_support): New proc.
+       (run_dump_test): Use check_relro_support to decide whether to pass
+       extra ld option "-z norelro".
+
 2020-06-11  Alan Modra  <amodra@gmail.com>
 
        * readelf.c (process_mips_specific): Don't alloc memory for
 2020-06-11  Alan Modra  <amodra@gmail.com>
 
        * readelf.c (process_mips_specific): Don't alloc memory for
index e3eae97a9e558281549fda17480f228ee8abef4a..c02136c0b693500af9741e5c7be6b31f0292f994 100644 (file)
@@ -34,8 +34,6 @@ if ![info exists LD] then {
 if ![info exists LDFLAGS] then {
     set LDFLAGS ""
 }
 if ![info exists LDFLAGS] then {
     set LDFLAGS ""
 }
-set ld_elf_shared_opt "-z norelro"
-
 if ![info exists NM] then {
     set NM [findfile $base_dir/nm-new $base_dir/nm-new [transform nm]]
 }
 if ![info exists NM] then {
     set NM [findfile $base_dir/nm-new $base_dir/nm-new [transform nm]]
 }
index b9e3c6d8174168226a044d532b760e22ef8f7d8f..491cd8db09ed8cd2f28b89309e377dd4e4028dff 100644 (file)
@@ -308,6 +308,25 @@ proc check_pie_support { } {
     return $pie_available_saved
 }
 
     return $pie_available_saved
 }
 
+proc check_relro_support { } {
+    global relro_available_saved
+    global ld
+
+    if {![info exists relro_available_saved]} {
+       remote_file host delete norelro
+       set ld_output [remote_exec host $ld "-z norelro"]
+       if { [string first "not supported" $ld_output] >= 0
+            || [string first "unrecognized option" $ld_output] >= 0
+            || [string first "-z norelro ignored" $ld_output] >= 0
+            || [string first "cannot find norelro" $ld_output] >= 0 } {
+           set relro_available_saved 0
+       } else {
+           set relro_available_saved 1
+       }
+    }
+    return $relro_available_saved
+}
+
 # Compare two files line-by-line.  FILE_1 is the actual output and FILE_2
 # is the expected output.  Ignore blank lines in either file.
 #
 # Compare two files line-by-line.  FILE_1 is the actual output and FILE_2
 # is the expected output.  Ignore blank lines in either file.
 #
@@ -729,7 +748,7 @@ proc run_dump_test { name {extra_options {}} } {
     global ADDR2LINE ADDR2LINEFLAGS AS ASFLAGS ELFEDIT ELFEDITFLAGS LD LDFLAGS
     global NM NMFLAGS OBJCOPY OBJCOPYFLAGS OBJDUMP OBJDUMPFLAGS
     global READELF READELFFLAGS STRIP STRIPFLAGS
     global ADDR2LINE ADDR2LINEFLAGS AS ASFLAGS ELFEDIT ELFEDITFLAGS LD LDFLAGS
     global NM NMFLAGS OBJCOPY OBJCOPYFLAGS OBJDUMP OBJDUMPFLAGS
     global READELF READELFFLAGS STRIP STRIPFLAGS
-    global copyfile env ld_elf_shared_opt runtests srcdir subdir verbose
+    global copyfile env runtests srcdir subdir verbose
 
     if [string match "*/*" $name] {
        set file $name
 
     if [string match "*/*" $name] {
        set file $name
@@ -1119,9 +1138,9 @@ proc run_dump_test { name {extra_options {}} } {
             set ld_extra_opt ""
             global ld
             set ld "$LD"
             set ld_extra_opt ""
             global ld
             set ld "$LD"
-            if { [is_elf_format] && [check_shared_lib_support] } {
-                set ld_extra_opt "$ld_elf_shared_opt"
-            }
+           if [check_relro_support] {
+               set ld_extra_opt "-z norelro"
+           }
 
             # Add -L$srcdir/$subdir so that the linker command can use
             # linker scripts in the source directory.
 
             # Add -L$srcdir/$subdir so that the linker command can use
             # linker scripts in the source directory.
index 45cf9485d50223898d4d001db06bb67d89df2b83..7a6caa94af9ce5374b068e8a762760b50d2e0939 100644 (file)
@@ -1,3 +1,21 @@
+2020-06-19  Alan Modra  <amodra@gmail.com>
+
+       * emultempl/elf.em (gld${EMULATION_NAME}_handle_option): Omit
+       -z relro and -z norelro when target support for GNU_RELRO is lacking.
+       (gld${EMULATION_NAME}_before_parse): Ignore RELRO default too.
+       * emultempl/aarch64elf.em (gld${EMULATION_NAME}_before_parse): Ignore
+       RELRO default when target support for GNU_RELRO is lacking.
+       * emultempl/armelf.em (gld${EMULATION_NAME}_before_parse): Likewise.
+       * emultempl/linux.em (gld${EMULATION_NAME}_before_parse): Likewise.
+       * emultempl/scoreelf.em (gld${EMULATION_NAME}_before_parse): Likewise.
+       * testsuite/config/default.exp (ld_elf_shared_opt): Don't set.
+       * testsuite/ld-elf/pr16322.d: xfail when no relro support.
+       * testsuite/ld-elf/pr22393-1a.d: Likewise.
+       * testsuite/ld-elf/pr22393-1b.d: Likewise.
+       * testsuite/ld-elf/shared.exp (pr20995-2.so, pr20995-2): Likewise.
+       * testsuite/lib/ld-lib.exp (run_ld_link_tests): Use check_relro_support
+       to decide whether to pass extra ld option "-z norelro".
+
 2020-06-17  H.J. Lu  <hongjiu.lu@intel.com>
 
        * testsuite/ld-elf/linux-x86.exp (check_pr25749a): Append "-w"
 2020-06-17  H.J. Lu  <hongjiu.lu@intel.com>
 
        * testsuite/ld-elf/linux-x86.exp (check_pr25749a): Append "-w"
index d0519b3d7b24542aa7500c1bc706415e48bd4f40..a036da970e7e9bace0c3a3286ab3a39b45bff1ec 100644 (file)
@@ -47,7 +47,13 @@ gld${EMULATION_NAME}_before_parse (void)
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
   link_info.check_relocs_after_open_input = TRUE;
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
   link_info.check_relocs_after_open_input = TRUE;
+EOF
+if test -n "$COMMONPAGESIZE"; then
+fragment <<EOF
   link_info.relro = DEFAULT_LD_Z_RELRO;
   link_info.relro = DEFAULT_LD_Z_RELRO;
+EOF
+fi
+fragment <<EOF
 }
 
 static void
 }
 
 static void
index fb5bbf85f6f8f308b2fab645074dfff5c156877e..34372ba7b0b64055097325f39cf1959de1e75cb3 100644 (file)
@@ -60,7 +60,13 @@ gld${EMULATION_NAME}_before_parse (void)
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
   link_info.check_relocs_after_open_input = TRUE;
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
   link_info.check_relocs_after_open_input = TRUE;
+EOF
+if test -n "$COMMONPAGESIZE"; then
+fragment <<EOF
   link_info.relro = DEFAULT_LD_Z_RELRO;
   link_info.relro = DEFAULT_LD_Z_RELRO;
+EOF
+fi
+fragment <<EOF
 }
 
 static void
 }
 
 static void
index c577e8b2e61b8c128fc309636cc9b443141a354b..356f34538b0d20ba344441feed23f6b00787a48e 100644 (file)
@@ -82,7 +82,13 @@ gld${EMULATION_NAME}_before_parse (void)
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
   link_info.check_relocs_after_open_input = TRUE;
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
   link_info.check_relocs_after_open_input = TRUE;
+EOF
+if test -n "$COMMONPAGESIZE"; then
+fragment <<EOF
   link_info.relro = DEFAULT_LD_Z_RELRO;
   link_info.relro = DEFAULT_LD_Z_RELRO;
+EOF
+fi
+fragment <<EOF
   link_info.separate_code = DEFAULT_LD_Z_SEPARATE_CODE;
 }
 
   link_info.separate_code = DEFAULT_LD_Z_SEPARATE_CODE;
 }
 
@@ -805,10 +811,16 @@ fragment <<EOF
        link_info.combreloc = FALSE;
       else if (strcmp (optarg, "nocopyreloc") == 0)
        link_info.nocopyreloc = TRUE;
        link_info.combreloc = FALSE;
       else if (strcmp (optarg, "nocopyreloc") == 0)
        link_info.nocopyreloc = TRUE;
+EOF
+if test -n "$COMMONPAGESIZE"; then
+fragment <<EOF
       else if (strcmp (optarg, "relro") == 0)
        link_info.relro = TRUE;
       else if (strcmp (optarg, "norelro") == 0)
        link_info.relro = FALSE;
       else if (strcmp (optarg, "relro") == 0)
        link_info.relro = TRUE;
       else if (strcmp (optarg, "norelro") == 0)
        link_info.relro = FALSE;
+EOF
+fi
+fragment <<EOF
       else if (strcmp (optarg, "separate-code") == 0)
        link_info.separate_code = TRUE;
       else if (strcmp (optarg, "noseparate-code") == 0)
       else if (strcmp (optarg, "separate-code") == 0)
        link_info.separate_code = TRUE;
       else if (strcmp (optarg, "noseparate-code") == 0)
index e9d802c657cdab833c6e7b5287fd7c565e1e27aa..14446109eaef0f60301566c68f760a2e82734967 100644 (file)
@@ -52,7 +52,13 @@ gld${EMULATION_NAME}_before_parse (void)
   input_flags.dynamic = TRUE;
   config.has_shared = TRUE;
   link_info.check_relocs_after_open_input = TRUE;
   input_flags.dynamic = TRUE;
   config.has_shared = TRUE;
   link_info.check_relocs_after_open_input = TRUE;
+EOF
+if test -n "$COMMONPAGESIZE"; then
+fragment <<EOF
   link_info.relro = DEFAULT_LD_Z_RELRO;
   link_info.relro = DEFAULT_LD_Z_RELRO;
+EOF
+fi
+fragment <<EOF
 }
 
 /* Try to open a dynamic archive.  This is where we know that Linux
 }
 
 /* Try to open a dynamic archive.  This is where we know that Linux
index 327ec6b6fffae06a6c4d45e1d578f0d5c39a27ab..70b9a705209dab11b2a11170d5d3ff8239111265 100644 (file)
@@ -40,7 +40,13 @@ gld${EMULATION_NAME}_before_parse (void)
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
   link_info.check_relocs_after_open_input = TRUE;
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
   link_info.check_relocs_after_open_input = TRUE;
+EOF
+if test -n "$COMMONPAGESIZE"; then
+fragment <<EOF
   link_info.relro = DEFAULT_LD_Z_RELRO;
   link_info.relro = DEFAULT_LD_Z_RELRO;
+EOF
+fi
+fragment <<EOF
 }
 
 static void
 }
 
 static void
index b2097ce7af25a02f29c3a791e3f263ba616982d3..9e89ca1283472c2ab071fb65104007e3246f7a1a 100644 (file)
@@ -76,9 +76,6 @@ if {[file exists tmpdir/libpath.exp]} {
     }
 }
 
     }
 }
 
-# Many ELF testcases expect that "-z relro" is off.
-set ld_elf_shared_opt "-z norelro"
-
 # The "make check" target in the Makefile passes in
 # "CC=$(CC_FOR_TARGET)".  But, if the user invokes runtest directly
 # (as when testing an installed linker), these flags may not be set.  
 # The "make check" target in the Makefile passes in
 # "CC=$(CC_FOR_TARGET)".  But, if the user invokes runtest directly
 # (as when testing an installed linker), these flags may not be set.  
index 7bd1a6ff1aeecac62e2e9def2338ab757b7c9a62..1e9175c67de766d1c3b71bacf6b862a28b43f876 100644 (file)
@@ -2,6 +2,7 @@
 #readelf: -l --wide
 #target: *-*-linux-gnu *-*-gnu* *-*-nacl* arm*-*-uclinuxfdpiceabi
 #xfail: ![check_shared_lib_support] 
 #readelf: -l --wide
 #target: *-*-linux-gnu *-*-gnu* *-*-nacl* arm*-*-uclinuxfdpiceabi
 #xfail: ![check_shared_lib_support] 
+#xfail: ![check_relro_support]
 
 #...
   GNU_RELRO .*
 
 #...
   GNU_RELRO .*
index c08ecaa3b0cf7d9f0c7c2671619e649a5fe975e5..2bfa40375671b6ed8ab78245b23cc8f23981a4c2 100644 (file)
@@ -3,6 +3,7 @@
 #readelf: -l --wide
 #target: *-*-linux-gnu *-*-gnu* *-*-nacl* arm*-*-uclinuxfdpiceabi
 #xfail: ![check_shared_lib_support] 
 #readelf: -l --wide
 #target: *-*-linux-gnu *-*-gnu* *-*-nacl* arm*-*-uclinuxfdpiceabi
 #xfail: ![check_shared_lib_support] 
+#xfail: ![check_relro_support]
 
 #failif
 #...
 
 #failif
 #...
index b0020a17142b97ce3083e56a59cc06c66be76ad8..96d8bc01b97787254958fe2dbc4fb6f39837340f 100644 (file)
@@ -3,6 +3,7 @@
 #readelf: -l --wide
 #target: *-*-linux-gnu *-*-gnu* *-*-nacl* arm*-*-uclinuxfdpiceabi
 #xfail: ![check_shared_lib_support] 
 #readelf: -l --wide
 #target: *-*-linux-gnu *-*-gnu* *-*-nacl* arm*-*-uclinuxfdpiceabi
 #xfail: ![check_shared_lib_support] 
+#xfail: ![check_relro_support]
 
 #failif
 #...
 
 #failif
 #...
index 9d72cad78d6c326644821192e9f395cce4df02b0..8f4ed71de5576a907fc658ef6eb93fc0a5dbd383 100644 (file)
@@ -454,16 +454,6 @@ run_ld_link_tests [list \
        {pr20995b.s} {} "pr20995.so"] \
 ]
 
        {pr20995b.s} {} "pr20995.so"] \
 ]
 
-# xfail on arm*-*-eabi*.  The list can be enlarged to those targets that
-# don't support GNU_RELRO.  For more details, please see discussions at:
-#   https://sourceware.org/ml/binutils/2017-01/msg00441.html
-run_ld_link_tests [list \
-    [list "Build pr20995-2.so" \
-       "-shared -z relro" "" "$AFLAGS_PIC" \
-       {pr20995c.s} {{readelf {-l --wide} pr20995-2so.r}} "pr20995-2.so"] \
-] "tic6x-*-*" "arm*-*-eabi*" "hppa*64*-*-hpux*" "aarch64*-*-elf*" \
-  "*-*-lynxos*" "arm*-*-nto*" "i?86-*-nto*" "sh*-*-nto*"
-
 # These targets don't copy dynamic variables into .bss.
 setup_xfail "alpha-*-*" "bfin-*-*" "ia64-*-*" "xtensa-*-*"
 # or don't have .data.rel.ro
 # These targets don't copy dynamic variables into .bss.
 setup_xfail "alpha-*-*" "bfin-*-*" "ia64-*-*" "xtensa-*-*"
 # or don't have .data.rel.ro
@@ -474,16 +464,22 @@ run_ld_link_tests [list \
        "$LFLAGS" "tmpdir/pr20995.so" "$AFLAGS_NONPIC" \
        {pr20995a.s} {{readelf {-S --wide} pr20995.r}} "pr20995"]]
 
        "$LFLAGS" "tmpdir/pr20995.so" "$AFLAGS_NONPIC" \
        {pr20995a.s} {{readelf {-S --wide} pr20995.r}} "pr20995"]]
 
-# xfail on arm*-*-eabi* is particularly because of no support of GNU_RELRO.
-# Please see the link above for details.
-setup_xfail "alpha-*-*" "bfin-*-*" "ia64-*-*" "xtensa-*-*" "arm*-*-eabi*"
-setup_xfail "hppa*64*-*-hpux*" "aarch64*-*-elf*" "tic6x-*-*"
+# xfail on targets that don't support GNU_RELRO.
+#   For more details, please see discussions at:
+#   https://sourceware.org/ml/binutils/2017-01/msg00441.html
+run_ld_link_tests [list \
+    [list "Build pr20995-2.so" \
+       "-shared -z relro" "" "$AFLAGS_PIC" \
+       {pr20995c.s} {{readelf {-l --wide} pr20995-2so.r}} "pr20995-2.so"] \
+] {![check_relro_support]}
+
+setup_xfail alpha-*-* xtensa-*-*
 run_ld_link_tests [list \
     [list \
        "pr20995-2" \
        "$LFLAGS" "tmpdir/pr20995-2.so" "$AFLAGS_NONPIC" \
        {pr20995a.s} {{readelf {-S --wide} pr20995.r}} "pr20995-2"]
 run_ld_link_tests [list \
     [list \
        "pr20995-2" \
        "$LFLAGS" "tmpdir/pr20995-2.so" "$AFLAGS_NONPIC" \
        {pr20995a.s} {{readelf {-S --wide} pr20995.r}} "pr20995-2"]
-] "*-*-lynxos*" "arm*-*-nto*" "i?86-*-nto*" "sh*-*-nto*"
+] {![check_relro_support]}
 
 run_ld_link_tests [list \
     [list "Build pr22374 shared library" \
 
 run_ld_link_tests [list \
     [list "Build pr22374 shared library" \
index a949437cea301b944df559009e5ba0dc21c2b19b..0a256c2395faa1df515e253c8a3b90f48ce2f702 100644 (file)
@@ -463,12 +463,10 @@ proc run_ld_link_tests { ldtests args } {
     global CFLAGS
     global runtests
     global exec_output
     global CFLAGS
     global runtests
     global exec_output
-    global ld_elf_shared_opt
 
 
-    if { [is_elf_format] && [check_shared_lib_support] } {
-       set ld_extra_opt "$ld_elf_shared_opt"
-    } else {
-       set ld_extra_opt ""
+    set ld_extra_opt ""
+    if [check_relro_support] {
+       set ld_extra_opt "-z norelro"
     }
 
     foreach testitem $ldtests {
     }
 
     foreach testitem $ldtests {
This page took 0.035781 seconds and 4 git commands to generate.