From b77db948f4175e479bb3310ba86346c9554ab9f5 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 20 Nov 2017 15:32:55 +0000 Subject: [PATCH] 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. --- 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(-) create mode 100644 ld/testsuite/ld-elf/pr22450.d create mode 100644 ld/testsuite/ld-elf/pr22450.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 6e148b0eaa0..5bf4f1a9524 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2017-11-20 Nick Clifton + + 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 PR 22451 diff --git a/bfd/elf-properties.c b/bfd/elf-properties.c index bfb106edc92..32e03dee37e 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 7f3c7319c7c..01e3d63511f 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,13 @@ +2017-11-20 Nick Clifton + + 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 PR 15152 diff --git a/ld/testsuite/config/default.exp b/ld/testsuite/config/default.exp index 6aba75fdc59..950e202b1ae 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 acdad8db22a..8f24a75a74b 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 00000000000..26853bc9b8d --- /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 00000000000..33118a1022d --- /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: -- 2.30.2