This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: ld/2218: Weak undefined symbol doesn't work properly with PIE


On Thu, Jan 26, 2006 at 11:03:35PM -0800, H. J. Lu wrote:
> We should treat global symbols in PIE like shared library. There is
> no regression on Linux/x86/x86-64/ia64.
> 

Here is a patch for testcase.

H.J.
----
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.

--- ld/testsuite/ld-pie/pie.exp.pie	2006-01-26 22:27:43.000000000 -0800
+++ ld/testsuite/ld-pie/pie.exp	2006-01-26 22:51:37.000000000 -0800
@@ -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
--- ld/testsuite/ld-pie/weakundef.c.pie	2006-01-26 22:27:49.000000000 -0800
+++ ld/testsuite/ld-pie/weakundef.c	2006-01-26 22:39:51.000000000 -0800
@@ -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;
+}
--- ld/testsuite/ld-pie/weakundef.out.pie	2006-01-26 22:40:33.000000000 -0800
+++ ld/testsuite/ld-pie/weakundef.out	2006-01-26 22:39:51.000000000 -0800
@@ -0,0 +1 @@
+PASSED
--- ld/testsuite/lib/ld-lib.exp.pie	2005-08-24 08:27:20.000000000 -0700
+++ ld/testsuite/lib/ld-lib.exp	2006-01-27 06:13:32.000000000 -0800
@@ -1313,33 +1313,44 @@ proc run_ld_link_exec_tests { targets_to
 	    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
 
-	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
-		set failed 1
+	    # 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 {
-		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 link_proc ld_link
+		set link_cmd $ld
+	    }
 
+	    if ![$link_proc $link_cmd $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
 		    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
 	    } else {
 		set errcnt 0
 		pass $testname
-	    } }
+	    }
 	}
     }
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]