aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2017-11-20 15:32:55 +0000
committerNick Clifton <nickc@redhat.com>2017-11-20 15:32:55 +0000
commitb77db948f4175e479bb3310ba86346c9554ab9f5 (patch)
tree634d70cd1221d48fa76e2f56c0c6836022e72c2c /ld
parentb7486a74a62527412cfd2dd50a9a100118265c28 (diff)
downloadgdb-b77db948f4175e479bb3310ba86346c9554ab9f5.zip
gdb-b77db948f4175e479bb3310ba86346c9554ab9f5.tar.gz
gdb-b77db948f4175e479bb3310ba86346c9554ab9f5.tar.bz2
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.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog10
-rw-r--r--ld/testsuite/config/default.exp2
-rw-r--r--ld/testsuite/ld-elf/elf.exp37
-rw-r--r--ld/testsuite/ld-elf/pr22450.d12
-rw-r--r--ld/testsuite/ld-elf/pr22450.s19
5 files changed, 79 insertions, 1 deletions
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: