From b77db948f4175e479bb3310ba86346c9554ab9f5 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 20 Nov 2017 15:32:55 +0000 Subject: 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. --- 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 +++++++++++++++++++ 5 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 ld/testsuite/ld-elf/pr22450.d create mode 100644 ld/testsuite/ld-elf/pr22450.s (limited to 'ld') 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 + + 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 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: -- cgit v1.1