]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
bfd: Discard symbol regardless of warning flag
authorTorbjörn SVENSSON <torbjorn.svensson@foss.st.com>
Sat, 17 Dec 2022 10:16:19 +0000 (11:16 +0100)
committerTorbjörn SVENSSON <torbjorn.svensson@foss.st.com>
Tue, 20 Dec 2022 10:37:22 +0000 (11:37 +0100)
The discard of symbols should be performed whether the warning for
the discard is enabled or not.
Without this patch, ld would segfault in bfd_section_removed_from_list,
called in the if-statement right after this block, as the argument
isec->output_section can be NULL.

Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>
Co-Authored-By: Yvan ROUX <yvan.roux@foss.st.com>
bfd/elflink.c
ld/testsuite/ld-arm/arm-elf.exp
ld/testsuite/ld-arm/non-contiguous-arm7.d [new file with mode: 0644]
ld/testsuite/ld-arm/non-contiguous-arm7.ld [new file with mode: 0644]
ld/testsuite/ld-arm/non-contiguous-arm7.s [new file with mode: 0644]

index fc3edef9a0564c8e52258f122f2c77eaec6b4d44..0368256970b4182dd2e1094ef87ca46ed2f8a2a4 100644 (file)
@@ -11154,12 +11154,12 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd)
       if (isym->st_shndx != SHN_UNDEF
          && isym->st_shndx < SHN_LORESERVE
          && isec->output_section == NULL
-         && flinfo->info->non_contiguous_regions
-         && flinfo->info->non_contiguous_regions_warnings)
+         && flinfo->info->non_contiguous_regions)
        {
-         _bfd_error_handler (_("warning: --enable-non-contiguous-regions "
-                               "discards section `%s' from '%s'\n"),
-                             isec->name, bfd_get_filename (isec->owner));
+         if (flinfo->info->non_contiguous_regions_warnings)
+           _bfd_error_handler (_("warning: --enable-non-contiguous-regions "
+                                 "discards section `%s' from '%s'\n"),
+                               isec->name, bfd_get_filename (isec->owner));
          continue;
        }
 
index e53b9bba723eda5056acac8b6e672df0e54487c2..ce3605d37094efe0247bbab7943308aad1541b00 100644 (file)
@@ -1271,6 +1271,7 @@ run_dump_test "non-contiguous-arm3"
 run_dump_test "non-contiguous-arm4"
 run_dump_test "non-contiguous-arm5"
 run_dump_test "non-contiguous-arm6"
+run_dump_test "non-contiguous-arm7"
 
 if { !$is_nacl && [check_shared_lib_support] } {
     run_dump_test "thumb-plt"
diff --git a/ld/testsuite/ld-arm/non-contiguous-arm7.d b/ld/testsuite/ld-arm/non-contiguous-arm7.d
new file mode 100644 (file)
index 0000000..b8f08d4
--- /dev/null
@@ -0,0 +1,4 @@
+#name: non-contiguous-arm7
+#source: non-contiguous-arm7.s
+#ld: --enable-non-contiguous-regions -T non-contiguous-arm7.ld
+#error: \A.*unresolvable R_ARM_ABS32 relocation against symbol .MY_BUF..*\Z
diff --git a/ld/testsuite/ld-arm/non-contiguous-arm7.ld b/ld/testsuite/ld-arm/non-contiguous-arm7.ld
new file mode 100644 (file)
index 0000000..9934fdf
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ The section .bss.MY_BUF won't fit in RAM1 or RAM2
+*/
+
+MEMORY
+{
+  ROM  (rx)    : ORIGIN = 0x8000000,    LENGTH = 10K
+  RAM1 (xrw)   : ORIGIN = 0x10000000,   LENGTH = 64K
+  RAM2 (xrw)   : ORIGIN = 0x20000000,   LENGTH = 96K
+}
+
+SECTIONS
+{
+  .text :
+  {
+    KEEP(*(.text.foo)) ;
+  } >ROM
+
+  .bss :
+  {
+    _sbss = .;
+    *(.bss) *(.bss*) ;
+    _ebss = .;
+  } >RAM1
+
+  .bss_ram2 :
+  {
+    _sbss_ram2 = .;
+    *(.bss) *(.bss*) ;
+    _ebss_ram2 = .;
+  } >RAM2
+}
diff --git a/ld/testsuite/ld-arm/non-contiguous-arm7.s b/ld/testsuite/ld-arm/non-contiguous-arm7.s
new file mode 100644 (file)
index 0000000..be0a407
--- /dev/null
@@ -0,0 +1,16 @@
+  .global MY_BUF
+  .section  .bss.MY_BUF,"aw",%nobits
+  .type        MY_BUF, %object
+  .size        MY_BUF, 102400
+MY_BUF:
+  .space  102400
+
+  .section  .text.foo,"ax",%progbits
+  .global foo
+  .type        foo, %function
+foo:
+  ldr r0, .L3
+  bx lr
+.L3:
+  .word        MY_BUF
+  .size        foo, .-foo