From: H.J. Lu Date: Fri, 18 Jan 2013 00:21:52 +0000 (+0000) Subject: Verify run-time size relocations if supported X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9a645e5c0d65fe630ce98bcecbd9138e768f2bdd;p=binutils-gdb.git Verify run-time size relocations if supported * ld-size/size-7.out: New file. * ld-size/size-8.out: Likewise. * ld-size/size-9.out: Likewise. * ld-size/size-9.rd: Likewise. * ld-size/size-9a.c: Likewise. * ld-size/size-9b.c: Likewise. * ld-size/size-10.out: Likewise. * ld-size/size-10.rd: Likewise. * ld-size/size-10a.c: Likewise. * ld-size/size-10b.c: Likewise. * ld-size/size.exp (build_tests): Build libsize-9.so and libsize-10.so. Run-time size relocation tests if supported. (run_time_tests): New. --- diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index c7ffa1e2628..76d4585ab83 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,21 @@ +2013-01-17 H.J. Lu + + * ld-size/size-7.out: New file. + * ld-size/size-8.out: Likewise. + * ld-size/size-9.out: Likewise. + * ld-size/size-9.rd: Likewise. + * ld-size/size-9a.c: Likewise. + * ld-size/size-9b.c: Likewise. + * ld-size/size-10.out: Likewise. + * ld-size/size-10.rd: Likewise. + * ld-size/size-10a.c: Likewise. + * ld-size/size-10b.c: Likewise. + + * ld-size/size.exp (build_tests): Build libsize-9.so and + libsize-10.so. + Run-time size relocation tests if supported. + (run_time_tests): New. + 2013-01-17 H.J. Lu * ld-size/size-1.c: New file. diff --git a/ld/testsuite/ld-size/size-10.out b/ld/testsuite/ld-size/size-10.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/ld/testsuite/ld-size/size-10.out @@ -0,0 +1 @@ +OK diff --git a/ld/testsuite/ld-size/size-10.rd b/ld/testsuite/ld-size/size-10.rd new file mode 100644 index 00000000000..a5f8ee8ded4 --- /dev/null +++ b/ld/testsuite/ld-size/size-10.rd @@ -0,0 +1,3 @@ +#... +[0-9a-f]+ +[0-9a-f]+ +R_.*_SIZE(32|64) +.* +#pass diff --git a/ld/testsuite/ld-size/size-10a.c b/ld/testsuite/ld-size/size-10a.c new file mode 100644 index 00000000000..47e6a2fc509 --- /dev/null +++ b/ld/testsuite/ld-size/size-10a.c @@ -0,0 +1,14 @@ +#include + +extern int bar_size; +extern char *get_bar (int, int); + +int +main () +{ + char *bar = get_bar (2, 20); + if (bar_size == 10 && bar[2] == 20) + printf ("OK\n"); + + return 0; +} diff --git a/ld/testsuite/ld-size/size-10b.c b/ld/testsuite/ld-size/size-10b.c new file mode 100644 index 00000000000..d043371b113 --- /dev/null +++ b/ld/testsuite/ld-size/size-10b.c @@ -0,0 +1,10 @@ +__thread char bar[10]; +extern char size_of_bar asm ("bar@SIZE"); +char *bar_size = &size_of_bar; + +char * +get_bar (int i, int v) +{ + bar[i] = v; + return bar; +} diff --git a/ld/testsuite/ld-size/size-7.out b/ld/testsuite/ld-size/size-7.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/ld/testsuite/ld-size/size-7.out @@ -0,0 +1 @@ +OK diff --git a/ld/testsuite/ld-size/size-8.out b/ld/testsuite/ld-size/size-8.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/ld/testsuite/ld-size/size-8.out @@ -0,0 +1 @@ +OK diff --git a/ld/testsuite/ld-size/size-9.out b/ld/testsuite/ld-size/size-9.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/ld/testsuite/ld-size/size-9.out @@ -0,0 +1 @@ +OK diff --git a/ld/testsuite/ld-size/size-9.rd b/ld/testsuite/ld-size/size-9.rd new file mode 100644 index 00000000000..a5f8ee8ded4 --- /dev/null +++ b/ld/testsuite/ld-size/size-9.rd @@ -0,0 +1,3 @@ +#... +[0-9a-f]+ +[0-9a-f]+ +R_.*_SIZE(32|64) +.* +#pass diff --git a/ld/testsuite/ld-size/size-9a.c b/ld/testsuite/ld-size/size-9a.c new file mode 100644 index 00000000000..229534b05b9 --- /dev/null +++ b/ld/testsuite/ld-size/size-9a.c @@ -0,0 +1,13 @@ +#include + +char bar[20]; +extern int bar_size; + +int +main () +{ + if (bar_size == 20) + printf ("OK\n"); + + return 0; +} diff --git a/ld/testsuite/ld-size/size-9b.c b/ld/testsuite/ld-size/size-9b.c new file mode 100644 index 00000000000..16890d15fa3 --- /dev/null +++ b/ld/testsuite/ld-size/size-9b.c @@ -0,0 +1,3 @@ +char bar[10]; +extern char size_of_bar asm ("bar@SIZE"); +char *bar_size = &size_of_bar; diff --git a/ld/testsuite/ld-size/size.exp b/ld/testsuite/ld-size/size.exp index fe4702cf398..24269c5f543 100644 --- a/ld/testsuite/ld-size/size.exp +++ b/ld/testsuite/ld-size/size.exp @@ -85,6 +85,12 @@ set build_tests { {"Build size-8" "tmpdir/libsize-8.so" "" {size-8a.c} {{readelf -rW size-8.rd}} "size-8.exe"} + {"Build libsize-9.so" + "-shared" "-fPIC" + {size-9b.c} {{readelf -rW size-9.rd}} "libsize-9.so"} + {"Build libsize-10.so" + "-shared" "-fPIC" + {size-10b.c} {{readelf -rW size-10.rd}} "libsize-10.so"} } run_cc_link_tests $build_tests @@ -132,3 +138,32 @@ set run_tests { } run_ld_link_exec_tests [] $run_tests + +# Check if size relocation works at run-time. +catch "exec tmpdir/size-7.exe > tmpdir/dump.out" exec_output +if ![string match "" $exec_output] then { + send_log "No run-time size relocation support: $exec_output\n" + verbose "No run-time size relocation support: $exec_output" 1 + return +} + +if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/size-7.out" ] } then { + verbose "output is [file_contents "tmpdir/dump.out"]" 2 + fail "Run-time size relocation" + return +} + +# Run-time size relocation tests. +set run_time_tests { + {"Run size-8" + "tmpdir/libsize-8.so" "" + {size-8a.c} "size-8" "size-8.out"} + {"Run size-9" + "tmpdir/libsize-9.so" "" + {size-9a.c} "size-9" "size-9.out"} + {"Run size-10" + "tmpdir/libsize-10.so" "" + {size-10a.c} "size-10" "size-10.out"} +} + +run_ld_link_exec_tests [] $run_time_tests