2006-01-27 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 27 Jan 2006 14:32:04 +0000 (14:32 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 27 Jan 2006 14:32:04 +0000 (14:32 +0000)
PR ld/2218
* ld-pie/pie.exp: New file.
* ld-pie/weakundef.c: Likewise.
* ld-pie/weakundef.out: Likewise.

* lib/ld-lib.exp (run_ld_link_exec_tests): Fix nesting. Support
building PIE and shared library.

ld/testsuite/ChangeLog
ld/testsuite/ld-pie/pie.exp [new file with mode: 0644]
ld/testsuite/ld-pie/weakundef.c [new file with mode: 0644]
ld/testsuite/ld-pie/weakundef.out [new file with mode: 0644]
ld/testsuite/lib/ld-lib.exp

index 62d6318608935bf55830c1ef18e40331f12ce6b5..134277129e7bc188248c96cb608a6431b8aa6068 100644 (file)
@@ -1,3 +1,13 @@
+2006-01-27  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/2218
+       * ld-pie/pie.exp: New file.
+       * ld-pie/weakundef.c: Likewise.
+       * ld-pie/weakundef.out: Likewise.
+
+       * lib/ld-lib.exp (run_ld_link_exec_tests): Fix nesting. Support
+       building PIE and shared library.
+
 2006-01-18  Alexandre Oliva  <aoliva@redhat.com>
 
        Introduce TLS descriptors for i386 and x86_64.
diff --git a/ld/testsuite/ld-pie/pie.exp b/ld/testsuite/ld-pie/pie.exp
new file mode 100644 (file)
index 0000000..48a42e4
--- /dev/null
@@ -0,0 +1,31 @@
+# Expect script for various PIE tests.
+#   Copyright 2006 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+#
+
+# This test can only be run if ld generates native executables.
+if ![isnative] then {return}
+
+# Run on Linux only.
+if { ![istarget *-*-linux*] } {
+    return
+}
+
+set array_tests {
+    {"weak undefined" "-pie" "" {weakundef.c} "weakundef" "weakundef.out" "-fPIC"}
+}
+
+run_ld_link_exec_tests [] $array_tests
diff --git a/ld/testsuite/ld-pie/weakundef.c b/ld/testsuite/ld-pie/weakundef.c
new file mode 100644 (file)
index 0000000..c206781
--- /dev/null
@@ -0,0 +1,15 @@
+#include <stdio.h>
+
+#pragma weak undef_func
+
+extern int undef_func (void);
+int (*ptr_to_func)(void) = undef_func;
+
+int
+main (void)
+{
+  if (ptr_to_func == NULL)
+    printf ("PASSED\n");
+
+  return 0;
+}
diff --git a/ld/testsuite/ld-pie/weakundef.out b/ld/testsuite/ld-pie/weakundef.out
new file mode 100644 (file)
index 0000000..53cdf1e
--- /dev/null
@@ -0,0 +1 @@
+PASSED
index f1bcc854afaed653c9d7766c2f3895a35287b908..2cf6dabca0f031f400f607d1ba2390d86b47b696 100644 (file)
@@ -1313,33 +1313,44 @@ proc run_ld_link_exec_tests { targets_to_xfail ldtests } {
            set objfile "tmpdir/[file rootname $src_file].o"
            lappend objfiles $objfile
 
-       # We ignore warnings since some compilers may generate
-       # incorrect section attributes and the assembler will warn
-       # them.
-       ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/$src_file $objfile
+           # We ignore warnings since some compilers may generate
+           # incorrect section attributes and the assembler will warn
+           # them.
+           ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/$src_file $objfile
+
+           # We have to use $CC to build PIE and shared library.
+           if { [ string match "-shared" $ld_options ] \
+                || [ string match "-pie" $ld_options ] } {
+               set link_proc ld_simple_link
+               set link_cmd $CC
+           } else {
+               set link_proc ld_link
+               set link_cmd $ld
+           }
 
-       if ![ld_link $ld $binfile "-L$srcdir/$subdir $ld_options $objfiles"] {
-           set failed 1
-       } else {
-           set failed 0
-           send_log "Running: $binfile > $binfile.out\n"
-           verbose "Running: $binfile > $binfile.out"
-           catch "exec $binfile > $binfile.out" exec_output
-           
-           if ![string match "" $exec_output] then {
-               send_log "$exec_output\n"
-               verbose "$exec_output" 1
+           if ![$link_proc $link_cmd $binfile "-L$srcdir/$subdir $ld_options $objfiles"] {
                set failed 1
            } else {
-               send_log "diff $binfile.out $srcdir/$subdir/$expfile\n"
-               verbose "diff $binfile.out $srcdir/$subdir/$expfile"
-               catch "exec diff $binfile.out $srcdir/$subdir/$expfile" exec_output
-               set exec_output [prune_warnings $exec_output]
-
+               set failed 0
+               send_log "Running: $binfile > $binfile.out\n"
+               verbose "Running: $binfile > $binfile.out"
+               catch "exec $binfile > $binfile.out" exec_output
+           
                if ![string match "" $exec_output] then {
                    send_log "$exec_output\n"
                    verbose "$exec_output" 1
                    set failed 1
+               } else {
+                   send_log "diff $binfile.out $srcdir/$subdir/$expfile\n"
+                   verbose "diff $binfile.out $srcdir/$subdir/$expfile"
+                   catch "exec diff $binfile.out $srcdir/$subdir/$expfile" exec_output
+                   set exec_output [prune_warnings $exec_output]
+
+                   if ![string match "" $exec_output] then {
+                       send_log "$exec_output\n"
+                       verbose "$exec_output" 1
+                       set failed 1
+                   }
                }
            }
 
@@ -1348,7 +1359,7 @@ proc run_ld_link_exec_tests { targets_to_xfail ldtests } {
            } else {
                set errcnt 0
                pass $testname
-           } }
+           }
        }
     }
 }