This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix handling of GNU Property notes that are not in a GNU NOTE PROPERTY section.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b77db948f4175e479bb3310ba86346c9554ab9f5

commit b77db948f4175e479bb3310ba86346c9554ab9f5
Author: Nick Clifton <nickc@redhat.com>
Date:   Mon Nov 20 15:32:55 2017 +0000

    Fix handling of GNU Property notes that are not in a GNU NOTE PROPERTY section.
    
    	PR 22450
    gas	* elf-properties.c (_bfd_elf_link_setup_gnu_properties): Skip
    	objects without a GNU_PROPERTY note section when looking for a bfd
    	onto which notes can be accumulated.
    
    ld	* testsuite/ld-elf/elf.exp: Add --defsym ALIGN=2|3 to assembler
    	command line depending upon the size of the target address space.
    	* testsuite/ld-elf/pr22450.s: New test file.
    	* testsuite/ld-elf/pr22450.d: New test driver.
    	* testsuite/config/default.exp: Add note that LD_CLASS refers to
    	the size of the host linker not the size of the target linker.

Diff:
---
 bfd/ChangeLog                   |  7 +++++++
 bfd/elf-properties.c            | 14 ++++++++++----
 ld/ChangeLog                    | 10 ++++++++++
 ld/testsuite/config/default.exp |  2 +-
 ld/testsuite/ld-elf/elf.exp     | 37 +++++++++++++++++++++++++++++++++++++
 ld/testsuite/ld-elf/pr22450.d   | 12 ++++++++++++
 ld/testsuite/ld-elf/pr22450.s   | 19 +++++++++++++++++++
 7 files changed, 96 insertions(+), 5 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6e148b0..5bf4f1a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2017-11-20  Nick Clifton  <nickc@redhat.com>
+
+	PR 22450
+	* elf-properties.c (_bfd_elf_link_setup_gnu_properties): Skip
+	objects without a GNU_PROPERTY note section when looking for a bfd
+	onto which notes can be accumulated.
+
 2017-11-20  Alan Modra  <amodra@gmail.com>
 
 	PR 22451
diff --git a/bfd/elf-properties.c b/bfd/elf-properties.c
index bfb106e..32e03de 100644
--- a/bfd/elf-properties.c
+++ b/bfd/elf-properties.c
@@ -328,11 +328,15 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
 	has_properties = TRUE;
 
 	/* Ignore GNU properties from ELF objects with different machine
-	   code or class.  */
+	   code or class.  Also skip objects without a GNU_PROPERTY note
+	   section.  */
 	if ((elf_machine_code
 	     == get_elf_backend_data (abfd)->elf_machine_code)
 	    && (elfclass
-		== get_elf_backend_data (abfd)->s->elfclass))
+		== get_elf_backend_data (abfd)->s->elfclass)
+	    && bfd_get_section_by_name (abfd,
+					NOTE_GNU_PROPERTY_SECTION_NAME) != NULL
+	    )
 	  {
 	    /* Keep .note.gnu.property section in FIRST_PBFD.  */
 	    first_pbfd = abfd;
@@ -374,10 +378,11 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
 
 	if (list != NULL)
 	  {
-	    /* Discard .note.gnu.property section in the rest inputs.  */
+	    /* Discard the .note.gnu.property section in this bfd.  */
 	    sec = bfd_get_section_by_name (abfd,
 					   NOTE_GNU_PROPERTY_SECTION_NAME);
-	    sec->output_section = bfd_abs_section_ptr;
+	    if (sec != NULL)
+	      sec->output_section = bfd_abs_section_ptr;
 	  }
       }
 
@@ -393,6 +398,7 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
 
       sec = bfd_get_section_by_name (first_pbfd,
 				     NOTE_GNU_PROPERTY_SECTION_NAME);
+      BFD_ASSERT (sec != NULL);
 
       /* Update stack size in .note.gnu.property with -z stack-size=N
 	 if N > 0.  */
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 7f3c731..01e3d63 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,13 @@
+2017-11-20  Nick Clifton  <nickc@redhat.com>
+
+	PR 22450
+	* testsuite/ld-elf/elf.exp: Add --defsym ALIGN=2|3 to assembler
+	command line depending upon the size of the target address space.
+	* testsuite/ld-elf/pr22450.s: New test file.
+	* testsuite/ld-elf/pr22450.d: New test driver.
+	* testsuite/config/default.exp: Add note that LD_CLASS refers to
+	the size of the host linker not the size of the target linker.
+
 2017-11-15  Nick Clifton  <nickc@redhat.com>
 
 	PR 15152
