aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-scripts
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2015-09-18 09:14:25 +0930
committerAlan Modra <amodra@gmail.com>2015-09-18 12:39:16 +0930
commit975f8a9e3144e4d3d3f391e907c8bf94b23dc8b6 (patch)
tree1e0766556406a33ec0f6fcd83b270087ae88897f /ld/testsuite/ld-scripts
parentb29b8669ad250df649a0f02c5575e7163a2cd9e4 (diff)
downloadgdb-975f8a9e3144e4d3d3f391e907c8bf94b23dc8b6.zip
gdb-975f8a9e3144e4d3d3f391e907c8bf94b23dc8b6.tar.gz
gdb-975f8a9e3144e4d3d3f391e907c8bf94b23dc8b6.tar.bz2
Delay converting linker script defined symbols from absolute
Giving linker script symbols defined outside of output sections a section-relative value early, leads to them being used in expressions as if they were defined inside an output section. This can mean loss of the section VMA, and wrong results. ld/ PR ld/18963 * ldexp.h (struct ldexp_control): Add rel_from_abs. (ldexp_finalize_syms): Declare. * ldexp.c (new_rel_from_abs): Keep absolute for expressions outside of output section statements. Set rel_from_abs. (make_abs, exp_fold_tree, exp_fold_tree_no_dot): Clear rel_from_abs. (struct definedness_hash_entry): Add final_sec, and comment. (update_definedness): Set final_sec. (set_sym_sections, ldexp_finalize_syms): New functions. * ldlang.c (lang_process): Call ldexp_finalize_syms. ld/testsuite PR ld/18963 * ld-scripts/pr18963.d, * ld-scripts/pr18963.t: New test. * ld-scripts/expr.exp: Run it. * ld-elf/provide-hidden-2.ld: Explicitly make "dot" absolute. * ld-mips-elf/gp-hidden.sd: Don't care about _gp section. * ld-mips-elf/no-shared-1-n32.d: Don't care about symbol shown at start of .data section. * ld-mips-elf/no-shared-1-n64.d: Likewise. * ld-mips-elf/no-shared-1-o32.d: Likewise.
Diffstat (limited to 'ld/testsuite/ld-scripts')
-rw-r--r--ld/testsuite/ld-scripts/expr.exp7
-rw-r--r--ld/testsuite/ld-scripts/pr18963.d15
-rw-r--r--ld/testsuite/ld-scripts/pr18963.t25
3 files changed, 47 insertions, 0 deletions
diff --git a/ld/testsuite/ld-scripts/expr.exp b/ld/testsuite/ld-scripts/expr.exp
index 85242ed..babbf43 100644
--- a/ld/testsuite/ld-scripts/expr.exp
+++ b/ld/testsuite/ld-scripts/expr.exp
@@ -25,3 +25,10 @@ run_dump_test sane1
run_dump_test assign-loc
run_dump_test pr14962
run_dump_test pr14962-2
+
+set old_ldflags $LDFLAGS
+if { [istarget spu*-*-*] } {
+ set LDFLAGS "$LDFLAGS --no-overlays --local-store 0:0"
+}
+run_dump_test pr18963
+set LDFLAGS $old_ldflags
diff --git a/ld/testsuite/ld-scripts/pr18963.d b/ld/testsuite/ld-scripts/pr18963.d
new file mode 100644
index 0000000..699db59
--- /dev/null
+++ b/ld/testsuite/ld-scripts/pr18963.d
@@ -0,0 +1,15 @@
+# source: data.s
+# ld: -T pr18963.t
+# nm: -B -n
+
+#...
+0+70000 A D
+#...
+0+70000 A E
+#...
+0+80000 T A
+#...
+0+90000 T B
+#...
+0+a0000 D C
+#pass
diff --git a/ld/testsuite/ld-scripts/pr18963.t b/ld/testsuite/ld-scripts/pr18963.t
new file mode 100644
index 0000000..b0cd742
--- /dev/null
+++ b/ld/testsuite/ld-scripts/pr18963.t
@@ -0,0 +1,25 @@
+SECTIONS
+{
+ . = 0x80000;
+ A = .;
+ .text :
+ {
+ _start = .;
+ . = 0x10000;
+ }
+ B = .;
+ .data :
+ {
+ . = 0x10000;
+ }
+ C = .;
+ .bss :
+ {
+ . = 0x10000;
+ }
+ D = A - C + B;
+ E = A + B - C;
+ /DISCARD/ : {*(*)}
+}
+
+ASSERT(D == E, "Addition is not commutative");