diff --git a/ld/testsuite/config/default.exp b/ld/testsuite/config/default.exp
index 6aba75f..950e202 100644
--- a/ld/testsuite/config/default.exp
+++ b/ld/testsuite/config/default.exp
@@ -251,7 +251,7 @@ if ![info exists LDFLAGS] then {
     set LDFLAGS {}
 }
 
-# Set LD_CLASS to "64bit" for 64-bit LD.
+# Set LD_CLASS to "64bit" for a 64-bit *host* linker.
 if { ![info exists LD_CLASS] } then {
     set REAL_LD [findfile $base_dir/.libs/ld-new .libs/ld-new $LD [transform ld]]
     set readelf_output [run_host_cmd "$READELF" "-h $REAL_LD"]
diff --git a/ld/testsuite/ld-elf/elf.exp b/ld/testsuite/ld-elf/elf.exp
index acdad8d..8f24a75 100644
--- a/ld/testsuite/ld-elf/elf.exp
+++ b/ld/testsuite/ld-elf/elf.exp
@@ -61,6 +61,8 @@ if { [is_remote host] } then {
     remote_download host merge.ld
 }
 
+# Note - the output file from the second test (symbol3w.a) is
+# used in the proc is_elf64 test below...
 run_ld_link_tests [list \
     [list "Build symbol3.a" \
 	"" "" $hpux \
@@ -70,6 +72,41 @@ run_ld_link_tests [list \
 	{symbol3w.s} {} "symbol3w.a" ] \
 ]
 
+
+# True if the object format is known to be 64-bit ELF.
+#
+proc is_elf64 { binary_file } {
+    global READELF
+    global READELFFLAGS
+
+    set readelf_size ""
+    catch "exec $READELF $READELFFLAGS -h $binary_file > readelf.out" got
+
+    if ![string match "" $got] then {
+	return 0
+    }
+
+    if { ![regexp "\n\[ \]*Class:\[ \]*ELF(\[0-9\]+)\n" \
+	       [file_contents readelf.out] nil readelf_size] } {
+	verbose "FAILED to determine ELF size"
+	return 0
+    }
+
+    if { $readelf_size == "64" } {
+	return 1
+    }
+
+    return 0
+}
+
+if [is_elf64 tmpdir/symbol3w.a] {
+    set ASFLAGS "$ASFLAGS --defsym ALIGN=3"
+} else {
+    set ASFLAGS "$ASFLAGS --defsym ALIGN=2"
+}
+
+
+
 # Targets that use _bfd_generic_link_add_symbols won't pass pr21703 tests
 run_ld_link_tests {
       {"PR ld/21703"
diff --git a/ld/testsuite/ld-elf/pr22450.d b/ld/testsuite/ld-elf/pr22450.d
new file mode 100644
index 0000000..26853bc
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr22450.d
@@ -0,0 +1,12 @@
+#source: pr22450.s
+#readelf: --notes --wide
+#ld: -r
+# Fails on H8300 because it does not generate the correct relocs for the size fields.
+# Fails on AVR, IP2K, M68HC11, SPARC64, XC16C because the assembler does not calculate the correct values for the differences of local symbols.
+# Fails on CRX because readelf does not know how to apply CRX reloc number 20 (R_CRX_SWITCH32).
+
+#...
+Displaying notes found in: \.note\.gnu
+[ 	]+Owner[ 	]+Data size[ 	]+Description
+[ 	]+GNU[ 	]+0x0+0..[ 	]+NT_GNU_PROPERTY_TYPE_0[ 	]+Properties: stack size: 0x8000
+#pass
diff --git a/ld/testsuite/ld-elf/pr22450.s b/ld/testsuite/ld-elf/pr22450.s
new file mode 100644
index 0000000..33118a1
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr22450.s
@@ -0,0 +1,19 @@
+
+	.section ".note.gnu", "a" /* NB/ Deliberately incorrect section name.  Should be: .note.gnu.property  */
+	.p2align ALIGN
+
+	.dc.l 1f - 0f		/* Name length.  */
+	.dc.l 5f - 2f		/* Data length.  */
+	.dc.l 5			/* Note type: NT_GNU_PROPERTY_TYPE_0 */
+0:
+	.asciz "GNU"		/* Vendor name.  */
+1:
+	.p2align ALIGN
+2:	
+	.dc.l 1			/* pr_type: GNU_PROPERTY_STACK_SIZE */
+	.dc.l 5f - 4f		/* pr_datasz.  */
+4:
+	.dc.a 0x8000		/* Stack size.  */
+5:
+	.p2align ALIGN
+3:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]